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