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
__glXGLVNDIsScreenSupported(Display * dpy,int screen)9 static Bool __glXGLVNDIsScreenSupported(Display *dpy, int screen)
10 {
11 /* TODO: Think of a better heuristic... */
12 return True;
13 }
14
__glXGLVNDGetProcAddress(const GLubyte * procName)15 static void *__glXGLVNDGetProcAddress(const GLubyte *procName)
16 {
17 return glXGetProcAddressARB(procName);
18 }
19
20 static int
compare(const void * l,const void * r)21 compare(const void *l, const void *r)
22 {
23 const char *s = *(const char **)r;
24 return strcmp(l, s);
25 }
26
FindGLXFunction(const GLubyte * name)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
__glXGLVNDGetDispatchAddress(const GLubyte * procName)40 static void *__glXGLVNDGetDispatchAddress(const GLubyte *procName)
41 {
42 unsigned internalIndex = FindGLXFunction(procName);
43
44 return __glXDispatchFunctions[internalIndex];
45 }
46
__glXGLVNDSetDispatchIndex(const GLubyte * procName,int index)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
__glx_Main(uint32_t version,const __GLXapiExports * exports,__GLXvendorInfo * vendor,__GLXapiImports * imports)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