1 #include <string.h> 2 #include <stdlib.h> 3 #include <X11/Xlib.h> 4 5 #include "glvnd/libglxabi.h" 6 7 #include "glxglvnd.h" 8 9 static Bool __glXGLVNDIsScreenSupported(Display *dpy, int screen) 10 { 11 /* TODO: Think of a better heuristic... */ 12 return True; 13 } 14 15 static void *__glXGLVNDGetProcAddress(const GLubyte *procName) 16 { 17 return glXGetProcAddressARB(procName); 18 } 19 20 static int 21 compare(const void *l, const void *r) 22 { 23 const char *s = *(const char **)r; 24 return strcmp(l, s); 25 } 26 27 static unsigned FindGLXFunction(const GLubyte *name) 28 { 29 const char **match; 30 31 match = bsearch(name, __glXDispatchTableStrings, DI_FUNCTION_COUNT, 32 sizeof(const char *), compare); 33 34 if (match == NULL) 35 return DI_FUNCTION_COUNT; 36 37 return match - __glXDispatchTableStrings; 38 } 39 40 static void *__glXGLVNDGetDispatchAddress(const GLubyte *procName) 41 { 42 unsigned internalIndex = FindGLXFunction(procName); 43 44 return __glXDispatchFunctions[internalIndex]; 45 } 46 47 static void __glXGLVNDSetDispatchIndex(const GLubyte *procName, int index) 48 { 49 unsigned internalIndex = FindGLXFunction(procName); 50 51 if (internalIndex == DI_FUNCTION_COUNT) 52 return; /* unknown or static dispatch */ 53 54 __glXDispatchTableIndices[internalIndex] = index; 55 } 56 57 _X_EXPORT Bool __glx_Main(uint32_t version, const __GLXapiExports *exports, 58 __GLXvendorInfo *vendor, __GLXapiImports *imports) 59 { 60 static Bool initDone = False; 61 62 if (GLX_VENDOR_ABI_GET_MAJOR_VERSION(version) != 63 GLX_VENDOR_ABI_MAJOR_VERSION || 64 GLX_VENDOR_ABI_GET_MINOR_VERSION(version) < 65 GLX_VENDOR_ABI_MINOR_VERSION) 66 return False; 67 68 if (!initDone) { 69 initDone = True; 70 __glXGLVNDAPIExports = exports; 71 72 imports->isScreenSupported = __glXGLVNDIsScreenSupported; 73 imports->getProcAddress = __glXGLVNDGetProcAddress; 74 imports->getDispatchAddress = __glXGLVNDGetDispatchAddress; 75 imports->setDispatchIndex = __glXGLVNDSetDispatchIndex; 76 imports->notifyError = NULL; 77 imports->isPatchSupported = NULL; 78 imports->initiatePatch = NULL; 79 } 80 81 return True; 82 } 83