1b8e80941Smrg#include <string.h>
2b8e80941Smrg#include <assert.h>
3b8e80941Smrg
4b8e80941Smrg#include <glvnd/libeglabi.h>
5b8e80941Smrg
6b8e80941Smrg#include "eglcurrent.h"
7b8e80941Smrg#include "egldispatchstubs.h"
8b8e80941Smrg#include "eglglobals.h"
9b8e80941Smrg
10b8e80941Smrgstatic const __EGLapiExports *__eglGLVNDApiExports = NULL;
11b8e80941Smrg
12b8e80941Smrgstatic const char * EGLAPIENTRY
13b8e80941Smrg__eglGLVNDQueryString(EGLDisplay dpy, EGLenum name)
14b8e80941Smrg{
15b8e80941Smrg   // For client extensions, return the list of non-platform extensions. The
16b8e80941Smrg   // platform extensions are returned by __eglGLVNDGetVendorString.
17b8e80941Smrg   if (dpy == EGL_NO_DISPLAY && name == EGL_EXTENSIONS)
18b8e80941Smrg      return _eglGlobal.ClientOnlyExtensionString;
19b8e80941Smrg
20b8e80941Smrg   // For everything else, forward to the normal eglQueryString function.
21b8e80941Smrg   return eglQueryString(dpy, name);
22b8e80941Smrg}
23b8e80941Smrg
24b8e80941Smrgstatic const char *
25b8e80941Smrg__eglGLVNDGetVendorString(int name)
26b8e80941Smrg{
27b8e80941Smrg   if (name == __EGL_VENDOR_STRING_PLATFORM_EXTENSIONS) {
28b8e80941Smrg      const char *str = _eglGlobal.PlatformExtensionString;
29b8e80941Smrg      // The platform extension string may have a leading space. If it does,
30b8e80941Smrg      // then skip over it.
31b8e80941Smrg      while (*str == ' ') {
32b8e80941Smrg         str++;
33b8e80941Smrg      }
34b8e80941Smrg      return str;
35b8e80941Smrg   }
36b8e80941Smrg
37b8e80941Smrg   return NULL;
38b8e80941Smrg}
39b8e80941Smrg
40b8e80941Smrgstatic EGLDisplay
41b8e80941Smrg__eglGLVNDGetPlatformDisplay(EGLenum platform, void *native_display,
42b8e80941Smrg      const EGLAttrib *attrib_list)
43b8e80941Smrg{
44b8e80941Smrg   if (platform == EGL_NONE) {
45b8e80941Smrg      assert(native_display == (void *) EGL_DEFAULT_DISPLAY);
46b8e80941Smrg      assert(attrib_list == NULL);
47b8e80941Smrg      return eglGetDisplay((EGLNativeDisplayType) native_display);
48b8e80941Smrg   } else {
49b8e80941Smrg      return eglGetPlatformDisplay(platform, native_display, attrib_list);
50b8e80941Smrg   }
51b8e80941Smrg}
52b8e80941Smrg
53b8e80941Smrgstatic void *
54b8e80941Smrg__eglGLVNDGetProcAddress(const char *procName)
55b8e80941Smrg{
56b8e80941Smrg   if (strcmp(procName, "eglQueryString") == 0)
57b8e80941Smrg      return (void *) __eglGLVNDQueryString;
58b8e80941Smrg
59b8e80941Smrg   return (void *) eglGetProcAddress(procName);
60b8e80941Smrg}
61b8e80941Smrg
62b8e80941SmrgEGLAPI EGLBoolean
63b8e80941Smrg__egl_Main(uint32_t version, const __EGLapiExports *exports,
64b8e80941Smrg     __EGLvendorInfo *vendor, __EGLapiImports *imports)
65b8e80941Smrg{
66b8e80941Smrg   if (EGL_VENDOR_ABI_GET_MAJOR_VERSION(version) !=
67b8e80941Smrg       EGL_VENDOR_ABI_MAJOR_VERSION)
68b8e80941Smrg      return EGL_FALSE;
69b8e80941Smrg
70b8e80941Smrg   __eglGLVNDApiExports = exports;
71b8e80941Smrg   __eglInitDispatchStubs(exports);
72b8e80941Smrg
73b8e80941Smrg   imports->getPlatformDisplay = __eglGLVNDGetPlatformDisplay;
74b8e80941Smrg   imports->getSupportsAPI = _eglIsApiValid;
75b8e80941Smrg   imports->getVendorString = __eglGLVNDGetVendorString;
76b8e80941Smrg   imports->getProcAddress = __eglGLVNDGetProcAddress;
77b8e80941Smrg   imports->getDispatchAddress = __eglDispatchFindDispatchFunction;
78b8e80941Smrg   imports->setDispatchIndex = __eglSetDispatchIndex;
79b8e80941Smrg
80b8e80941Smrg   return EGL_TRUE;
81b8e80941Smrg}
82b8e80941Smrg
83