1 /* 2 * Copyright © 2007 Red Hat, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Soft- 6 * ware"), to deal in the Software without restriction, including without 7 * limitation the rights to use, copy, modify, merge, publish, distribute, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, provided that the above copyright 10 * notice(s) and this permission notice appear in all copies of the Soft- 11 * ware and that both the above copyright notice(s) and this permission 12 * notice appear in supporting documentation. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- 16 * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY 17 * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN 18 * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE- 19 * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 20 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 21 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR- 22 * MANCE OF THIS SOFTWARE. 23 * 24 * Except as contained in this notice, the name of a copyright holder shall 25 * not be used in advertising or otherwise to promote the sale, use or 26 * other dealings in this Software without prior written authorization of 27 * the copyright holder. 28 * 29 * Authors: 30 * Kristian Høgsberg (krh@redhat.com) 31 */ 32 33 #ifndef _DRI2_H_ 34 #define _DRI2_H_ 35 36 #include <X11/extensions/dri2tokens.h> 37 38 /* Version 2 structure (with format at the end) */ 39 typedef struct { 40 unsigned int attachment; 41 unsigned int name; 42 unsigned int pitch; 43 unsigned int cpp; 44 unsigned int flags; 45 unsigned int format; 46 void *driverPrivate; 47 } DRI2BufferRec, *DRI2BufferPtr; 48 49 extern CARD8 dri2_major; /* version of DRI2 supported by DDX */ 50 extern CARD8 dri2_minor; 51 52 typedef DRI2BufferRec DRI2Buffer2Rec, *DRI2Buffer2Ptr; 53 typedef void (*DRI2SwapEventPtr) (ClientPtr client, void *data, int type, 54 CARD64 ust, CARD64 msc, CARD32 sbc); 55 56 typedef DRI2BufferPtr(*DRI2CreateBuffersProcPtr) (DrawablePtr pDraw, 57 unsigned int *attachments, 58 int count); 59 typedef void (*DRI2DestroyBuffersProcPtr) (DrawablePtr pDraw, 60 DRI2BufferPtr buffers, int count); 61 typedef void (*DRI2CopyRegionProcPtr) (DrawablePtr pDraw, 62 RegionPtr pRegion, 63 DRI2BufferPtr pDestBuffer, 64 DRI2BufferPtr pSrcBuffer); 65 typedef void (*DRI2WaitProcPtr) (WindowPtr pWin, unsigned int sequence); 66 typedef int (*DRI2AuthMagicProcPtr) (int fd, uint32_t magic); 67 typedef int (*DRI2AuthMagic2ProcPtr) (ScreenPtr pScreen, uint32_t magic); 68 69 /** 70 * Schedule a buffer swap 71 * 72 * This callback is used to support glXSwapBuffers and the OML_sync_control 73 * extension (see it for a description of the params). 74 * 75 * Drivers should queue an event for the frame count that satisfies the 76 * parameters passed in. If the event is in the future (i.e. the conditions 77 * aren't currently satisfied), the server may block the client at the next 78 * GLX request using DRI2WaitSwap. When the event arrives, drivers should call 79 * \c DRI2SwapComplete, which will handle waking the client and returning 80 * the appropriate data. 81 * 82 * The DDX is responsible for doing a flip, exchange, or blit of the swap 83 * when the corresponding event arrives. The \c DRI2CanFlip and 84 * \c DRI2CanExchange functions can be used as helpers for this purpose. 85 * 86 * \param client client pointer (used for block/unblock) 87 * \param pDraw drawable whose count we want 88 * \param pDestBuffer current front buffer 89 * \param pSrcBuffer current back buffer 90 * \param target_msc frame count to wait for 91 * \param divisor divisor for condition equation 92 * \param remainder remainder for division equation 93 * \param func function to call when the swap completes 94 * \param data data for the callback \p func. 95 */ 96 typedef int (*DRI2ScheduleSwapProcPtr) (ClientPtr client, 97 DrawablePtr pDraw, 98 DRI2BufferPtr pDestBuffer, 99 DRI2BufferPtr pSrcBuffer, 100 CARD64 * target_msc, 101 CARD64 divisor, 102 CARD64 remainder, 103 DRI2SwapEventPtr func, void *data); 104 typedef DRI2BufferPtr(*DRI2CreateBufferProcPtr) (DrawablePtr pDraw, 105 unsigned int attachment, 106 unsigned int format); 107 typedef void (*DRI2DestroyBufferProcPtr) (DrawablePtr pDraw, 108 DRI2BufferPtr buffer); 109 /** 110 * Notifies driver when DRI2GetBuffers reuses a dri2 buffer. 111 * 112 * Driver may rename the dri2 buffer in this notify if it is required. 113 * 114 * \param pDraw drawable whose count we want 115 * \param buffer buffer that will be returned to client 116 */ 117 typedef void (*DRI2ReuseBufferNotifyProcPtr) (DrawablePtr pDraw, 118 DRI2BufferPtr buffer); 119 /** 120 * Get current media stamp counter values 121 * 122 * This callback is used to support the SGI_video_sync and OML_sync_control 123 * extensions. 124 * 125 * Drivers should return the current frame counter and the timestamp from 126 * when the returned frame count was last incremented. 127 * 128 * The count should correspond to the screen where the drawable is currently 129 * visible. If the drawable isn't visible (e.g. redirected), the server 130 * should return BadDrawable to the client, pending GLX spec updates to 131 * define this behavior. 132 * 133 * \param pDraw drawable whose count we want 134 * \param ust timestamp from when the count was last incremented. 135 * \param mst current frame count 136 */ 137 typedef int (*DRI2GetMSCProcPtr) (DrawablePtr pDraw, CARD64 * ust, 138 CARD64 * msc); 139 /** 140 * Schedule a frame count related wait 141 * 142 * This callback is used to support the SGI_video_sync and OML_sync_control 143 * extensions. See those specifications for details on how to handle 144 * the divisor and remainder parameters. 145 * 146 * Drivers should queue an event for the frame count that satisfies the 147 * parameters passed in. If the event is in the future (i.e. the conditions 148 * aren't currently satisfied), the driver should block the client using 149 * \c DRI2BlockClient. When the event arrives, drivers should call 150 * \c DRI2WaitMSCComplete, which will handle waking the client and returning 151 * the appropriate data. 152 * 153 * \param client client pointer (used for block/unblock) 154 * \param pDraw drawable whose count we want 155 * \param target_msc frame count to wait for 156 * \param divisor divisor for condition equation 157 * \param remainder remainder for division equation 158 */ 159 typedef int (*DRI2ScheduleWaitMSCProcPtr) (ClientPtr client, 160 DrawablePtr pDraw, 161 CARD64 target_msc, 162 CARD64 divisor, CARD64 remainder); 163 164 typedef void (*DRI2InvalidateProcPtr) (DrawablePtr pDraw, void *data, XID id); 165 166 /** 167 * DRI2 calls this hook when ever swap_limit is going to be changed. Default 168 * implementation for the hook only accepts one as swap_limit. If driver can 169 * support other swap_limits it has to implement supported limits with this 170 * callback. 171 * 172 * \param pDraw drawable whos swap_limit is going to be changed 173 * \param swap_limit new swap_limit that going to be set 174 * \return TRUE if limit is support, FALSE if not. 175 */ 176 typedef Bool (*DRI2SwapLimitValidateProcPtr) (DrawablePtr pDraw, 177 int swap_limit); 178 179 typedef DRI2BufferPtr(*DRI2CreateBuffer2ProcPtr) (ScreenPtr pScreen, 180 DrawablePtr pDraw, 181 unsigned int attachment, 182 unsigned int format); 183 typedef void (*DRI2DestroyBuffer2ProcPtr) (ScreenPtr pScreen, DrawablePtr pDraw, 184 DRI2BufferPtr buffer); 185 186 typedef void (*DRI2CopyRegion2ProcPtr) (ScreenPtr pScreen, DrawablePtr pDraw, 187 RegionPtr pRegion, 188 DRI2BufferPtr pDestBuffer, 189 DRI2BufferPtr pSrcBuffer); 190 191 /** 192 * \brief Get the value of a parameter. 193 * 194 * The parameter's \a value is looked up on the screen associated with 195 * \a pDrawable. 196 * 197 * \return \c Success or error code. 198 */ 199 typedef int (*DRI2GetParamProcPtr) (ClientPtr client, 200 DrawablePtr pDrawable, 201 CARD64 param, 202 BOOL *is_param_recognized, 203 CARD64 *value); 204 205 /** 206 * Version of the DRI2InfoRec structure defined in this header 207 */ 208 #define DRI2INFOREC_VERSION 9 209 210 typedef struct { 211 unsigned int version; /**< Version of this struct */ 212 int fd; 213 const char *driverName; 214 const char *deviceName; 215 216 DRI2CreateBufferProcPtr CreateBuffer; 217 DRI2DestroyBufferProcPtr DestroyBuffer; 218 DRI2CopyRegionProcPtr CopyRegion; 219 DRI2WaitProcPtr Wait; 220 221 /* added in version 4 */ 222 223 DRI2ScheduleSwapProcPtr ScheduleSwap; 224 DRI2GetMSCProcPtr GetMSC; 225 DRI2ScheduleWaitMSCProcPtr ScheduleWaitMSC; 226 227 /* number of drivers in the driverNames array */ 228 unsigned int numDrivers; 229 /* array of driver names, indexed by DRI2Driver* driver types */ 230 /* a name of NULL means that driver is not supported */ 231 const char *const *driverNames; 232 233 /* added in version 5 */ 234 235 DRI2AuthMagicProcPtr AuthMagic; 236 237 /* added in version 6 */ 238 239 DRI2ReuseBufferNotifyProcPtr ReuseBufferNotify; 240 DRI2SwapLimitValidateProcPtr SwapLimitValidate; 241 242 /* added in version 7 */ 243 DRI2GetParamProcPtr GetParam; 244 245 /* added in version 8 */ 246 /* AuthMagic callback which passes extra context */ 247 /* If this is NULL the AuthMagic callback is used */ 248 /* If this is non-NULL the AuthMagic callback is ignored */ 249 DRI2AuthMagic2ProcPtr AuthMagic2; 250 251 /* added in version 9 */ 252 DRI2CreateBuffer2ProcPtr CreateBuffer2; 253 DRI2DestroyBuffer2ProcPtr DestroyBuffer2; 254 DRI2CopyRegion2ProcPtr CopyRegion2; 255 } DRI2InfoRec, *DRI2InfoPtr; 256 257 extern _X_EXPORT Bool DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info); 258 259 extern _X_EXPORT void DRI2CloseScreen(ScreenPtr pScreen); 260 261 extern _X_EXPORT Bool DRI2HasSwapControl(ScreenPtr pScreen); 262 263 extern _X_EXPORT Bool DRI2Connect(ClientPtr client, ScreenPtr pScreen, 264 unsigned int driverType, 265 int *fd, 266 const char **driverName, 267 const char **deviceName); 268 269 extern _X_EXPORT Bool DRI2Authenticate(ClientPtr client, ScreenPtr pScreen, uint32_t magic); 270 271 extern _X_EXPORT int DRI2CreateDrawable(ClientPtr client, 272 DrawablePtr pDraw, 273 XID id, 274 DRI2InvalidateProcPtr invalidate, 275 void *priv); 276 277 extern _X_EXPORT int DRI2CreateDrawable2(ClientPtr client, 278 DrawablePtr pDraw, 279 XID id, 280 DRI2InvalidateProcPtr invalidate, 281 void *priv, 282 XID *dri2_id_out); 283 284 extern _X_EXPORT DRI2BufferPtr *DRI2GetBuffers(DrawablePtr pDraw, 285 int *width, 286 int *height, 287 unsigned int *attachments, 288 int count, int *out_count); 289 290 extern _X_EXPORT int DRI2CopyRegion(DrawablePtr pDraw, 291 RegionPtr pRegion, 292 unsigned int dest, unsigned int src); 293 294 /** 295 * Determine the major and minor version of the DRI2 extension. 296 * 297 * Provides a mechanism to other modules (e.g., 2D drivers) to determine the 298 * version of the DRI2 extension. While it is possible to peek directly at 299 * the \c XF86ModuleData from a layered module, such a module will fail to 300 * load (due to an unresolved symbol) if the DRI2 extension is not loaded. 301 * 302 * \param major Location to store the major verion of the DRI2 extension 303 * \param minor Location to store the minor verion of the DRI2 extension 304 * 305 * \note 306 * This interface was added some time after the initial release of the DRI2 307 * module. Layered modules that wish to use this interface must first test 308 * its existance by calling \c xf86LoaderCheckSymbol. 309 */ 310 extern _X_EXPORT void DRI2Version(int *major, int *minor); 311 312 extern _X_EXPORT DRI2BufferPtr *DRI2GetBuffersWithFormat(DrawablePtr pDraw, 313 int *width, 314 int *height, 315 unsigned int 316 *attachments, 317 int count, 318 int *out_count); 319 320 extern _X_EXPORT void DRI2SwapInterval(DrawablePtr pDrawable, int interval); 321 extern _X_EXPORT Bool DRI2SwapLimit(DrawablePtr pDraw, int swap_limit); 322 extern _X_EXPORT int DRI2SwapBuffers(ClientPtr client, DrawablePtr pDrawable, 323 CARD64 target_msc, CARD64 divisor, 324 CARD64 remainder, CARD64 * swap_target, 325 DRI2SwapEventPtr func, void *data); 326 extern _X_EXPORT Bool DRI2WaitSwap(ClientPtr client, DrawablePtr pDrawable); 327 328 extern _X_EXPORT int DRI2GetMSC(DrawablePtr pDrawable, CARD64 * ust, 329 CARD64 * msc, CARD64 * sbc); 330 extern _X_EXPORT int DRI2WaitMSC(ClientPtr client, DrawablePtr pDrawable, 331 CARD64 target_msc, CARD64 divisor, 332 CARD64 remainder); 333 extern _X_EXPORT int ProcDRI2WaitMSCReply(ClientPtr client, CARD64 ust, 334 CARD64 msc, CARD64 sbc); 335 extern _X_EXPORT int DRI2WaitSBC(ClientPtr client, DrawablePtr pDraw, 336 CARD64 target_sbc); 337 extern _X_EXPORT Bool DRI2ThrottleClient(ClientPtr client, DrawablePtr pDraw); 338 339 extern _X_EXPORT Bool DRI2CanFlip(DrawablePtr pDraw); 340 341 extern _X_EXPORT Bool DRI2CanExchange(DrawablePtr pDraw); 342 343 /* Note: use *only* for MSC related waits */ 344 extern _X_EXPORT void DRI2BlockClient(ClientPtr client, DrawablePtr pDraw); 345 346 extern _X_EXPORT void DRI2SwapComplete(ClientPtr client, DrawablePtr pDraw, 347 int frame, unsigned int tv_sec, 348 unsigned int tv_usec, int type, 349 DRI2SwapEventPtr swap_complete, 350 void *swap_data); 351 extern _X_EXPORT void DRI2WaitMSCComplete(ClientPtr client, DrawablePtr pDraw, 352 int frame, unsigned int tv_sec, 353 unsigned int tv_usec); 354 355 extern _X_EXPORT int DRI2GetParam(ClientPtr client, 356 DrawablePtr pDrawable, 357 CARD64 param, 358 BOOL *is_param_recognized, 359 CARD64 *value); 360 361 extern _X_EXPORT DrawablePtr DRI2UpdatePrime(DrawablePtr pDraw, DRI2BufferPtr pDest); 362 #endif 363