Module Name: xsrc Committed By: mrg Date: Mon Nov 2 04:46:30 UTC 2020
Modified Files: xsrc/external/mit/libepoxy/dist/src: dispatch_common.c dispatch_common.h Removed Files: xsrc/external/mit/libepoxy/dist: .gitignore xsrc/external/mit/libepoxy/dist/test: egl_and_glx_different_pointers.c Log Message: merge libepoxy 1.5.4. To generate a diff of this commit: cvs rdiff -u -r1.1.1.1 -r0 xsrc/external/mit/libepoxy/dist/.gitignore cvs rdiff -u -r1.4 -r1.5 \ xsrc/external/mit/libepoxy/dist/src/dispatch_common.c cvs rdiff -u -r1.7 -r1.8 \ xsrc/external/mit/libepoxy/dist/src/dispatch_common.h cvs rdiff -u -r1.1.1.1 -r0 \ xsrc/external/mit/libepoxy/dist/test/egl_and_glx_different_pointers.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: xsrc/external/mit/libepoxy/dist/src/dispatch_common.c diff -u xsrc/external/mit/libepoxy/dist/src/dispatch_common.c:1.4 xsrc/external/mit/libepoxy/dist/src/dispatch_common.c:1.5 --- xsrc/external/mit/libepoxy/dist/src/dispatch_common.c:1.4 Tue Jul 9 21:55:21 2019 +++ xsrc/external/mit/libepoxy/dist/src/dispatch_common.c Mon Nov 2 04:46:29 2020 @@ -41,7 +41,7 @@ * \section features_sec Features * * - Automatically initializes as new GL functions are used. - * - GL 4.4 core and compatibility context support. + * - GL 4.6 core and compatibility context support. * - GLES 1/2/3 context support. * - Knows about function aliases so (e.g.) `glBufferData()` can be * used with `GL_ARB_vertex_buffer_object` implementations, along @@ -173,30 +173,33 @@ #include "dispatch_common.h" -#ifdef __APPLE__ +#if defined(__APPLE__) #define GLX_LIB "/opt/X11/lib/libGL.1.dylib" -#elif defined(ANDROID) +#define OPENGL_LIB "/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL" +#define GLES1_LIB "libGLESv1_CM.so" +#define GLES2_LIB "libGLESv2.so" +#elif defined(__ANDROID__) #define GLX_LIB "libGLESv2.so" -#else -#ifdef __NetBSD__ +#elif __NetBSD__ #define GLX_LIB "libGL.so" -#else -#define GLX_LIB "libGL.so.1" -#endif #endif #if defined(ANDROID) || defined(__NetBSD__) #define EGL_LIB "libEGL.so" #define GLES1_LIB "libGLESv1_CM.so" #define GLES2_LIB "libGLESv2.so" -#elif defined _WIN32 +#elif defined(_WIN32) #define EGL_LIB "libEGL.dll" #define GLES1_LIB "libGLES_CM.dll" #define GLES2_LIB "libGLESv2.dll" +#define OPENGL_LIB "OPENGL32" #else +#define GLVND_GLX_LIB "libGLX.so.1" +#define GLX_LIB "libGL.so.1" #define EGL_LIB "libEGL.so.1" #define GLES1_LIB "libGLESv1_CM.so.1" #define GLES2_LIB "libGLESv2.so.2" +#define OPENGL_LIB "libOpenGL.so.0" #endif #ifdef __GNUC__ @@ -230,13 +233,18 @@ struct api { pthread_mutex_t mutex; #endif - /* dlopen() return value for libGL.so.1. */ + /* + * dlopen() return value for the GLX API. This is libGLX.so.1 if the + * runtime is glvnd-enabled, else libGL.so.1 + */ void *glx_handle; /* - * dlopen() return value for OS X's GL library. + * dlopen() return value for the desktop GL library. * - * On linux, glx_handle is used instead. + * On Windows this is OPENGL32. On OSX this is classic libGL. On Linux + * this is either libOpenGL (if the runtime is glvnd-enabled) or + * classic libGL.so.1 */ void *gl_handle; @@ -290,14 +298,13 @@ library_init(void) } static bool -get_dlopen_handle(void **handle, const char *lib_name, bool exit_on_fail) +get_dlopen_handle(void **handle, const char *lib_name, bool exit_on_fail, bool load) { if (*handle) return true; if (!library_initialized) { - fprintf(stderr, - "Attempting to dlopen() while in the dynamic linker.\n"); + fputs("Attempting to dlopen() while in the dynamic linker.\n", stderr); abort(); } @@ -306,11 +313,15 @@ get_dlopen_handle(void **handle, const c #else pthread_mutex_lock(&api.mutex); if (!*handle) { - *handle = dlopen(lib_name, RTLD_LAZY | RTLD_LOCAL); + int flags = RTLD_LAZY | RTLD_LOCAL; + if (!load) + flags |= RTLD_NOLOAD; + + *handle = dlopen(lib_name, flags); if (!*handle) { if (exit_on_fail) { fprintf(stderr, "Couldn't open %s: %s\n", lib_name, dlerror()); - exit(1); + abort(); } else { (void)dlerror(); } @@ -323,15 +334,11 @@ get_dlopen_handle(void **handle, const c } static void * -do_dlsym(void **handle, const char *lib_name, const char *name, - bool exit_on_fail) +do_dlsym(void **handle, const char *name, bool exit_on_fail) { void *result; const char *error = ""; - if (!get_dlopen_handle(handle, lib_name, exit_on_fail)) - return NULL; - #ifdef _WIN32 result = GetProcAddress(*handle, name); #else @@ -340,8 +347,8 @@ do_dlsym(void **handle, const char *lib_ error = dlerror(); #endif if (!result && exit_on_fail) { - fprintf(stderr,"%s() not found in %s: %s\n", name, lib_name, error); - exit(1); + fprintf(stderr, "%s() not found: %s\n", name, error); + abort(); } return result; @@ -393,10 +400,10 @@ epoxy_is_desktop_gl(void) } static int -epoxy_internal_gl_version(int error_version) +epoxy_internal_gl_version(GLenum version_string, int error_version) { - const char *version = (const char *)glGetString(GL_VERSION); - GLint major, minor; + const char *version = (const char *)glGetString(version_string); + GLint major, minor, factor; int scanf_count; if (!version) @@ -411,9 +418,15 @@ epoxy_internal_gl_version(int error_vers if (scanf_count != 2) { fprintf(stderr, "Unable to interpret GL_VERSION string: %s\n", version); - exit(1); + abort(); } - return 10 * major + minor; + + if (minor >= 10) + factor = 100; + else + factor = 10; + + return factor * major + minor; } /** @@ -434,7 +447,7 @@ epoxy_internal_gl_version(int error_vers int epoxy_gl_version(void) { - return epoxy_internal_gl_version(0); + return epoxy_internal_gl_version(GL_VERSION, 0); } int @@ -443,9 +456,52 @@ epoxy_conservative_gl_version(void) if (api.begin_count) return 100; - return epoxy_internal_gl_version(100); + return epoxy_internal_gl_version(GL_VERSION, 100); +} + +/** + * @brief Returns the version of the GL Shading Language we are using + * + * The version is encoded as: + * + * ``` + * + * version = major * 100 + minor + * + * ``` + * + * So it can be easily used for version comparisons. + * + * @return The encoded version of the GL Shading Language we are using + */ +int +epoxy_glsl_version(void) +{ + if (epoxy_gl_version() >= 20 || + epoxy_has_gl_extension ("GL_ARB_shading_language_100")) + return epoxy_internal_gl_version(GL_SHADING_LANGUAGE_VERSION, 0); + + return 0; } +/** + * @brief Checks for the presence of an extension in an OpenGL extension string + * + * @param extension_list The string containing the list of extensions to check + * @param ext The name of the GL extension + * @return `true` if the extension is available' + * + * @note If you are looking to check whether a normal GL, EGL or GLX extension + * is supported by the client, this probably isn't the function you want. + * + * Some parts of the spec for OpenGL and friends will return an OpenGL formatted + * extension string that is separate from the usual extension strings for the + * spec. This function provides easy parsing of those strings. + * + * @see epoxy_has_gl_extension() + * @see epoxy_has_egl_extension() + * @see epoxy_has_glx_extension() + */ bool epoxy_extension_in_string(const char *extension_list, const char *ext) { @@ -500,6 +556,31 @@ epoxy_internal_has_gl_extension(const ch } } +bool +epoxy_load_glx(bool exit_if_fails, bool load) +{ +#if PLATFORM_HAS_GLX +# ifdef GLVND_GLX_LIB + /* prefer the glvnd library if it exists */ + if (!api.glx_handle) + get_dlopen_handle(&api.glx_handle, GLVND_GLX_LIB, false, load); +# endif + if (!api.glx_handle) + get_dlopen_handle(&api.glx_handle, GLX_LIB, exit_if_fails, load); +#endif + return api.glx_handle != NULL; +} + +void * +epoxy_conservative_glx_dlsym(const char *name, bool exit_if_fails) +{ +#if PLATFORM_HAS_GLX + if (epoxy_load_glx(exit_if_fails, exit_if_fails)) + return do_dlsym(&api.glx_handle, name, exit_if_fails); +#endif + return NULL; +} + /** * Tests whether the currently bound context is EGL or GLX, trying to * avoid loading libraries unless necessary. @@ -510,16 +591,9 @@ epoxy_current_context_is_glx(void) #if !PLATFORM_HAS_GLX return false; #else - /* If the application hasn't explicitly called some of our GLX - * or EGL code but has presumably set up a context on its own, - * then we need to figure out how to getprocaddress anyway. - * - * If there's a public GetProcAddress loaded in the - * application's namespace, then use that. - */ void *sym; - sym = dlsym(NULL, "glXGetCurrentContext"); + sym = epoxy_conservative_glx_dlsym("glXGetCurrentContext", false); if (sym) { if (glXGetCurrentContext()) return true; @@ -528,7 +602,7 @@ epoxy_current_context_is_glx(void) } #if PLATFORM_HAS_EGL - sym = dlsym(NULL, "eglGetCurrentContext"); + sym = epoxy_conservative_egl_dlsym("eglGetCurrentContext", false); if (sym) { if (epoxy_egl_get_current_gl_context_api() != EGL_NONE) return false; @@ -537,21 +611,6 @@ epoxy_current_context_is_glx(void) } #endif /* PLATFORM_HAS_EGL */ - /* OK, couldn't find anything in the app's address space. - * Presumably they dlopened with RTLD_LOCAL, which hides it - * from us. Just go dlopen()ing likely libraries and try them. - */ - sym = do_dlsym(&api.glx_handle, GLX_LIB, "glXGetCurrentContext", false); - if (sym && glXGetCurrentContext()) - return true; - -#if PLATFORM_HAS_EGL - sym = do_dlsym(&api.egl_handle, EGL_LIB, "eglGetCurrentContext", - false); - if (sym && epoxy_egl_get_current_gl_context_api() != EGL_NONE) - return false; -#endif /* PLATFORM_HAS_EGL */ - return false; #endif /* PLATFORM_HAS_GLX */ } @@ -582,10 +641,24 @@ epoxy_conservative_has_gl_extension(cons return epoxy_internal_has_gl_extension(ext, true); } +bool +epoxy_load_egl(bool exit_if_fails, bool load) +{ +#if PLATFORM_HAS_EGL + return get_dlopen_handle(&api.egl_handle, EGL_LIB, exit_if_fails, load); +#else + return false; +#endif +} + void * epoxy_conservative_egl_dlsym(const char *name, bool exit_if_fails) { - return do_dlsym(&api.egl_handle, EGL_LIB, name, exit_if_fails); +#if PLATFORM_HAS_EGL + if (epoxy_load_egl(exit_if_fails, exit_if_fails)) + return do_dlsym(&api.egl_handle, name, exit_if_fails); +#endif + return NULL; } void * @@ -595,30 +668,37 @@ epoxy_egl_dlsym(const char *name) } void * -epoxy_conservative_glx_dlsym(const char *name, bool exit_if_fails) +epoxy_glx_dlsym(const char *name) { - return do_dlsym(&api.glx_handle, GLX_LIB, name, exit_if_fails); + return epoxy_conservative_glx_dlsym(name, true); } -void * -epoxy_glx_dlsym(const char *name) +static void +epoxy_load_gl(void) { - return epoxy_conservative_glx_dlsym(name, true); + if (api.gl_handle) + return; + +#if defined(_WIN32) || defined(__APPLE__) + get_dlopen_handle(&api.gl_handle, OPENGL_LIB, true, true); +#else + +#if defined(OPENGL_LIB) + if (!api.gl_handle) + get_dlopen_handle(&api.gl_handle, OPENGL_LIB, false, true); +#endif + + get_dlopen_handle(&api.glx_handle, GLX_LIB, true, true); + api.gl_handle = api.glx_handle; +#endif } void * epoxy_gl_dlsym(const char *name) { -#ifdef _WIN32 - return do_dlsym(&api.gl_handle, "OPENGL32", name, true); -#elif defined(__APPLE__) - return do_dlsym(&api.gl_handle, - "/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", - name, true); -#else - /* There's no library for desktop GL support independent of GLX. */ - return epoxy_glx_dlsym(name); -#endif + epoxy_load_gl(); + + return do_dlsym(&api.gl_handle, name, true); } void * @@ -627,7 +707,8 @@ epoxy_gles1_dlsym(const char *name) if (epoxy_current_context_is_glx()) { return epoxy_get_proc_address(name); } else { - return do_dlsym(&api.gles1_handle, GLES1_LIB, name, true); + get_dlopen_handle(&api.gles1_handle, GLES1_LIB, true, true); + return do_dlsym(&api.gles1_handle, name, true); } } @@ -637,7 +718,8 @@ epoxy_gles2_dlsym(const char *name) if (epoxy_current_context_is_glx()) { return epoxy_get_proc_address(name); } else { - return do_dlsym(&api.gles2_handle, GLES2_LIB, name, true); + get_dlopen_handle(&api.gles2_handle, GLES2_LIB, true, true); + return do_dlsym(&api.gles2_handle, name, true); } } @@ -657,10 +739,12 @@ epoxy_gles3_dlsym(const char *name) if (epoxy_current_context_is_glx()) { return epoxy_get_proc_address(name); } else { - void *func = do_dlsym(&api.gles2_handle, GLES2_LIB, name, false); + if (get_dlopen_handle(&api.gles2_handle, GLES2_LIB, false, true)) { + void *func = do_dlsym(&api.gles2_handle, name, false); - if (func) - return func; + if (func) + return func; + } return epoxy_get_proc_address(name); } @@ -675,7 +759,7 @@ epoxy_get_core_proc_address(const char * { #ifdef _WIN32 int core_symbol_support = 11; -#elif defined(ANDROID) +#elif defined(__ANDROID__) /** * All symbols must be resolved through eglGetProcAddress * on Android @@ -735,22 +819,22 @@ epoxy_get_bootstrap_proc_address(const c * non-X11 ES2 context from loading a bunch of X11 junk). */ #if PLATFORM_HAS_EGL - get_dlopen_handle(&api.egl_handle, EGL_LIB, false); + get_dlopen_handle(&api.egl_handle, EGL_LIB, false, true); if (api.egl_handle) { + int version = 0; switch (epoxy_egl_get_current_gl_context_api()) { case EGL_OPENGL_API: return epoxy_gl_dlsym(name); case EGL_OPENGL_ES_API: - /* We can't resolve the GL version, because - * epoxy_glGetString() is one of the two things calling - * us. Try the GLES2 implementation first, and fall back - * to GLES1 otherwise. - */ - get_dlopen_handle(&api.gles2_handle, GLES2_LIB, false); - if (api.gles2_handle) - return epoxy_gles2_dlsym(name); - else - return epoxy_gles1_dlsym(name); + if (eglQueryContext(eglGetCurrentDisplay(), + eglGetCurrentContext(), + EGL_CONTEXT_CLIENT_VERSION, + &version)) { + if (version >= 2) + return epoxy_gles2_dlsym(name); + else + return epoxy_gles1_dlsym(name); + } } } #endif /* PLATFORM_HAS_EGL */ @@ -784,7 +868,7 @@ epoxy_get_proc_address(const char *name) #elif PLATFORM_HAS_GLX if (epoxy_current_context_is_glx()) return glXGetProcAddressARB((const GLubyte *)name); - errx(1, "Couldn't find current GLX or EGL context.\n"); + assert(0 && "Couldn't find current GLX or EGL context.\n"); #endif return NULL; @@ -820,3 +904,28 @@ WRAPPER(epoxy_glEnd)(void) PFNGLBEGINPROC epoxy_glBegin = epoxy_glBegin_wrapped; PFNGLENDPROC epoxy_glEnd = epoxy_glEnd_wrapped; + +epoxy_resolver_failure_handler_t epoxy_resolver_failure_handler; + +/** + * Sets the function that will be called every time Epoxy fails to + * resolve a symbol. + * + * @param handler The new handler function + * @return The previous handler function + */ +epoxy_resolver_failure_handler_t +epoxy_set_resolver_failure_handler(epoxy_resolver_failure_handler_t handler) +{ +#ifdef _WIN32 + return InterlockedExchangePointer((void**)&epoxy_resolver_failure_handler, + handler); +#else + epoxy_resolver_failure_handler_t old; + pthread_mutex_lock(&api.mutex); + old = epoxy_resolver_failure_handler; + epoxy_resolver_failure_handler = handler; + pthread_mutex_unlock(&api.mutex); + return old; +#endif +} Index: xsrc/external/mit/libepoxy/dist/src/dispatch_common.h diff -u xsrc/external/mit/libepoxy/dist/src/dispatch_common.h:1.7 xsrc/external/mit/libepoxy/dist/src/dispatch_common.h:1.8 --- xsrc/external/mit/libepoxy/dist/src/dispatch_common.h:1.7 Wed Jul 10 07:10:48 2019 +++ xsrc/external/mit/libepoxy/dist/src/dispatch_common.h Mon Nov 2 04:46:29 2020 @@ -28,7 +28,7 @@ #define PLATFORM_HAS_GLX ENABLE_GLX #define PLATFORM_HAS_WGL 1 #elif defined(__APPLE__) -#define PLATFORM_HAS_EGL ENABLE_EGL +#define PLATFORM_HAS_EGL 0 #define PLATFORM_HAS_GLX ENABLE_GLX #define PLATFORM_HAS_WGL 0 #elif defined(ANDROID) @@ -56,6 +56,13 @@ #include "epoxy/glx.h" #endif #if PLATFORM_HAS_EGL +# if !ENABLE_X11 +/* Mesa uses this symbol to avoid including X11 headers when including + * EGL.h; since X11 was explicitly disabled at configuration time, we + * should do the same + */ +# define MESA_EGL_NO_X11_HEADERS 1 +# endif #include "epoxy/egl.h" #endif #if PLATFORM_HAS_WGL @@ -88,10 +95,11 @@ #define WRAPPER(x) x ## _wrapped #define GEN_GLOBAL_REWRITE_PTR(name, args, passthrough) \ - static void EPOXY_CALLSPEC \ + static void EPOXY_CALLSPEC \ name##_global_rewrite_ptr args \ { \ - name = (void *)name##_resolver(); \ + if (name == (void *)name##_global_rewrite_ptr) \ + name = (void *)name##_resolver(); \ name passthrough; \ } @@ -99,7 +107,8 @@ static ret EPOXY_CALLSPEC \ name##_global_rewrite_ptr args \ { \ - name = (void *)name##_resolver(); \ + if (name == (void *)name##_global_rewrite_ptr) \ + name = (void *)name##_resolver(); \ return name passthrough; \ } @@ -175,13 +184,16 @@ bool epoxy_conservative_has_wgl_extensio void *epoxy_conservative_egl_dlsym(const char *name, bool exit_if_fails); void *epoxy_conservative_glx_dlsym(const char *name, bool exit_if_fails); -bool epoxy_extension_in_string(const char *extension_list, const char *ext); +bool epoxy_load_glx(bool exit_if_fails, bool load); +bool epoxy_load_egl(bool exit_if_fails, bool load); #define glBegin_unwrapped epoxy_glBegin_unwrapped #define glEnd_unwrapped epoxy_glEnd_unwrapped extern void UNWRAPPED_PROTO(glBegin_unwrapped)(GLenum primtype); extern void UNWRAPPED_PROTO(glEnd_unwrapped)(void); +extern epoxy_resolver_failure_handler_t epoxy_resolver_failure_handler; + #if USING_DISPATCH_TABLE void gl_init_dispatch_table(void); void gl_switch_to_dispatch_table(void);