summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gmail.com>2018-04-30 23:39:22 +0100
committerGitHub <noreply@github.com>2018-04-30 23:39:22 +0100
commitb80ea6a36ac579edda5ea575782ce719c314ebfd (patch)
treeedc9f5aa84ba70fb061de47621559be6c6ce60f3
parent43ac91170d61514ab1dd156a4373664b961d81d3 (diff)
parenta33623dca7cc430a9edecdc44f1c76bfb251d576 (diff)
downloadlibepoxy-b80ea6a36ac579edda5ea575782ce719c314ebfd.tar.gz
Merge pull request #168 from nwnk/even-more-gentle-glx-detection
Even more gentle glx detection
-rw-r--r--src/dispatch_common.c61
1 files changed, 17 insertions, 44 deletions
diff --git a/src/dispatch_common.c b/src/dispatch_common.c
index 1eccb3b..244938b 100644
--- a/src/dispatch_common.c
+++ b/src/dispatch_common.c
@@ -305,7 +305,11 @@ get_dlopen_handle(void **handle, const char *lib_name, bool exit_on_fail)
#else
pthread_mutex_lock(&api.mutex);
if (!*handle) {
- *handle = dlopen(lib_name, RTLD_LAZY | RTLD_LOCAL);
+ int flags = RTLD_LAZY | RTLD_LOCAL;
+ if (!exit_on_fail)
+ 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());
@@ -572,23 +576,7 @@ epoxy_current_context_is_glx(void)
#else
void *sym;
- /* If we've been called already, don't load more */
- if (!api.egl_handle != !api.glx_handle) {
- if (api.glx_handle)
- return true;
- else if (api.egl_handle)
- return false;
- }
-
- /* 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.
- */
-
- sym = dlsym(NULL, "glXGetCurrentContext");
+ sym = epoxy_conservative_glx_dlsym("glXGetCurrentContext", false);
if (sym) {
if (glXGetCurrentContext())
return true;
@@ -597,7 +585,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;
@@ -606,21 +594,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 = epoxy_conservative_glx_dlsym("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 */
}
@@ -812,20 +785,20 @@ epoxy_get_bootstrap_proc_address(const char *name)
#if PLATFORM_HAS_EGL
get_dlopen_handle(&api.egl_handle, EGL_LIB, false);
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 */