[Mesa-dev] [PATCH 3/3] glx/glvnd: rework dispatch functions/indices tables lookup
Adam Jackson
ajax at redhat.com
Wed May 11 18:01:55 UTC 2016
From: Emil Velikov <emil.velikov at collabora.com>
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 <ajax at redhat.com>
Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
---
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 13fbc5e..72f0f68 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 9475023..fa39ad4 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);
+ unsigned internalIndex = FindGLXFunction(procName);
- if (internalIndex >= 0) {
- return __glXDispatchFunctions[internalIndex];
- }
-
- 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.7.4
More information about the mesa-dev
mailing list