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