Path: blob/21.2-virgl/src/glx/g_glxglvnddispatchfuncs.c
4558 views
#include <stdlib.h>12#include "glxclient.h"3#include "glxglvnd.h"4#include "glxglvnddispatchfuncs.h"5#include "g_glxglvnddispatchindices.h"67const int DI_FUNCTION_COUNT = DI_LAST_INDEX;8/* Allocate an extra 'dummy' to ease lookup. See FindGLXFunction() */9int __glXDispatchTableIndices[DI_LAST_INDEX + 1];10const __GLXapiExports *__glXGLVNDAPIExports;1112const char * const __glXDispatchTableStrings[DI_LAST_INDEX] = {13#define __ATTRIB(field) \14[DI_##field] = "glX"#field1516__ATTRIB(BindSwapBarrierSGIX),17__ATTRIB(BindTexImageEXT),18// glXChooseFBConfig implemented by libglvnd19__ATTRIB(ChooseFBConfigSGIX),20// glXChooseVisual implemented by libglvnd21// glXCopyContext implemented by libglvnd22__ATTRIB(CopySubBufferMESA),23// glXCreateContext implemented by libglvnd24__ATTRIB(CreateContextAttribsARB),25__ATTRIB(CreateContextWithConfigSGIX),26__ATTRIB(CreateGLXPbufferSGIX),27// glXCreateGLXPixmap implemented by libglvnd28__ATTRIB(CreateGLXPixmapMESA),29__ATTRIB(CreateGLXPixmapWithConfigSGIX),30// glXCreateNewContext implemented by libglvnd31// glXCreatePbuffer implemented by libglvnd32// glXCreatePixmap implemented by libglvnd33// glXCreateWindow implemented by libglvnd34// glXDestroyContext implemented by libglvnd35__ATTRIB(DestroyGLXPbufferSGIX),36// glXDestroyGLXPixmap implemented by libglvnd37// glXDestroyPbuffer implemented by libglvnd38// glXDestroyPixmap implemented by libglvnd39// glXDestroyWindow implemented by libglvnd40// glXFreeContextEXT implemented by libglvnd41// glXGetClientString implemented by libglvnd42// glXGetConfig implemented by libglvnd43__ATTRIB(GetContextIDEXT),44// glXGetCurrentContext implemented by libglvnd45// glXGetCurrentDisplay implemented by libglvnd46__ATTRIB(GetCurrentDisplayEXT),47// glXGetCurrentDrawable implemented by libglvnd48// glXGetCurrentReadDrawable implemented by libglvnd49__ATTRIB(GetDriverConfig),50// glXGetFBConfigAttrib implemented by libglvnd51__ATTRIB(GetFBConfigAttribSGIX),52__ATTRIB(GetFBConfigFromVisualSGIX),53// glXGetFBConfigs implemented by libglvnd54__ATTRIB(GetMscRateOML),55// glXGetProcAddress implemented by libglvnd56// glXGetProcAddressARB implemented by libglvnd57__ATTRIB(GetScreenDriver),58// glXGetSelectedEvent implemented by libglvnd59__ATTRIB(GetSelectedEventSGIX),60__ATTRIB(GetSwapIntervalMESA),61__ATTRIB(GetSyncValuesOML),62__ATTRIB(GetVideoSyncSGI),63// glXGetVisualFromFBConfig implemented by libglvnd64__ATTRIB(GetVisualFromFBConfigSGIX),65// glXImportContextEXT implemented by libglvnd66// glXIsDirect implemented by libglvnd67__ATTRIB(JoinSwapGroupSGIX),68// glXMakeContextCurrent implemented by libglvnd69// glXMakeCurrent implemented by libglvnd70// glXQueryContext implemented by libglvnd71__ATTRIB(QueryContextInfoEXT),72__ATTRIB(QueryCurrentRendererIntegerMESA),73__ATTRIB(QueryCurrentRendererStringMESA),74// glXQueryDrawable implemented by libglvnd75// glXQueryExtension implemented by libglvnd76// glXQueryExtensionsString implemented by libglvnd77__ATTRIB(QueryGLXPbufferSGIX),78__ATTRIB(QueryMaxSwapBarriersSGIX),79__ATTRIB(QueryRendererIntegerMESA),80__ATTRIB(QueryRendererStringMESA),81// glXQueryServerString implemented by libglvnd82// glXQueryVersion implemented by libglvnd83__ATTRIB(ReleaseBuffersMESA),84__ATTRIB(ReleaseTexImageEXT),85// glXSelectEvent implemented by libglvnd86__ATTRIB(SelectEventSGIX),87// glXSwapBuffers implemented by libglvnd88__ATTRIB(SwapBuffersMscOML),89__ATTRIB(SwapIntervalEXT),90__ATTRIB(SwapIntervalMESA),91__ATTRIB(SwapIntervalSGI),92// glXUseXFont implemented by libglvnd93__ATTRIB(WaitForMscOML),94__ATTRIB(WaitForSbcOML),95// glXWaitGL implemented by libglvnd96__ATTRIB(WaitVideoSyncSGI),97// glXWaitX implemented by libglvnd9899#undef __ATTRIB100};101102#define __FETCH_FUNCTION_PTR(func_name) \103p##func_name = (void *) \104__VND->fetchDispatchEntry(dd, __glXDispatchTableIndices[DI_##func_name])105106107static void dispatch_BindTexImageEXT(Display *dpy, GLXDrawable drawable,108int buffer, const int *attrib_list)109{110PFNGLXBINDTEXIMAGEEXTPROC pBindTexImageEXT;111__GLXvendorInfo *dd;112113dd = GetDispatchFromDrawable(dpy, drawable);114if (dd == NULL)115return;116117__FETCH_FUNCTION_PTR(BindTexImageEXT);118if (pBindTexImageEXT == NULL)119return;120121pBindTexImageEXT(dpy, drawable, buffer, attrib_list);122}123124125126static GLXFBConfigSGIX *dispatch_ChooseFBConfigSGIX(Display *dpy, int screen,127int *attrib_list,128int *nelements)129{130PFNGLXCHOOSEFBCONFIGSGIXPROC pChooseFBConfigSGIX;131__GLXvendorInfo *dd;132GLXFBConfigSGIX *ret;133134dd = __VND->getDynDispatch(dpy, screen);135if (dd == NULL)136return NULL;137138__FETCH_FUNCTION_PTR(ChooseFBConfigSGIX);139if (pChooseFBConfigSGIX == NULL)140return NULL;141142ret = pChooseFBConfigSGIX(dpy, screen, attrib_list, nelements);143if (AddFBConfigsMapping(dpy, ret, nelements, dd)) {144free(ret);145return NULL;146}147148return ret;149}150151152153static GLXContext dispatch_CreateContextAttribsARB(Display *dpy,154GLXFBConfig config,155GLXContext share_list,156Bool direct,157const int *attrib_list)158{159PFNGLXCREATECONTEXTATTRIBSARBPROC pCreateContextAttribsARB;160__GLXvendorInfo *dd = NULL;161GLXContext ret;162163if (config) {164dd = GetDispatchFromFBConfig(dpy, config);165} else if (attrib_list) {166int i, screen;167168for (i = 0; attrib_list[i * 2] != None; i++) {169if (attrib_list[i * 2] == GLX_SCREEN) {170screen = attrib_list[i * 2 + 1];171dd = GetDispatchFromDrawable(dpy, RootWindow(dpy, screen));172break;173}174}175}176if (dd == NULL)177return None;178179__FETCH_FUNCTION_PTR(CreateContextAttribsARB);180if (pCreateContextAttribsARB == NULL)181return None;182183ret = pCreateContextAttribsARB(dpy, config, share_list, direct, attrib_list);184if (AddContextMapping(dpy, ret, dd)) {185/* XXX: Call glXDestroyContext which lives in libglvnd. If we're not186* allowed to call it from here, should we extend __glXDispatchTableIndices ?187*/188return None;189}190191return ret;192}193194195196static GLXContext dispatch_CreateContextWithConfigSGIX(Display *dpy,197GLXFBConfigSGIX config,198int render_type,199GLXContext share_list,200Bool direct)201{202PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC pCreateContextWithConfigSGIX;203__GLXvendorInfo *dd;204GLXContext ret;205206dd = GetDispatchFromFBConfig(dpy, config);207if (dd == NULL)208return None;209210__FETCH_FUNCTION_PTR(CreateContextWithConfigSGIX);211if (pCreateContextWithConfigSGIX == NULL)212return None;213214ret = pCreateContextWithConfigSGIX(dpy, config, render_type, share_list, direct);215if (AddContextMapping(dpy, ret, dd)) {216/* XXX: Call glXDestroyContext which lives in libglvnd. If we're not217* allowed to call it from here, should we extend __glXDispatchTableIndices ?218*/219return None;220}221222return ret;223}224225226227static GLXPbuffer dispatch_CreateGLXPbufferSGIX(Display *dpy,228GLXFBConfig config,229unsigned int width,230unsigned int height,231int *attrib_list)232{233PFNGLXCREATEGLXPBUFFERSGIXPROC pCreateGLXPbufferSGIX;234__GLXvendorInfo *dd;235GLXPbuffer ret;236237dd = GetDispatchFromFBConfig(dpy, config);238if (dd == NULL)239return None;240241__FETCH_FUNCTION_PTR(CreateGLXPbufferSGIX);242if (pCreateGLXPbufferSGIX == NULL)243return None;244245ret = pCreateGLXPbufferSGIX(dpy, config, width, height, attrib_list);246if (AddDrawableMapping(dpy, ret, dd)) {247PFNGLXDESTROYGLXPBUFFERSGIXPROC pDestroyGLXPbufferSGIX;248249__FETCH_FUNCTION_PTR(DestroyGLXPbufferSGIX);250if (pDestroyGLXPbufferSGIX)251pDestroyGLXPbufferSGIX(dpy, ret);252253return None;254}255256return ret;257}258259260261static GLXPixmap dispatch_CreateGLXPixmapWithConfigSGIX(Display *dpy,262GLXFBConfigSGIX config,263Pixmap pixmap)264{265PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC pCreateGLXPixmapWithConfigSGIX;266__GLXvendorInfo *dd;267GLXPixmap ret;268269dd = GetDispatchFromFBConfig(dpy, config);270if (dd == NULL)271return None;272273__FETCH_FUNCTION_PTR(CreateGLXPixmapWithConfigSGIX);274if (pCreateGLXPixmapWithConfigSGIX == NULL)275return None;276277ret = pCreateGLXPixmapWithConfigSGIX(dpy, config, pixmap);278if (AddDrawableMapping(dpy, ret, dd)) {279/* XXX: Call glXDestroyGLXPixmap which lives in libglvnd. If we're not280* allowed to call it from here, should we extend __glXDispatchTableIndices ?281*/282return None;283}284285return ret;286}287288289290static void dispatch_DestroyGLXPbufferSGIX(Display *dpy, GLXPbuffer pbuf)291{292PFNGLXDESTROYGLXPBUFFERSGIXPROC pDestroyGLXPbufferSGIX;293__GLXvendorInfo *dd;294295dd = GetDispatchFromDrawable(dpy, pbuf);296if (dd == NULL)297return;298299__FETCH_FUNCTION_PTR(DestroyGLXPbufferSGIX);300if (pDestroyGLXPbufferSGIX == NULL)301return;302303pDestroyGLXPbufferSGIX(dpy, pbuf);304}305306307308static GLXContextID dispatch_GetContextIDEXT(const GLXContext ctx)309{310PFNGLXGETCONTEXTIDEXTPROC pGetContextIDEXT;311__GLXvendorInfo *dd;312313dd = GetDispatchFromContext(ctx);314if (dd == NULL)315return None;316317__FETCH_FUNCTION_PTR(GetContextIDEXT);318if (pGetContextIDEXT == NULL)319return None;320321return pGetContextIDEXT(ctx);322}323324325326static Display *dispatch_GetCurrentDisplayEXT(void)327{328PFNGLXGETCURRENTDISPLAYEXTPROC pGetCurrentDisplayEXT;329__GLXvendorInfo *dd;330331if (!__VND->getCurrentContext())332return NULL;333334dd = __VND->getCurrentDynDispatch();335if (dd == NULL)336return NULL;337338__FETCH_FUNCTION_PTR(GetCurrentDisplayEXT);339if (pGetCurrentDisplayEXT == NULL)340return NULL;341342return pGetCurrentDisplayEXT();343}344345346347static const char *dispatch_GetDriverConfig(const char *driverName)348{349#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)350/*351* The options are constant for a given driverName, so we do not need352* a context (and apps expect to be able to call this without one).353*/354return glXGetDriverConfig(driverName);355#else356return NULL;357#endif358}359360361362static int dispatch_GetFBConfigAttribSGIX(Display *dpy, GLXFBConfigSGIX config,363int attribute, int *value_return)364{365PFNGLXGETFBCONFIGATTRIBSGIXPROC pGetFBConfigAttribSGIX;366__GLXvendorInfo *dd;367368dd = GetDispatchFromFBConfig(dpy, config);369if (dd == NULL)370return GLX_NO_EXTENSION;371372__FETCH_FUNCTION_PTR(GetFBConfigAttribSGIX);373if (pGetFBConfigAttribSGIX == NULL)374return GLX_NO_EXTENSION;375376return pGetFBConfigAttribSGIX(dpy, config, attribute, value_return);377}378379380381static GLXFBConfigSGIX dispatch_GetFBConfigFromVisualSGIX(Display *dpy,382XVisualInfo *vis)383{384PFNGLXGETFBCONFIGFROMVISUALSGIXPROC pGetFBConfigFromVisualSGIX;385__GLXvendorInfo *dd;386GLXFBConfigSGIX ret = NULL;387388dd = GetDispatchFromVisual(dpy, vis);389if (dd == NULL)390return NULL;391392__FETCH_FUNCTION_PTR(GetFBConfigFromVisualSGIX);393if (pGetFBConfigFromVisualSGIX == NULL)394return NULL;395396ret = pGetFBConfigFromVisualSGIX(dpy, vis);397if (AddFBConfigMapping(dpy, ret, dd))398/* XXX: dealloc ret ? */399return NULL;400401return ret;402}403404405406static void dispatch_GetSelectedEventSGIX(Display *dpy, GLXDrawable drawable,407unsigned long *mask)408{409PFNGLXGETSELECTEDEVENTSGIXPROC pGetSelectedEventSGIX;410__GLXvendorInfo *dd;411412dd = GetDispatchFromDrawable(dpy, drawable);413if (dd == NULL)414return;415416__FETCH_FUNCTION_PTR(GetSelectedEventSGIX);417if (pGetSelectedEventSGIX == NULL)418return;419420pGetSelectedEventSGIX(dpy, drawable, mask);421}422423424425static int dispatch_GetVideoSyncSGI(unsigned int *count)426{427PFNGLXGETVIDEOSYNCSGIPROC pGetVideoSyncSGI;428__GLXvendorInfo *dd;429430if (!__VND->getCurrentContext())431return GLX_BAD_CONTEXT;432433dd = __VND->getCurrentDynDispatch();434if (dd == NULL)435return GLX_NO_EXTENSION;436437__FETCH_FUNCTION_PTR(GetVideoSyncSGI);438if (pGetVideoSyncSGI == NULL)439return GLX_NO_EXTENSION;440441return pGetVideoSyncSGI(count);442}443444445446static XVisualInfo *dispatch_GetVisualFromFBConfigSGIX(Display *dpy,447GLXFBConfigSGIX config)448{449PFNGLXGETVISUALFROMFBCONFIGSGIXPROC pGetVisualFromFBConfigSGIX;450__GLXvendorInfo *dd;451452dd = GetDispatchFromFBConfig(dpy, config);453if (dd == NULL)454return NULL;455456__FETCH_FUNCTION_PTR(GetVisualFromFBConfigSGIX);457if (pGetVisualFromFBConfigSGIX == NULL)458return NULL;459460return pGetVisualFromFBConfigSGIX(dpy, config);461}462463464465static int dispatch_QueryContextInfoEXT(Display *dpy, GLXContext ctx,466int attribute, int *value)467{468PFNGLXQUERYCONTEXTINFOEXTPROC pQueryContextInfoEXT;469__GLXvendorInfo *dd;470471dd = GetDispatchFromContext(ctx);472if (dd == NULL)473return GLX_NO_EXTENSION;474475__FETCH_FUNCTION_PTR(QueryContextInfoEXT);476if (pQueryContextInfoEXT == NULL)477return GLX_NO_EXTENSION;478479return pQueryContextInfoEXT(dpy, ctx, attribute, value);480}481482483484static void dispatch_QueryGLXPbufferSGIX(Display *dpy, GLXPbuffer pbuf,485int attribute, unsigned int *value)486{487PFNGLXQUERYGLXPBUFFERSGIXPROC pQueryGLXPbufferSGIX;488__GLXvendorInfo *dd;489490dd = GetDispatchFromDrawable(dpy, pbuf);491if (dd == NULL)492return;493494__FETCH_FUNCTION_PTR(QueryGLXPbufferSGIX);495if (pQueryGLXPbufferSGIX == NULL)496return;497498pQueryGLXPbufferSGIX(dpy, pbuf, attribute, value);499}500501502503static void dispatch_ReleaseTexImageEXT(Display *dpy, GLXDrawable drawable,504int buffer)505{506PFNGLXRELEASETEXIMAGEEXTPROC pReleaseTexImageEXT;507__GLXvendorInfo *dd;508509dd = GetDispatchFromDrawable(dpy, drawable);510if (dd == NULL)511return;512513__FETCH_FUNCTION_PTR(ReleaseTexImageEXT);514if (pReleaseTexImageEXT == NULL)515return;516517pReleaseTexImageEXT(dpy, drawable, buffer);518}519520521522static void dispatch_SelectEventSGIX(Display *dpy, GLXDrawable drawable,523unsigned long mask)524{525PFNGLXSELECTEVENTSGIXPROC pSelectEventSGIX;526__GLXvendorInfo *dd;527528dd = GetDispatchFromDrawable(dpy, drawable);529if (dd == NULL)530return;531532__FETCH_FUNCTION_PTR(SelectEventSGIX);533if (pSelectEventSGIX == NULL)534return;535536pSelectEventSGIX(dpy, drawable, mask);537}538539540541static int dispatch_SwapIntervalSGI(int interval)542{543PFNGLXSWAPINTERVALSGIPROC pSwapIntervalSGI;544__GLXvendorInfo *dd;545546if (!__VND->getCurrentContext())547return GLX_BAD_CONTEXT;548549dd = __VND->getCurrentDynDispatch();550if (dd == NULL)551return GLX_NO_EXTENSION;552553__FETCH_FUNCTION_PTR(SwapIntervalSGI);554if (pSwapIntervalSGI == NULL)555return GLX_NO_EXTENSION;556557return pSwapIntervalSGI(interval);558}559560561562static int dispatch_WaitVideoSyncSGI(int divisor, int remainder,563unsigned int *count)564{565PFNGLXWAITVIDEOSYNCSGIPROC pWaitVideoSyncSGI;566__GLXvendorInfo *dd;567568if (!__VND->getCurrentContext())569return GLX_BAD_CONTEXT;570571dd = __VND->getCurrentDynDispatch();572if (dd == NULL)573return GLX_NO_EXTENSION;574575__FETCH_FUNCTION_PTR(WaitVideoSyncSGI);576if (pWaitVideoSyncSGI == NULL)577return GLX_NO_EXTENSION;578579return pWaitVideoSyncSGI(divisor, remainder, count);580}581582583584static void dispatch_BindSwapBarrierSGIX(Display *dpy, GLXDrawable drawable,585int barrier)586{587PFNGLXBINDSWAPBARRIERSGIXPROC pBindSwapBarrierSGIX;588__GLXvendorInfo *dd;589590dd = GetDispatchFromDrawable(dpy, drawable);591if (dd == NULL)592return;593594__FETCH_FUNCTION_PTR(BindSwapBarrierSGIX);595if (pBindSwapBarrierSGIX == NULL)596return;597598pBindSwapBarrierSGIX(dpy, drawable, barrier);599}600601602603static void dispatch_CopySubBufferMESA(Display *dpy, GLXDrawable drawable,604int x, int y, int width, int height)605{606PFNGLXCOPYSUBBUFFERMESAPROC pCopySubBufferMESA;607__GLXvendorInfo *dd;608609dd = GetDispatchFromDrawable(dpy, drawable);610if (dd == NULL)611return;612613__FETCH_FUNCTION_PTR(CopySubBufferMESA);614if (pCopySubBufferMESA == NULL)615return;616617pCopySubBufferMESA(dpy, drawable, x, y, width, height);618}619620621622static GLXPixmap dispatch_CreateGLXPixmapMESA(Display *dpy,623XVisualInfo *visinfo,624Pixmap pixmap, Colormap cmap)625{626PFNGLXCREATEGLXPIXMAPMESAPROC pCreateGLXPixmapMESA;627__GLXvendorInfo *dd;628GLXPixmap ret;629630dd = GetDispatchFromVisual(dpy, visinfo);631if (dd == NULL)632return None;633634__FETCH_FUNCTION_PTR(CreateGLXPixmapMESA);635if (pCreateGLXPixmapMESA == NULL)636return None;637638ret = pCreateGLXPixmapMESA(dpy, visinfo, pixmap, cmap);639if (AddDrawableMapping(dpy, ret, dd)) {640/* XXX: Call glXDestroyGLXPixmap which lives in libglvnd. If we're not641* allowed to call it from here, should we extend __glXDispatchTableIndices ?642*/643return None;644}645646return ret;647}648649650651static GLboolean dispatch_GetMscRateOML(Display *dpy, GLXDrawable drawable,652int32_t *numerator, int32_t *denominator)653{654PFNGLXGETMSCRATEOMLPROC pGetMscRateOML;655__GLXvendorInfo *dd;656657dd = GetDispatchFromDrawable(dpy, drawable);658if (dd == NULL)659return GL_FALSE;660661__FETCH_FUNCTION_PTR(GetMscRateOML);662if (pGetMscRateOML == NULL)663return GL_FALSE;664665return pGetMscRateOML(dpy, drawable, numerator, denominator);666}667668669670static const char *dispatch_GetScreenDriver(Display *dpy, int scrNum)671{672typedef const char *(*fn_glXGetScreenDriver_ptr)(Display *dpy, int scrNum);673fn_glXGetScreenDriver_ptr pGetScreenDriver;674__GLXvendorInfo *dd;675676dd = __VND->getDynDispatch(dpy, scrNum);677if (dd == NULL)678return NULL;679680__FETCH_FUNCTION_PTR(GetScreenDriver);681if (pGetScreenDriver == NULL)682return NULL;683684return pGetScreenDriver(dpy, scrNum);685}686687688689static int dispatch_GetSwapIntervalMESA(void)690{691PFNGLXGETSWAPINTERVALMESAPROC pGetSwapIntervalMESA;692__GLXvendorInfo *dd;693694if (!__VND->getCurrentContext())695return GLX_BAD_CONTEXT;696697dd = __VND->getCurrentDynDispatch();698if (dd == NULL)699return 0;700701__FETCH_FUNCTION_PTR(GetSwapIntervalMESA);702if (pGetSwapIntervalMESA == NULL)703return 0;704705return pGetSwapIntervalMESA();706}707708709710static Bool dispatch_GetSyncValuesOML(Display *dpy, GLXDrawable drawable,711int64_t *ust, int64_t *msc, int64_t *sbc)712{713PFNGLXGETSYNCVALUESOMLPROC pGetSyncValuesOML;714__GLXvendorInfo *dd;715716dd = GetDispatchFromDrawable(dpy, drawable);717if (dd == NULL)718return False;719720__FETCH_FUNCTION_PTR(GetSyncValuesOML);721if (pGetSyncValuesOML == NULL)722return False;723724return pGetSyncValuesOML(dpy, drawable, ust, msc, sbc);725}726727728729static void dispatch_JoinSwapGroupSGIX(Display *dpy, GLXDrawable drawable,730GLXDrawable member)731{732PFNGLXJOINSWAPGROUPSGIXPROC pJoinSwapGroupSGIX;733__GLXvendorInfo *dd;734735dd = GetDispatchFromDrawable(dpy, drawable);736if (dd == NULL)737return;738739__FETCH_FUNCTION_PTR(JoinSwapGroupSGIX);740if (pJoinSwapGroupSGIX == NULL)741return;742743pJoinSwapGroupSGIX(dpy, drawable, member);744}745746747748static Bool dispatch_QueryCurrentRendererIntegerMESA(int attribute,749unsigned int *value)750{751PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC pQueryCurrentRendererIntegerMESA;752__GLXvendorInfo *dd;753754if (!__VND->getCurrentContext())755return False;756757dd = __VND->getCurrentDynDispatch();758if (dd == NULL)759return False;760761__FETCH_FUNCTION_PTR(QueryCurrentRendererIntegerMESA);762if (pQueryCurrentRendererIntegerMESA == NULL)763return False;764765return pQueryCurrentRendererIntegerMESA(attribute, value);766}767768769770static const char *dispatch_QueryCurrentRendererStringMESA(int attribute)771{772PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC pQueryCurrentRendererStringMESA;773__GLXvendorInfo *dd;774775if (!__VND->getCurrentContext())776return NULL;777778dd = __VND->getCurrentDynDispatch();779if (dd == NULL)780return NULL;781782__FETCH_FUNCTION_PTR(QueryCurrentRendererStringMESA);783if (pQueryCurrentRendererStringMESA == NULL)784return NULL;785786return pQueryCurrentRendererStringMESA(attribute);787}788789790791static Bool dispatch_QueryMaxSwapBarriersSGIX(Display *dpy, int screen,792int *max)793{794PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC pQueryMaxSwapBarriersSGIX;795__GLXvendorInfo *dd;796797dd = __VND->getDynDispatch(dpy, screen);798if (dd == NULL)799return False;800801__FETCH_FUNCTION_PTR(QueryMaxSwapBarriersSGIX);802if (pQueryMaxSwapBarriersSGIX == NULL)803return False;804805return pQueryMaxSwapBarriersSGIX(dpy, screen, max);806}807808809810static Bool dispatch_QueryRendererIntegerMESA(Display *dpy, int screen,811int renderer, int attribute,812unsigned int *value)813{814PFNGLXQUERYRENDERERINTEGERMESAPROC pQueryRendererIntegerMESA;815__GLXvendorInfo *dd;816817dd = __VND->getDynDispatch(dpy, screen);818if (dd == NULL)819return False;820821__FETCH_FUNCTION_PTR(QueryRendererIntegerMESA);822if (pQueryRendererIntegerMESA == NULL)823return False;824825return pQueryRendererIntegerMESA(dpy, screen, renderer, attribute, value);826}827828829830static const char *dispatch_QueryRendererStringMESA(Display *dpy, int screen,831int renderer, int attribute)832{833PFNGLXQUERYRENDERERSTRINGMESAPROC pQueryRendererStringMESA;834__GLXvendorInfo *dd = NULL;835836dd = __VND->getDynDispatch(dpy, screen);837if (dd == NULL)838return NULL;839840__FETCH_FUNCTION_PTR(QueryRendererStringMESA);841if (pQueryRendererStringMESA == NULL)842return NULL;843844return pQueryRendererStringMESA(dpy, screen, renderer, attribute);845}846847848849static Bool dispatch_ReleaseBuffersMESA(Display *dpy, GLXDrawable d)850{851PFNGLXRELEASEBUFFERSMESAPROC pReleaseBuffersMESA;852__GLXvendorInfo *dd;853854dd = GetDispatchFromDrawable(dpy, d);855if (dd == NULL)856return False;857858__FETCH_FUNCTION_PTR(ReleaseBuffersMESA);859if (pReleaseBuffersMESA == NULL)860return False;861862return pReleaseBuffersMESA(dpy, d);863}864865866867static int64_t dispatch_SwapBuffersMscOML(Display *dpy, GLXDrawable drawable,868int64_t target_msc, int64_t divisor,869int64_t remainder)870{871PFNGLXSWAPBUFFERSMSCOMLPROC pSwapBuffersMscOML;872__GLXvendorInfo *dd;873874dd = GetDispatchFromDrawable(dpy, drawable);875if (dd == NULL)876return 0;877878__FETCH_FUNCTION_PTR(SwapBuffersMscOML);879if (pSwapBuffersMscOML == NULL)880return 0;881882return pSwapBuffersMscOML(dpy, drawable, target_msc, divisor, remainder);883}884885886887static int dispatch_SwapIntervalMESA(unsigned int interval)888{889PFNGLXSWAPINTERVALMESAPROC pSwapIntervalMESA;890__GLXvendorInfo *dd;891892if (!__VND->getCurrentContext())893return GLX_BAD_CONTEXT;894895dd = __VND->getCurrentDynDispatch();896if (dd == NULL)897return 0;898899__FETCH_FUNCTION_PTR(SwapIntervalMESA);900if (pSwapIntervalMESA == NULL)901return 0;902903return pSwapIntervalMESA(interval);904}905906907908static void dispatch_SwapIntervalEXT(Display *dpy, GLXDrawable drawable, int interval)909{910PFNGLXSWAPINTERVALEXTPROC pSwapIntervalEXT;911__GLXvendorInfo *dd;912913dd = GetDispatchFromDrawable(dpy, drawable);914if (dd == NULL)915return;916917__FETCH_FUNCTION_PTR(SwapIntervalEXT);918if (pSwapIntervalEXT == NULL)919return;920921pSwapIntervalEXT(dpy, drawable, interval);922}923924925926static Bool dispatch_WaitForMscOML(Display *dpy, GLXDrawable drawable,927int64_t target_msc, int64_t divisor,928int64_t remainder, int64_t *ust,929int64_t *msc, int64_t *sbc)930{931PFNGLXWAITFORMSCOMLPROC pWaitForMscOML;932__GLXvendorInfo *dd;933934dd = GetDispatchFromDrawable(dpy, drawable);935if (dd == NULL)936return False;937938__FETCH_FUNCTION_PTR(WaitForMscOML);939if (pWaitForMscOML == NULL)940return False;941942return pWaitForMscOML(dpy, drawable, target_msc, divisor, remainder, ust, msc, sbc);943}944945946947static Bool dispatch_WaitForSbcOML(Display *dpy, GLXDrawable drawable,948int64_t target_sbc, int64_t *ust,949int64_t *msc, int64_t *sbc)950{951PFNGLXWAITFORSBCOMLPROC pWaitForSbcOML;952__GLXvendorInfo *dd;953954dd = GetDispatchFromDrawable(dpy, drawable);955if (dd == NULL)956return False;957958__FETCH_FUNCTION_PTR(WaitForSbcOML);959if (pWaitForSbcOML == NULL)960return False;961962return pWaitForSbcOML(dpy, drawable, target_sbc, ust, msc, sbc);963}964965#undef __FETCH_FUNCTION_PTR966967968/* Allocate an extra 'dummy' to ease lookup. See FindGLXFunction() */969const void * const __glXDispatchFunctions[DI_LAST_INDEX + 1] = {970#define __ATTRIB(field) \971[DI_##field] = (void *)dispatch_##field972973__ATTRIB(BindSwapBarrierSGIX),974__ATTRIB(BindTexImageEXT),975__ATTRIB(ChooseFBConfigSGIX),976__ATTRIB(CopySubBufferMESA),977__ATTRIB(CreateContextAttribsARB),978__ATTRIB(CreateContextWithConfigSGIX),979__ATTRIB(CreateGLXPbufferSGIX),980__ATTRIB(CreateGLXPixmapMESA),981__ATTRIB(CreateGLXPixmapWithConfigSGIX),982__ATTRIB(DestroyGLXPbufferSGIX),983__ATTRIB(GetContextIDEXT),984__ATTRIB(GetCurrentDisplayEXT),985__ATTRIB(GetDriverConfig),986__ATTRIB(GetFBConfigAttribSGIX),987__ATTRIB(GetFBConfigFromVisualSGIX),988__ATTRIB(GetMscRateOML),989__ATTRIB(GetScreenDriver),990__ATTRIB(GetSelectedEventSGIX),991__ATTRIB(GetSwapIntervalMESA),992__ATTRIB(GetSyncValuesOML),993__ATTRIB(GetVideoSyncSGI),994__ATTRIB(GetVisualFromFBConfigSGIX),995__ATTRIB(JoinSwapGroupSGIX),996__ATTRIB(QueryContextInfoEXT),997__ATTRIB(QueryCurrentRendererIntegerMESA),998__ATTRIB(QueryCurrentRendererStringMESA),999__ATTRIB(QueryGLXPbufferSGIX),1000__ATTRIB(QueryMaxSwapBarriersSGIX),1001__ATTRIB(QueryRendererIntegerMESA),1002__ATTRIB(QueryRendererStringMESA),1003__ATTRIB(ReleaseBuffersMESA),1004__ATTRIB(ReleaseTexImageEXT),1005__ATTRIB(SelectEventSGIX),1006__ATTRIB(SwapBuffersMscOML),1007__ATTRIB(SwapIntervalEXT),1008__ATTRIB(SwapIntervalMESA),1009__ATTRIB(SwapIntervalSGI),1010__ATTRIB(WaitForMscOML),1011__ATTRIB(WaitForSbcOML),1012__ATTRIB(WaitVideoSyncSGI),10131014[DI_LAST_INDEX] = NULL,1015#undef __ATTRIB1016};101710181019