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