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
;
163 dd
= GetDispatchFromFBConfig(dpy
, config
);
167 __FETCH_FUNCTION_PTR(CreateContextAttribsARB
);
168 if (pCreateContextAttribsARB
== NULL
)
171 ret
= pCreateContextAttribsARB(dpy
, config
, share_list
, direct
, attrib_list
);
172 if (AddContextMapping(dpy
, ret
, dd
)) {
173 /* XXX: Call glXDestroyContext which lives in libglvnd. If we're not
174 * allowed to call it from here, should we extend __glXDispatchTableIndices ?
184 static GLXContext
dispatch_CreateContextWithConfigSGIX(Display
*dpy
,
185 GLXFBConfigSGIX config
,
187 GLXContext share_list
,
190 PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC pCreateContextWithConfigSGIX
;
194 dd
= GetDispatchFromFBConfig(dpy
, config
);
198 __FETCH_FUNCTION_PTR(CreateContextWithConfigSGIX
);
199 if (pCreateContextWithConfigSGIX
== NULL
)
202 ret
= pCreateContextWithConfigSGIX(dpy
, config
, render_type
, share_list
, direct
);
203 if (AddContextMapping(dpy
, ret
, dd
)) {
204 /* XXX: Call glXDestroyContext which lives in libglvnd. If we're not
205 * allowed to call it from here, should we extend __glXDispatchTableIndices ?
215 static GLXPbuffer
dispatch_CreateGLXPbufferSGIX(Display
*dpy
,
221 PFNGLXCREATEGLXPBUFFERSGIXPROC pCreateGLXPbufferSGIX
;
225 dd
= GetDispatchFromFBConfig(dpy
, config
);
229 __FETCH_FUNCTION_PTR(CreateGLXPbufferSGIX
);
230 if (pCreateGLXPbufferSGIX
== NULL
)
233 ret
= pCreateGLXPbufferSGIX(dpy
, config
, width
, height
, attrib_list
);
234 if (AddDrawableMapping(dpy
, ret
, dd
)) {
235 PFNGLXDESTROYGLXPBUFFERSGIXPROC pDestroyGLXPbufferSGIX
;
237 __FETCH_FUNCTION_PTR(DestroyGLXPbufferSGIX
);
238 if (pDestroyGLXPbufferSGIX
)
239 pDestroyGLXPbufferSGIX(dpy
, ret
);
249 static GLXPixmap
dispatch_CreateGLXPixmapWithConfigSGIX(Display
*dpy
,
250 GLXFBConfigSGIX config
,
253 PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC pCreateGLXPixmapWithConfigSGIX
;
257 dd
= GetDispatchFromFBConfig(dpy
, config
);
261 __FETCH_FUNCTION_PTR(CreateGLXPixmapWithConfigSGIX
);
262 if (pCreateGLXPixmapWithConfigSGIX
== NULL
)
265 ret
= pCreateGLXPixmapWithConfigSGIX(dpy
, config
, pixmap
);
266 if (AddDrawableMapping(dpy
, ret
, dd
)) {
267 /* XXX: Call glXDestroyGLXPixmap which lives in libglvnd. If we're not
268 * allowed to call it from here, should we extend __glXDispatchTableIndices ?
278 static void dispatch_DestroyGLXPbufferSGIX(Display
*dpy
, GLXPbuffer pbuf
)
280 PFNGLXDESTROYGLXPBUFFERSGIXPROC pDestroyGLXPbufferSGIX
;
283 dd
= GetDispatchFromDrawable(dpy
, pbuf
);
287 __FETCH_FUNCTION_PTR(DestroyGLXPbufferSGIX
);
288 if (pDestroyGLXPbufferSGIX
== NULL
)
291 pDestroyGLXPbufferSGIX(dpy
, pbuf
);
296 static GLXContextID
dispatch_GetContextIDEXT(const GLXContext ctx
)
298 PFNGLXGETCONTEXTIDEXTPROC pGetContextIDEXT
;
301 dd
= GetDispatchFromContext(ctx
);
305 __FETCH_FUNCTION_PTR(GetContextIDEXT
);
306 if (pGetContextIDEXT
== NULL
)
309 return pGetContextIDEXT(ctx
);
314 static Display
*dispatch_GetCurrentDisplayEXT(void)
316 PFNGLXGETCURRENTDISPLAYEXTPROC pGetCurrentDisplayEXT
;
319 if (!__VND
->getCurrentContext())
322 dd
= __VND
->getCurrentDynDispatch();
326 __FETCH_FUNCTION_PTR(GetCurrentDisplayEXT
);
327 if (pGetCurrentDisplayEXT
== NULL
)
330 return pGetCurrentDisplayEXT();
335 static const char *dispatch_GetDriverConfig(const char *driverName
)
337 #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
339 * The options are constant for a given driverName, so we do not need
340 * a context (and apps expect to be able to call this without one).
342 return glXGetDriverConfig(driverName
);
350 static int dispatch_GetFBConfigAttribSGIX(Display
*dpy
, GLXFBConfigSGIX config
,
351 int attribute
, int *value_return
)
353 PFNGLXGETFBCONFIGATTRIBSGIXPROC pGetFBConfigAttribSGIX
;
356 dd
= GetDispatchFromFBConfig(dpy
, config
);
358 return GLX_NO_EXTENSION
;
360 __FETCH_FUNCTION_PTR(GetFBConfigAttribSGIX
);
361 if (pGetFBConfigAttribSGIX
== NULL
)
362 return GLX_NO_EXTENSION
;
364 return pGetFBConfigAttribSGIX(dpy
, config
, attribute
, value_return
);
369 static GLXFBConfigSGIX
dispatch_GetFBConfigFromVisualSGIX(Display
*dpy
,
372 PFNGLXGETFBCONFIGFROMVISUALSGIXPROC pGetFBConfigFromVisualSGIX
;
374 GLXFBConfigSGIX ret
= NULL
;
376 dd
= GetDispatchFromVisual(dpy
, vis
);
380 __FETCH_FUNCTION_PTR(GetFBConfigFromVisualSGIX
);
381 if (pGetFBConfigFromVisualSGIX
== NULL
)
384 ret
= pGetFBConfigFromVisualSGIX(dpy
, vis
);
385 if (AddFBConfigMapping(dpy
, ret
, dd
))
386 /* XXX: dealloc ret ? */
394 static void dispatch_GetSelectedEventSGIX(Display
*dpy
, GLXDrawable drawable
,
397 PFNGLXGETSELECTEDEVENTSGIXPROC pGetSelectedEventSGIX
;
400 dd
= GetDispatchFromDrawable(dpy
, drawable
);
404 __FETCH_FUNCTION_PTR(GetSelectedEventSGIX
);
405 if (pGetSelectedEventSGIX
== NULL
)
408 pGetSelectedEventSGIX(dpy
, drawable
, mask
);
413 static int dispatch_GetVideoSyncSGI(unsigned int *count
)
415 PFNGLXGETVIDEOSYNCSGIPROC pGetVideoSyncSGI
;
418 if (!__VND
->getCurrentContext())
419 return GLX_BAD_CONTEXT
;
421 dd
= __VND
->getCurrentDynDispatch();
423 return GLX_NO_EXTENSION
;
425 __FETCH_FUNCTION_PTR(GetVideoSyncSGI
);
426 if (pGetVideoSyncSGI
== NULL
)
427 return GLX_NO_EXTENSION
;
429 return pGetVideoSyncSGI(count
);
434 static XVisualInfo
*dispatch_GetVisualFromFBConfigSGIX(Display
*dpy
,
435 GLXFBConfigSGIX config
)
437 PFNGLXGETVISUALFROMFBCONFIGSGIXPROC pGetVisualFromFBConfigSGIX
;
440 dd
= GetDispatchFromFBConfig(dpy
, config
);
444 __FETCH_FUNCTION_PTR(GetVisualFromFBConfigSGIX
);
445 if (pGetVisualFromFBConfigSGIX
== NULL
)
448 return pGetVisualFromFBConfigSGIX(dpy
, config
);
453 static int dispatch_QueryContextInfoEXT(Display
*dpy
, GLXContext ctx
,
454 int attribute
, int *value
)
456 PFNGLXQUERYCONTEXTINFOEXTPROC pQueryContextInfoEXT
;
459 dd
= GetDispatchFromContext(ctx
);
461 return GLX_NO_EXTENSION
;
463 __FETCH_FUNCTION_PTR(QueryContextInfoEXT
);
464 if (pQueryContextInfoEXT
== NULL
)
465 return GLX_NO_EXTENSION
;
467 return pQueryContextInfoEXT(dpy
, ctx
, attribute
, value
);
472 static void dispatch_QueryGLXPbufferSGIX(Display
*dpy
, GLXPbuffer pbuf
,
473 int attribute
, unsigned int *value
)
475 PFNGLXQUERYGLXPBUFFERSGIXPROC pQueryGLXPbufferSGIX
;
478 dd
= GetDispatchFromDrawable(dpy
, pbuf
);
482 __FETCH_FUNCTION_PTR(QueryGLXPbufferSGIX
);
483 if (pQueryGLXPbufferSGIX
== NULL
)
486 pQueryGLXPbufferSGIX(dpy
, pbuf
, attribute
, value
);
491 static void dispatch_ReleaseTexImageEXT(Display
*dpy
, GLXDrawable drawable
,
494 PFNGLXRELEASETEXIMAGEEXTPROC pReleaseTexImageEXT
;
497 dd
= GetDispatchFromDrawable(dpy
, drawable
);
501 __FETCH_FUNCTION_PTR(ReleaseTexImageEXT
);
502 if (pReleaseTexImageEXT
== NULL
)
505 pReleaseTexImageEXT(dpy
, drawable
, buffer
);
510 static void dispatch_SelectEventSGIX(Display
*dpy
, GLXDrawable drawable
,
513 PFNGLXSELECTEVENTSGIXPROC pSelectEventSGIX
;
516 dd
= GetDispatchFromDrawable(dpy
, drawable
);
520 __FETCH_FUNCTION_PTR(SelectEventSGIX
);
521 if (pSelectEventSGIX
== NULL
)
524 pSelectEventSGIX(dpy
, drawable
, mask
);
529 static int dispatch_SwapIntervalSGI(int interval
)
531 PFNGLXSWAPINTERVALSGIPROC pSwapIntervalSGI
;
534 if (!__VND
->getCurrentContext())
535 return GLX_BAD_CONTEXT
;
537 dd
= __VND
->getCurrentDynDispatch();
539 return GLX_NO_EXTENSION
;
541 __FETCH_FUNCTION_PTR(SwapIntervalSGI
);
542 if (pSwapIntervalSGI
== NULL
)
543 return GLX_NO_EXTENSION
;
545 return pSwapIntervalSGI(interval
);
550 static int dispatch_WaitVideoSyncSGI(int divisor
, int remainder
,
553 PFNGLXWAITVIDEOSYNCSGIPROC pWaitVideoSyncSGI
;
556 if (!__VND
->getCurrentContext())
557 return GLX_BAD_CONTEXT
;
559 dd
= __VND
->getCurrentDynDispatch();
561 return GLX_NO_EXTENSION
;
563 __FETCH_FUNCTION_PTR(WaitVideoSyncSGI
);
564 if (pWaitVideoSyncSGI
== NULL
)
565 return GLX_NO_EXTENSION
;
567 return pWaitVideoSyncSGI(divisor
, remainder
, count
);
572 static void dispatch_BindSwapBarrierSGIX(Display
*dpy
, GLXDrawable drawable
,
575 PFNGLXBINDSWAPBARRIERSGIXPROC pBindSwapBarrierSGIX
;
578 dd
= GetDispatchFromDrawable(dpy
, drawable
);
582 __FETCH_FUNCTION_PTR(BindSwapBarrierSGIX
);
583 if (pBindSwapBarrierSGIX
== NULL
)
586 pBindSwapBarrierSGIX(dpy
, drawable
, barrier
);
591 static void dispatch_CopySubBufferMESA(Display
*dpy
, GLXDrawable drawable
,
592 int x
, int y
, int width
, int height
)
594 PFNGLXCOPYSUBBUFFERMESAPROC pCopySubBufferMESA
;
597 dd
= GetDispatchFromDrawable(dpy
, drawable
);
601 __FETCH_FUNCTION_PTR(CopySubBufferMESA
);
602 if (pCopySubBufferMESA
== NULL
)
605 pCopySubBufferMESA(dpy
, drawable
, x
, y
, width
, height
);
610 static GLXPixmap
dispatch_CreateGLXPixmapMESA(Display
*dpy
,
611 XVisualInfo
*visinfo
,
612 Pixmap pixmap
, Colormap cmap
)
614 PFNGLXCREATEGLXPIXMAPMESAPROC pCreateGLXPixmapMESA
;
618 dd
= GetDispatchFromVisual(dpy
, visinfo
);
622 __FETCH_FUNCTION_PTR(CreateGLXPixmapMESA
);
623 if (pCreateGLXPixmapMESA
== NULL
)
626 ret
= pCreateGLXPixmapMESA(dpy
, visinfo
, pixmap
, cmap
);
627 if (AddDrawableMapping(dpy
, ret
, dd
)) {
628 /* XXX: Call glXDestroyGLXPixmap which lives in libglvnd. If we're not
629 * allowed to call it from here, should we extend __glXDispatchTableIndices ?
639 static GLboolean
dispatch_GetMscRateOML(Display
*dpy
, GLXDrawable drawable
,
640 int32_t *numerator
, int32_t *denominator
)
642 PFNGLXGETMSCRATEOMLPROC pGetMscRateOML
;
645 dd
= GetDispatchFromDrawable(dpy
, drawable
);
649 __FETCH_FUNCTION_PTR(GetMscRateOML
);
650 if (pGetMscRateOML
== NULL
)
653 return pGetMscRateOML(dpy
, drawable
, numerator
, denominator
);
658 static const char *dispatch_GetScreenDriver(Display
*dpy
, int scrNum
)
660 typedef const char *(*fn_glXGetScreenDriver_ptr
)(Display
*dpy
, int scrNum
);
661 fn_glXGetScreenDriver_ptr pGetScreenDriver
;
664 dd
= __VND
->getDynDispatch(dpy
, scrNum
);
668 __FETCH_FUNCTION_PTR(GetScreenDriver
);
669 if (pGetScreenDriver
== NULL
)
672 return pGetScreenDriver(dpy
, scrNum
);
677 static int dispatch_GetSwapIntervalMESA(void)
679 PFNGLXGETSWAPINTERVALMESAPROC pGetSwapIntervalMESA
;
682 if (!__VND
->getCurrentContext())
683 return GLX_BAD_CONTEXT
;
685 dd
= __VND
->getCurrentDynDispatch();
689 __FETCH_FUNCTION_PTR(GetSwapIntervalMESA
);
690 if (pGetSwapIntervalMESA
== NULL
)
693 return pGetSwapIntervalMESA();
698 static Bool
dispatch_GetSyncValuesOML(Display
*dpy
, GLXDrawable drawable
,
699 int64_t *ust
, int64_t *msc
, int64_t *sbc
)
701 PFNGLXGETSYNCVALUESOMLPROC pGetSyncValuesOML
;
704 dd
= GetDispatchFromDrawable(dpy
, drawable
);
708 __FETCH_FUNCTION_PTR(GetSyncValuesOML
);
709 if (pGetSyncValuesOML
== NULL
)
712 return pGetSyncValuesOML(dpy
, drawable
, ust
, msc
, sbc
);
717 static void dispatch_JoinSwapGroupSGIX(Display
*dpy
, GLXDrawable drawable
,
720 PFNGLXJOINSWAPGROUPSGIXPROC pJoinSwapGroupSGIX
;
723 dd
= GetDispatchFromDrawable(dpy
, drawable
);
727 __FETCH_FUNCTION_PTR(JoinSwapGroupSGIX
);
728 if (pJoinSwapGroupSGIX
== NULL
)
731 pJoinSwapGroupSGIX(dpy
, drawable
, member
);
736 static Bool
dispatch_QueryCurrentRendererIntegerMESA(int attribute
,
739 PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC pQueryCurrentRendererIntegerMESA
;
742 if (!__VND
->getCurrentContext())
745 dd
= __VND
->getCurrentDynDispatch();
749 __FETCH_FUNCTION_PTR(QueryCurrentRendererIntegerMESA
);
750 if (pQueryCurrentRendererIntegerMESA
== NULL
)
753 return pQueryCurrentRendererIntegerMESA(attribute
, value
);
758 static const char *dispatch_QueryCurrentRendererStringMESA(int attribute
)
760 PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC pQueryCurrentRendererStringMESA
;
763 if (!__VND
->getCurrentContext())
766 dd
= __VND
->getCurrentDynDispatch();
770 __FETCH_FUNCTION_PTR(QueryCurrentRendererStringMESA
);
771 if (pQueryCurrentRendererStringMESA
== NULL
)
774 return pQueryCurrentRendererStringMESA(attribute
);
779 static Bool
dispatch_QueryMaxSwapBarriersSGIX(Display
*dpy
, int screen
,
782 PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC pQueryMaxSwapBarriersSGIX
;
785 dd
= __VND
->getDynDispatch(dpy
, screen
);
789 __FETCH_FUNCTION_PTR(QueryMaxSwapBarriersSGIX
);
790 if (pQueryMaxSwapBarriersSGIX
== NULL
)
793 return pQueryMaxSwapBarriersSGIX(dpy
, screen
, max
);
798 static Bool
dispatch_QueryRendererIntegerMESA(Display
*dpy
, int screen
,
799 int renderer
, int attribute
,
802 PFNGLXQUERYRENDERERINTEGERMESAPROC pQueryRendererIntegerMESA
;
805 dd
= __VND
->getDynDispatch(dpy
, screen
);
809 __FETCH_FUNCTION_PTR(QueryRendererIntegerMESA
);
810 if (pQueryRendererIntegerMESA
== NULL
)
813 return pQueryRendererIntegerMESA(dpy
, screen
, renderer
, attribute
, value
);
818 static const char *dispatch_QueryRendererStringMESA(Display
*dpy
, int screen
,
819 int renderer
, int attribute
)
821 PFNGLXQUERYRENDERERSTRINGMESAPROC pQueryRendererStringMESA
;
822 __GLXvendorInfo
*dd
= NULL
;
824 dd
= __VND
->getDynDispatch(dpy
, screen
);
828 __FETCH_FUNCTION_PTR(QueryRendererStringMESA
);
829 if (pQueryRendererStringMESA
== NULL
)
832 return pQueryRendererStringMESA(dpy
, screen
, renderer
, attribute
);
837 static Bool
dispatch_ReleaseBuffersMESA(Display
*dpy
, GLXDrawable d
)
839 PFNGLXRELEASEBUFFERSMESAPROC pReleaseBuffersMESA
;
842 dd
= GetDispatchFromDrawable(dpy
, d
);
846 __FETCH_FUNCTION_PTR(ReleaseBuffersMESA
);
847 if (pReleaseBuffersMESA
== NULL
)
850 return pReleaseBuffersMESA(dpy
, d
);
855 static int64_t dispatch_SwapBuffersMscOML(Display
*dpy
, GLXDrawable drawable
,
856 int64_t target_msc
, int64_t divisor
,
859 PFNGLXSWAPBUFFERSMSCOMLPROC pSwapBuffersMscOML
;
862 dd
= GetDispatchFromDrawable(dpy
, drawable
);
866 __FETCH_FUNCTION_PTR(SwapBuffersMscOML
);
867 if (pSwapBuffersMscOML
== NULL
)
870 return pSwapBuffersMscOML(dpy
, drawable
, target_msc
, divisor
, remainder
);
875 static int dispatch_SwapIntervalMESA(unsigned int interval
)
877 PFNGLXSWAPINTERVALMESAPROC pSwapIntervalMESA
;
880 if (!__VND
->getCurrentContext())
881 return GLX_BAD_CONTEXT
;
883 dd
= __VND
->getCurrentDynDispatch();
887 __FETCH_FUNCTION_PTR(SwapIntervalMESA
);
888 if (pSwapIntervalMESA
== NULL
)
891 return pSwapIntervalMESA(interval
);
896 static Bool
dispatch_WaitForMscOML(Display
*dpy
, GLXDrawable drawable
,
897 int64_t target_msc
, int64_t divisor
,
898 int64_t remainder
, int64_t *ust
,
899 int64_t *msc
, int64_t *sbc
)
901 PFNGLXWAITFORMSCOMLPROC pWaitForMscOML
;
904 dd
= GetDispatchFromDrawable(dpy
, drawable
);
908 __FETCH_FUNCTION_PTR(WaitForMscOML
);
909 if (pWaitForMscOML
== NULL
)
912 return pWaitForMscOML(dpy
, drawable
, target_msc
, divisor
, remainder
, ust
, msc
, sbc
);
917 static Bool
dispatch_WaitForSbcOML(Display
*dpy
, GLXDrawable drawable
,
918 int64_t target_sbc
, int64_t *ust
,
919 int64_t *msc
, int64_t *sbc
)
921 PFNGLXWAITFORSBCOMLPROC pWaitForSbcOML
;
924 dd
= GetDispatchFromDrawable(dpy
, drawable
);
928 __FETCH_FUNCTION_PTR(WaitForSbcOML
);
929 if (pWaitForSbcOML
== NULL
)
932 return pWaitForSbcOML(dpy
, drawable
, target_sbc
, ust
, msc
, sbc
);
935 #undef __FETCH_FUNCTION_PTR
938 /* Allocate an extra 'dummy' to ease lookup. See FindGLXFunction() */
939 const void * const __glXDispatchFunctions
[DI_LAST_INDEX
+ 1] = {
940 #define __ATTRIB(field) \
941 [DI_##field] = (void *)dispatch_##field
943 __ATTRIB(BindSwapBarrierSGIX
),
944 __ATTRIB(BindTexImageEXT
),
945 __ATTRIB(ChooseFBConfigSGIX
),
946 __ATTRIB(CopySubBufferMESA
),
947 __ATTRIB(CreateContextAttribsARB
),
948 __ATTRIB(CreateContextWithConfigSGIX
),
949 __ATTRIB(CreateGLXPbufferSGIX
),
950 __ATTRIB(CreateGLXPixmapMESA
),
951 __ATTRIB(CreateGLXPixmapWithConfigSGIX
),
952 __ATTRIB(DestroyGLXPbufferSGIX
),
953 __ATTRIB(GetContextIDEXT
),
954 __ATTRIB(GetCurrentDisplayEXT
),
955 __ATTRIB(GetDriverConfig
),
956 __ATTRIB(GetFBConfigAttribSGIX
),
957 __ATTRIB(GetFBConfigFromVisualSGIX
),
958 __ATTRIB(GetMscRateOML
),
959 __ATTRIB(GetScreenDriver
),
960 __ATTRIB(GetSelectedEventSGIX
),
961 __ATTRIB(GetSwapIntervalMESA
),
962 __ATTRIB(GetSyncValuesOML
),
963 __ATTRIB(GetVideoSyncSGI
),
964 __ATTRIB(GetVisualFromFBConfigSGIX
),
965 __ATTRIB(JoinSwapGroupSGIX
),
966 __ATTRIB(QueryContextInfoEXT
),
967 __ATTRIB(QueryCurrentRendererIntegerMESA
),
968 __ATTRIB(QueryCurrentRendererStringMESA
),
969 __ATTRIB(QueryGLXPbufferSGIX
),
970 __ATTRIB(QueryMaxSwapBarriersSGIX
),
971 __ATTRIB(QueryRendererIntegerMESA
),
972 __ATTRIB(QueryRendererStringMESA
),
973 __ATTRIB(ReleaseBuffersMESA
),
974 __ATTRIB(ReleaseTexImageEXT
),
975 __ATTRIB(SelectEventSGIX
),
976 __ATTRIB(SwapBuffersMscOML
),
977 __ATTRIB(SwapIntervalMESA
),
978 __ATTRIB(SwapIntervalSGI
),
979 __ATTRIB(WaitForMscOML
),
980 __ATTRIB(WaitForSbcOML
),
981 __ATTRIB(WaitVideoSyncSGI
),
983 [DI_LAST_INDEX
] = NULL
,