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