dri3_priv.h revision 568a27588d13146d0fd7cb4e775e1ac0187e5e29
1/* 2 * Copyright © 2013 Keith Packard 3 * 4 * Permission to use, copy, modify, distribute, and sell this software and its 5 * documentation for any purpose is hereby granted without fee, provided that 6 * the above copyright notice appear in all copies and that both that copyright 7 * notice and this permission notice appear in supporting documentation, and 8 * that the name of the copyright holders not be used in advertising or 9 * publicity pertaining to distribution of the software without specific, 10 * written prior permission. The copyright holders make no representations 11 * about the suitability of this software for any purpose. It is provided "as 12 * is" without express or implied warranty. 13 * 14 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 16 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 20 * OF THIS SOFTWARE. 21 */ 22 23/* This file was derived from dri2_priv.h which carries the following 24 * copyright: 25 * 26 * Copyright © 2008 Red Hat, Inc. 27 * 28 * Permission is hereby granted, free of charge, to any person obtaining a 29 * copy of this software and associated documentation files (the "Soft- 30 * ware"), to deal in the Software without restriction, including without 31 * limitation the rights to use, copy, modify, merge, publish, distribute, 32 * and/or sell copies of the Software, and to permit persons to whom the 33 * Software is furnished to do so, provided that the above copyright 34 * notice(s) and this permission notice appear in all copies of the Soft- 35 * ware and that both the above copyright notice(s) and this permission 36 * notice appear in supporting documentation. 37 * 38 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 39 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- 40 * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY 41 * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN 42 * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE- 43 * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 44 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 45 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR- 46 * MANCE OF THIS SOFTWARE. 47 * 48 * Except as contained in this notice, the name of a copyright holder shall 49 * not be used in advertising or otherwise to promote the sale, use or 50 * other dealings in this Software without prior written authorization of 51 * the copyright holder. 52 * 53 * Authors: 54 * Kristian Høgsberg (krh@redhat.com) 55 */ 56 57#include <xcb/xcb.h> 58#include <xcb/dri3.h> 59#include <xcb/present.h> 60#include <xcb/sync.h> 61 62/* From xmlpool/options.h, user exposed so should be stable */ 63#define DRI_CONF_VBLANK_NEVER 0 64#define DRI_CONF_VBLANK_DEF_INTERVAL_0 1 65#define DRI_CONF_VBLANK_DEF_INTERVAL_1 2 66#define DRI_CONF_VBLANK_ALWAYS_SYNC 3 67 68enum dri3_buffer_type { 69 dri3_buffer_back = 0, 70 dri3_buffer_front = 1 71}; 72 73struct dri3_buffer { 74 __DRIimage *image; 75 uint32_t pixmap; 76 77 /* Synchronization between the client and X server is done using an 78 * xshmfence that is mapped into an X server SyncFence. This lets the 79 * client check whether the X server is done using a buffer with a simple 80 * xshmfence call, rather than going to read X events from the wire. 81 * 82 * However, we can only wait for one xshmfence to be triggered at a time, 83 * so we need to know *which* buffer is going to be idle next. We do that 84 * by waiting for a PresentIdleNotify event. When that event arrives, the 85 * 'busy' flag gets cleared and the client knows that the fence has been 86 * triggered, and that the wait call will not block. 87 */ 88 89 uint32_t sync_fence; /* XID of X SyncFence object */ 90 struct xshmfence *shm_fence; /* pointer to xshmfence object */ 91 GLboolean busy; /* Set on swap, cleared on IdleNotify */ 92 void *driverPrivate; 93 94 uint32_t size; 95 uint32_t pitch; 96 uint32_t cpp; 97 uint32_t flags; 98 uint32_t width, height; 99 100 enum dri3_buffer_type buffer_type; 101}; 102 103struct dri3_display 104{ 105 __GLXDRIdisplay base; 106 107 const __DRIextension *loader_extensions[8]; 108 109 /* DRI3 bits */ 110 int dri3Major; 111 int dri3Minor; 112 113 /* Present bits */ 114 int hasPresent; 115 int presentMajor; 116 int presentMinor; 117}; 118 119struct dri3_screen { 120 struct glx_screen base; 121 122 __DRIscreen *driScreen; 123 __GLXDRIscreen vtable; 124 125 const __DRIimageExtension *image; 126 const __DRIimageDriverExtension *image_driver; 127 const __DRIcoreExtension *core; 128 const __DRI2flushExtension *f; 129 const __DRI2configQueryExtension *config; 130 const __DRItexBufferExtension *texBuffer; 131 const __DRIconfig **driver_configs; 132 133 void *driver; 134 int fd; 135 136 Bool show_fps; 137}; 138 139struct dri3_context 140{ 141 struct glx_context base; 142 __DRIcontext *driContext; 143}; 144 145#define DRI3_MAX_BACK 2 146#define DRI3_BACK_ID(i) (i) 147#define DRI3_FRONT_ID (DRI3_MAX_BACK) 148 149static inline int 150dri3_buf_id_next(int buf_id) 151{ 152 if (buf_id == DRI3_MAX_BACK - 1) 153 return 0; 154 return buf_id + 1; 155} 156 157static inline int 158dri3_buf_id_prev(int buf_id) 159{ 160 if (buf_id == 0) 161 return DRI3_MAX_BACK - 1; 162 return buf_id - 1; 163} 164 165static inline int 166dri3_pixmap_buf_id(enum dri3_buffer_type buffer_type) 167{ 168 if (buffer_type == dri3_buffer_back) 169 return DRI3_BACK_ID(0); 170 else 171 return DRI3_FRONT_ID; 172} 173 174struct dri3_drawable { 175 __GLXDRIdrawable base; 176 __DRIdrawable *driDrawable; 177 int width, height; 178 int swap_interval; 179 uint8_t have_back; 180 uint8_t have_fake_front; 181 uint8_t is_pixmap; 182 183 uint32_t present_request_serial; 184 uint32_t present_event_serial; 185 186 uint64_t sbc; 187 188 uint64_t ust, msc; 189 190 /* For WaitMSC */ 191 uint32_t present_msc_request_serial; 192 uint32_t present_msc_event_serial; 193 194 uint64_t previous_time; 195 unsigned frames; 196 197 struct dri3_buffer *buffers[1 + DRI3_MAX_BACK]; 198 int cur_back; 199 int depth; 200 201 uint32_t *stamp; 202 203 xcb_present_event_t eid; 204 xcb_gcontext_t gc; 205 xcb_special_event_t *special_event; 206}; 207 208char * 209dri3_get_driver_for_fd(int fd); 210