101e04c3fSmrg#include <stdlib.h>
201e04c3fSmrg
301e04c3fSmrg#include "glxclient.h"
401e04c3fSmrg#include "glxglvnd.h"
501e04c3fSmrg#include "glxglvnddispatchfuncs.h"
601e04c3fSmrg#include "g_glxglvnddispatchindices.h"
701e04c3fSmrg
801e04c3fSmrgconst int DI_FUNCTION_COUNT = DI_LAST_INDEX;
901e04c3fSmrg/* Allocate an extra 'dummy' to ease lookup. See FindGLXFunction() */
1001e04c3fSmrgint __glXDispatchTableIndices[DI_LAST_INDEX + 1];
1101e04c3fSmrgconst __GLXapiExports *__glXGLVNDAPIExports;
1201e04c3fSmrg
1301e04c3fSmrgconst char * const __glXDispatchTableStrings[DI_LAST_INDEX] = {
1401e04c3fSmrg#define __ATTRIB(field) \
1501e04c3fSmrg    [DI_##field] = "glX"#field
1601e04c3fSmrg
1701e04c3fSmrg    __ATTRIB(BindSwapBarrierSGIX),
1801e04c3fSmrg    __ATTRIB(BindTexImageEXT),
1901e04c3fSmrg    // glXChooseFBConfig implemented by libglvnd
2001e04c3fSmrg    __ATTRIB(ChooseFBConfigSGIX),
2101e04c3fSmrg    // glXChooseVisual implemented by libglvnd
2201e04c3fSmrg    // glXCopyContext implemented by libglvnd
2301e04c3fSmrg    __ATTRIB(CopySubBufferMESA),
2401e04c3fSmrg    // glXCreateContext implemented by libglvnd
2501e04c3fSmrg    __ATTRIB(CreateContextAttribsARB),
2601e04c3fSmrg    __ATTRIB(CreateContextWithConfigSGIX),
2701e04c3fSmrg    __ATTRIB(CreateGLXPbufferSGIX),
2801e04c3fSmrg    // glXCreateGLXPixmap implemented by libglvnd
2901e04c3fSmrg    __ATTRIB(CreateGLXPixmapMESA),
3001e04c3fSmrg    __ATTRIB(CreateGLXPixmapWithConfigSGIX),
3101e04c3fSmrg    // glXCreateNewContext implemented by libglvnd
3201e04c3fSmrg    // glXCreatePbuffer implemented by libglvnd
3301e04c3fSmrg    // glXCreatePixmap implemented by libglvnd
3401e04c3fSmrg    // glXCreateWindow implemented by libglvnd
3501e04c3fSmrg    // glXDestroyContext implemented by libglvnd
3601e04c3fSmrg    __ATTRIB(DestroyGLXPbufferSGIX),
3701e04c3fSmrg    // glXDestroyGLXPixmap implemented by libglvnd
3801e04c3fSmrg    // glXDestroyPbuffer implemented by libglvnd
3901e04c3fSmrg    // glXDestroyPixmap implemented by libglvnd
4001e04c3fSmrg    // glXDestroyWindow implemented by libglvnd
4101e04c3fSmrg    // glXFreeContextEXT implemented by libglvnd
4201e04c3fSmrg    // glXGetClientString implemented by libglvnd
4301e04c3fSmrg    // glXGetConfig implemented by libglvnd
4401e04c3fSmrg    __ATTRIB(GetContextIDEXT),
4501e04c3fSmrg    // glXGetCurrentContext implemented by libglvnd
4601e04c3fSmrg    // glXGetCurrentDisplay implemented by libglvnd
4701e04c3fSmrg    __ATTRIB(GetCurrentDisplayEXT),
4801e04c3fSmrg    // glXGetCurrentDrawable implemented by libglvnd
4901e04c3fSmrg    // glXGetCurrentReadDrawable implemented by libglvnd
5001e04c3fSmrg    __ATTRIB(GetDriverConfig),
5101e04c3fSmrg    // glXGetFBConfigAttrib implemented by libglvnd
5201e04c3fSmrg    __ATTRIB(GetFBConfigAttribSGIX),
5301e04c3fSmrg    __ATTRIB(GetFBConfigFromVisualSGIX),
5401e04c3fSmrg    // glXGetFBConfigs implemented by libglvnd
5501e04c3fSmrg    __ATTRIB(GetMscRateOML),
5601e04c3fSmrg    // glXGetProcAddress implemented by libglvnd
5701e04c3fSmrg    // glXGetProcAddressARB implemented by libglvnd
5801e04c3fSmrg    __ATTRIB(GetScreenDriver),
5901e04c3fSmrg    // glXGetSelectedEvent implemented by libglvnd
6001e04c3fSmrg    __ATTRIB(GetSelectedEventSGIX),
6101e04c3fSmrg    __ATTRIB(GetSwapIntervalMESA),
6201e04c3fSmrg    __ATTRIB(GetSyncValuesOML),
6301e04c3fSmrg    __ATTRIB(GetVideoSyncSGI),
6401e04c3fSmrg    // glXGetVisualFromFBConfig implemented by libglvnd
6501e04c3fSmrg    __ATTRIB(GetVisualFromFBConfigSGIX),
6601e04c3fSmrg    // glXImportContextEXT implemented by libglvnd
6701e04c3fSmrg    // glXIsDirect implemented by libglvnd
6801e04c3fSmrg    __ATTRIB(JoinSwapGroupSGIX),
6901e04c3fSmrg    // glXMakeContextCurrent implemented by libglvnd
7001e04c3fSmrg    // glXMakeCurrent implemented by libglvnd
7101e04c3fSmrg    // glXQueryContext implemented by libglvnd
7201e04c3fSmrg    __ATTRIB(QueryContextInfoEXT),
7301e04c3fSmrg    __ATTRIB(QueryCurrentRendererIntegerMESA),
7401e04c3fSmrg    __ATTRIB(QueryCurrentRendererStringMESA),
7501e04c3fSmrg    // glXQueryDrawable implemented by libglvnd
7601e04c3fSmrg    // glXQueryExtension implemented by libglvnd
7701e04c3fSmrg    // glXQueryExtensionsString implemented by libglvnd
7801e04c3fSmrg    __ATTRIB(QueryGLXPbufferSGIX),
7901e04c3fSmrg    __ATTRIB(QueryMaxSwapBarriersSGIX),
8001e04c3fSmrg    __ATTRIB(QueryRendererIntegerMESA),
8101e04c3fSmrg    __ATTRIB(QueryRendererStringMESA),
8201e04c3fSmrg    // glXQueryServerString implemented by libglvnd
8301e04c3fSmrg    // glXQueryVersion implemented by libglvnd
8401e04c3fSmrg    __ATTRIB(ReleaseBuffersMESA),
8501e04c3fSmrg    __ATTRIB(ReleaseTexImageEXT),
8601e04c3fSmrg    // glXSelectEvent implemented by libglvnd
8701e04c3fSmrg    __ATTRIB(SelectEventSGIX),
8801e04c3fSmrg    // glXSwapBuffers implemented by libglvnd
8901e04c3fSmrg    __ATTRIB(SwapBuffersMscOML),
907ec681f3Smrg    __ATTRIB(SwapIntervalEXT),
9101e04c3fSmrg    __ATTRIB(SwapIntervalMESA),
9201e04c3fSmrg    __ATTRIB(SwapIntervalSGI),
9301e04c3fSmrg    // glXUseXFont implemented by libglvnd
9401e04c3fSmrg    __ATTRIB(WaitForMscOML),
9501e04c3fSmrg    __ATTRIB(WaitForSbcOML),
9601e04c3fSmrg    // glXWaitGL implemented by libglvnd
9701e04c3fSmrg    __ATTRIB(WaitVideoSyncSGI),
9801e04c3fSmrg    // glXWaitX implemented by libglvnd
9901e04c3fSmrg
10001e04c3fSmrg#undef __ATTRIB
10101e04c3fSmrg};
10201e04c3fSmrg
10301e04c3fSmrg#define __FETCH_FUNCTION_PTR(func_name) \
10401e04c3fSmrg    p##func_name = (void *) \
10501e04c3fSmrg        __VND->fetchDispatchEntry(dd, __glXDispatchTableIndices[DI_##func_name])
10601e04c3fSmrg
10701e04c3fSmrg
10801e04c3fSmrgstatic void dispatch_BindTexImageEXT(Display *dpy, GLXDrawable drawable,
10901e04c3fSmrg                                     int buffer, const int *attrib_list)
11001e04c3fSmrg{
11101e04c3fSmrg    PFNGLXBINDTEXIMAGEEXTPROC pBindTexImageEXT;
11201e04c3fSmrg    __GLXvendorInfo *dd;
11301e04c3fSmrg
11401e04c3fSmrg    dd = GetDispatchFromDrawable(dpy, drawable);
11501e04c3fSmrg    if (dd == NULL)
11601e04c3fSmrg        return;
11701e04c3fSmrg
11801e04c3fSmrg    __FETCH_FUNCTION_PTR(BindTexImageEXT);
11901e04c3fSmrg    if (pBindTexImageEXT == NULL)
12001e04c3fSmrg        return;
12101e04c3fSmrg
1227ec681f3Smrg    pBindTexImageEXT(dpy, drawable, buffer, attrib_list);
12301e04c3fSmrg}
12401e04c3fSmrg
12501e04c3fSmrg
12601e04c3fSmrg
12701e04c3fSmrgstatic GLXFBConfigSGIX *dispatch_ChooseFBConfigSGIX(Display *dpy, int screen,
1289f464c52Smaya                                                    int *attrib_list,
12901e04c3fSmrg                                                    int *nelements)
13001e04c3fSmrg{
13101e04c3fSmrg    PFNGLXCHOOSEFBCONFIGSGIXPROC pChooseFBConfigSGIX;
13201e04c3fSmrg    __GLXvendorInfo *dd;
13301e04c3fSmrg    GLXFBConfigSGIX *ret;
13401e04c3fSmrg
13501e04c3fSmrg    dd = __VND->getDynDispatch(dpy, screen);
13601e04c3fSmrg    if (dd == NULL)
13701e04c3fSmrg        return NULL;
13801e04c3fSmrg
13901e04c3fSmrg    __FETCH_FUNCTION_PTR(ChooseFBConfigSGIX);
14001e04c3fSmrg    if (pChooseFBConfigSGIX == NULL)
14101e04c3fSmrg        return NULL;
14201e04c3fSmrg
1437ec681f3Smrg    ret = pChooseFBConfigSGIX(dpy, screen, attrib_list, nelements);
14401e04c3fSmrg    if (AddFBConfigsMapping(dpy, ret, nelements, dd)) {
14501e04c3fSmrg        free(ret);
14601e04c3fSmrg        return NULL;
14701e04c3fSmrg    }
14801e04c3fSmrg
14901e04c3fSmrg    return ret;
15001e04c3fSmrg}
15101e04c3fSmrg
15201e04c3fSmrg
15301e04c3fSmrg
15401e04c3fSmrgstatic GLXContext dispatch_CreateContextAttribsARB(Display *dpy,
15501e04c3fSmrg                                                   GLXFBConfig config,
15601e04c3fSmrg                                                   GLXContext share_list,
15701e04c3fSmrg                                                   Bool direct,
15801e04c3fSmrg                                                   const int *attrib_list)
15901e04c3fSmrg{
16001e04c3fSmrg    PFNGLXCREATECONTEXTATTRIBSARBPROC pCreateContextAttribsARB;
1617ec681f3Smrg    __GLXvendorInfo *dd = NULL;
16201e04c3fSmrg    GLXContext ret;
16301e04c3fSmrg
1647ec681f3Smrg    if (config) {
1657ec681f3Smrg       dd = GetDispatchFromFBConfig(dpy, config);
1667ec681f3Smrg    } else if (attrib_list) {
1677ec681f3Smrg       int i, screen;
1687ec681f3Smrg
1697ec681f3Smrg       for (i = 0; attrib_list[i * 2] != None; i++) {
1707ec681f3Smrg          if (attrib_list[i * 2] == GLX_SCREEN) {
1717ec681f3Smrg             screen = attrib_list[i * 2 + 1];
1727ec681f3Smrg             dd = GetDispatchFromDrawable(dpy, RootWindow(dpy, screen));
1737ec681f3Smrg             break;
1747ec681f3Smrg          }
1757ec681f3Smrg       }
1767ec681f3Smrg    }
17701e04c3fSmrg    if (dd == NULL)
17801e04c3fSmrg        return None;
17901e04c3fSmrg
18001e04c3fSmrg    __FETCH_FUNCTION_PTR(CreateContextAttribsARB);
18101e04c3fSmrg    if (pCreateContextAttribsARB == NULL)
18201e04c3fSmrg        return None;
18301e04c3fSmrg
1847ec681f3Smrg    ret = pCreateContextAttribsARB(dpy, config, share_list, direct, attrib_list);
18501e04c3fSmrg    if (AddContextMapping(dpy, ret, dd)) {
18601e04c3fSmrg        /* XXX: Call glXDestroyContext which lives in libglvnd. If we're not
18701e04c3fSmrg         * allowed to call it from here, should we extend __glXDispatchTableIndices ?
18801e04c3fSmrg         */
18901e04c3fSmrg        return None;
19001e04c3fSmrg    }
19101e04c3fSmrg
19201e04c3fSmrg    return ret;
19301e04c3fSmrg}
19401e04c3fSmrg
19501e04c3fSmrg
19601e04c3fSmrg
19701e04c3fSmrgstatic GLXContext dispatch_CreateContextWithConfigSGIX(Display *dpy,
19801e04c3fSmrg                                                       GLXFBConfigSGIX config,
19901e04c3fSmrg                                                       int render_type,
20001e04c3fSmrg                                                       GLXContext share_list,
20101e04c3fSmrg                                                       Bool direct)
20201e04c3fSmrg{
20301e04c3fSmrg    PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC pCreateContextWithConfigSGIX;
20401e04c3fSmrg    __GLXvendorInfo *dd;
20501e04c3fSmrg    GLXContext ret;
20601e04c3fSmrg
20701e04c3fSmrg    dd = GetDispatchFromFBConfig(dpy, config);
20801e04c3fSmrg    if (dd == NULL)
20901e04c3fSmrg        return None;
21001e04c3fSmrg
21101e04c3fSmrg    __FETCH_FUNCTION_PTR(CreateContextWithConfigSGIX);
21201e04c3fSmrg    if (pCreateContextWithConfigSGIX == NULL)
21301e04c3fSmrg        return None;
21401e04c3fSmrg
2157ec681f3Smrg    ret = pCreateContextWithConfigSGIX(dpy, config, render_type, share_list, direct);
21601e04c3fSmrg    if (AddContextMapping(dpy, ret, dd)) {
21701e04c3fSmrg        /* XXX: Call glXDestroyContext which lives in libglvnd. If we're not
21801e04c3fSmrg         * allowed to call it from here, should we extend __glXDispatchTableIndices ?
21901e04c3fSmrg         */
22001e04c3fSmrg        return None;
22101e04c3fSmrg    }
22201e04c3fSmrg
22301e04c3fSmrg    return ret;
22401e04c3fSmrg}
22501e04c3fSmrg
22601e04c3fSmrg
22701e04c3fSmrg
22801e04c3fSmrgstatic GLXPbuffer dispatch_CreateGLXPbufferSGIX(Display *dpy,
22901e04c3fSmrg                                                GLXFBConfig config,
23001e04c3fSmrg                                                unsigned int width,
23101e04c3fSmrg                                                unsigned int height,
2329f464c52Smaya                                                int *attrib_list)
23301e04c3fSmrg{
23401e04c3fSmrg    PFNGLXCREATEGLXPBUFFERSGIXPROC pCreateGLXPbufferSGIX;
23501e04c3fSmrg    __GLXvendorInfo *dd;
23601e04c3fSmrg    GLXPbuffer ret;
23701e04c3fSmrg
23801e04c3fSmrg    dd = GetDispatchFromFBConfig(dpy, config);
23901e04c3fSmrg    if (dd == NULL)
24001e04c3fSmrg        return None;
24101e04c3fSmrg
24201e04c3fSmrg    __FETCH_FUNCTION_PTR(CreateGLXPbufferSGIX);
24301e04c3fSmrg    if (pCreateGLXPbufferSGIX == NULL)
24401e04c3fSmrg        return None;
24501e04c3fSmrg
2467ec681f3Smrg    ret = pCreateGLXPbufferSGIX(dpy, config, width, height, attrib_list);
24701e04c3fSmrg    if (AddDrawableMapping(dpy, ret, dd)) {
24801e04c3fSmrg        PFNGLXDESTROYGLXPBUFFERSGIXPROC pDestroyGLXPbufferSGIX;
24901e04c3fSmrg
25001e04c3fSmrg        __FETCH_FUNCTION_PTR(DestroyGLXPbufferSGIX);
25101e04c3fSmrg        if (pDestroyGLXPbufferSGIX)
2527ec681f3Smrg            pDestroyGLXPbufferSGIX(dpy, ret);
25301e04c3fSmrg
25401e04c3fSmrg        return None;
25501e04c3fSmrg    }
25601e04c3fSmrg
25701e04c3fSmrg    return ret;
25801e04c3fSmrg}
25901e04c3fSmrg
26001e04c3fSmrg
26101e04c3fSmrg
26201e04c3fSmrgstatic GLXPixmap dispatch_CreateGLXPixmapWithConfigSGIX(Display *dpy,
26301e04c3fSmrg                                                        GLXFBConfigSGIX config,
26401e04c3fSmrg                                                        Pixmap pixmap)
26501e04c3fSmrg{
26601e04c3fSmrg    PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC pCreateGLXPixmapWithConfigSGIX;
26701e04c3fSmrg    __GLXvendorInfo *dd;
26801e04c3fSmrg    GLXPixmap ret;
26901e04c3fSmrg
27001e04c3fSmrg    dd = GetDispatchFromFBConfig(dpy, config);
27101e04c3fSmrg    if (dd == NULL)
27201e04c3fSmrg        return None;
27301e04c3fSmrg
27401e04c3fSmrg    __FETCH_FUNCTION_PTR(CreateGLXPixmapWithConfigSGIX);
27501e04c3fSmrg    if (pCreateGLXPixmapWithConfigSGIX == NULL)
27601e04c3fSmrg        return None;
27701e04c3fSmrg
2787ec681f3Smrg    ret = pCreateGLXPixmapWithConfigSGIX(dpy, config, pixmap);
27901e04c3fSmrg    if (AddDrawableMapping(dpy, ret, dd)) {
28001e04c3fSmrg        /* XXX: Call glXDestroyGLXPixmap which lives in libglvnd. If we're not
28101e04c3fSmrg         * allowed to call it from here, should we extend __glXDispatchTableIndices ?
28201e04c3fSmrg         */
28301e04c3fSmrg        return None;
28401e04c3fSmrg    }
28501e04c3fSmrg
28601e04c3fSmrg    return ret;
28701e04c3fSmrg}
28801e04c3fSmrg
28901e04c3fSmrg
29001e04c3fSmrg
29101e04c3fSmrgstatic void dispatch_DestroyGLXPbufferSGIX(Display *dpy, GLXPbuffer pbuf)
29201e04c3fSmrg{
29301e04c3fSmrg    PFNGLXDESTROYGLXPBUFFERSGIXPROC pDestroyGLXPbufferSGIX;
29401e04c3fSmrg    __GLXvendorInfo *dd;
29501e04c3fSmrg
29601e04c3fSmrg    dd = GetDispatchFromDrawable(dpy, pbuf);
29701e04c3fSmrg    if (dd == NULL)
29801e04c3fSmrg        return;
29901e04c3fSmrg
30001e04c3fSmrg    __FETCH_FUNCTION_PTR(DestroyGLXPbufferSGIX);
30101e04c3fSmrg    if (pDestroyGLXPbufferSGIX == NULL)
30201e04c3fSmrg        return;
30301e04c3fSmrg
3047ec681f3Smrg    pDestroyGLXPbufferSGIX(dpy, pbuf);
30501e04c3fSmrg}
30601e04c3fSmrg
30701e04c3fSmrg
30801e04c3fSmrg
30901e04c3fSmrgstatic GLXContextID dispatch_GetContextIDEXT(const GLXContext ctx)
31001e04c3fSmrg{
31101e04c3fSmrg    PFNGLXGETCONTEXTIDEXTPROC pGetContextIDEXT;
31201e04c3fSmrg    __GLXvendorInfo *dd;
31301e04c3fSmrg
31401e04c3fSmrg    dd = GetDispatchFromContext(ctx);
31501e04c3fSmrg    if (dd == NULL)
31601e04c3fSmrg        return None;
31701e04c3fSmrg
31801e04c3fSmrg    __FETCH_FUNCTION_PTR(GetContextIDEXT);
31901e04c3fSmrg    if (pGetContextIDEXT == NULL)
32001e04c3fSmrg        return None;
32101e04c3fSmrg
3227ec681f3Smrg    return pGetContextIDEXT(ctx);
32301e04c3fSmrg}
32401e04c3fSmrg
32501e04c3fSmrg
32601e04c3fSmrg
32701e04c3fSmrgstatic Display *dispatch_GetCurrentDisplayEXT(void)
32801e04c3fSmrg{
32901e04c3fSmrg    PFNGLXGETCURRENTDISPLAYEXTPROC pGetCurrentDisplayEXT;
33001e04c3fSmrg    __GLXvendorInfo *dd;
33101e04c3fSmrg
33201e04c3fSmrg    if (!__VND->getCurrentContext())
33301e04c3fSmrg        return NULL;
33401e04c3fSmrg
33501e04c3fSmrg    dd = __VND->getCurrentDynDispatch();
33601e04c3fSmrg    if (dd == NULL)
33701e04c3fSmrg        return NULL;
33801e04c3fSmrg
33901e04c3fSmrg    __FETCH_FUNCTION_PTR(GetCurrentDisplayEXT);
34001e04c3fSmrg    if (pGetCurrentDisplayEXT == NULL)
34101e04c3fSmrg        return NULL;
34201e04c3fSmrg
3437ec681f3Smrg    return pGetCurrentDisplayEXT();
34401e04c3fSmrg}
34501e04c3fSmrg
34601e04c3fSmrg
34701e04c3fSmrg
34801e04c3fSmrgstatic const char *dispatch_GetDriverConfig(const char *driverName)
34901e04c3fSmrg{
35001e04c3fSmrg#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
35101e04c3fSmrg    /*
35201e04c3fSmrg     * The options are constant for a given driverName, so we do not need
35301e04c3fSmrg     * a context (and apps expect to be able to call this without one).
35401e04c3fSmrg     */
35501e04c3fSmrg    return glXGetDriverConfig(driverName);
35601e04c3fSmrg#else
35701e04c3fSmrg    return NULL;
35801e04c3fSmrg#endif
35901e04c3fSmrg}
36001e04c3fSmrg
36101e04c3fSmrg
36201e04c3fSmrg
36301e04c3fSmrgstatic int dispatch_GetFBConfigAttribSGIX(Display *dpy, GLXFBConfigSGIX config,
36401e04c3fSmrg                                          int attribute, int *value_return)
36501e04c3fSmrg{
36601e04c3fSmrg    PFNGLXGETFBCONFIGATTRIBSGIXPROC pGetFBConfigAttribSGIX;
36701e04c3fSmrg    __GLXvendorInfo *dd;
36801e04c3fSmrg
36901e04c3fSmrg    dd = GetDispatchFromFBConfig(dpy, config);
37001e04c3fSmrg    if (dd == NULL)
37101e04c3fSmrg        return GLX_NO_EXTENSION;
37201e04c3fSmrg
37301e04c3fSmrg    __FETCH_FUNCTION_PTR(GetFBConfigAttribSGIX);
37401e04c3fSmrg    if (pGetFBConfigAttribSGIX == NULL)
37501e04c3fSmrg        return GLX_NO_EXTENSION;
37601e04c3fSmrg
3777ec681f3Smrg    return pGetFBConfigAttribSGIX(dpy, config, attribute, value_return);
37801e04c3fSmrg}
37901e04c3fSmrg
38001e04c3fSmrg
38101e04c3fSmrg
38201e04c3fSmrgstatic GLXFBConfigSGIX dispatch_GetFBConfigFromVisualSGIX(Display *dpy,
38301e04c3fSmrg                                                          XVisualInfo *vis)
38401e04c3fSmrg{
38501e04c3fSmrg    PFNGLXGETFBCONFIGFROMVISUALSGIXPROC pGetFBConfigFromVisualSGIX;
38601e04c3fSmrg    __GLXvendorInfo *dd;
38701e04c3fSmrg    GLXFBConfigSGIX ret = NULL;
38801e04c3fSmrg
38901e04c3fSmrg    dd = GetDispatchFromVisual(dpy, vis);
39001e04c3fSmrg    if (dd == NULL)
39101e04c3fSmrg        return NULL;
39201e04c3fSmrg
39301e04c3fSmrg    __FETCH_FUNCTION_PTR(GetFBConfigFromVisualSGIX);
39401e04c3fSmrg    if (pGetFBConfigFromVisualSGIX == NULL)
39501e04c3fSmrg        return NULL;
39601e04c3fSmrg
3977ec681f3Smrg    ret = pGetFBConfigFromVisualSGIX(dpy, vis);
39801e04c3fSmrg    if (AddFBConfigMapping(dpy, ret, dd))
39901e04c3fSmrg        /* XXX: dealloc ret ? */
40001e04c3fSmrg        return NULL;
40101e04c3fSmrg
40201e04c3fSmrg    return ret;
40301e04c3fSmrg}
40401e04c3fSmrg
40501e04c3fSmrg
40601e04c3fSmrg
40701e04c3fSmrgstatic void dispatch_GetSelectedEventSGIX(Display *dpy, GLXDrawable drawable,
40801e04c3fSmrg                                          unsigned long *mask)
40901e04c3fSmrg{
41001e04c3fSmrg    PFNGLXGETSELECTEDEVENTSGIXPROC pGetSelectedEventSGIX;
41101e04c3fSmrg    __GLXvendorInfo *dd;
41201e04c3fSmrg
41301e04c3fSmrg    dd = GetDispatchFromDrawable(dpy, drawable);
41401e04c3fSmrg    if (dd == NULL)
41501e04c3fSmrg        return;
41601e04c3fSmrg
41701e04c3fSmrg    __FETCH_FUNCTION_PTR(GetSelectedEventSGIX);
41801e04c3fSmrg    if (pGetSelectedEventSGIX == NULL)
41901e04c3fSmrg        return;
42001e04c3fSmrg
4217ec681f3Smrg    pGetSelectedEventSGIX(dpy, drawable, mask);
42201e04c3fSmrg}
42301e04c3fSmrg
42401e04c3fSmrg
42501e04c3fSmrg
42601e04c3fSmrgstatic int dispatch_GetVideoSyncSGI(unsigned int *count)
42701e04c3fSmrg{
42801e04c3fSmrg    PFNGLXGETVIDEOSYNCSGIPROC pGetVideoSyncSGI;
42901e04c3fSmrg    __GLXvendorInfo *dd;
43001e04c3fSmrg
43101e04c3fSmrg    if (!__VND->getCurrentContext())
43201e04c3fSmrg        return GLX_BAD_CONTEXT;
43301e04c3fSmrg
43401e04c3fSmrg    dd = __VND->getCurrentDynDispatch();
43501e04c3fSmrg    if (dd == NULL)
43601e04c3fSmrg        return GLX_NO_EXTENSION;
43701e04c3fSmrg
43801e04c3fSmrg    __FETCH_FUNCTION_PTR(GetVideoSyncSGI);
43901e04c3fSmrg    if (pGetVideoSyncSGI == NULL)
44001e04c3fSmrg        return GLX_NO_EXTENSION;
44101e04c3fSmrg
4427ec681f3Smrg    return pGetVideoSyncSGI(count);
44301e04c3fSmrg}
44401e04c3fSmrg
44501e04c3fSmrg
44601e04c3fSmrg
44701e04c3fSmrgstatic XVisualInfo *dispatch_GetVisualFromFBConfigSGIX(Display *dpy,
44801e04c3fSmrg                                                       GLXFBConfigSGIX config)
44901e04c3fSmrg{
45001e04c3fSmrg    PFNGLXGETVISUALFROMFBCONFIGSGIXPROC pGetVisualFromFBConfigSGIX;
45101e04c3fSmrg    __GLXvendorInfo *dd;
45201e04c3fSmrg
45301e04c3fSmrg    dd = GetDispatchFromFBConfig(dpy, config);
45401e04c3fSmrg    if (dd == NULL)
45501e04c3fSmrg        return NULL;
45601e04c3fSmrg
45701e04c3fSmrg    __FETCH_FUNCTION_PTR(GetVisualFromFBConfigSGIX);
45801e04c3fSmrg    if (pGetVisualFromFBConfigSGIX == NULL)
45901e04c3fSmrg        return NULL;
46001e04c3fSmrg
4617ec681f3Smrg    return pGetVisualFromFBConfigSGIX(dpy, config);
46201e04c3fSmrg}
46301e04c3fSmrg
46401e04c3fSmrg
46501e04c3fSmrg
46601e04c3fSmrgstatic int dispatch_QueryContextInfoEXT(Display *dpy, GLXContext ctx,
46701e04c3fSmrg                                        int attribute, int *value)
46801e04c3fSmrg{
46901e04c3fSmrg    PFNGLXQUERYCONTEXTINFOEXTPROC pQueryContextInfoEXT;
47001e04c3fSmrg    __GLXvendorInfo *dd;
47101e04c3fSmrg
47201e04c3fSmrg    dd = GetDispatchFromContext(ctx);
47301e04c3fSmrg    if (dd == NULL)
47401e04c3fSmrg        return GLX_NO_EXTENSION;
47501e04c3fSmrg
47601e04c3fSmrg    __FETCH_FUNCTION_PTR(QueryContextInfoEXT);
47701e04c3fSmrg    if (pQueryContextInfoEXT == NULL)
47801e04c3fSmrg        return GLX_NO_EXTENSION;
47901e04c3fSmrg
4807ec681f3Smrg    return pQueryContextInfoEXT(dpy, ctx, attribute, value);
48101e04c3fSmrg}
48201e04c3fSmrg
48301e04c3fSmrg
48401e04c3fSmrg
48501e04c3fSmrgstatic void dispatch_QueryGLXPbufferSGIX(Display *dpy, GLXPbuffer pbuf,
48601e04c3fSmrg                                         int attribute, unsigned int *value)
48701e04c3fSmrg{
48801e04c3fSmrg    PFNGLXQUERYGLXPBUFFERSGIXPROC pQueryGLXPbufferSGIX;
48901e04c3fSmrg    __GLXvendorInfo *dd;
49001e04c3fSmrg
49101e04c3fSmrg    dd = GetDispatchFromDrawable(dpy, pbuf);
49201e04c3fSmrg    if (dd == NULL)
49301e04c3fSmrg        return;
49401e04c3fSmrg
49501e04c3fSmrg    __FETCH_FUNCTION_PTR(QueryGLXPbufferSGIX);
49601e04c3fSmrg    if (pQueryGLXPbufferSGIX == NULL)
49701e04c3fSmrg        return;
49801e04c3fSmrg
4997ec681f3Smrg    pQueryGLXPbufferSGIX(dpy, pbuf, attribute, value);
50001e04c3fSmrg}
50101e04c3fSmrg
50201e04c3fSmrg
50301e04c3fSmrg
50401e04c3fSmrgstatic void dispatch_ReleaseTexImageEXT(Display *dpy, GLXDrawable drawable,
50501e04c3fSmrg                                        int buffer)
50601e04c3fSmrg{
50701e04c3fSmrg    PFNGLXRELEASETEXIMAGEEXTPROC pReleaseTexImageEXT;
50801e04c3fSmrg    __GLXvendorInfo *dd;
50901e04c3fSmrg
51001e04c3fSmrg    dd = GetDispatchFromDrawable(dpy, drawable);
51101e04c3fSmrg    if (dd == NULL)
51201e04c3fSmrg        return;
51301e04c3fSmrg
51401e04c3fSmrg    __FETCH_FUNCTION_PTR(ReleaseTexImageEXT);
51501e04c3fSmrg    if (pReleaseTexImageEXT == NULL)
51601e04c3fSmrg        return;
51701e04c3fSmrg
5187ec681f3Smrg    pReleaseTexImageEXT(dpy, drawable, buffer);
51901e04c3fSmrg}
52001e04c3fSmrg
52101e04c3fSmrg
52201e04c3fSmrg
52301e04c3fSmrgstatic void dispatch_SelectEventSGIX(Display *dpy, GLXDrawable drawable,
52401e04c3fSmrg                                     unsigned long mask)
52501e04c3fSmrg{
52601e04c3fSmrg    PFNGLXSELECTEVENTSGIXPROC pSelectEventSGIX;
52701e04c3fSmrg    __GLXvendorInfo *dd;
52801e04c3fSmrg
52901e04c3fSmrg    dd = GetDispatchFromDrawable(dpy, drawable);
53001e04c3fSmrg    if (dd == NULL)
53101e04c3fSmrg        return;
53201e04c3fSmrg
53301e04c3fSmrg    __FETCH_FUNCTION_PTR(SelectEventSGIX);
53401e04c3fSmrg    if (pSelectEventSGIX == NULL)
53501e04c3fSmrg        return;
53601e04c3fSmrg
5377ec681f3Smrg    pSelectEventSGIX(dpy, drawable, mask);
53801e04c3fSmrg}
53901e04c3fSmrg
54001e04c3fSmrg
54101e04c3fSmrg
54201e04c3fSmrgstatic int dispatch_SwapIntervalSGI(int interval)
54301e04c3fSmrg{
54401e04c3fSmrg    PFNGLXSWAPINTERVALSGIPROC pSwapIntervalSGI;
54501e04c3fSmrg    __GLXvendorInfo *dd;
54601e04c3fSmrg
54701e04c3fSmrg    if (!__VND->getCurrentContext())
54801e04c3fSmrg        return GLX_BAD_CONTEXT;
54901e04c3fSmrg
55001e04c3fSmrg    dd = __VND->getCurrentDynDispatch();
55101e04c3fSmrg    if (dd == NULL)
55201e04c3fSmrg        return GLX_NO_EXTENSION;
55301e04c3fSmrg
55401e04c3fSmrg    __FETCH_FUNCTION_PTR(SwapIntervalSGI);
55501e04c3fSmrg    if (pSwapIntervalSGI == NULL)
55601e04c3fSmrg        return GLX_NO_EXTENSION;
55701e04c3fSmrg
5587ec681f3Smrg    return pSwapIntervalSGI(interval);
55901e04c3fSmrg}
56001e04c3fSmrg
56101e04c3fSmrg
56201e04c3fSmrg
56301e04c3fSmrgstatic int dispatch_WaitVideoSyncSGI(int divisor, int remainder,
56401e04c3fSmrg                                     unsigned int *count)
56501e04c3fSmrg{
56601e04c3fSmrg    PFNGLXWAITVIDEOSYNCSGIPROC pWaitVideoSyncSGI;
56701e04c3fSmrg    __GLXvendorInfo *dd;
56801e04c3fSmrg
56901e04c3fSmrg    if (!__VND->getCurrentContext())
57001e04c3fSmrg        return GLX_BAD_CONTEXT;
57101e04c3fSmrg
57201e04c3fSmrg    dd = __VND->getCurrentDynDispatch();
57301e04c3fSmrg    if (dd == NULL)
57401e04c3fSmrg        return GLX_NO_EXTENSION;
57501e04c3fSmrg
57601e04c3fSmrg    __FETCH_FUNCTION_PTR(WaitVideoSyncSGI);
57701e04c3fSmrg    if (pWaitVideoSyncSGI == NULL)
57801e04c3fSmrg        return GLX_NO_EXTENSION;
57901e04c3fSmrg
5807ec681f3Smrg    return pWaitVideoSyncSGI(divisor, remainder, count);
58101e04c3fSmrg}
58201e04c3fSmrg
58301e04c3fSmrg
58401e04c3fSmrg
58501e04c3fSmrgstatic void dispatch_BindSwapBarrierSGIX(Display *dpy, GLXDrawable drawable,
58601e04c3fSmrg                                            int barrier)
58701e04c3fSmrg{
58801e04c3fSmrg    PFNGLXBINDSWAPBARRIERSGIXPROC pBindSwapBarrierSGIX;
58901e04c3fSmrg    __GLXvendorInfo *dd;
59001e04c3fSmrg
59101e04c3fSmrg    dd = GetDispatchFromDrawable(dpy, drawable);
59201e04c3fSmrg    if (dd == NULL)
59301e04c3fSmrg        return;
59401e04c3fSmrg
59501e04c3fSmrg    __FETCH_FUNCTION_PTR(BindSwapBarrierSGIX);
59601e04c3fSmrg    if (pBindSwapBarrierSGIX == NULL)
59701e04c3fSmrg        return;
59801e04c3fSmrg
5997ec681f3Smrg    pBindSwapBarrierSGIX(dpy, drawable, barrier);
60001e04c3fSmrg}
60101e04c3fSmrg
60201e04c3fSmrg
60301e04c3fSmrg
60401e04c3fSmrgstatic void dispatch_CopySubBufferMESA(Display *dpy, GLXDrawable drawable,
60501e04c3fSmrg                                          int x, int y, int width, int height)
60601e04c3fSmrg{
60701e04c3fSmrg    PFNGLXCOPYSUBBUFFERMESAPROC pCopySubBufferMESA;
60801e04c3fSmrg    __GLXvendorInfo *dd;
60901e04c3fSmrg
61001e04c3fSmrg    dd = GetDispatchFromDrawable(dpy, drawable);
61101e04c3fSmrg    if (dd == NULL)
61201e04c3fSmrg        return;
61301e04c3fSmrg
61401e04c3fSmrg    __FETCH_FUNCTION_PTR(CopySubBufferMESA);
61501e04c3fSmrg    if (pCopySubBufferMESA == NULL)
61601e04c3fSmrg        return;
61701e04c3fSmrg
6187ec681f3Smrg    pCopySubBufferMESA(dpy, drawable, x, y, width, height);
61901e04c3fSmrg}
62001e04c3fSmrg
62101e04c3fSmrg
62201e04c3fSmrg
62301e04c3fSmrgstatic GLXPixmap dispatch_CreateGLXPixmapMESA(Display *dpy,
62401e04c3fSmrg                                                 XVisualInfo *visinfo,
62501e04c3fSmrg                                                 Pixmap pixmap, Colormap cmap)
62601e04c3fSmrg{
62701e04c3fSmrg    PFNGLXCREATEGLXPIXMAPMESAPROC pCreateGLXPixmapMESA;
62801e04c3fSmrg    __GLXvendorInfo *dd;
62901e04c3fSmrg    GLXPixmap ret;
63001e04c3fSmrg
63101e04c3fSmrg    dd = GetDispatchFromVisual(dpy, visinfo);
63201e04c3fSmrg    if (dd == NULL)
63301e04c3fSmrg        return None;
63401e04c3fSmrg
63501e04c3fSmrg    __FETCH_FUNCTION_PTR(CreateGLXPixmapMESA);
63601e04c3fSmrg    if (pCreateGLXPixmapMESA == NULL)
63701e04c3fSmrg        return None;
63801e04c3fSmrg
6397ec681f3Smrg    ret = pCreateGLXPixmapMESA(dpy, visinfo, pixmap, cmap);
64001e04c3fSmrg    if (AddDrawableMapping(dpy, ret, dd)) {
64101e04c3fSmrg        /* XXX: Call glXDestroyGLXPixmap which lives in libglvnd. If we're not
64201e04c3fSmrg         * allowed to call it from here, should we extend __glXDispatchTableIndices ?
64301e04c3fSmrg         */
64401e04c3fSmrg        return None;
64501e04c3fSmrg    }
64601e04c3fSmrg
64701e04c3fSmrg    return ret;
64801e04c3fSmrg}
64901e04c3fSmrg
65001e04c3fSmrg
65101e04c3fSmrg
65201e04c3fSmrgstatic GLboolean dispatch_GetMscRateOML(Display *dpy, GLXDrawable drawable,
65301e04c3fSmrg                                           int32_t *numerator, int32_t *denominator)
65401e04c3fSmrg{
65501e04c3fSmrg    PFNGLXGETMSCRATEOMLPROC pGetMscRateOML;
65601e04c3fSmrg    __GLXvendorInfo *dd;
65701e04c3fSmrg
65801e04c3fSmrg    dd = GetDispatchFromDrawable(dpy, drawable);
65901e04c3fSmrg    if (dd == NULL)
66001e04c3fSmrg        return GL_FALSE;
66101e04c3fSmrg
66201e04c3fSmrg    __FETCH_FUNCTION_PTR(GetMscRateOML);
66301e04c3fSmrg    if (pGetMscRateOML == NULL)
66401e04c3fSmrg        return GL_FALSE;
66501e04c3fSmrg
6667ec681f3Smrg    return pGetMscRateOML(dpy, drawable, numerator, denominator);
66701e04c3fSmrg}
66801e04c3fSmrg
66901e04c3fSmrg
67001e04c3fSmrg
67101e04c3fSmrgstatic const char *dispatch_GetScreenDriver(Display *dpy, int scrNum)
67201e04c3fSmrg{
67301e04c3fSmrg    typedef const char *(*fn_glXGetScreenDriver_ptr)(Display *dpy, int scrNum);
67401e04c3fSmrg    fn_glXGetScreenDriver_ptr pGetScreenDriver;
67501e04c3fSmrg    __GLXvendorInfo *dd;
67601e04c3fSmrg
67701e04c3fSmrg    dd = __VND->getDynDispatch(dpy, scrNum);
67801e04c3fSmrg    if (dd == NULL)
67901e04c3fSmrg        return NULL;
68001e04c3fSmrg
68101e04c3fSmrg    __FETCH_FUNCTION_PTR(GetScreenDriver);
68201e04c3fSmrg    if (pGetScreenDriver == NULL)
68301e04c3fSmrg        return NULL;
68401e04c3fSmrg
6857ec681f3Smrg    return pGetScreenDriver(dpy, scrNum);
68601e04c3fSmrg}
68701e04c3fSmrg
68801e04c3fSmrg
68901e04c3fSmrg
69001e04c3fSmrgstatic int dispatch_GetSwapIntervalMESA(void)
69101e04c3fSmrg{
69201e04c3fSmrg    PFNGLXGETSWAPINTERVALMESAPROC pGetSwapIntervalMESA;
69301e04c3fSmrg    __GLXvendorInfo *dd;
69401e04c3fSmrg
69501e04c3fSmrg    if (!__VND->getCurrentContext())
69601e04c3fSmrg        return GLX_BAD_CONTEXT;
69701e04c3fSmrg
69801e04c3fSmrg    dd = __VND->getCurrentDynDispatch();
69901e04c3fSmrg    if (dd == NULL)
70001e04c3fSmrg        return 0;
70101e04c3fSmrg
70201e04c3fSmrg    __FETCH_FUNCTION_PTR(GetSwapIntervalMESA);
70301e04c3fSmrg    if (pGetSwapIntervalMESA == NULL)
70401e04c3fSmrg        return 0;
70501e04c3fSmrg
7067ec681f3Smrg    return pGetSwapIntervalMESA();
70701e04c3fSmrg}
70801e04c3fSmrg
70901e04c3fSmrg
71001e04c3fSmrg
71101e04c3fSmrgstatic Bool dispatch_GetSyncValuesOML(Display *dpy, GLXDrawable drawable,
71201e04c3fSmrg                                         int64_t *ust, int64_t *msc, int64_t *sbc)
71301e04c3fSmrg{
71401e04c3fSmrg    PFNGLXGETSYNCVALUESOMLPROC pGetSyncValuesOML;
71501e04c3fSmrg    __GLXvendorInfo *dd;
71601e04c3fSmrg
71701e04c3fSmrg    dd = GetDispatchFromDrawable(dpy, drawable);
71801e04c3fSmrg    if (dd == NULL)
71901e04c3fSmrg        return False;
72001e04c3fSmrg
72101e04c3fSmrg    __FETCH_FUNCTION_PTR(GetSyncValuesOML);
72201e04c3fSmrg    if (pGetSyncValuesOML == NULL)
72301e04c3fSmrg        return False;
72401e04c3fSmrg
7257ec681f3Smrg    return pGetSyncValuesOML(dpy, drawable, ust, msc, sbc);
72601e04c3fSmrg}
72701e04c3fSmrg
72801e04c3fSmrg
72901e04c3fSmrg
73001e04c3fSmrgstatic void dispatch_JoinSwapGroupSGIX(Display *dpy, GLXDrawable drawable,
73101e04c3fSmrg                                          GLXDrawable member)
73201e04c3fSmrg{
73301e04c3fSmrg    PFNGLXJOINSWAPGROUPSGIXPROC pJoinSwapGroupSGIX;
73401e04c3fSmrg    __GLXvendorInfo *dd;
73501e04c3fSmrg
73601e04c3fSmrg    dd = GetDispatchFromDrawable(dpy, drawable);
73701e04c3fSmrg    if (dd == NULL)
73801e04c3fSmrg        return;
73901e04c3fSmrg
74001e04c3fSmrg    __FETCH_FUNCTION_PTR(JoinSwapGroupSGIX);
74101e04c3fSmrg    if (pJoinSwapGroupSGIX == NULL)
74201e04c3fSmrg        return;
74301e04c3fSmrg
7447ec681f3Smrg    pJoinSwapGroupSGIX(dpy, drawable, member);
74501e04c3fSmrg}
74601e04c3fSmrg
74701e04c3fSmrg
74801e04c3fSmrg
74901e04c3fSmrgstatic Bool dispatch_QueryCurrentRendererIntegerMESA(int attribute,
75001e04c3fSmrg                                                        unsigned int *value)
75101e04c3fSmrg{
75201e04c3fSmrg    PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC pQueryCurrentRendererIntegerMESA;
75301e04c3fSmrg    __GLXvendorInfo *dd;
75401e04c3fSmrg
75501e04c3fSmrg    if (!__VND->getCurrentContext())
75601e04c3fSmrg        return False;
75701e04c3fSmrg
75801e04c3fSmrg    dd = __VND->getCurrentDynDispatch();
75901e04c3fSmrg    if (dd == NULL)
76001e04c3fSmrg        return False;
76101e04c3fSmrg
76201e04c3fSmrg    __FETCH_FUNCTION_PTR(QueryCurrentRendererIntegerMESA);
76301e04c3fSmrg    if (pQueryCurrentRendererIntegerMESA == NULL)
76401e04c3fSmrg        return False;
76501e04c3fSmrg
7667ec681f3Smrg    return pQueryCurrentRendererIntegerMESA(attribute, value);
76701e04c3fSmrg}
76801e04c3fSmrg
76901e04c3fSmrg
77001e04c3fSmrg
77101e04c3fSmrgstatic const char *dispatch_QueryCurrentRendererStringMESA(int attribute)
77201e04c3fSmrg{
77301e04c3fSmrg    PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC pQueryCurrentRendererStringMESA;
77401e04c3fSmrg    __GLXvendorInfo *dd;
77501e04c3fSmrg
77601e04c3fSmrg    if (!__VND->getCurrentContext())
77701e04c3fSmrg        return NULL;
77801e04c3fSmrg
77901e04c3fSmrg    dd = __VND->getCurrentDynDispatch();
78001e04c3fSmrg    if (dd == NULL)
78101e04c3fSmrg        return NULL;
78201e04c3fSmrg
78301e04c3fSmrg    __FETCH_FUNCTION_PTR(QueryCurrentRendererStringMESA);
78401e04c3fSmrg    if (pQueryCurrentRendererStringMESA == NULL)
78501e04c3fSmrg        return NULL;
78601e04c3fSmrg
7877ec681f3Smrg    return pQueryCurrentRendererStringMESA(attribute);
78801e04c3fSmrg}
78901e04c3fSmrg
79001e04c3fSmrg
79101e04c3fSmrg
79201e04c3fSmrgstatic Bool dispatch_QueryMaxSwapBarriersSGIX(Display *dpy, int screen,
79301e04c3fSmrg                                                 int *max)
79401e04c3fSmrg{
79501e04c3fSmrg    PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC pQueryMaxSwapBarriersSGIX;
79601e04c3fSmrg    __GLXvendorInfo *dd;
79701e04c3fSmrg
79801e04c3fSmrg    dd = __VND->getDynDispatch(dpy, screen);
79901e04c3fSmrg    if (dd == NULL)
80001e04c3fSmrg        return False;
80101e04c3fSmrg
80201e04c3fSmrg    __FETCH_FUNCTION_PTR(QueryMaxSwapBarriersSGIX);
80301e04c3fSmrg    if (pQueryMaxSwapBarriersSGIX == NULL)
80401e04c3fSmrg        return False;
80501e04c3fSmrg
8067ec681f3Smrg    return pQueryMaxSwapBarriersSGIX(dpy, screen, max);
80701e04c3fSmrg}
80801e04c3fSmrg
80901e04c3fSmrg
81001e04c3fSmrg
81101e04c3fSmrgstatic Bool dispatch_QueryRendererIntegerMESA(Display *dpy, int screen,
81201e04c3fSmrg                                                 int renderer, int attribute,
81301e04c3fSmrg                                                 unsigned int *value)
81401e04c3fSmrg{
81501e04c3fSmrg    PFNGLXQUERYRENDERERINTEGERMESAPROC pQueryRendererIntegerMESA;
81601e04c3fSmrg    __GLXvendorInfo *dd;
81701e04c3fSmrg
81801e04c3fSmrg    dd = __VND->getDynDispatch(dpy, screen);
81901e04c3fSmrg    if (dd == NULL)
82001e04c3fSmrg        return False;
82101e04c3fSmrg
82201e04c3fSmrg    __FETCH_FUNCTION_PTR(QueryRendererIntegerMESA);
82301e04c3fSmrg    if (pQueryRendererIntegerMESA == NULL)
82401e04c3fSmrg        return False;
82501e04c3fSmrg
8267ec681f3Smrg    return pQueryRendererIntegerMESA(dpy, screen, renderer, attribute, value);
82701e04c3fSmrg}
82801e04c3fSmrg
82901e04c3fSmrg
83001e04c3fSmrg
83101e04c3fSmrgstatic const char *dispatch_QueryRendererStringMESA(Display *dpy, int screen,
83201e04c3fSmrg                                                       int renderer, int attribute)
83301e04c3fSmrg{
83401e04c3fSmrg    PFNGLXQUERYRENDERERSTRINGMESAPROC pQueryRendererStringMESA;
83501e04c3fSmrg    __GLXvendorInfo *dd = NULL;
83601e04c3fSmrg
83701e04c3fSmrg    dd = __VND->getDynDispatch(dpy, screen);
83801e04c3fSmrg    if (dd == NULL)
83901e04c3fSmrg        return NULL;
84001e04c3fSmrg
84101e04c3fSmrg    __FETCH_FUNCTION_PTR(QueryRendererStringMESA);
84201e04c3fSmrg    if (pQueryRendererStringMESA == NULL)
84301e04c3fSmrg        return NULL;
84401e04c3fSmrg
8457ec681f3Smrg    return pQueryRendererStringMESA(dpy, screen, renderer, attribute);
84601e04c3fSmrg}
84701e04c3fSmrg
84801e04c3fSmrg
84901e04c3fSmrg
85001e04c3fSmrgstatic Bool dispatch_ReleaseBuffersMESA(Display *dpy, GLXDrawable d)
85101e04c3fSmrg{
85201e04c3fSmrg    PFNGLXRELEASEBUFFERSMESAPROC pReleaseBuffersMESA;
85301e04c3fSmrg    __GLXvendorInfo *dd;
85401e04c3fSmrg
85501e04c3fSmrg    dd = GetDispatchFromDrawable(dpy, d);
85601e04c3fSmrg    if (dd == NULL)
85701e04c3fSmrg        return False;
85801e04c3fSmrg
85901e04c3fSmrg    __FETCH_FUNCTION_PTR(ReleaseBuffersMESA);
86001e04c3fSmrg    if (pReleaseBuffersMESA == NULL)
86101e04c3fSmrg        return False;
86201e04c3fSmrg
8637ec681f3Smrg    return pReleaseBuffersMESA(dpy, d);
86401e04c3fSmrg}
86501e04c3fSmrg
86601e04c3fSmrg
86701e04c3fSmrg
86801e04c3fSmrgstatic int64_t dispatch_SwapBuffersMscOML(Display *dpy, GLXDrawable drawable,
86901e04c3fSmrg                                             int64_t target_msc, int64_t divisor,
87001e04c3fSmrg                                             int64_t remainder)
87101e04c3fSmrg{
87201e04c3fSmrg    PFNGLXSWAPBUFFERSMSCOMLPROC pSwapBuffersMscOML;
87301e04c3fSmrg    __GLXvendorInfo *dd;
87401e04c3fSmrg
87501e04c3fSmrg    dd = GetDispatchFromDrawable(dpy, drawable);
87601e04c3fSmrg    if (dd == NULL)
87701e04c3fSmrg        return 0;
87801e04c3fSmrg
87901e04c3fSmrg    __FETCH_FUNCTION_PTR(SwapBuffersMscOML);
88001e04c3fSmrg    if (pSwapBuffersMscOML == NULL)
88101e04c3fSmrg        return 0;
88201e04c3fSmrg
8837ec681f3Smrg    return pSwapBuffersMscOML(dpy, drawable, target_msc, divisor, remainder);
88401e04c3fSmrg}
88501e04c3fSmrg
88601e04c3fSmrg
88701e04c3fSmrg
88801e04c3fSmrgstatic int dispatch_SwapIntervalMESA(unsigned int interval)
88901e04c3fSmrg{
89001e04c3fSmrg    PFNGLXSWAPINTERVALMESAPROC pSwapIntervalMESA;
89101e04c3fSmrg    __GLXvendorInfo *dd;
89201e04c3fSmrg
89301e04c3fSmrg    if (!__VND->getCurrentContext())
89401e04c3fSmrg        return GLX_BAD_CONTEXT;
89501e04c3fSmrg
89601e04c3fSmrg    dd = __VND->getCurrentDynDispatch();
89701e04c3fSmrg    if (dd == NULL)
89801e04c3fSmrg        return 0;
89901e04c3fSmrg
90001e04c3fSmrg    __FETCH_FUNCTION_PTR(SwapIntervalMESA);
90101e04c3fSmrg    if (pSwapIntervalMESA == NULL)
90201e04c3fSmrg        return 0;
90301e04c3fSmrg
9047ec681f3Smrg    return pSwapIntervalMESA(interval);
9057ec681f3Smrg}
9067ec681f3Smrg
9077ec681f3Smrg
9087ec681f3Smrg
9097ec681f3Smrgstatic void dispatch_SwapIntervalEXT(Display *dpy, GLXDrawable drawable, int interval)
9107ec681f3Smrg{
9117ec681f3Smrg    PFNGLXSWAPINTERVALEXTPROC pSwapIntervalEXT;
9127ec681f3Smrg    __GLXvendorInfo *dd;
9137ec681f3Smrg
9147ec681f3Smrg    dd = GetDispatchFromDrawable(dpy, drawable);
9157ec681f3Smrg    if (dd == NULL)
9167ec681f3Smrg        return;
9177ec681f3Smrg
9187ec681f3Smrg    __FETCH_FUNCTION_PTR(SwapIntervalEXT);
9197ec681f3Smrg    if (pSwapIntervalEXT == NULL)
9207ec681f3Smrg        return;
9217ec681f3Smrg
9227ec681f3Smrg    pSwapIntervalEXT(dpy, drawable, interval);
92301e04c3fSmrg}
92401e04c3fSmrg
92501e04c3fSmrg
92601e04c3fSmrg
92701e04c3fSmrgstatic Bool dispatch_WaitForMscOML(Display *dpy, GLXDrawable drawable,
92801e04c3fSmrg                                      int64_t target_msc, int64_t divisor,
92901e04c3fSmrg                                      int64_t remainder, int64_t *ust,
93001e04c3fSmrg                                      int64_t *msc, int64_t *sbc)
93101e04c3fSmrg{
93201e04c3fSmrg    PFNGLXWAITFORMSCOMLPROC pWaitForMscOML;
93301e04c3fSmrg    __GLXvendorInfo *dd;
93401e04c3fSmrg
93501e04c3fSmrg    dd = GetDispatchFromDrawable(dpy, drawable);
93601e04c3fSmrg    if (dd == NULL)
93701e04c3fSmrg        return False;
93801e04c3fSmrg
93901e04c3fSmrg    __FETCH_FUNCTION_PTR(WaitForMscOML);
94001e04c3fSmrg    if (pWaitForMscOML == NULL)
94101e04c3fSmrg        return False;
94201e04c3fSmrg
9437ec681f3Smrg    return pWaitForMscOML(dpy, drawable, target_msc, divisor, remainder, ust, msc, sbc);
94401e04c3fSmrg}
94501e04c3fSmrg
94601e04c3fSmrg
94701e04c3fSmrg
94801e04c3fSmrgstatic Bool dispatch_WaitForSbcOML(Display *dpy, GLXDrawable drawable,
94901e04c3fSmrg                                      int64_t target_sbc, int64_t *ust,
95001e04c3fSmrg                                      int64_t *msc, int64_t *sbc)
95101e04c3fSmrg{
95201e04c3fSmrg    PFNGLXWAITFORSBCOMLPROC pWaitForSbcOML;
95301e04c3fSmrg    __GLXvendorInfo *dd;
95401e04c3fSmrg
95501e04c3fSmrg    dd = GetDispatchFromDrawable(dpy, drawable);
95601e04c3fSmrg    if (dd == NULL)
95701e04c3fSmrg        return False;
95801e04c3fSmrg
95901e04c3fSmrg    __FETCH_FUNCTION_PTR(WaitForSbcOML);
96001e04c3fSmrg    if (pWaitForSbcOML == NULL)
96101e04c3fSmrg        return False;
96201e04c3fSmrg
9637ec681f3Smrg    return pWaitForSbcOML(dpy, drawable, target_sbc, ust, msc, sbc);
96401e04c3fSmrg}
96501e04c3fSmrg
96601e04c3fSmrg#undef __FETCH_FUNCTION_PTR
96701e04c3fSmrg
96801e04c3fSmrg
96901e04c3fSmrg/* Allocate an extra 'dummy' to ease lookup. See FindGLXFunction() */
97001e04c3fSmrgconst void * const __glXDispatchFunctions[DI_LAST_INDEX + 1] = {
97101e04c3fSmrg#define __ATTRIB(field) \
97201e04c3fSmrg    [DI_##field] = (void *)dispatch_##field
97301e04c3fSmrg
97401e04c3fSmrg    __ATTRIB(BindSwapBarrierSGIX),
97501e04c3fSmrg    __ATTRIB(BindTexImageEXT),
97601e04c3fSmrg    __ATTRIB(ChooseFBConfigSGIX),
97701e04c3fSmrg    __ATTRIB(CopySubBufferMESA),
97801e04c3fSmrg    __ATTRIB(CreateContextAttribsARB),
97901e04c3fSmrg    __ATTRIB(CreateContextWithConfigSGIX),
98001e04c3fSmrg    __ATTRIB(CreateGLXPbufferSGIX),
98101e04c3fSmrg    __ATTRIB(CreateGLXPixmapMESA),
98201e04c3fSmrg    __ATTRIB(CreateGLXPixmapWithConfigSGIX),
98301e04c3fSmrg    __ATTRIB(DestroyGLXPbufferSGIX),
98401e04c3fSmrg    __ATTRIB(GetContextIDEXT),
98501e04c3fSmrg    __ATTRIB(GetCurrentDisplayEXT),
98601e04c3fSmrg    __ATTRIB(GetDriverConfig),
98701e04c3fSmrg    __ATTRIB(GetFBConfigAttribSGIX),
98801e04c3fSmrg    __ATTRIB(GetFBConfigFromVisualSGIX),
98901e04c3fSmrg    __ATTRIB(GetMscRateOML),
99001e04c3fSmrg    __ATTRIB(GetScreenDriver),
99101e04c3fSmrg    __ATTRIB(GetSelectedEventSGIX),
99201e04c3fSmrg    __ATTRIB(GetSwapIntervalMESA),
99301e04c3fSmrg    __ATTRIB(GetSyncValuesOML),
99401e04c3fSmrg    __ATTRIB(GetVideoSyncSGI),
99501e04c3fSmrg    __ATTRIB(GetVisualFromFBConfigSGIX),
99601e04c3fSmrg    __ATTRIB(JoinSwapGroupSGIX),
99701e04c3fSmrg    __ATTRIB(QueryContextInfoEXT),
99801e04c3fSmrg    __ATTRIB(QueryCurrentRendererIntegerMESA),
99901e04c3fSmrg    __ATTRIB(QueryCurrentRendererStringMESA),
100001e04c3fSmrg    __ATTRIB(QueryGLXPbufferSGIX),
100101e04c3fSmrg    __ATTRIB(QueryMaxSwapBarriersSGIX),
100201e04c3fSmrg    __ATTRIB(QueryRendererIntegerMESA),
100301e04c3fSmrg    __ATTRIB(QueryRendererStringMESA),
100401e04c3fSmrg    __ATTRIB(ReleaseBuffersMESA),
100501e04c3fSmrg    __ATTRIB(ReleaseTexImageEXT),
100601e04c3fSmrg    __ATTRIB(SelectEventSGIX),
100701e04c3fSmrg    __ATTRIB(SwapBuffersMscOML),
10087ec681f3Smrg    __ATTRIB(SwapIntervalEXT),
100901e04c3fSmrg    __ATTRIB(SwapIntervalMESA),
101001e04c3fSmrg    __ATTRIB(SwapIntervalSGI),
101101e04c3fSmrg    __ATTRIB(WaitForMscOML),
101201e04c3fSmrg    __ATTRIB(WaitForSbcOML),
101301e04c3fSmrg    __ATTRIB(WaitVideoSyncSGI),
101401e04c3fSmrg
101501e04c3fSmrg    [DI_LAST_INDEX] = NULL,
101601e04c3fSmrg#undef __ATTRIB
101701e04c3fSmrg};
1018