[Mesa-dev] [PATCH] glvnd: Fix dynamic GLX entrypoint lookup
Emil Velikov
emil.l.velikov at gmail.com
Mon Sep 5 10:58:22 UTC 2016
On 5 September 2016 at 11:23, Eric Engestrom <eric.engestrom at imgtec.com> wrote:
> On Fri, Sep 02, 2016 at 04:12:24PM -0400, Adam Jackson wrote:
>> The dynamic dispatch table needs to be sorted properly, the entrypoints
>> shouldn't duplicate the 'glX' prefix, and please just use bsearch()
>> instead of open-coding it.
>>
>> Signed-off-by: Adam Jackson <ajax at redhat.com>
>> ---
>> src/glx/g_glxglvnddispatchfuncs.c | 254 ++++++++++++++++++------------------
>> src/glx/g_glxglvnddispatchindices.h | 36 ++---
>> src/glx/glxglvnd.c | 32 ++---
>> 3 files changed, 161 insertions(+), 161 deletions(-)
>>
>> diff --git a/src/glx/g_glxglvnddispatchfuncs.c b/src/glx/g_glxglvnddispatchfuncs.c
>> index e6b9c0b..b5e3398 100644
>> --- a/src/glx/g_glxglvnddispatchfuncs.c
>> +++ b/src/glx/g_glxglvnddispatchfuncs.c
>> @@ -17,16 +17,19 @@ const char * const __glXDispatchTableStrings[DI_LAST_INDEX] = {
>> #define __ATTRIB(field) \
>> [DI_##field] = "glX"#field
>>
>> + __ATTRIB(BindSwapBarrierSGIX),
>> __ATTRIB(BindTexImageEXT),
>> // glXChooseFBConfig implemented by libglvnd
>> __ATTRIB(ChooseFBConfigSGIX),
>> // glXChooseVisual implemented by libglvnd
>> // glXCopyContext implemented by libglvnd
>> + __ATTRIB(CopySubBufferMESA),
>> // glXCreateContext implemented by libglvnd
>> __ATTRIB(CreateContextAttribsARB),
>> __ATTRIB(CreateContextWithConfigSGIX),
>> __ATTRIB(CreateGLXPbufferSGIX),
>> // glXCreateGLXPixmap implemented by libglvnd
>> + __ATTRIB(CreateGLXPixmapMESA),
>> __ATTRIB(CreateGLXPixmapWithConfigSGIX),
>> // glXCreateNewContext implemented by libglvnd
>> // glXCreatePbuffer implemented by libglvnd
>> @@ -51,54 +54,50 @@ const char * const __glXDispatchTableStrings[DI_LAST_INDEX] = {
>> __ATTRIB(GetFBConfigAttribSGIX),
>> __ATTRIB(GetFBConfigFromVisualSGIX),
>> // glXGetFBConfigs implemented by libglvnd
>> + __ATTRIB(GetMscRateOML),
>> // glXGetProcAddress implemented by libglvnd
>> // glXGetProcAddressARB implemented by libglvnd
>> + __ATTRIB(GetScreenDriver),
>> // glXGetSelectedEvent implemented by libglvnd
>> __ATTRIB(GetSelectedEventSGIX),
>> + __ATTRIB(GetSwapIntervalMESA),
>> + __ATTRIB(GetSyncValuesOML),
>> __ATTRIB(GetVideoSyncSGI),
>> // glXGetVisualFromFBConfig implemented by libglvnd
>> __ATTRIB(GetVisualFromFBConfigSGIX),
>> // glXImportContextEXT implemented by libglvnd
>> // glXIsDirect implemented by libglvnd
>> + __ATTRIB(JoinSwapGroupSGIX),
>> // glXMakeContextCurrent implemented by libglvnd
>> // glXMakeCurrent implemented by libglvnd
>> // glXQueryContext implemented by libglvnd
>> __ATTRIB(QueryContextInfoEXT),
>> + __ATTRIB(QueryCurrentRendererIntegerMESA),
>> + __ATTRIB(QueryCurrentRendererStringMESA),
>> // glXQueryDrawable implemented by libglvnd
>> // glXQueryExtension implemented by libglvnd
>> // glXQueryExtensionsString implemented by libglvnd
>> __ATTRIB(QueryGLXPbufferSGIX),
>> + __ATTRIB(QueryMaxSwapBarriersSGIX),
>> + __ATTRIB(QueryRendererIntegerMESA),
>> + __ATTRIB(QueryRendererStringMESA),
>> // glXQueryServerString implemented by libglvnd
>> // glXQueryVersion implemented by libglvnd
>> + __ATTRIB(ReleaseBuffersMESA),
>> __ATTRIB(ReleaseTexImageEXT),
>> // glXSelectEvent implemented by libglvnd
>> __ATTRIB(SelectEventSGIX),
>> // glXSwapBuffers implemented by libglvnd
>> + __ATTRIB(SwapBuffersMscOML),
>> + __ATTRIB(SwapIntervalMESA),
>> __ATTRIB(SwapIntervalSGI),
>> // glXUseXFont implemented by libglvnd
>> + __ATTRIB(WaitForMscOML),
>> + __ATTRIB(WaitForSbcOML),
>> // glXWaitGL implemented by libglvnd
>> __ATTRIB(WaitVideoSyncSGI),
>> // glXWaitX implemented by libglvnd
>>
>> - __ATTRIB(glXBindSwapBarrierSGIX),
>> - __ATTRIB(glXCopySubBufferMESA),
>> - __ATTRIB(glXCreateGLXPixmapMESA),
>> - __ATTRIB(glXGetMscRateOML),
>> - __ATTRIB(glXGetScreenDriver),
>> - __ATTRIB(glXGetSwapIntervalMESA),
>> - __ATTRIB(glXGetSyncValuesOML),
>> - __ATTRIB(glXJoinSwapGroupSGIX),
>> - __ATTRIB(glXQueryCurrentRendererIntegerMESA),
>> - __ATTRIB(glXQueryCurrentRendererStringMESA),
>> - __ATTRIB(glXQueryMaxSwapBarriersSGIX),
>> - __ATTRIB(glXQueryRendererIntegerMESA),
>> - __ATTRIB(glXQueryRendererStringMESA),
>> - __ATTRIB(glXReleaseBuffersMESA),
>> - __ATTRIB(glXSwapBuffersMscOML),
>> - __ATTRIB(glXSwapIntervalMESA),
>> - __ATTRIB(glXWaitForMscOML),
>> - __ATTRIB(glXWaitForSbcOML),
>> -
>> #undef __ATTRIB
>> };
>>
>> @@ -557,49 +556,49 @@ static int dispatch_WaitVideoSyncSGI(int divisor, int remainder,
>>
>>
>>
>> -static void dispatch_glXBindSwapBarrierSGIX(Display *dpy, GLXDrawable drawable,
>> +static void dispatch_BindSwapBarrierSGIX(Display *dpy, GLXDrawable drawable,
>> int barrier)
>> {
>> - PFNGLXBINDSWAPBARRIERSGIXPROC pglXBindSwapBarrierSGIX;
>> + PFNGLXBINDSWAPBARRIERSGIXPROC pBindSwapBarrierSGIX;
>> __GLXvendorInfo *dd;
>>
>> dd = GetDispatchFromDrawable(dpy, drawable);
>> if (dd == NULL)
>> return;
>>
>> - __FETCH_FUNCTION_PTR(glXBindSwapBarrierSGIX);
>> - if (pglXBindSwapBarrierSGIX == NULL)
>> + __FETCH_FUNCTION_PTR(BindSwapBarrierSGIX);
>> + if (pBindSwapBarrierSGIX == NULL)
>> return;
>>
>> - (*pglXBindSwapBarrierSGIX)(dpy, drawable, barrier);
>> + (*pBindSwapBarrierSGIX)(dpy, drawable, barrier);
>> }
>>
>>
>>
>> -static void dispatch_glXCopySubBufferMESA(Display *dpy, GLXDrawable drawable,
>> +static void dispatch_CopySubBufferMESA(Display *dpy, GLXDrawable drawable,
>> int x, int y, int width, int height)
>> {
>> - PFNGLXCOPYSUBBUFFERMESAPROC pglXCopySubBufferMESA;
>> + PFNGLXCOPYSUBBUFFERMESAPROC pCopySubBufferMESA;
>> __GLXvendorInfo *dd;
>>
>> dd = GetDispatchFromDrawable(dpy, drawable);
>> if (dd == NULL)
>> return;
>>
>> - __FETCH_FUNCTION_PTR(glXCopySubBufferMESA);
>> - if (pglXCopySubBufferMESA == NULL)
>> + __FETCH_FUNCTION_PTR(CopySubBufferMESA);
>> + if (pCopySubBufferMESA == NULL)
>> return;
>>
>> - (*pglXCopySubBufferMESA)(dpy, drawable, x, y, width, height);
>> + (*pCopySubBufferMESA)(dpy, drawable, x, y, width, height);
>> }
>>
>>
>>
>> -static GLXPixmap dispatch_glXCreateGLXPixmapMESA(Display *dpy,
>> +static GLXPixmap dispatch_CreateGLXPixmapMESA(Display *dpy,
>> XVisualInfo *visinfo,
>> Pixmap pixmap, Colormap cmap)
>> {
>> - PFNGLXCREATEGLXPIXMAPMESAPROC pglXCreateGLXPixmapMESA;
>> + PFNGLXCREATEGLXPIXMAPMESAPROC pCreateGLXPixmapMESA;
>> __GLXvendorInfo *dd;
>> GLXPixmap ret;
>>
>> @@ -607,11 +606,11 @@ static GLXPixmap dispatch_glXCreateGLXPixmapMESA(Display *dpy,
>> if (dd == NULL)
>> return None;
>>
>> - __FETCH_FUNCTION_PTR(glXCreateGLXPixmapMESA);
>> - if (pglXCreateGLXPixmapMESA == NULL)
>> + __FETCH_FUNCTION_PTR(CreateGLXPixmapMESA);
>> + if (pCreateGLXPixmapMESA == NULL)
>> return None;
>>
>> - ret = (*pglXCreateGLXPixmapMESA)(dpy, visinfo, pixmap, cmap);
>> + ret = (*pCreateGLXPixmapMESA)(dpy, visinfo, pixmap, cmap);
>> if (AddDrawableMapping(dpy, ret, dd)) {
>> /* XXX: Call glXDestroyGLXPixmap which lives in libglvnd. If we're not
>> * allowed to call it from here, should we extend __glXDispatchTableIndices ?
>> @@ -624,47 +623,47 @@ static GLXPixmap dispatch_glXCreateGLXPixmapMESA(Display *dpy,
>>
>>
>>
>> -static GLboolean dispatch_glXGetMscRateOML(Display *dpy, GLXDrawable drawable,
>> +static GLboolean dispatch_GetMscRateOML(Display *dpy, GLXDrawable drawable,
>> int32_t *numerator, int32_t *denominator)
>> {
>> - PFNGLXGETMSCRATEOMLPROC pglXGetMscRateOML;
>> + PFNGLXGETMSCRATEOMLPROC pGetMscRateOML;
>> __GLXvendorInfo *dd;
>>
>> dd = GetDispatchFromDrawable(dpy, drawable);
>> if (dd == NULL)
>> return GL_FALSE;
>>
>> - __FETCH_FUNCTION_PTR(glXGetMscRateOML);
>> - if (pglXGetMscRateOML == NULL)
>> + __FETCH_FUNCTION_PTR(GetMscRateOML);
>> + if (pGetMscRateOML == NULL)
>> return GL_FALSE;
>>
>> - return (*pglXGetMscRateOML)(dpy, drawable, numerator, denominator);
>> + return (*pGetMscRateOML)(dpy, drawable, numerator, denominator);
>> }
>>
>>
>>
>> -static const char *dispatch_glXGetScreenDriver(Display *dpy, int scrNum)
>> +static const char *dispatch_GetScreenDriver(Display *dpy, int scrNum)
>> {
>> typedef const char *(*fn_glXGetScreenDriver_ptr)(Display *dpy, int scrNum);
>> - fn_glXGetScreenDriver_ptr pglXGetScreenDriver;
>> + fn_glXGetScreenDriver_ptr pGetScreenDriver;
>> __GLXvendorInfo *dd;
>>
>> dd = __VND->getDynDispatch(dpy, scrNum);
>> if (dd == NULL)
>> return NULL;
>>
>> - __FETCH_FUNCTION_PTR(glXGetScreenDriver);
>> - if (pglXGetScreenDriver == NULL)
>> + __FETCH_FUNCTION_PTR(GetScreenDriver);
>> + if (pGetScreenDriver == NULL)
>> return NULL;
>>
>> - return (*pglXGetScreenDriver)(dpy, scrNum);
>> + return (*pGetScreenDriver)(dpy, scrNum);
>> }
>>
>>
>>
>> -static int dispatch_glXGetSwapIntervalMESA(void)
>> +static int dispatch_GetSwapIntervalMESA(void)
>> {
>> - PFNGLXGETSWAPINTERVALMESAPROC pglXGetSwapIntervalMESA;
>> + PFNGLXGETSWAPINTERVALMESAPROC pGetSwapIntervalMESA;
>> __GLXvendorInfo *dd;
>>
>> if (!__VND->getCurrentContext())
>> @@ -674,57 +673,57 @@ static int dispatch_glXGetSwapIntervalMESA(void)
>> if (dd == NULL)
>> return 0;
>>
>> - __FETCH_FUNCTION_PTR(glXGetSwapIntervalMESA);
>> - if (pglXGetSwapIntervalMESA == NULL)
>> + __FETCH_FUNCTION_PTR(GetSwapIntervalMESA);
>> + if (pGetSwapIntervalMESA == NULL)
>> return 0;
>>
>> - return (*pglXGetSwapIntervalMESA)();
>> + return (*pGetSwapIntervalMESA)();
>> }
>>
>>
>>
>> -static Bool dispatch_glXGetSyncValuesOML(Display *dpy, GLXDrawable drawable,
>> +static Bool dispatch_GetSyncValuesOML(Display *dpy, GLXDrawable drawable,
>> int64_t *ust, int64_t *msc, int64_t *sbc)
>> {
>> - PFNGLXGETSYNCVALUESOMLPROC pglXGetSyncValuesOML;
>> + PFNGLXGETSYNCVALUESOMLPROC pGetSyncValuesOML;
>> __GLXvendorInfo *dd;
>>
>> dd = GetDispatchFromDrawable(dpy, drawable);
>> if (dd == NULL)
>> return False;
>>
>> - __FETCH_FUNCTION_PTR(glXGetSyncValuesOML);
>> - if (pglXGetSyncValuesOML == NULL)
>> + __FETCH_FUNCTION_PTR(GetSyncValuesOML);
>> + if (pGetSyncValuesOML == NULL)
>> return False;
>>
>> - return (*pglXGetSyncValuesOML)(dpy, drawable, ust, msc, sbc);
>> + return (*pGetSyncValuesOML)(dpy, drawable, ust, msc, sbc);
>> }
>>
>>
>>
>> -static void dispatch_glXJoinSwapGroupSGIX(Display *dpy, GLXDrawable drawable,
>> +static void dispatch_JoinSwapGroupSGIX(Display *dpy, GLXDrawable drawable,
>> GLXDrawable member)
>> {
>> - PFNGLXJOINSWAPGROUPSGIXPROC pglXJoinSwapGroupSGIX;
>> + PFNGLXJOINSWAPGROUPSGIXPROC pJoinSwapGroupSGIX;
>> __GLXvendorInfo *dd;
>>
>> dd = GetDispatchFromDrawable(dpy, drawable);
>> if (dd == NULL)
>> return;
>>
>> - __FETCH_FUNCTION_PTR(glXJoinSwapGroupSGIX);
>> - if (pglXJoinSwapGroupSGIX == NULL)
>> + __FETCH_FUNCTION_PTR(JoinSwapGroupSGIX);
>> + if (pJoinSwapGroupSGIX == NULL)
>> return;
>>
>> - (*pglXJoinSwapGroupSGIX)(dpy, drawable, member);
>> + (*pJoinSwapGroupSGIX)(dpy, drawable, member);
>> }
>>
>>
>>
>> -static Bool dispatch_glXQueryCurrentRendererIntegerMESA(int attribute,
>> +static Bool dispatch_QueryCurrentRendererIntegerMESA(int attribute,
>> unsigned int *value)
>> {
>> - PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC pglXQueryCurrentRendererIntegerMESA;
>> + PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC pQueryCurrentRendererIntegerMESA;
>> __GLXvendorInfo *dd;
>>
>> if (!__VND->getCurrentContext())
>> @@ -734,18 +733,18 @@ static Bool dispatch_glXQueryCurrentRendererIntegerMESA(int attribute,
>> if (dd == NULL)
>> return False;
>>
>> - __FETCH_FUNCTION_PTR(glXQueryCurrentRendererIntegerMESA);
>> - if (pglXQueryCurrentRendererIntegerMESA == NULL)
>> + __FETCH_FUNCTION_PTR(QueryCurrentRendererIntegerMESA);
>> + if (pQueryCurrentRendererIntegerMESA == NULL)
>> return False;
>>
>> - return (*pglXQueryCurrentRendererIntegerMESA)(attribute, value);
>> + return (*pQueryCurrentRendererIntegerMESA)(attribute, value);
>> }
>>
>>
>>
>> -static const char *dispatch_glXQueryCurrentRendererStringMESA(int attribute)
>> +static const char *dispatch_QueryCurrentRendererStringMESA(int attribute)
>> {
>> - PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC pglXQueryCurrentRendererStringMESA;
>> + PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC pQueryCurrentRendererStringMESA;
>> __GLXvendorInfo *dd;
>>
>> if (!__VND->getCurrentContext())
>> @@ -755,114 +754,114 @@ static const char *dispatch_glXQueryCurrentRendererStringMESA(int attribute)
>> if (dd == NULL)
>> return NULL;
>>
>> - __FETCH_FUNCTION_PTR(glXQueryCurrentRendererStringMESA);
>> - if (pglXQueryCurrentRendererStringMESA == NULL)
>> + __FETCH_FUNCTION_PTR(QueryCurrentRendererStringMESA);
>> + if (pQueryCurrentRendererStringMESA == NULL)
>> return NULL;
>>
>> - return (*pglXQueryCurrentRendererStringMESA)(attribute);
>> + return (*pQueryCurrentRendererStringMESA)(attribute);
>> }
>>
>>
>>
>> -static Bool dispatch_glXQueryMaxSwapBarriersSGIX(Display *dpy, int screen,
>> +static Bool dispatch_QueryMaxSwapBarriersSGIX(Display *dpy, int screen,
>> int *max)
>> {
>> - PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC pglXQueryMaxSwapBarriersSGIX;
>> + PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC pQueryMaxSwapBarriersSGIX;
>> __GLXvendorInfo *dd;
>>
>> dd = __VND->getDynDispatch(dpy, screen);
>> if (dd == NULL)
>> return False;
>>
>> - __FETCH_FUNCTION_PTR(glXQueryMaxSwapBarriersSGIX);
>> - if (pglXQueryMaxSwapBarriersSGIX == NULL)
>> + __FETCH_FUNCTION_PTR(QueryMaxSwapBarriersSGIX);
>> + if (pQueryMaxSwapBarriersSGIX == NULL)
>> return False;
>>
>> - return (*pglXQueryMaxSwapBarriersSGIX)(dpy, screen, max);
>> + return (*pQueryMaxSwapBarriersSGIX)(dpy, screen, max);
>> }
>>
>>
>>
>> -static Bool dispatch_glXQueryRendererIntegerMESA(Display *dpy, int screen,
>> +static Bool dispatch_QueryRendererIntegerMESA(Display *dpy, int screen,
>> int renderer, int attribute,
>> unsigned int *value)
>> {
>> - PFNGLXQUERYRENDERERINTEGERMESAPROC pglXQueryRendererIntegerMESA;
>> + PFNGLXQUERYRENDERERINTEGERMESAPROC pQueryRendererIntegerMESA;
>> __GLXvendorInfo *dd;
>>
>> dd = __VND->getDynDispatch(dpy, screen);
>> if (dd == NULL)
>> return False;
>>
>> - __FETCH_FUNCTION_PTR(glXQueryRendererIntegerMESA);
>> - if (pglXQueryRendererIntegerMESA == NULL)
>> + __FETCH_FUNCTION_PTR(QueryRendererIntegerMESA);
>> + if (pQueryRendererIntegerMESA == NULL)
>> return False;
>>
>> - return (*pglXQueryRendererIntegerMESA)(dpy, screen, renderer, attribute, value);
>> + return (*pQueryRendererIntegerMESA)(dpy, screen, renderer, attribute, value);
>> }
>>
>>
>>
>> -static const char *dispatch_glXQueryRendererStringMESA(Display *dpy, int screen,
>> +static const char *dispatch_QueryRendererStringMESA(Display *dpy, int screen,
>> int renderer, int attribute)
>> {
>> - PFNGLXQUERYRENDERERSTRINGMESAPROC pglXQueryRendererStringMESA;
>> + PFNGLXQUERYRENDERERSTRINGMESAPROC pQueryRendererStringMESA;
>> __GLXvendorInfo *dd = NULL;
>>
>> dd = __VND->getDynDispatch(dpy, screen);
>> if (dd == NULL)
>> return NULL;
>>
>> - __FETCH_FUNCTION_PTR(glXQueryRendererStringMESA);
>> - if (pglXQueryRendererStringMESA == NULL)
>> + __FETCH_FUNCTION_PTR(QueryRendererStringMESA);
>> + if (pQueryRendererStringMESA == NULL)
>> return NULL;
>>
>> - return (*pglXQueryRendererStringMESA)(dpy, screen, renderer, attribute);
>> + return (*pQueryRendererStringMESA)(dpy, screen, renderer, attribute);
>> }
>>
>>
>>
>> -static Bool dispatch_glXReleaseBuffersMESA(Display *dpy, GLXDrawable d)
>> +static Bool dispatch_ReleaseBuffersMESA(Display *dpy, GLXDrawable d)
>> {
>> - PFNGLXRELEASEBUFFERSMESAPROC pglXReleaseBuffersMESA;
>> + PFNGLXRELEASEBUFFERSMESAPROC pReleaseBuffersMESA;
>> __GLXvendorInfo *dd;
>>
>> dd = GetDispatchFromDrawable(dpy, d);
>> if (dd == NULL)
>> return False;
>>
>> - __FETCH_FUNCTION_PTR(glXReleaseBuffersMESA);
>> - if (pglXReleaseBuffersMESA == NULL)
>> + __FETCH_FUNCTION_PTR(ReleaseBuffersMESA);
>> + if (pReleaseBuffersMESA == NULL)
>> return False;
>>
>> - return (*pglXReleaseBuffersMESA)(dpy, d);
>> + return (*pReleaseBuffersMESA)(dpy, d);
>> }
>>
>>
>>
>> -static int64_t dispatch_glXSwapBuffersMscOML(Display *dpy, GLXDrawable drawable,
>> +static int64_t dispatch_SwapBuffersMscOML(Display *dpy, GLXDrawable drawable,
>> int64_t target_msc, int64_t divisor,
>> int64_t remainder)
>> {
>> - PFNGLXSWAPBUFFERSMSCOMLPROC pglXSwapBuffersMscOML;
>> + PFNGLXSWAPBUFFERSMSCOMLPROC pSwapBuffersMscOML;
>> __GLXvendorInfo *dd;
>>
>> dd = GetDispatchFromDrawable(dpy, drawable);
>> if (dd == NULL)
>> return 0;
>>
>> - __FETCH_FUNCTION_PTR(glXSwapBuffersMscOML);
>> - if (pglXSwapBuffersMscOML == NULL)
>> + __FETCH_FUNCTION_PTR(SwapBuffersMscOML);
>> + if (pSwapBuffersMscOML == NULL)
>> return 0;
>>
>> - return (*pglXSwapBuffersMscOML)(dpy, drawable, target_msc, divisor, remainder);
>> + return (*pSwapBuffersMscOML)(dpy, drawable, target_msc, divisor, remainder);
>> }
>>
>>
>>
>> -static int dispatch_glXSwapIntervalMESA(unsigned int interval)
>> +static int dispatch_SwapIntervalMESA(unsigned int interval)
>> {
>> - PFNGLXSWAPINTERVALMESAPROC pglXSwapIntervalMESA;
>> + PFNGLXSWAPINTERVALMESAPROC pSwapIntervalMESA;
>> __GLXvendorInfo *dd;
>>
>> if (!__VND->getCurrentContext())
>> @@ -872,52 +871,52 @@ static int dispatch_glXSwapIntervalMESA(unsigned int interval)
>> if (dd == NULL)
>> return 0;
>>
>> - __FETCH_FUNCTION_PTR(glXSwapIntervalMESA);
>> - if (pglXSwapIntervalMESA == NULL)
>> + __FETCH_FUNCTION_PTR(SwapIntervalMESA);
>> + if (pSwapIntervalMESA == NULL)
>> return 0;
>>
>> - return (*pglXSwapIntervalMESA)(interval);
>> + return (*pSwapIntervalMESA)(interval);
>> }
>>
>>
>>
>> -static Bool dispatch_glXWaitForMscOML(Display *dpy, GLXDrawable drawable,
>> +static Bool dispatch_WaitForMscOML(Display *dpy, GLXDrawable drawable,
>> int64_t target_msc, int64_t divisor,
>> int64_t remainder, int64_t *ust,
>> int64_t *msc, int64_t *sbc)
>> {
>> - PFNGLXWAITFORMSCOMLPROC pglXWaitForMscOML;
>> + PFNGLXWAITFORMSCOMLPROC pWaitForMscOML;
>> __GLXvendorInfo *dd;
>>
>> dd = GetDispatchFromDrawable(dpy, drawable);
>> if (dd == NULL)
>> return False;
>>
>> - __FETCH_FUNCTION_PTR(glXWaitForMscOML);
>> - if (pglXWaitForMscOML == NULL)
>> + __FETCH_FUNCTION_PTR(WaitForMscOML);
>> + if (pWaitForMscOML == NULL)
>> return False;
>>
>> - return (*pglXWaitForMscOML)(dpy, drawable, target_msc, divisor, remainder, ust, msc, sbc);
>> + return (*pWaitForMscOML)(dpy, drawable, target_msc, divisor, remainder, ust, msc, sbc);
>> }
>>
>>
>>
>> -static Bool dispatch_glXWaitForSbcOML(Display *dpy, GLXDrawable drawable,
>> +static Bool dispatch_WaitForSbcOML(Display *dpy, GLXDrawable drawable,
>> int64_t target_sbc, int64_t *ust,
>> int64_t *msc, int64_t *sbc)
>> {
>> - PFNGLXWAITFORSBCOMLPROC pglXWaitForSbcOML;
>> + PFNGLXWAITFORSBCOMLPROC pWaitForSbcOML;
>> __GLXvendorInfo *dd;
>>
>> dd = GetDispatchFromDrawable(dpy, drawable);
>> if (dd == NULL)
>> return False;
>>
>> - __FETCH_FUNCTION_PTR(glXWaitForSbcOML);
>> - if (pglXWaitForSbcOML == NULL)
>> + __FETCH_FUNCTION_PTR(WaitForSbcOML);
>> + if (pWaitForSbcOML == NULL)
>> return False;
>>
>> - return (*pglXWaitForSbcOML)(dpy, drawable, target_sbc, ust, msc, sbc);
>> + return (*pWaitForSbcOML)(dpy, drawable, target_sbc, ust, msc, sbc);
>> }
>>
>> #undef __FETCH_FUNCTION_PTR
>> @@ -928,45 +927,44 @@ const void * const __glXDispatchFunctions[DI_LAST_INDEX + 1] = {
>> #define __ATTRIB(field) \
>> [DI_##field] = (void *)dispatch_##field
>>
>> - __ATTRIB(BindTexImageEXT),
>> + __ATTRIB(BindSwapBarrierSGIX),
>> __ATTRIB(BindTexImageEXT),
>> __ATTRIB(ChooseFBConfigSGIX),
>> + __ATTRIB(CopySubBufferMESA),
>> __ATTRIB(CreateContextAttribsARB),
>> __ATTRIB(CreateContextWithConfigSGIX),
>> __ATTRIB(CreateGLXPbufferSGIX),
>> + __ATTRIB(CreateGLXPixmapMESA),
>> __ATTRIB(CreateGLXPixmapWithConfigSGIX),
>> __ATTRIB(DestroyGLXPbufferSGIX),
>> __ATTRIB(GetContextIDEXT),
>> __ATTRIB(GetCurrentDisplayEXT),
>> __ATTRIB(GetFBConfigAttribSGIX),
>> __ATTRIB(GetFBConfigFromVisualSGIX),
>> + __ATTRIB(GetMscRateOML),
>> + __ATTRIB(GetScreenDriver),
>> __ATTRIB(GetSelectedEventSGIX),
>> + __ATTRIB(GetSwapIntervalMESA),
>> + __ATTRIB(GetSyncValuesOML),
>> __ATTRIB(GetVideoSyncSGI),
>> __ATTRIB(GetVisualFromFBConfigSGIX),
>> + __ATTRIB(JoinSwapGroupSGIX),
>> __ATTRIB(QueryContextInfoEXT),
>> + __ATTRIB(QueryCurrentRendererIntegerMESA),
>> + __ATTRIB(QueryCurrentRendererStringMESA),
>> __ATTRIB(QueryGLXPbufferSGIX),
>> + __ATTRIB(QueryMaxSwapBarriersSGIX),
>> + __ATTRIB(QueryRendererIntegerMESA),
>> + __ATTRIB(QueryRendererStringMESA),
>> + __ATTRIB(ReleaseBuffersMESA),
>> __ATTRIB(ReleaseTexImageEXT),
>> __ATTRIB(SelectEventSGIX),
>> + __ATTRIB(SwapBuffersMscOML),
>> + __ATTRIB(SwapIntervalMESA),
>> __ATTRIB(SwapIntervalSGI),
>> + __ATTRIB(WaitForMscOML),
>> + __ATTRIB(WaitForSbcOML),
>> __ATTRIB(WaitVideoSyncSGI),
>> - __ATTRIB(glXBindSwapBarrierSGIX),
>> - __ATTRIB(glXCopySubBufferMESA),
>> - __ATTRIB(glXCreateGLXPixmapMESA),
>> - __ATTRIB(glXGetMscRateOML),
>> - __ATTRIB(glXGetScreenDriver),
>> - __ATTRIB(glXGetSwapIntervalMESA),
>> - __ATTRIB(glXGetSyncValuesOML),
>> - __ATTRIB(glXJoinSwapGroupSGIX),
>> - __ATTRIB(glXQueryCurrentRendererIntegerMESA),
>> - __ATTRIB(glXQueryCurrentRendererStringMESA),
>> - __ATTRIB(glXQueryMaxSwapBarriersSGIX),
>> - __ATTRIB(glXQueryRendererIntegerMESA),
>> - __ATTRIB(glXQueryRendererStringMESA),
>> - __ATTRIB(glXReleaseBuffersMESA),
>> - __ATTRIB(glXSwapBuffersMscOML),
>> - __ATTRIB(glXSwapIntervalMESA),
>> - __ATTRIB(glXWaitForMscOML),
>> - __ATTRIB(glXWaitForSbcOML),
>>
>> [DI_LAST_INDEX] = NULL,
>> #undef __ATTRIB
>> diff --git a/src/glx/g_glxglvnddispatchindices.h b/src/glx/g_glxglvnddispatchindices.h
>> index fd2156e..0891654 100644
>> --- a/src/glx/g_glxglvnddispatchindices.h
>> +++ b/src/glx/g_glxglvnddispatchindices.h
>> @@ -6,16 +6,19 @@
>> #define __glxlibglvnd_dispatchindex_h__
>>
>> typedef enum __GLXdispatchIndex {
>> + DI_BindSwapBarrierSGIX,
>> DI_BindTexImageEXT,
>> // ChooseFBConfig implemented by libglvnd
>> DI_ChooseFBConfigSGIX,
>> // ChooseVisual implemented by libglvnd
>> // CopyContext implemented by libglvnd
>> + DI_CopySubBufferMESA,
>> // CreateContext implemented by libglvnd
>> DI_CreateContextAttribsARB,
>> DI_CreateContextWithConfigSGIX,
>> DI_CreateGLXPbufferSGIX,
>> // CreateGLXPixmap implemented by libglvnd
>> + DI_CreateGLXPixmapMESA,
>> DI_CreateGLXPixmapWithConfigSGIX,
>> // CreateNewContext implemented by libglvnd
>> // CreatePbuffer implemented by libglvnd
>> @@ -40,6 +43,7 @@ typedef enum __GLXdispatchIndex {
>> DI_GetFBConfigAttribSGIX,
>> DI_GetFBConfigFromVisualSGIX,
>> // GetFBConfigs implemented by libglvnd
>> + DI_GetMscRateOML,
>> // GetProcAddress implemented by libglvnd
>> // GetProcAddressARB implemented by libglvnd
>> // GetSelectedEvent implemented by libglvnd
>> @@ -47,45 +51,41 @@ typedef enum __GLXdispatchIndex {
>> DI_GetVideoSyncSGI,
>> // GetVisualFromFBConfig implemented by libglvnd
>> DI_GetVisualFromFBConfigSGIX,
>> + DI_GetScreenDriver,
>> + DI_GetSwapIntervalMESA,
>> + DI_GetSyncValuesOML,
>> // ImportContextEXT implemented by libglvnd
>> // IsDirect implemented by libglvnd
>> + DI_JoinSwapGroupSGIX,
>> // MakeContextCurrent implemented by libglvnd
>> // MakeCurrent implemented by libglvnd
>> // QueryContext implemented by libglvnd
>> DI_QueryContextInfoEXT,
>> + DI_QueryCurrentRendererIntegerMESA,
>> + DI_QueryCurrentRendererStringMESA,
>> // QueryDrawable implemented by libglvnd
>> // QueryExtension implemented by libglvnd
>> // QueryExtensionsString implemented by libglvnd
>> DI_QueryGLXPbufferSGIX,
>> + DI_QueryMaxSwapBarriersSGIX,
>> + DI_QueryRendererIntegerMESA,
>> + DI_QueryRendererStringMESA,
>> // QueryServerString implemented by libglvnd
>> // QueryVersion implemented by libglvnd
>> + DI_ReleaseBuffersMESA,
>> DI_ReleaseTexImageEXT,
>> // SelectEvent implemented by libglvnd
>> DI_SelectEventSGIX,
>> // SwapBuffers implemented by libglvnd
>> + DI_SwapBuffersMscOML,
>> + DI_SwapIntervalMESA,
>> DI_SwapIntervalSGI,
>> // UseXFont implemented by libglvnd
>> // WaitGL implemented by libglvnd
>> + DI_WaitForMscOML,
>> + DI_WaitForSbcOML,
>> DI_WaitVideoSyncSGI,
>> // WaitX implemented by libglvnd
>> - DI_glXBindSwapBarrierSGIX,
>> - DI_glXCopySubBufferMESA,
>> - DI_glXCreateGLXPixmapMESA,
>> - DI_glXGetMscRateOML,
>> - DI_glXGetScreenDriver,
>> - DI_glXGetSwapIntervalMESA,
>> - DI_glXGetSyncValuesOML,
>> - DI_glXJoinSwapGroupSGIX,
>> - DI_glXQueryCurrentRendererIntegerMESA,
>> - DI_glXQueryCurrentRendererStringMESA,
>> - DI_glXQueryMaxSwapBarriersSGIX,
>> - DI_glXQueryRendererIntegerMESA,
>> - DI_glXQueryRendererStringMESA,
>> - DI_glXReleaseBuffersMESA,
>> - DI_glXSwapBuffersMscOML,
>> - DI_glXSwapIntervalMESA,
>> - DI_glXWaitForMscOML,
>> - DI_glXWaitForSbcOML,
>> DI_LAST_INDEX
>> } __GLXdispatchIndex;
>>
>> diff --git a/src/glx/glxglvnd.c b/src/glx/glxglvnd.c
>> index 962eda8..21ffc38 100644
>> --- a/src/glx/glxglvnd.c
>> +++ b/src/glx/glxglvnd.c
>> @@ -5,6 +5,7 @@
>>
>> #include "glxglvnd.h"
>>
>> +#include <stdlib.h>
>>
>> static Bool __glXGLVNDIsScreenSupported(Display *dpy, int screen)
>> {
>> @@ -17,26 +18,24 @@ static void *__glXGLVNDGetProcAddress(const GLubyte *procName)
>> return glXGetProcAddressARB(procName);
>> }
>>
>> +static int
>> +compare(const void *l, const void *r)
>> +{
>> + const char *s = *(const char **)r;
>
> Shouldn't we do the same with `l`?
>
>> + return strcmp(l, s);
>> +}
>> +
>> static unsigned FindGLXFunction(const GLubyte *name)
>> {
>> - int first = 0;
>> - int last = DI_FUNCTION_COUNT - 1;
>> + const char **match;
>>
>> - while (first <= last) {
>> - int middle = (first + last) / 2;
>> - int comp = strcmp((const char *) name,
>> - __glXDispatchTableStrings[middle]);
>> + match = bsearch(name, __glXDispatchTableStrings, DI_FUNCTION_COUNT,
>> + sizeof(const char *), compare);
>
> stray tab
>
>>
>> - if (comp < 0)
>> - first = middle + 1;
>> - else if (comp > 0)
>> - last = middle - 1;
>> - else
>> - return middle;
>> - }
>> + if (match == NULL)
>> + return DI_FUNCTION_COUNT;
>
> stray tab
>
>>
>> - /* Just point to the dummy entry at the end of the respective table */
>> - return DI_FUNCTION_COUNT;
>> + return match - __glXDispatchTableStrings;
>> }
>
> I didn't know bsearch() existed, but that's a much cleaner solution indeed.
>
> The whole thing is:
> Reviewed-by: Eric Engestrom <eric.engestrom at imgtec.com>
>
> but IMHO this should be 3-4 patches:
> - replace the open-coded binary sort with bsearch()
> - reorder the names to actually be binary searchable
> - remove the glX prefixes (will need a reorder too, so it could be squashed
> with the previous patch)
> - add the missing return in the hunk below
>
Wrt the glx prefixed functions - they go through a layer of
indirection and we still get to the correct functions. I started going
through the 'generated' file, nuking everything but the ones we need
which ended up a bit longer than expected. It's nice to have and not
an actual bug.
On the 'sin' part ... relating that to the discoveries in xserver I'd
call it a walk in the park ;-)
But if you insist, please split it out from the other refactoring.
For the moment I'll go with the 2 line fix.
Emil
More information about the mesa-dev
mailing list