summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dispatch_common.c36
-rw-r--r--src/dispatch_common.h3
-rw-r--r--src/dispatch_egl.c10
-rw-r--r--src/dispatch_glx.c14
4 files changed, 35 insertions, 28 deletions
diff --git a/src/dispatch_common.c b/src/dispatch_common.c
index 085661f..dedf664 100644
--- a/src/dispatch_common.c
+++ b/src/dispatch_common.c
@@ -292,7 +292,7 @@ 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;
@@ -308,7 +308,7 @@ get_dlopen_handle(void **handle, const char *lib_name, bool exit_on_fail)
pthread_mutex_lock(&api.mutex);
if (!*handle) {
int flags = RTLD_LAZY | RTLD_LOCAL;
- if (!exit_on_fail)
+ if (!load)
flags |= RTLD_NOLOAD;
*handle = dlopen(lib_name, flags);
@@ -550,16 +550,16 @@ epoxy_internal_has_gl_extension(const char *ext, bool invalid_op_mode)
}
}
-static bool
-epoxy_load_glx(bool exit_if_fails)
+bool
+epoxy_load_glx(bool exit_if_fails, bool load)
{
#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);
+ 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);
+ get_dlopen_handle(&api.glx_handle, GLX_LIB, exit_if_fails, load);
return api.glx_handle != NULL;
}
@@ -567,7 +567,7 @@ epoxy_load_glx(bool exit_if_fails)
void *
epoxy_conservative_glx_dlsym(const char *name, bool exit_if_fails)
{
- if (epoxy_load_glx(exit_if_fails))
+ if (epoxy_load_glx(exit_if_fails, exit_if_fails))
return do_dlsym(&api.glx_handle, name, exit_if_fails);
return NULL;
@@ -633,16 +633,16 @@ epoxy_conservative_has_gl_extension(const char *ext)
return epoxy_internal_has_gl_extension(ext, true);
}
-static bool
-epoxy_load_egl(bool exit_if_fails)
+bool
+epoxy_load_egl(bool exit_if_fails, bool load)
{
- return get_dlopen_handle(&api.egl_handle, EGL_LIB, exit_if_fails);
+ return get_dlopen_handle(&api.egl_handle, EGL_LIB, exit_if_fails, load);
}
void *
epoxy_conservative_egl_dlsym(const char *name, bool exit_if_fails)
{
- if (epoxy_load_egl(exit_if_fails))
+ if (epoxy_load_egl(exit_if_fails, exit_if_fails))
return do_dlsym(&api.egl_handle, name, exit_if_fails);
return NULL;
@@ -667,15 +667,15 @@ epoxy_load_gl(void)
return;
#if defined(_WIN32) || defined(__APPLE__)
- get_dlopen_handle(&api.gl_handle, OPENGL_LIB, true);
+ 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);
+ get_dlopen_handle(&api.gl_handle, OPENGL_LIB, false, true);
#endif
- get_dlopen_handle(&api.glx_handle, GLX_LIB, true);
+ get_dlopen_handle(&api.glx_handle, GLX_LIB, true, true);
api.gl_handle = api.glx_handle;
#endif
}
@@ -694,7 +694,7 @@ epoxy_gles1_dlsym(const char *name)
if (epoxy_current_context_is_glx()) {
return epoxy_get_proc_address(name);
} else {
- get_dlopen_handle(&api.gles1_handle, GLES1_LIB, true);
+ get_dlopen_handle(&api.gles1_handle, GLES1_LIB, true, true);
return do_dlsym(&api.gles1_handle, name, true);
}
}
@@ -705,7 +705,7 @@ epoxy_gles2_dlsym(const char *name)
if (epoxy_current_context_is_glx()) {
return epoxy_get_proc_address(name);
} else {
- get_dlopen_handle(&api.gles2_handle, GLES2_LIB, true);
+ get_dlopen_handle(&api.gles2_handle, GLES2_LIB, true, true);
return do_dlsym(&api.gles2_handle, name, true);
}
}
@@ -726,7 +726,7 @@ epoxy_gles3_dlsym(const char *name)
if (epoxy_current_context_is_glx()) {
return epoxy_get_proc_address(name);
} else {
- if (get_dlopen_handle(&api.gles2_handle, GLES2_LIB, false)) {
+ if (get_dlopen_handle(&api.gles2_handle, GLES2_LIB, false, true)) {
void *func = do_dlsym(&api.gles2_handle, GLES2_LIB, false);
if (func)
@@ -806,7 +806,7 @@ epoxy_get_bootstrap_proc_address(const char *name)
* 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()) {
diff --git a/src/dispatch_common.h b/src/dispatch_common.h
index 9675cff..fc99635 100644
--- a/src/dispatch_common.h
+++ b/src/dispatch_common.h
@@ -172,6 +172,9 @@ bool epoxy_conservative_has_wgl_extension(const char *name);
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_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);
diff --git a/src/dispatch_egl.c b/src/dispatch_egl.c
index f555a58..3f0c789 100644
--- a/src/dispatch_egl.c
+++ b/src/dispatch_egl.c
@@ -109,11 +109,13 @@ epoxy_has_egl(void)
#if !PLATFORM_HAS_EGL
return false;
#else
- EGLDisplay* (* pf_eglGetCurrentDisplay) (void);
+ if (epoxy_load_egl(false, true)) {
+ EGLDisplay* (* pf_eglGetCurrentDisplay) (void);
- pf_eglGetCurrentDisplay = epoxy_conservative_egl_dlsym("eglGetCurrentDisplay", false);
- if (pf_eglGetCurrentDisplay)
- return true;
+ pf_eglGetCurrentDisplay = epoxy_conservative_egl_dlsym("eglGetCurrentDisplay", false);
+ if (pf_eglGetCurrentDisplay)
+ return true;
+ }
return false;
#endif /* PLATFORM_HAS_EGL */
diff --git a/src/dispatch_glx.c b/src/dispatch_glx.c
index b5ad42e..e395564 100644
--- a/src/dispatch_glx.c
+++ b/src/dispatch_glx.c
@@ -158,12 +158,14 @@ epoxy_has_glx(Display *dpy)
#if !PLATFORM_HAS_GLX
return false;
#else
- Bool (* pf_glXQueryExtension) (Display *, int *, int *);
- int error_base, event_base;
-
- pf_glXQueryExtension = epoxy_conservative_glx_dlsym("glXQueryExtension", false);
- if (pf_glXQueryExtension && pf_glXQueryExtension(dpy, &error_base, &event_base))
- return true;
+ if (epoxy_load_glx(false, true)) {
+ Bool (* pf_glXQueryExtension) (Display *, int *, int *);
+ int error_base, event_base;
+
+ pf_glXQueryExtension = epoxy_conservative_glx_dlsym("glXQueryExtension", false);
+ if (pf_glXQueryExtension && pf_glXQueryExtension(dpy, &error_base, &event_base))
+ return true;
+ }
return false;
#endif /* !PLATFORM_HAS_GLX */