From 3bf00b6c6ac108f7d6cfc5c36401ccfd6a378469 Mon Sep 17 00:00:00 2001 From: Emil Velikov Date: Wed, 11 May 2016 14:01:55 -0400 Subject: [PATCH] glx/glvnd: rework dispatch functions/indices tables lookup Rather than checking if the function name maps to a valid entry in the respective table, just create a dummy entry at the end of each table. This allows us to remove some unnessesary "index >= 0" checks, which get executed quite often. Reviewed-by: Adam Jackson Signed-off-by: Emil Velikov --- src/glx/g_glxglvnddispatchfuncs.c | 7 +++++-- src/glx/glxglvnd.c | 19 ++++++++----------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/glx/g_glxglvnddispatchfuncs.c b/src/glx/g_glxglvnddispatchfuncs.c index 13fbc5ea81b..72f0f68bf39 100644 --- a/src/glx/g_glxglvnddispatchfuncs.c +++ b/src/glx/g_glxglvnddispatchfuncs.c @@ -9,7 +9,8 @@ #include "g_glxglvnddispatchindices.h" const int DI_FUNCTION_COUNT = DI_LAST_INDEX; -int __glXDispatchTableIndices[DI_LAST_INDEX]; +/* Allocate an extra 'dummy' to ease lookup. See FindGLXFunction() */ +int __glXDispatchTableIndices[DI_LAST_INDEX + 1]; const __GLXapiExports *__glXGLVNDAPIExports; const char * const __glXDispatchTableStrings[DI_LAST_INDEX] = { @@ -922,7 +923,8 @@ static Bool dispatch_glXWaitForSbcOML(Display *dpy, GLXDrawable drawable, #undef __FETCH_FUNCTION_PTR -const void * const __glXDispatchFunctions[DI_LAST_INDEX] = { +/* Allocate an extra 'dummy' to ease lookup. See FindGLXFunction() */ +const void * const __glXDispatchFunctions[DI_LAST_INDEX + 1] = { #define __ATTRIB(field) \ [DI_##field] = (void *)dispatch_##field @@ -972,5 +974,6 @@ const void * const __glXDispatchFunctions[DI_LAST_INDEX] = { __ATTRIB(glXWaitForMscOML), __ATTRIB(glXWaitForSbcOML), + [DI_LAST_INDEX] = NULL, #undef __ATTRIB }; diff --git a/src/glx/glxglvnd.c b/src/glx/glxglvnd.c index 96cd1fd7e95..b7252a791ad 100644 --- a/src/glx/glxglvnd.c +++ b/src/glx/glxglvnd.c @@ -17,7 +17,7 @@ static void *__glXGLVNDGetProcAddress(const GLubyte *procName) return glXGetProcAddressARB(procName); } -static int FindGLXFunction(const GLubyte *name) +static unsigned FindGLXFunction(const GLubyte *name) { unsigned first = 0; unsigned last = DI_FUNCTION_COUNT - 1; @@ -34,26 +34,23 @@ static int FindGLXFunction(const GLubyte *name) else return middle; } - return -1; + + /* Just point to the dummy entry at the end of the respective table */ + return DI_FUNCTION_COUNT; } static void *__glXGLVNDGetDispatchAddress(const GLubyte *procName) { - int internalIndex = FindGLXFunction(procName); - - if (internalIndex >= 0) { - return __glXDispatchFunctions[internalIndex]; - } + unsigned internalIndex = FindGLXFunction(procName); - return NULL; + return __glXDispatchFunctions[internalIndex]; } static void __glXGLVNDSetDispatchIndex(const GLubyte *procName, int index) { - int internalIndex = FindGLXFunction(procName); + unsigned internalIndex = FindGLXFunction(procName); - if (internalIndex >= 0) - __glXDispatchTableIndices[internalIndex] = index; + __glXDispatchTableIndices[internalIndex] = index; } _X_EXPORT Bool __glx_Main(uint32_t version, const __GLXapiExports *exports, -- 2.30.2