Home | History | Annotate | Download | only in glx
      1 /*
      2  * THIS FILE IS AUTOMATICALLY GENERATED BY gen_scrn_dispatch.pl
      3  * DO NOT EDIT!!
      4  */
      5 #include <stdlib.h>
      6 
      7 #include "glxglvnd.h"
      8 #include "glxglvnddispatchfuncs.h"
      9 #include "g_glxglvnddispatchindices.h"
     10 
     11 const int DI_FUNCTION_COUNT = DI_LAST_INDEX;
     12 /* Allocate an extra 'dummy' to ease lookup. See FindGLXFunction() */
     13 int __glXDispatchTableIndices[DI_LAST_INDEX + 1];
     14 const __GLXapiExports *__glXGLVNDAPIExports;
     15 
     16 const char * const __glXDispatchTableStrings[DI_LAST_INDEX] = {
     17 #define __ATTRIB(field) \
     18     [DI_##field] = "glX"#field
     19 
     20     __ATTRIB(BindSwapBarrierSGIX),
     21     __ATTRIB(BindTexImageEXT),
     22     // glXChooseFBConfig implemented by libglvnd
     23     __ATTRIB(ChooseFBConfigSGIX),
     24     // glXChooseVisual implemented by libglvnd
     25     // glXCopyContext implemented by libglvnd
     26     __ATTRIB(CopySubBufferMESA),
     27     // glXCreateContext implemented by libglvnd
     28     __ATTRIB(CreateContextAttribsARB),
     29     __ATTRIB(CreateContextWithConfigSGIX),
     30     __ATTRIB(CreateGLXPbufferSGIX),
     31     // glXCreateGLXPixmap implemented by libglvnd
     32     __ATTRIB(CreateGLXPixmapMESA),
     33     __ATTRIB(CreateGLXPixmapWithConfigSGIX),
     34     // glXCreateNewContext implemented by libglvnd
     35     // glXCreatePbuffer implemented by libglvnd
     36     // glXCreatePixmap implemented by libglvnd
     37     // glXCreateWindow implemented by libglvnd
     38     // glXDestroyContext implemented by libglvnd
     39     __ATTRIB(DestroyGLXPbufferSGIX),
     40     // glXDestroyGLXPixmap implemented by libglvnd
     41     // glXDestroyPbuffer implemented by libglvnd
     42     // glXDestroyPixmap implemented by libglvnd
     43     // glXDestroyWindow implemented by libglvnd
     44     // glXFreeContextEXT implemented by libglvnd
     45     // glXGetClientString implemented by libglvnd
     46     // glXGetConfig implemented by libglvnd
     47     __ATTRIB(GetContextIDEXT),
     48     // glXGetCurrentContext implemented by libglvnd
     49     // glXGetCurrentDisplay implemented by libglvnd
     50     __ATTRIB(GetCurrentDisplayEXT),
     51     // glXGetCurrentDrawable implemented by libglvnd
     52     // glXGetCurrentReadDrawable implemented by libglvnd
     53     // glXGetFBConfigAttrib implemented by libglvnd
     54     __ATTRIB(GetFBConfigAttribSGIX),
     55     __ATTRIB(GetFBConfigFromVisualSGIX),
     56     // glXGetFBConfigs implemented by libglvnd
     57     __ATTRIB(GetMscRateOML),
     58     // glXGetProcAddress implemented by libglvnd
     59     // glXGetProcAddressARB implemented by libglvnd
     60     __ATTRIB(GetScreenDriver),
     61     // glXGetSelectedEvent implemented by libglvnd
     62     __ATTRIB(GetSelectedEventSGIX),
     63     __ATTRIB(GetSwapIntervalMESA),
     64     __ATTRIB(GetSyncValuesOML),
     65     __ATTRIB(GetVideoSyncSGI),
     66     // glXGetVisualFromFBConfig implemented by libglvnd
     67     __ATTRIB(GetVisualFromFBConfigSGIX),
     68     // glXImportContextEXT implemented by libglvnd
     69     // glXIsDirect implemented by libglvnd
     70     __ATTRIB(JoinSwapGroupSGIX),
     71     // glXMakeContextCurrent implemented by libglvnd
     72     // glXMakeCurrent implemented by libglvnd
     73     // glXQueryContext implemented by libglvnd
     74     __ATTRIB(QueryContextInfoEXT),
     75     __ATTRIB(QueryCurrentRendererIntegerMESA),
     76     __ATTRIB(QueryCurrentRendererStringMESA),
     77     // glXQueryDrawable implemented by libglvnd
     78     // glXQueryExtension implemented by libglvnd
     79     // glXQueryExtensionsString implemented by libglvnd
     80     __ATTRIB(QueryGLXPbufferSGIX),
     81     __ATTRIB(QueryMaxSwapBarriersSGIX),
     82     __ATTRIB(QueryRendererIntegerMESA),
     83     __ATTRIB(QueryRendererStringMESA),
     84     // glXQueryServerString implemented by libglvnd
     85     // glXQueryVersion implemented by libglvnd
     86     __ATTRIB(ReleaseBuffersMESA),
     87     __ATTRIB(ReleaseTexImageEXT),
     88     // glXSelectEvent implemented by libglvnd
     89     __ATTRIB(SelectEventSGIX),
     90     // glXSwapBuffers implemented by libglvnd
     91     __ATTRIB(SwapBuffersMscOML),
     92     __ATTRIB(SwapIntervalMESA),
     93     __ATTRIB(SwapIntervalSGI),
     94     // glXUseXFont implemented by libglvnd
     95     __ATTRIB(WaitForMscOML),
     96     __ATTRIB(WaitForSbcOML),
     97     // glXWaitGL implemented by libglvnd
     98     __ATTRIB(WaitVideoSyncSGI),
     99     // glXWaitX implemented by libglvnd
    100 
    101 #undef __ATTRIB
    102 };
    103 
    104 #define __FETCH_FUNCTION_PTR(func_name) \
    105     p##func_name = (void *) \
    106         __VND->fetchDispatchEntry(dd, __glXDispatchTableIndices[DI_##func_name])
    107 
    108 
    109 static void dispatch_BindTexImageEXT(Display *dpy, GLXDrawable drawable,
    110                                      int buffer, const int *attrib_list)
    111 {
    112     PFNGLXBINDTEXIMAGEEXTPROC pBindTexImageEXT;
    113     __GLXvendorInfo *dd;
    114 
    115     dd = GetDispatchFromDrawable(dpy, drawable);
    116     if (dd == NULL)
    117         return;
    118 
    119     __FETCH_FUNCTION_PTR(BindTexImageEXT);
    120     if (pBindTexImageEXT == NULL)
    121         return;
    122 
    123     (*pBindTexImageEXT)(dpy, drawable, buffer, attrib_list);
    124 }
    125 
    126 
    127 
    128 static GLXFBConfigSGIX *dispatch_ChooseFBConfigSGIX(Display *dpy, int screen,
    129                                                     const int *attrib_list,
    130                                                     int *nelements)
    131 {
    132     PFNGLXCHOOSEFBCONFIGSGIXPROC pChooseFBConfigSGIX;
    133     __GLXvendorInfo *dd;
    134     GLXFBConfigSGIX *ret;
    135 
    136     dd = __VND->getDynDispatch(dpy, screen);
    137     if (dd == NULL)
    138         return NULL;
    139 
    140     __FETCH_FUNCTION_PTR(ChooseFBConfigSGIX);
    141     if (pChooseFBConfigSGIX == NULL)
    142         return NULL;
    143 
    144     ret = (*pChooseFBConfigSGIX)(dpy, screen, attrib_list, nelements);
    145     if (AddFBConfigsMapping(dpy, ret, nelements, dd)) {
    146         free(ret);
    147         return NULL;
    148     }
    149 
    150     return ret;
    151 }
    152 
    153 
    154 
    155 static GLXContext dispatch_CreateContextAttribsARB(Display *dpy,
    156                                                    GLXFBConfig config,
    157                                                    GLXContext share_list,
    158                                                    Bool direct,
    159                                                    const int *attrib_list)
    160 {
    161     PFNGLXCREATECONTEXTATTRIBSARBPROC pCreateContextAttribsARB;
    162     __GLXvendorInfo *dd;
    163     GLXContext ret;
    164 
    165     dd = GetDispatchFromFBConfig(dpy, config);
    166     if (dd == NULL)
    167         return None;
    168 
    169     __FETCH_FUNCTION_PTR(CreateContextAttribsARB);
    170     if (pCreateContextAttribsARB == NULL)
    171         return None;
    172 
    173     ret = (*pCreateContextAttribsARB)(dpy, config, share_list, direct, attrib_list);
    174     if (AddContextMapping(dpy, ret, dd)) {
    175         /* XXX: Call glXDestroyContext which lives in libglvnd. If we're not
    176          * allowed to call it from here, should we extend __glXDispatchTableIndices ?
    177          */
    178         return None;
    179     }
    180 
    181     return ret;
    182 }
    183 
    184 
    185 
    186 static GLXContext dispatch_CreateContextWithConfigSGIX(Display *dpy,
    187                                                        GLXFBConfigSGIX config,
    188                                                        int render_type,
    189                                                        GLXContext share_list,
    190                                                        Bool direct)
    191 {
    192     PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC pCreateContextWithConfigSGIX;
    193     __GLXvendorInfo *dd;
    194     GLXContext ret;
    195 
    196     dd = GetDispatchFromFBConfig(dpy, config);
    197     if (dd == NULL)
    198         return None;
    199 
    200     __FETCH_FUNCTION_PTR(CreateContextWithConfigSGIX);
    201     if (pCreateContextWithConfigSGIX == NULL)
    202         return None;
    203 
    204     ret = (*pCreateContextWithConfigSGIX)(dpy, config, render_type, share_list, direct);
    205     if (AddContextMapping(dpy, ret, dd)) {
    206         /* XXX: Call glXDestroyContext which lives in libglvnd. If we're not
    207          * allowed to call it from here, should we extend __glXDispatchTableIndices ?
    208          */
    209         return None;
    210     }
    211 
    212     return ret;
    213 }
    214 
    215 
    216 
    217 static GLXPbuffer dispatch_CreateGLXPbufferSGIX(Display *dpy,
    218                                                 GLXFBConfig config,
    219                                                 unsigned int width,
    220                                                 unsigned int height,
    221                                                 const int *attrib_list)
    222 {
    223     PFNGLXCREATEGLXPBUFFERSGIXPROC pCreateGLXPbufferSGIX;
    224     __GLXvendorInfo *dd;
    225     GLXPbuffer ret;
    226 
    227     dd = GetDispatchFromFBConfig(dpy, config);
    228     if (dd == NULL)
    229         return None;
    230 
    231     __FETCH_FUNCTION_PTR(CreateGLXPbufferSGIX);
    232     if (pCreateGLXPbufferSGIX == NULL)
    233         return None;
    234 
    235     ret = (*pCreateGLXPbufferSGIX)(dpy, config, width, height, attrib_list);
    236     if (AddDrawableMapping(dpy, ret, dd)) {
    237         PFNGLXDESTROYGLXPBUFFERSGIXPROC pDestroyGLXPbufferSGIX;
    238 
    239         __FETCH_FUNCTION_PTR(DestroyGLXPbufferSGIX);
    240         if (pDestroyGLXPbufferSGIX)
    241             (*pDestroyGLXPbufferSGIX)(dpy, ret);
    242 
    243         return None;
    244     }
    245 
    246     return ret;
    247 }
    248 
    249 
    250 
    251 static GLXPixmap dispatch_CreateGLXPixmapWithConfigSGIX(Display *dpy,
    252                                                         GLXFBConfigSGIX config,
    253                                                         Pixmap pixmap)
    254 {
    255     PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC pCreateGLXPixmapWithConfigSGIX;
    256     __GLXvendorInfo *dd;
    257     GLXPixmap ret;
    258 
    259     dd = GetDispatchFromFBConfig(dpy, config);
    260     if (dd == NULL)
    261         return None;
    262 
    263     __FETCH_FUNCTION_PTR(CreateGLXPixmapWithConfigSGIX);
    264     if (pCreateGLXPixmapWithConfigSGIX == NULL)
    265         return None;
    266 
    267     ret = (*pCreateGLXPixmapWithConfigSGIX)(dpy, config, pixmap);
    268     if (AddDrawableMapping(dpy, ret, dd)) {
    269         /* XXX: Call glXDestroyGLXPixmap which lives in libglvnd. If we're not
    270          * allowed to call it from here, should we extend __glXDispatchTableIndices ?
    271          */
    272         return None;
    273     }
    274 
    275     return ret;
    276 }
    277 
    278 
    279 
    280 static void dispatch_DestroyGLXPbufferSGIX(Display *dpy, GLXPbuffer pbuf)
    281 {
    282     PFNGLXDESTROYGLXPBUFFERSGIXPROC pDestroyGLXPbufferSGIX;
    283     __GLXvendorInfo *dd;
    284 
    285     dd = GetDispatchFromDrawable(dpy, pbuf);
    286     if (dd == NULL)
    287         return;
    288 
    289     __FETCH_FUNCTION_PTR(DestroyGLXPbufferSGIX);
    290     if (pDestroyGLXPbufferSGIX == NULL)
    291         return;
    292 
    293     (*pDestroyGLXPbufferSGIX)(dpy, pbuf);
    294 }
    295 
    296 
    297 
    298 static GLXContextID dispatch_GetContextIDEXT(const GLXContext ctx)
    299 {
    300     PFNGLXGETCONTEXTIDEXTPROC pGetContextIDEXT;
    301     __GLXvendorInfo *dd;
    302 
    303     dd = GetDispatchFromContext(ctx);
    304     if (dd == NULL)
    305         return None;
    306 
    307     __FETCH_FUNCTION_PTR(GetContextIDEXT);
    308     if (pGetContextIDEXT == NULL)
    309         return None;
    310 
    311     return (*pGetContextIDEXT)(ctx);
    312 }
    313 
    314 
    315 
    316 static Display *dispatch_GetCurrentDisplayEXT(void)
    317 {
    318     PFNGLXGETCURRENTDISPLAYEXTPROC pGetCurrentDisplayEXT;
    319     __GLXvendorInfo *dd;
    320 
    321     if (!__VND->getCurrentContext())
    322         return NULL;
    323 
    324     dd = __VND->getCurrentDynDispatch();
    325     if (dd == NULL)
    326         return NULL;
    327 
    328     __FETCH_FUNCTION_PTR(GetCurrentDisplayEXT);
    329     if (pGetCurrentDisplayEXT == NULL)
    330         return NULL;
    331 
    332     return (*pGetCurrentDisplayEXT)();
    333 }
    334 
    335 
    336 
    337 static int dispatch_GetFBConfigAttribSGIX(Display *dpy, GLXFBConfigSGIX config,
    338                                           int attribute, int *value_return)
    339 {
    340     PFNGLXGETFBCONFIGATTRIBSGIXPROC pGetFBConfigAttribSGIX;
    341     __GLXvendorInfo *dd;
    342 
    343     dd = GetDispatchFromFBConfig(dpy, config);
    344     if (dd == NULL)
    345         return GLX_NO_EXTENSION;
    346 
    347     __FETCH_FUNCTION_PTR(GetFBConfigAttribSGIX);
    348     if (pGetFBConfigAttribSGIX == NULL)
    349         return GLX_NO_EXTENSION;
    350 
    351     return (*pGetFBConfigAttribSGIX)(dpy, config, attribute, value_return);
    352 }
    353 
    354 
    355 
    356 static GLXFBConfigSGIX dispatch_GetFBConfigFromVisualSGIX(Display *dpy,
    357                                                           XVisualInfo *vis)
    358 {
    359     PFNGLXGETFBCONFIGFROMVISUALSGIXPROC pGetFBConfigFromVisualSGIX;
    360     __GLXvendorInfo *dd;
    361     GLXFBConfigSGIX ret = NULL;
    362 
    363     dd = GetDispatchFromVisual(dpy, vis);
    364     if (dd == NULL)
    365         return NULL;
    366 
    367     __FETCH_FUNCTION_PTR(GetFBConfigFromVisualSGIX);
    368     if (pGetFBConfigFromVisualSGIX == NULL)
    369         return NULL;
    370 
    371     ret = (*pGetFBConfigFromVisualSGIX)(dpy, vis);
    372     if (AddFBConfigMapping(dpy, ret, dd))
    373         /* XXX: dealloc ret ? */
    374         return NULL;
    375 
    376     return ret;
    377 }
    378 
    379 
    380 
    381 static void dispatch_GetSelectedEventSGIX(Display *dpy, GLXDrawable drawable,
    382                                           unsigned long *mask)
    383 {
    384     PFNGLXGETSELECTEDEVENTSGIXPROC pGetSelectedEventSGIX;
    385     __GLXvendorInfo *dd;
    386 
    387     dd = GetDispatchFromDrawable(dpy, drawable);
    388     if (dd == NULL)
    389         return;
    390 
    391     __FETCH_FUNCTION_PTR(GetSelectedEventSGIX);
    392     if (pGetSelectedEventSGIX == NULL)
    393         return;
    394 
    395     (*pGetSelectedEventSGIX)(dpy, drawable, mask);
    396 }
    397 
    398 
    399 
    400 static int dispatch_GetVideoSyncSGI(unsigned int *count)
    401 {
    402     PFNGLXGETVIDEOSYNCSGIPROC pGetVideoSyncSGI;
    403     __GLXvendorInfo *dd;
    404 
    405     if (!__VND->getCurrentContext())
    406         return GLX_BAD_CONTEXT;
    407 
    408     dd = __VND->getCurrentDynDispatch();
    409     if (dd == NULL)
    410         return GLX_NO_EXTENSION;
    411 
    412     __FETCH_FUNCTION_PTR(GetVideoSyncSGI);
    413     if (pGetVideoSyncSGI == NULL)
    414         return GLX_NO_EXTENSION;
    415 
    416     return (*pGetVideoSyncSGI)(count);
    417 }
    418 
    419 
    420 
    421 static XVisualInfo *dispatch_GetVisualFromFBConfigSGIX(Display *dpy,
    422                                                        GLXFBConfigSGIX config)
    423 {
    424     PFNGLXGETVISUALFROMFBCONFIGSGIXPROC pGetVisualFromFBConfigSGIX;
    425     __GLXvendorInfo *dd;
    426 
    427     dd = GetDispatchFromFBConfig(dpy, config);
    428     if (dd == NULL)
    429         return NULL;
    430 
    431     __FETCH_FUNCTION_PTR(GetVisualFromFBConfigSGIX);
    432     if (pGetVisualFromFBConfigSGIX == NULL)
    433         return NULL;
    434 
    435     return (*pGetVisualFromFBConfigSGIX)(dpy, config);
    436 }
    437 
    438 
    439 
    440 static int dispatch_QueryContextInfoEXT(Display *dpy, GLXContext ctx,
    441                                         int attribute, int *value)
    442 {
    443     PFNGLXQUERYCONTEXTINFOEXTPROC pQueryContextInfoEXT;
    444     __GLXvendorInfo *dd;
    445 
    446     dd = GetDispatchFromContext(ctx);
    447     if (dd == NULL)
    448         return GLX_NO_EXTENSION;
    449 
    450     __FETCH_FUNCTION_PTR(QueryContextInfoEXT);
    451     if (pQueryContextInfoEXT == NULL)
    452         return GLX_NO_EXTENSION;
    453 
    454     return (*pQueryContextInfoEXT)(dpy, ctx, attribute, value);
    455 }
    456 
    457 
    458 
    459 static void dispatch_QueryGLXPbufferSGIX(Display *dpy, GLXPbuffer pbuf,
    460                                          int attribute, unsigned int *value)
    461 {
    462     PFNGLXQUERYGLXPBUFFERSGIXPROC pQueryGLXPbufferSGIX;
    463     __GLXvendorInfo *dd;
    464 
    465     dd = GetDispatchFromDrawable(dpy, pbuf);
    466     if (dd == NULL)
    467         return;
    468 
    469     __FETCH_FUNCTION_PTR(QueryGLXPbufferSGIX);
    470     if (pQueryGLXPbufferSGIX == NULL)
    471         return;
    472 
    473     (*pQueryGLXPbufferSGIX)(dpy, pbuf, attribute, value);
    474 }
    475 
    476 
    477 
    478 static void dispatch_ReleaseTexImageEXT(Display *dpy, GLXDrawable drawable,
    479                                         int buffer)
    480 {
    481     PFNGLXRELEASETEXIMAGEEXTPROC pReleaseTexImageEXT;
    482     __GLXvendorInfo *dd;
    483 
    484     dd = GetDispatchFromDrawable(dpy, drawable);
    485     if (dd == NULL)
    486         return;
    487 
    488     __FETCH_FUNCTION_PTR(ReleaseTexImageEXT);
    489     if (pReleaseTexImageEXT == NULL)
    490         return;
    491 
    492     (*pReleaseTexImageEXT)(dpy, drawable, buffer);
    493 }
    494 
    495 
    496 
    497 static void dispatch_SelectEventSGIX(Display *dpy, GLXDrawable drawable,
    498                                      unsigned long mask)
    499 {
    500     PFNGLXSELECTEVENTSGIXPROC pSelectEventSGIX;
    501     __GLXvendorInfo *dd;
    502 
    503     dd = GetDispatchFromDrawable(dpy, drawable);
    504     if (dd == NULL)
    505         return;
    506 
    507     __FETCH_FUNCTION_PTR(SelectEventSGIX);
    508     if (pSelectEventSGIX == NULL)
    509         return;
    510 
    511     (*pSelectEventSGIX)(dpy, drawable, mask);
    512 }
    513 
    514 
    515 
    516 static int dispatch_SwapIntervalSGI(int interval)
    517 {
    518     PFNGLXSWAPINTERVALSGIPROC pSwapIntervalSGI;
    519     __GLXvendorInfo *dd;
    520 
    521     if (!__VND->getCurrentContext())
    522         return GLX_BAD_CONTEXT;
    523 
    524     dd = __VND->getCurrentDynDispatch();
    525     if (dd == NULL)
    526         return GLX_NO_EXTENSION;
    527 
    528     __FETCH_FUNCTION_PTR(SwapIntervalSGI);
    529     if (pSwapIntervalSGI == NULL)
    530         return GLX_NO_EXTENSION;
    531 
    532     return (*pSwapIntervalSGI)(interval);
    533 }
    534 
    535 
    536 
    537 static int dispatch_WaitVideoSyncSGI(int divisor, int remainder,
    538                                      unsigned int *count)
    539 {
    540     PFNGLXWAITVIDEOSYNCSGIPROC pWaitVideoSyncSGI;
    541     __GLXvendorInfo *dd;
    542 
    543     if (!__VND->getCurrentContext())
    544         return GLX_BAD_CONTEXT;
    545 
    546     dd = __VND->getCurrentDynDispatch();
    547     if (dd == NULL)
    548         return GLX_NO_EXTENSION;
    549 
    550     __FETCH_FUNCTION_PTR(WaitVideoSyncSGI);
    551     if (pWaitVideoSyncSGI == NULL)
    552         return GLX_NO_EXTENSION;
    553 
    554     return (*pWaitVideoSyncSGI)(divisor, remainder, count);
    555 }
    556 
    557 
    558 
    559 static void dispatch_BindSwapBarrierSGIX(Display *dpy, GLXDrawable drawable,
    560                                             int barrier)
    561 {
    562     PFNGLXBINDSWAPBARRIERSGIXPROC pBindSwapBarrierSGIX;
    563     __GLXvendorInfo *dd;
    564 
    565     dd = GetDispatchFromDrawable(dpy, drawable);
    566     if (dd == NULL)
    567         return;
    568 
    569     __FETCH_FUNCTION_PTR(BindSwapBarrierSGIX);
    570     if (pBindSwapBarrierSGIX == NULL)
    571         return;
    572 
    573     (*pBindSwapBarrierSGIX)(dpy, drawable, barrier);
    574 }
    575 
    576 
    577 
    578 static void dispatch_CopySubBufferMESA(Display *dpy, GLXDrawable drawable,
    579                                           int x, int y, int width, int height)
    580 {
    581     PFNGLXCOPYSUBBUFFERMESAPROC pCopySubBufferMESA;
    582     __GLXvendorInfo *dd;
    583 
    584     dd = GetDispatchFromDrawable(dpy, drawable);
    585     if (dd == NULL)
    586         return;
    587 
    588     __FETCH_FUNCTION_PTR(CopySubBufferMESA);
    589     if (pCopySubBufferMESA == NULL)
    590         return;
    591 
    592     (*pCopySubBufferMESA)(dpy, drawable, x, y, width, height);
    593 }
    594 
    595 
    596 
    597 static GLXPixmap dispatch_CreateGLXPixmapMESA(Display *dpy,
    598                                                  XVisualInfo *visinfo,
    599                                                  Pixmap pixmap, Colormap cmap)
    600 {
    601     PFNGLXCREATEGLXPIXMAPMESAPROC pCreateGLXPixmapMESA;
    602     __GLXvendorInfo *dd;
    603     GLXPixmap ret;
    604 
    605     dd = GetDispatchFromVisual(dpy, visinfo);
    606     if (dd == NULL)
    607         return None;
    608 
    609     __FETCH_FUNCTION_PTR(CreateGLXPixmapMESA);
    610     if (pCreateGLXPixmapMESA == NULL)
    611         return None;
    612 
    613     ret = (*pCreateGLXPixmapMESA)(dpy, visinfo, pixmap, cmap);
    614     if (AddDrawableMapping(dpy, ret, dd)) {
    615         /* XXX: Call glXDestroyGLXPixmap which lives in libglvnd. If we're not
    616          * allowed to call it from here, should we extend __glXDispatchTableIndices ?
    617          */
    618         return None;
    619     }
    620 
    621     return ret;
    622 }
    623 
    624 
    625 
    626 static GLboolean dispatch_GetMscRateOML(Display *dpy, GLXDrawable drawable,
    627                                            int32_t *numerator, int32_t *denominator)
    628 {
    629     PFNGLXGETMSCRATEOMLPROC pGetMscRateOML;
    630     __GLXvendorInfo *dd;
    631 
    632     dd = GetDispatchFromDrawable(dpy, drawable);
    633     if (dd == NULL)
    634         return GL_FALSE;
    635 
    636     __FETCH_FUNCTION_PTR(GetMscRateOML);
    637     if (pGetMscRateOML == NULL)
    638         return GL_FALSE;
    639 
    640     return (*pGetMscRateOML)(dpy, drawable, numerator, denominator);
    641 }
    642 
    643 
    644 
    645 static const char *dispatch_GetScreenDriver(Display *dpy, int scrNum)
    646 {
    647     typedef const char *(*fn_glXGetScreenDriver_ptr)(Display *dpy, int scrNum);
    648     fn_glXGetScreenDriver_ptr pGetScreenDriver;
    649     __GLXvendorInfo *dd;
    650 
    651     dd = __VND->getDynDispatch(dpy, scrNum);
    652     if (dd == NULL)
    653         return NULL;
    654 
    655     __FETCH_FUNCTION_PTR(GetScreenDriver);
    656     if (pGetScreenDriver == NULL)
    657         return NULL;
    658 
    659     return (*pGetScreenDriver)(dpy, scrNum);
    660 }
    661 
    662 
    663 
    664 static int dispatch_GetSwapIntervalMESA(void)
    665 {
    666     PFNGLXGETSWAPINTERVALMESAPROC pGetSwapIntervalMESA;
    667     __GLXvendorInfo *dd;
    668 
    669     if (!__VND->getCurrentContext())
    670         return GLX_BAD_CONTEXT;
    671 
    672     dd = __VND->getCurrentDynDispatch();
    673     if (dd == NULL)
    674         return 0;
    675 
    676     __FETCH_FUNCTION_PTR(GetSwapIntervalMESA);
    677     if (pGetSwapIntervalMESA == NULL)
    678         return 0;
    679 
    680     return (*pGetSwapIntervalMESA)();
    681 }
    682 
    683 
    684 
    685 static Bool dispatch_GetSyncValuesOML(Display *dpy, GLXDrawable drawable,
    686                                          int64_t *ust, int64_t *msc, int64_t *sbc)
    687 {
    688     PFNGLXGETSYNCVALUESOMLPROC pGetSyncValuesOML;
    689     __GLXvendorInfo *dd;
    690 
    691     dd = GetDispatchFromDrawable(dpy, drawable);
    692     if (dd == NULL)
    693         return False;
    694 
    695     __FETCH_FUNCTION_PTR(GetSyncValuesOML);
    696     if (pGetSyncValuesOML == NULL)
    697         return False;
    698 
    699     return (*pGetSyncValuesOML)(dpy, drawable, ust, msc, sbc);
    700 }
    701 
    702 
    703 
    704 static void dispatch_JoinSwapGroupSGIX(Display *dpy, GLXDrawable drawable,
    705                                           GLXDrawable member)
    706 {
    707     PFNGLXJOINSWAPGROUPSGIXPROC pJoinSwapGroupSGIX;
    708     __GLXvendorInfo *dd;
    709 
    710     dd = GetDispatchFromDrawable(dpy, drawable);
    711     if (dd == NULL)
    712         return;
    713 
    714     __FETCH_FUNCTION_PTR(JoinSwapGroupSGIX);
    715     if (pJoinSwapGroupSGIX == NULL)
    716         return;
    717 
    718     (*pJoinSwapGroupSGIX)(dpy, drawable, member);
    719 }
    720 
    721 
    722 
    723 static Bool dispatch_QueryCurrentRendererIntegerMESA(int attribute,
    724                                                         unsigned int *value)
    725 {
    726     PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC pQueryCurrentRendererIntegerMESA;
    727     __GLXvendorInfo *dd;
    728 
    729     if (!__VND->getCurrentContext())
    730         return False;
    731 
    732     dd = __VND->getCurrentDynDispatch();
    733     if (dd == NULL)
    734         return False;
    735 
    736     __FETCH_FUNCTION_PTR(QueryCurrentRendererIntegerMESA);
    737     if (pQueryCurrentRendererIntegerMESA == NULL)
    738         return False;
    739 
    740     return (*pQueryCurrentRendererIntegerMESA)(attribute, value);
    741 }
    742 
    743 
    744 
    745 static const char *dispatch_QueryCurrentRendererStringMESA(int attribute)
    746 {
    747     PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC pQueryCurrentRendererStringMESA;
    748     __GLXvendorInfo *dd;
    749 
    750     if (!__VND->getCurrentContext())
    751         return NULL;
    752 
    753     dd = __VND->getCurrentDynDispatch();
    754     if (dd == NULL)
    755         return NULL;
    756 
    757     __FETCH_FUNCTION_PTR(QueryCurrentRendererStringMESA);
    758     if (pQueryCurrentRendererStringMESA == NULL)
    759         return NULL;
    760 
    761     return (*pQueryCurrentRendererStringMESA)(attribute);
    762 }
    763 
    764 
    765 
    766 static Bool dispatch_QueryMaxSwapBarriersSGIX(Display *dpy, int screen,
    767                                                  int *max)
    768 {
    769     PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC pQueryMaxSwapBarriersSGIX;
    770     __GLXvendorInfo *dd;
    771 
    772     dd = __VND->getDynDispatch(dpy, screen);
    773     if (dd == NULL)
    774         return False;
    775 
    776     __FETCH_FUNCTION_PTR(QueryMaxSwapBarriersSGIX);
    777     if (pQueryMaxSwapBarriersSGIX == NULL)
    778         return False;
    779 
    780     return (*pQueryMaxSwapBarriersSGIX)(dpy, screen, max);
    781 }
    782 
    783 
    784 
    785 static Bool dispatch_QueryRendererIntegerMESA(Display *dpy, int screen,
    786                                                  int renderer, int attribute,
    787                                                  unsigned int *value)
    788 {
    789     PFNGLXQUERYRENDERERINTEGERMESAPROC pQueryRendererIntegerMESA;
    790     __GLXvendorInfo *dd;
    791 
    792     dd = __VND->getDynDispatch(dpy, screen);
    793     if (dd == NULL)
    794         return False;
    795 
    796     __FETCH_FUNCTION_PTR(QueryRendererIntegerMESA);
    797     if (pQueryRendererIntegerMESA == NULL)
    798         return False;
    799 
    800     return (*pQueryRendererIntegerMESA)(dpy, screen, renderer, attribute, value);
    801 }
    802 
    803 
    804 
    805 static const char *dispatch_QueryRendererStringMESA(Display *dpy, int screen,
    806                                                        int renderer, int attribute)
    807 {
    808     PFNGLXQUERYRENDERERSTRINGMESAPROC pQueryRendererStringMESA;
    809     __GLXvendorInfo *dd = NULL;
    810 
    811     dd = __VND->getDynDispatch(dpy, screen);
    812     if (dd == NULL)
    813         return NULL;
    814 
    815     __FETCH_FUNCTION_PTR(QueryRendererStringMESA);
    816     if (pQueryRendererStringMESA == NULL)
    817         return NULL;
    818 
    819     return (*pQueryRendererStringMESA)(dpy, screen, renderer, attribute);
    820 }
    821 
    822 
    823 
    824 static Bool dispatch_ReleaseBuffersMESA(Display *dpy, GLXDrawable d)
    825 {
    826     PFNGLXRELEASEBUFFERSMESAPROC pReleaseBuffersMESA;
    827     __GLXvendorInfo *dd;
    828 
    829     dd = GetDispatchFromDrawable(dpy, d);
    830     if (dd == NULL)
    831         return False;
    832 
    833     __FETCH_FUNCTION_PTR(ReleaseBuffersMESA);
    834     if (pReleaseBuffersMESA == NULL)
    835         return False;
    836 
    837     return (*pReleaseBuffersMESA)(dpy, d);
    838 }
    839 
    840 
    841 
    842 static int64_t dispatch_SwapBuffersMscOML(Display *dpy, GLXDrawable drawable,
    843                                              int64_t target_msc, int64_t divisor,
    844                                              int64_t remainder)
    845 {
    846     PFNGLXSWAPBUFFERSMSCOMLPROC pSwapBuffersMscOML;
    847     __GLXvendorInfo *dd;
    848 
    849     dd = GetDispatchFromDrawable(dpy, drawable);
    850     if (dd == NULL)
    851         return 0;
    852 
    853     __FETCH_FUNCTION_PTR(SwapBuffersMscOML);
    854     if (pSwapBuffersMscOML == NULL)
    855         return 0;
    856 
    857     return (*pSwapBuffersMscOML)(dpy, drawable, target_msc, divisor, remainder);
    858 }
    859 
    860 
    861 
    862 static int dispatch_SwapIntervalMESA(unsigned int interval)
    863 {
    864     PFNGLXSWAPINTERVALMESAPROC pSwapIntervalMESA;
    865     __GLXvendorInfo *dd;
    866 
    867     if (!__VND->getCurrentContext())
    868         return GLX_BAD_CONTEXT;
    869 
    870     dd = __VND->getCurrentDynDispatch();
    871     if (dd == NULL)
    872         return 0;
    873 
    874     __FETCH_FUNCTION_PTR(SwapIntervalMESA);
    875     if (pSwapIntervalMESA == NULL)
    876         return 0;
    877 
    878     return (*pSwapIntervalMESA)(interval);
    879 }
    880 
    881 
    882 
    883 static Bool dispatch_WaitForMscOML(Display *dpy, GLXDrawable drawable,
    884                                       int64_t target_msc, int64_t divisor,
    885                                       int64_t remainder, int64_t *ust,
    886                                       int64_t *msc, int64_t *sbc)
    887 {
    888     PFNGLXWAITFORMSCOMLPROC pWaitForMscOML;
    889     __GLXvendorInfo *dd;
    890 
    891     dd = GetDispatchFromDrawable(dpy, drawable);
    892     if (dd == NULL)
    893         return False;
    894 
    895     __FETCH_FUNCTION_PTR(WaitForMscOML);
    896     if (pWaitForMscOML == NULL)
    897         return False;
    898 
    899     return (*pWaitForMscOML)(dpy, drawable, target_msc, divisor, remainder, ust, msc, sbc);
    900 }
    901 
    902 
    903 
    904 static Bool dispatch_WaitForSbcOML(Display *dpy, GLXDrawable drawable,
    905                                       int64_t target_sbc, int64_t *ust,
    906                                       int64_t *msc, int64_t *sbc)
    907 {
    908     PFNGLXWAITFORSBCOMLPROC pWaitForSbcOML;
    909     __GLXvendorInfo *dd;
    910 
    911     dd = GetDispatchFromDrawable(dpy, drawable);
    912     if (dd == NULL)
    913         return False;
    914 
    915     __FETCH_FUNCTION_PTR(WaitForSbcOML);
    916     if (pWaitForSbcOML == NULL)
    917         return False;
    918 
    919     return (*pWaitForSbcOML)(dpy, drawable, target_sbc, ust, msc, sbc);
    920 }
    921 
    922 #undef __FETCH_FUNCTION_PTR
    923 
    924 
    925 /* Allocate an extra 'dummy' to ease lookup. See FindGLXFunction() */
    926 const void * const __glXDispatchFunctions[DI_LAST_INDEX + 1] = {
    927 #define __ATTRIB(field) \
    928     [DI_##field] = (void *)dispatch_##field
    929 
    930     __ATTRIB(BindSwapBarrierSGIX),
    931     __ATTRIB(BindTexImageEXT),
    932     __ATTRIB(ChooseFBConfigSGIX),
    933     __ATTRIB(CopySubBufferMESA),
    934     __ATTRIB(CreateContextAttribsARB),
    935     __ATTRIB(CreateContextWithConfigSGIX),
    936     __ATTRIB(CreateGLXPbufferSGIX),
    937     __ATTRIB(CreateGLXPixmapMESA),
    938     __ATTRIB(CreateGLXPixmapWithConfigSGIX),
    939     __ATTRIB(DestroyGLXPbufferSGIX),
    940     __ATTRIB(GetContextIDEXT),
    941     __ATTRIB(GetCurrentDisplayEXT),
    942     __ATTRIB(GetFBConfigAttribSGIX),
    943     __ATTRIB(GetFBConfigFromVisualSGIX),
    944     __ATTRIB(GetMscRateOML),
    945     __ATTRIB(GetScreenDriver),
    946     __ATTRIB(GetSelectedEventSGIX),
    947     __ATTRIB(GetSwapIntervalMESA),
    948     __ATTRIB(GetSyncValuesOML),
    949     __ATTRIB(GetVideoSyncSGI),
    950     __ATTRIB(GetVisualFromFBConfigSGIX),
    951     __ATTRIB(JoinSwapGroupSGIX),
    952     __ATTRIB(QueryContextInfoEXT),
    953     __ATTRIB(QueryCurrentRendererIntegerMESA),
    954     __ATTRIB(QueryCurrentRendererStringMESA),
    955     __ATTRIB(QueryGLXPbufferSGIX),
    956     __ATTRIB(QueryMaxSwapBarriersSGIX),
    957     __ATTRIB(QueryRendererIntegerMESA),
    958     __ATTRIB(QueryRendererStringMESA),
    959     __ATTRIB(ReleaseBuffersMESA),
    960     __ATTRIB(ReleaseTexImageEXT),
    961     __ATTRIB(SelectEventSGIX),
    962     __ATTRIB(SwapBuffersMscOML),
    963     __ATTRIB(SwapIntervalMESA),
    964     __ATTRIB(SwapIntervalSGI),
    965     __ATTRIB(WaitForMscOML),
    966     __ATTRIB(WaitForSbcOML),
    967     __ATTRIB(WaitVideoSyncSGI),
    968 
    969     [DI_LAST_INDEX] = NULL,
    970 #undef __ATTRIB
    971 };
    972