5 #include "glxglvnddispatchfuncs.h"
6 #include "g_glxglvnddispatchindices.h"
8 const int DI_FUNCTION_COUNT
= DI_LAST_INDEX
;
9 /* Allocate an extra 'dummy' to ease lookup. See FindGLXFunction() */
10 int __glXDispatchTableIndices
[DI_LAST_INDEX
+ 1];
11 const __GLXapiExports
*__glXGLVNDAPIExports
;
13 const char * const __glXDispatchTableStrings
[DI_LAST_INDEX
] = {
14 #define __ATTRIB(field) \
15 [DI_##field] = "glX"#field
17 __ATTRIB(BindSwapBarrierSGIX
),
18 __ATTRIB(BindTexImageEXT
),
19 // glXChooseFBConfig implemented by libglvnd
20 __ATTRIB(ChooseFBConfigSGIX
),
21 // glXChooseVisual implemented by libglvnd
22 // glXCopyContext implemented by libglvnd
23 __ATTRIB(CopySubBufferMESA
),
24 // glXCreateContext implemented by libglvnd
25 __ATTRIB(CreateContextAttribsARB
),
26 __ATTRIB(CreateContextWithConfigSGIX
),
27 __ATTRIB(CreateGLXPbufferSGIX
),
28 // glXCreateGLXPixmap implemented by libglvnd
29 __ATTRIB(CreateGLXPixmapMESA
),
30 __ATTRIB(CreateGLXPixmapWithConfigSGIX
),
31 // glXCreateNewContext implemented by libglvnd
32 // glXCreatePbuffer implemented by libglvnd
33 // glXCreatePixmap implemented by libglvnd
34 // glXCreateWindow implemented by libglvnd
35 // glXDestroyContext implemented by libglvnd
36 __ATTRIB(DestroyGLXPbufferSGIX
),
37 // glXDestroyGLXPixmap implemented by libglvnd
38 // glXDestroyPbuffer implemented by libglvnd
39 // glXDestroyPixmap implemented by libglvnd
40 // glXDestroyWindow implemented by libglvnd
41 // glXFreeContextEXT implemented by libglvnd
42 // glXGetClientString implemented by libglvnd
43 // glXGetConfig implemented by libglvnd
44 __ATTRIB(GetContextIDEXT
),
45 // glXGetCurrentContext implemented by libglvnd
46 // glXGetCurrentDisplay implemented by libglvnd
47 __ATTRIB(GetCurrentDisplayEXT
),
48 // glXGetCurrentDrawable implemented by libglvnd
49 // glXGetCurrentReadDrawable implemented by libglvnd
50 __ATTRIB(GetDriverConfig
),
51 // glXGetFBConfigAttrib implemented by libglvnd
52 __ATTRIB(GetFBConfigAttribSGIX
),
53 __ATTRIB(GetFBConfigFromVisualSGIX
),
54 // glXGetFBConfigs implemented by libglvnd
55 __ATTRIB(GetMscRateOML
),
56 // glXGetProcAddress implemented by libglvnd
57 // glXGetProcAddressARB implemented by libglvnd
58 __ATTRIB(GetScreenDriver
),
59 // glXGetSelectedEvent implemented by libglvnd
60 __ATTRIB(GetSelectedEventSGIX
),
61 __ATTRIB(GetSwapIntervalMESA
),
62 __ATTRIB(GetSyncValuesOML
),
63 __ATTRIB(GetVideoSyncSGI
),
64 // glXGetVisualFromFBConfig implemented by libglvnd
65 __ATTRIB(GetVisualFromFBConfigSGIX
),
66 // glXImportContextEXT implemented by libglvnd
67 // glXIsDirect implemented by libglvnd
68 __ATTRIB(JoinSwapGroupSGIX
),
69 // glXMakeContextCurrent implemented by libglvnd
70 // glXMakeCurrent implemented by libglvnd
71 // glXQueryContext implemented by libglvnd
72 __ATTRIB(QueryContextInfoEXT
),
73 __ATTRIB(QueryCurrentRendererIntegerMESA
),
74 __ATTRIB(QueryCurrentRendererStringMESA
),
75 // glXQueryDrawable implemented by libglvnd
76 // glXQueryExtension implemented by libglvnd
77 // glXQueryExtensionsString implemented by libglvnd
78 __ATTRIB(QueryGLXPbufferSGIX
),
79 __ATTRIB(QueryMaxSwapBarriersSGIX
),
80 __ATTRIB(QueryRendererIntegerMESA
),
81 __ATTRIB(QueryRendererStringMESA
),
82 // glXQueryServerString implemented by libglvnd
83 // glXQueryVersion implemented by libglvnd
84 __ATTRIB(ReleaseBuffersMESA
),
85 __ATTRIB(ReleaseTexImageEXT
),
86 // glXSelectEvent implemented by libglvnd
87 __ATTRIB(SelectEventSGIX
),
88 // glXSwapBuffers implemented by libglvnd
89 __ATTRIB(SwapBuffersMscOML
),
90 __ATTRIB(SwapIntervalMESA
),
91 __ATTRIB(SwapIntervalSGI
),
92 // glXUseXFont implemented by libglvnd
93 __ATTRIB(WaitForMscOML
),
94 __ATTRIB(WaitForSbcOML
),
95 // glXWaitGL implemented by libglvnd
96 __ATTRIB(WaitVideoSyncSGI
),
97 // glXWaitX implemented by libglvnd
102 #define __FETCH_FUNCTION_PTR(func_name) \
103 p##func_name = (void *) \
104 __VND->fetchDispatchEntry(dd, __glXDispatchTableIndices[DI_##func_name])
107 static void dispatch_BindTexImageEXT(Display
*dpy
, GLXDrawable drawable
,
108 int buffer
, const int *attrib_list
)
110 PFNGLXBINDTEXIMAGEEXTPROC pBindTexImageEXT
;
113 dd
= GetDispatchFromDrawable(dpy
, drawable
);
117 __FETCH_FUNCTION_PTR(BindTexImageEXT
);
118 if (pBindTexImageEXT
== NULL
)
121 pBindTexImageEXT(dpy
, drawable
, buffer
, attrib_list
);
126 static GLXFBConfigSGIX
*dispatch_ChooseFBConfigSGIX(Display
*dpy
, int screen
,
130 PFNGLXCHOOSEFBCONFIGSGIXPROC pChooseFBConfigSGIX
;
132 GLXFBConfigSGIX
*ret
;
134 dd
= __VND
->getDynDispatch(dpy
, screen
);
138 __FETCH_FUNCTION_PTR(ChooseFBConfigSGIX
);
139 if (pChooseFBConfigSGIX
== NULL
)
142 ret
= pChooseFBConfigSGIX(dpy
, screen
, attrib_list
, nelements
);
143 if (AddFBConfigsMapping(dpy
, ret
, nelements
, dd
)) {
153 static GLXContext
dispatch_CreateContextAttribsARB(Display
*dpy
,
155 GLXContext share_list
,
157 const int *attrib_list
)
159 PFNGLXCREATECONTEXTATTRIBSARBPROC pCreateContextAttribsARB
;
164 dd
= GetDispatchFromFBConfig(dpy
, config
);
165 } else if (attrib_list
) {
168 for (i
= 0; attrib_list
[i
* 2] != None
; i
++) {
169 if (attrib_list
[i
* 2] == GLX_SCREEN
) {
170 screen
= attrib_list
[i
* 2 + 1];
171 dd
= GetDispatchFromDrawable(dpy
, RootWindow(dpy
, screen
));
179 __FETCH_FUNCTION_PTR(CreateContextAttribsARB
);
180 if (pCreateContextAttribsARB
== NULL
)
183 ret
= pCreateContextAttribsARB(dpy
, config
, share_list
, direct
, attrib_list
);
184 if (AddContextMapping(dpy
, ret
, dd
)) {
185 /* XXX: Call glXDestroyContext which lives in libglvnd. If we're not
186 * allowed to call it from here, should we extend __glXDispatchTableIndices ?
196 static GLXContext
dispatch_CreateContextWithConfigSGIX(Display
*dpy
,
197 GLXFBConfigSGIX config
,
199 GLXContext share_list
,
202 PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC pCreateContextWithConfigSGIX
;
206 dd
= GetDispatchFromFBConfig(dpy
, config
);
210 __FETCH_FUNCTION_PTR(CreateContextWithConfigSGIX
);
211 if (pCreateContextWithConfigSGIX
== NULL
)
214 ret
= pCreateContextWithConfigSGIX(dpy
, config
, render_type
, share_list
, direct
);
215 if (AddContextMapping(dpy
, ret
, dd
)) {
216 /* XXX: Call glXDestroyContext which lives in libglvnd. If we're not
217 * allowed to call it from here, should we extend __glXDispatchTableIndices ?
227 static GLXPbuffer
dispatch_CreateGLXPbufferSGIX(Display
*dpy
,
233 PFNGLXCREATEGLXPBUFFERSGIXPROC pCreateGLXPbufferSGIX
;
237 dd
= GetDispatchFromFBConfig(dpy
, config
);
241 __FETCH_FUNCTION_PTR(CreateGLXPbufferSGIX
);
242 if (pCreateGLXPbufferSGIX
== NULL
)
245 ret
= pCreateGLXPbufferSGIX(dpy
, config
, width
, height
, attrib_list
);
246 if (AddDrawableMapping(dpy
, ret
, dd
)) {
247 PFNGLXDESTROYGLXPBUFFERSGIXPROC pDestroyGLXPbufferSGIX
;
249 __FETCH_FUNCTION_PTR(DestroyGLXPbufferSGIX
);
250 if (pDestroyGLXPbufferSGIX
)
251 pDestroyGLXPbufferSGIX(dpy
, ret
);
261 static GLXPixmap
dispatch_CreateGLXPixmapWithConfigSGIX(Display
*dpy
,
262 GLXFBConfigSGIX config
,
265 PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC pCreateGLXPixmapWithConfigSGIX
;
269 dd
= GetDispatchFromFBConfig(dpy
, config
);
273 __FETCH_FUNCTION_PTR(CreateGLXPixmapWithConfigSGIX
);
274 if (pCreateGLXPixmapWithConfigSGIX
== NULL
)
277 ret
= pCreateGLXPixmapWithConfigSGIX(dpy
, config
, pixmap
);
278 if (AddDrawableMapping(dpy
, ret
, dd
)) {
279 /* XXX: Call glXDestroyGLXPixmap which lives in libglvnd. If we're not
280 * allowed to call it from here, should we extend __glXDispatchTableIndices ?
290 static void dispatch_DestroyGLXPbufferSGIX(Display
*dpy
, GLXPbuffer pbuf
)
292 PFNGLXDESTROYGLXPBUFFERSGIXPROC pDestroyGLXPbufferSGIX
;
295 dd
= GetDispatchFromDrawable(dpy
, pbuf
);
299 __FETCH_FUNCTION_PTR(DestroyGLXPbufferSGIX
);
300 if (pDestroyGLXPbufferSGIX
== NULL
)
303 pDestroyGLXPbufferSGIX(dpy
, pbuf
);
308 static GLXContextID
dispatch_GetContextIDEXT(const GLXContext ctx
)
310 PFNGLXGETCONTEXTIDEXTPROC pGetContextIDEXT
;
313 dd
= GetDispatchFromContext(ctx
);
317 __FETCH_FUNCTION_PTR(GetContextIDEXT
);
318 if (pGetContextIDEXT
== NULL
)
321 return pGetContextIDEXT(ctx
);
326 static Display
*dispatch_GetCurrentDisplayEXT(void)
328 PFNGLXGETCURRENTDISPLAYEXTPROC pGetCurrentDisplayEXT
;
331 if (!__VND
->getCurrentContext())
334 dd
= __VND
->getCurrentDynDispatch();
338 __FETCH_FUNCTION_PTR(GetCurrentDisplayEXT
);
339 if (pGetCurrentDisplayEXT
== NULL
)
342 return pGetCurrentDisplayEXT();
347 static const char *dispatch_GetDriverConfig(const char *driverName
)
349 #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
351 * The options are constant for a given driverName, so we do not need
352 * a context (and apps expect to be able to call this without one).
354 return glXGetDriverConfig(driverName
);
362 static int dispatch_GetFBConfigAttribSGIX(Display
*dpy
, GLXFBConfigSGIX config
,
363 int attribute
, int *value_return
)
365 PFNGLXGETFBCONFIGATTRIBSGIXPROC pGetFBConfigAttribSGIX
;
368 dd
= GetDispatchFromFBConfig(dpy
, config
);
370 return GLX_NO_EXTENSION
;
372 __FETCH_FUNCTION_PTR(GetFBConfigAttribSGIX
);
373 if (pGetFBConfigAttribSGIX
== NULL
)
374 return GLX_NO_EXTENSION
;
376 return pGetFBConfigAttribSGIX(dpy
, config
, attribute
, value_return
);
381 static GLXFBConfigSGIX
dispatch_GetFBConfigFromVisualSGIX(Display
*dpy
,
384 PFNGLXGETFBCONFIGFROMVISUALSGIXPROC pGetFBConfigFromVisualSGIX
;
386 GLXFBConfigSGIX ret
= NULL
;
388 dd
= GetDispatchFromVisual(dpy
, vis
);
392 __FETCH_FUNCTION_PTR(GetFBConfigFromVisualSGIX
);
393 if (pGetFBConfigFromVisualSGIX
== NULL
)
396 ret
= pGetFBConfigFromVisualSGIX(dpy
, vis
);
397 if (AddFBConfigMapping(dpy
, ret
, dd
))
398 /* XXX: dealloc ret ? */
406 static void dispatch_GetSelectedEventSGIX(Display
*dpy
, GLXDrawable drawable
,
409 PFNGLXGETSELECTEDEVENTSGIXPROC pGetSelectedEventSGIX
;
412 dd
= GetDispatchFromDrawable(dpy
, drawable
);
416 __FETCH_FUNCTION_PTR(GetSelectedEventSGIX
);
417 if (pGetSelectedEventSGIX
== NULL
)
420 pGetSelectedEventSGIX(dpy
, drawable
, mask
);
425 static int dispatch_GetVideoSyncSGI(unsigned int *count
)
427 PFNGLXGETVIDEOSYNCSGIPROC pGetVideoSyncSGI
;
430 if (!__VND
->getCurrentContext())
431 return GLX_BAD_CONTEXT
;
433 dd
= __VND
->getCurrentDynDispatch();
435 return GLX_NO_EXTENSION
;
437 __FETCH_FUNCTION_PTR(GetVideoSyncSGI
);
438 if (pGetVideoSyncSGI
== NULL
)
439 return GLX_NO_EXTENSION
;
441 return pGetVideoSyncSGI(count
);
446 static XVisualInfo
*dispatch_GetVisualFromFBConfigSGIX(Display
*dpy
,
447 GLXFBConfigSGIX config
)
449 PFNGLXGETVISUALFROMFBCONFIGSGIXPROC pGetVisualFromFBConfigSGIX
;
452 dd
= GetDispatchFromFBConfig(dpy
, config
);
456 __FETCH_FUNCTION_PTR(GetVisualFromFBConfigSGIX
);
457 if (pGetVisualFromFBConfigSGIX
== NULL
)
460 return pGetVisualFromFBConfigSGIX(dpy
, config
);
465 static int dispatch_QueryContextInfoEXT(Display
*dpy
, GLXContext ctx
,
466 int attribute
, int *value
)
468 PFNGLXQUERYCONTEXTINFOEXTPROC pQueryContextInfoEXT
;
471 dd
= GetDispatchFromContext(ctx
);
473 return GLX_NO_EXTENSION
;
475 __FETCH_FUNCTION_PTR(QueryContextInfoEXT
);
476 if (pQueryContextInfoEXT
== NULL
)
477 return GLX_NO_EXTENSION
;
479 return pQueryContextInfoEXT(dpy
, ctx
, attribute
, value
);
484 static void dispatch_QueryGLXPbufferSGIX(Display
*dpy
, GLXPbuffer pbuf
,
485 int attribute
, unsigned int *value
)
487 PFNGLXQUERYGLXPBUFFERSGIXPROC pQueryGLXPbufferSGIX
;
490 dd
= GetDispatchFromDrawable(dpy
, pbuf
);
494 __FETCH_FUNCTION_PTR(QueryGLXPbufferSGIX
);
495 if (pQueryGLXPbufferSGIX
== NULL
)
498 pQueryGLXPbufferSGIX(dpy
, pbuf
, attribute
, value
);
503 static void dispatch_ReleaseTexImageEXT(Display
*dpy
, GLXDrawable drawable
,
506 PFNGLXRELEASETEXIMAGEEXTPROC pReleaseTexImageEXT
;
509 dd
= GetDispatchFromDrawable(dpy
, drawable
);
513 __FETCH_FUNCTION_PTR(ReleaseTexImageEXT
);
514 if (pReleaseTexImageEXT
== NULL
)
517 pReleaseTexImageEXT(dpy
, drawable
, buffer
);
522 static void dispatch_SelectEventSGIX(Display
*dpy
, GLXDrawable drawable
,
525 PFNGLXSELECTEVENTSGIXPROC pSelectEventSGIX
;
528 dd
= GetDispatchFromDrawable(dpy
, drawable
);
532 __FETCH_FUNCTION_PTR(SelectEventSGIX
);
533 if (pSelectEventSGIX
== NULL
)
536 pSelectEventSGIX(dpy
, drawable
, mask
);
541 static int dispatch_SwapIntervalSGI(int interval
)
543 PFNGLXSWAPINTERVALSGIPROC pSwapIntervalSGI
;
546 if (!__VND
->getCurrentContext())
547 return GLX_BAD_CONTEXT
;
549 dd
= __VND
->getCurrentDynDispatch();
551 return GLX_NO_EXTENSION
;
553 __FETCH_FUNCTION_PTR(SwapIntervalSGI
);
554 if (pSwapIntervalSGI
== NULL
)
555 return GLX_NO_EXTENSION
;
557 return pSwapIntervalSGI(interval
);
562 static int dispatch_WaitVideoSyncSGI(int divisor
, int remainder
,
565 PFNGLXWAITVIDEOSYNCSGIPROC pWaitVideoSyncSGI
;
568 if (!__VND
->getCurrentContext())
569 return GLX_BAD_CONTEXT
;
571 dd
= __VND
->getCurrentDynDispatch();
573 return GLX_NO_EXTENSION
;
575 __FETCH_FUNCTION_PTR(WaitVideoSyncSGI
);
576 if (pWaitVideoSyncSGI
== NULL
)
577 return GLX_NO_EXTENSION
;
579 return pWaitVideoSyncSGI(divisor
, remainder
, count
);
584 static void dispatch_BindSwapBarrierSGIX(Display
*dpy
, GLXDrawable drawable
,
587 PFNGLXBINDSWAPBARRIERSGIXPROC pBindSwapBarrierSGIX
;
590 dd
= GetDispatchFromDrawable(dpy
, drawable
);
594 __FETCH_FUNCTION_PTR(BindSwapBarrierSGIX
);
595 if (pBindSwapBarrierSGIX
== NULL
)
598 pBindSwapBarrierSGIX(dpy
, drawable
, barrier
);
603 static void dispatch_CopySubBufferMESA(Display
*dpy
, GLXDrawable drawable
,
604 int x
, int y
, int width
, int height
)
606 PFNGLXCOPYSUBBUFFERMESAPROC pCopySubBufferMESA
;
609 dd
= GetDispatchFromDrawable(dpy
, drawable
);
613 __FETCH_FUNCTION_PTR(CopySubBufferMESA
);
614 if (pCopySubBufferMESA
== NULL
)
617 pCopySubBufferMESA(dpy
, drawable
, x
, y
, width
, height
);
622 static GLXPixmap
dispatch_CreateGLXPixmapMESA(Display
*dpy
,
623 XVisualInfo
*visinfo
,
624 Pixmap pixmap
, Colormap cmap
)
626 PFNGLXCREATEGLXPIXMAPMESAPROC pCreateGLXPixmapMESA
;
630 dd
= GetDispatchFromVisual(dpy
, visinfo
);
634 __FETCH_FUNCTION_PTR(CreateGLXPixmapMESA
);
635 if (pCreateGLXPixmapMESA
== NULL
)
638 ret
= pCreateGLXPixmapMESA(dpy
, visinfo
, pixmap
, cmap
);
639 if (AddDrawableMapping(dpy
, ret
, dd
)) {
640 /* XXX: Call glXDestroyGLXPixmap which lives in libglvnd. If we're not
641 * allowed to call it from here, should we extend __glXDispatchTableIndices ?
651 static GLboolean
dispatch_GetMscRateOML(Display
*dpy
, GLXDrawable drawable
,
652 int32_t *numerator
, int32_t *denominator
)
654 PFNGLXGETMSCRATEOMLPROC pGetMscRateOML
;
657 dd
= GetDispatchFromDrawable(dpy
, drawable
);
661 __FETCH_FUNCTION_PTR(GetMscRateOML
);
662 if (pGetMscRateOML
== NULL
)
665 return pGetMscRateOML(dpy
, drawable
, numerator
, denominator
);
670 static const char *dispatch_GetScreenDriver(Display
*dpy
, int scrNum
)
672 typedef const char *(*fn_glXGetScreenDriver_ptr
)(Display
*dpy
, int scrNum
);
673 fn_glXGetScreenDriver_ptr pGetScreenDriver
;
676 dd
= __VND
->getDynDispatch(dpy
, scrNum
);
680 __FETCH_FUNCTION_PTR(GetScreenDriver
);
681 if (pGetScreenDriver
== NULL
)
684 return pGetScreenDriver(dpy
, scrNum
);
689 static int dispatch_GetSwapIntervalMESA(void)
691 PFNGLXGETSWAPINTERVALMESAPROC pGetSwapIntervalMESA
;
694 if (!__VND
->getCurrentContext())
695 return GLX_BAD_CONTEXT
;
697 dd
= __VND
->getCurrentDynDispatch();
701 __FETCH_FUNCTION_PTR(GetSwapIntervalMESA
);
702 if (pGetSwapIntervalMESA
== NULL
)
705 return pGetSwapIntervalMESA();
710 static Bool
dispatch_GetSyncValuesOML(Display
*dpy
, GLXDrawable drawable
,
711 int64_t *ust
, int64_t *msc
, int64_t *sbc
)
713 PFNGLXGETSYNCVALUESOMLPROC pGetSyncValuesOML
;
716 dd
= GetDispatchFromDrawable(dpy
, drawable
);
720 __FETCH_FUNCTION_PTR(GetSyncValuesOML
);
721 if (pGetSyncValuesOML
== NULL
)
724 return pGetSyncValuesOML(dpy
, drawable
, ust
, msc
, sbc
);
729 static void dispatch_JoinSwapGroupSGIX(Display
*dpy
, GLXDrawable drawable
,
732 PFNGLXJOINSWAPGROUPSGIXPROC pJoinSwapGroupSGIX
;
735 dd
= GetDispatchFromDrawable(dpy
, drawable
);
739 __FETCH_FUNCTION_PTR(JoinSwapGroupSGIX
);
740 if (pJoinSwapGroupSGIX
== NULL
)
743 pJoinSwapGroupSGIX(dpy
, drawable
, member
);
748 static Bool
dispatch_QueryCurrentRendererIntegerMESA(int attribute
,
751 PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC pQueryCurrentRendererIntegerMESA
;
754 if (!__VND
->getCurrentContext())
757 dd
= __VND
->getCurrentDynDispatch();
761 __FETCH_FUNCTION_PTR(QueryCurrentRendererIntegerMESA
);
762 if (pQueryCurrentRendererIntegerMESA
== NULL
)
765 return pQueryCurrentRendererIntegerMESA(attribute
, value
);
770 static const char *dispatch_QueryCurrentRendererStringMESA(int attribute
)
772 PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC pQueryCurrentRendererStringMESA
;
775 if (!__VND
->getCurrentContext())
778 dd
= __VND
->getCurrentDynDispatch();
782 __FETCH_FUNCTION_PTR(QueryCurrentRendererStringMESA
);
783 if (pQueryCurrentRendererStringMESA
== NULL
)
786 return pQueryCurrentRendererStringMESA(attribute
);
791 static Bool
dispatch_QueryMaxSwapBarriersSGIX(Display
*dpy
, int screen
,
794 PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC pQueryMaxSwapBarriersSGIX
;
797 dd
= __VND
->getDynDispatch(dpy
, screen
);
801 __FETCH_FUNCTION_PTR(QueryMaxSwapBarriersSGIX
);
802 if (pQueryMaxSwapBarriersSGIX
== NULL
)
805 return pQueryMaxSwapBarriersSGIX(dpy
, screen
, max
);
810 static Bool
dispatch_QueryRendererIntegerMESA(Display
*dpy
, int screen
,
811 int renderer
, int attribute
,
814 PFNGLXQUERYRENDERERINTEGERMESAPROC pQueryRendererIntegerMESA
;
817 dd
= __VND
->getDynDispatch(dpy
, screen
);
821 __FETCH_FUNCTION_PTR(QueryRendererIntegerMESA
);
822 if (pQueryRendererIntegerMESA
== NULL
)
825 return pQueryRendererIntegerMESA(dpy
, screen
, renderer
, attribute
, value
);
830 static const char *dispatch_QueryRendererStringMESA(Display
*dpy
, int screen
,
831 int renderer
, int attribute
)
833 PFNGLXQUERYRENDERERSTRINGMESAPROC pQueryRendererStringMESA
;
834 __GLXvendorInfo
*dd
= NULL
;
836 dd
= __VND
->getDynDispatch(dpy
, screen
);
840 __FETCH_FUNCTION_PTR(QueryRendererStringMESA
);
841 if (pQueryRendererStringMESA
== NULL
)
844 return pQueryRendererStringMESA(dpy
, screen
, renderer
, attribute
);
849 static Bool
dispatch_ReleaseBuffersMESA(Display
*dpy
, GLXDrawable d
)
851 PFNGLXRELEASEBUFFERSMESAPROC pReleaseBuffersMESA
;
854 dd
= GetDispatchFromDrawable(dpy
, d
);
858 __FETCH_FUNCTION_PTR(ReleaseBuffersMESA
);
859 if (pReleaseBuffersMESA
== NULL
)
862 return pReleaseBuffersMESA(dpy
, d
);
867 static int64_t dispatch_SwapBuffersMscOML(Display
*dpy
, GLXDrawable drawable
,
868 int64_t target_msc
, int64_t divisor
,
871 PFNGLXSWAPBUFFERSMSCOMLPROC pSwapBuffersMscOML
;
874 dd
= GetDispatchFromDrawable(dpy
, drawable
);
878 __FETCH_FUNCTION_PTR(SwapBuffersMscOML
);
879 if (pSwapBuffersMscOML
== NULL
)
882 return pSwapBuffersMscOML(dpy
, drawable
, target_msc
, divisor
, remainder
);
887 static int dispatch_SwapIntervalMESA(unsigned int interval
)
889 PFNGLXSWAPINTERVALMESAPROC pSwapIntervalMESA
;
892 if (!__VND
->getCurrentContext())
893 return GLX_BAD_CONTEXT
;
895 dd
= __VND
->getCurrentDynDispatch();
899 __FETCH_FUNCTION_PTR(SwapIntervalMESA
);
900 if (pSwapIntervalMESA
== NULL
)
903 return pSwapIntervalMESA(interval
);
908 static Bool
dispatch_WaitForMscOML(Display
*dpy
, GLXDrawable drawable
,
909 int64_t target_msc
, int64_t divisor
,
910 int64_t remainder
, int64_t *ust
,
911 int64_t *msc
, int64_t *sbc
)
913 PFNGLXWAITFORMSCOMLPROC pWaitForMscOML
;
916 dd
= GetDispatchFromDrawable(dpy
, drawable
);
920 __FETCH_FUNCTION_PTR(WaitForMscOML
);
921 if (pWaitForMscOML
== NULL
)
924 return pWaitForMscOML(dpy
, drawable
, target_msc
, divisor
, remainder
, ust
, msc
, sbc
);
929 static Bool
dispatch_WaitForSbcOML(Display
*dpy
, GLXDrawable drawable
,
930 int64_t target_sbc
, int64_t *ust
,
931 int64_t *msc
, int64_t *sbc
)
933 PFNGLXWAITFORSBCOMLPROC pWaitForSbcOML
;
936 dd
= GetDispatchFromDrawable(dpy
, drawable
);
940 __FETCH_FUNCTION_PTR(WaitForSbcOML
);
941 if (pWaitForSbcOML
== NULL
)
944 return pWaitForSbcOML(dpy
, drawable
, target_sbc
, ust
, msc
, sbc
);
947 #undef __FETCH_FUNCTION_PTR
950 /* Allocate an extra 'dummy' to ease lookup. See FindGLXFunction() */
951 const void * const __glXDispatchFunctions
[DI_LAST_INDEX
+ 1] = {
952 #define __ATTRIB(field) \
953 [DI_##field] = (void *)dispatch_##field
955 __ATTRIB(BindSwapBarrierSGIX
),
956 __ATTRIB(BindTexImageEXT
),
957 __ATTRIB(ChooseFBConfigSGIX
),
958 __ATTRIB(CopySubBufferMESA
),
959 __ATTRIB(CreateContextAttribsARB
),
960 __ATTRIB(CreateContextWithConfigSGIX
),
961 __ATTRIB(CreateGLXPbufferSGIX
),
962 __ATTRIB(CreateGLXPixmapMESA
),
963 __ATTRIB(CreateGLXPixmapWithConfigSGIX
),
964 __ATTRIB(DestroyGLXPbufferSGIX
),
965 __ATTRIB(GetContextIDEXT
),
966 __ATTRIB(GetCurrentDisplayEXT
),
967 __ATTRIB(GetDriverConfig
),
968 __ATTRIB(GetFBConfigAttribSGIX
),
969 __ATTRIB(GetFBConfigFromVisualSGIX
),
970 __ATTRIB(GetMscRateOML
),
971 __ATTRIB(GetScreenDriver
),
972 __ATTRIB(GetSelectedEventSGIX
),
973 __ATTRIB(GetSwapIntervalMESA
),
974 __ATTRIB(GetSyncValuesOML
),
975 __ATTRIB(GetVideoSyncSGI
),
976 __ATTRIB(GetVisualFromFBConfigSGIX
),
977 __ATTRIB(JoinSwapGroupSGIX
),
978 __ATTRIB(QueryContextInfoEXT
),
979 __ATTRIB(QueryCurrentRendererIntegerMESA
),
980 __ATTRIB(QueryCurrentRendererStringMESA
),
981 __ATTRIB(QueryGLXPbufferSGIX
),
982 __ATTRIB(QueryMaxSwapBarriersSGIX
),
983 __ATTRIB(QueryRendererIntegerMESA
),
984 __ATTRIB(QueryRendererStringMESA
),
985 __ATTRIB(ReleaseBuffersMESA
),
986 __ATTRIB(ReleaseTexImageEXT
),
987 __ATTRIB(SelectEventSGIX
),
988 __ATTRIB(SwapBuffersMscOML
),
989 __ATTRIB(SwapIntervalMESA
),
990 __ATTRIB(SwapIntervalSGI
),
991 __ATTRIB(WaitForMscOML
),
992 __ATTRIB(WaitForSbcOML
),
993 __ATTRIB(WaitVideoSyncSGI
),
995 [DI_LAST_INDEX
] = NULL
,