xref: /aosp_15_r20/external/mesa3d/src/glx/glxglvnd.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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