[Mesa-dev] [PATCH] glvnd: Fix dynamic GLX entrypoint lookup

Eric Engestrom eric.engestrom at imgtec.com
Mon Sep 5 10:23:46 UTC 2016


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

Cheers,
  Eric

>  
>  static void *__glXGLVNDGetDispatchAddress(const GLubyte *procName)
> @@ -50,6 +49,9 @@ static void __glXGLVNDSetDispatchIndex(const GLubyte *procName, int index)
>  {
>      unsigned internalIndex = FindGLXFunction(procName);
>  
> +    if (internalIndex == DI_FUNCTION_COUNT)
> +	return; /* unknown or static dispatch */

stray tab

> +
>      __glXDispatchTableIndices[internalIndex] = index;
>  }
>  
> -- 
> 2.9.3


More information about the mesa-dev mailing list