summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdam Jackson <ajax@redhat.com>2018-05-01 11:16:46 -0400
committerAdam Jackson <ajax@redhat.com>2018-05-01 11:20:30 -0400
commit53ae0bbffe18072e4d8408bad5d8448d0b4392c3 (patch)
tree65e9c9c4b2e1f83fefc55170218457223b147b82 /src
parentb80ea6a36ac579edda5ea575782ce719c314ebfd (diff)
downloadlibepoxy-53ae0bbffe18072e4d8408bad5d8448d0b4392c3.tar.gz
dispatch: Stop implicitly loading libraries from do_dlsym
Mostly this is to get all the calls to get_dlopen_handle nicely isolated so they're easier to reason about. Signed-off-by: Adam Jackson <ajax@redhat.com>
Diffstat (limited to 'src')
-rw-r--r--src/dispatch_common.c87
1 files changed, 55 insertions, 32 deletions
diff --git a/src/dispatch_common.c b/src/dispatch_common.c
index 244938b..085661f 100644
--- a/src/dispatch_common.c
+++ b/src/dispatch_common.c
@@ -175,6 +175,7 @@
#ifdef __APPLE__
#define GLX_LIB "/opt/X11/lib/libGL.1.dylib"
+#define OPENGL_LIB "/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL"
#elif defined(__ANDROID__)
#define GLX_LIB "libGLESv2.so"
#else
@@ -190,6 +191,7 @@
#define EGL_LIB "libEGL.dll"
#define GLES1_LIB "libGLES_CM.dll"
#define GLES2_LIB "libGLESv2.dll"
+#define OPENGL_LIB "OPENGL32"
#else
#define EGL_LIB "libEGL.so.1"
#define GLES1_LIB "libGLESv1_CM.so.1"
@@ -326,15 +328,11 @@ get_dlopen_handle(void **handle, const char *lib_name, bool exit_on_fail)
}
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
@@ -343,7 +341,7 @@ do_dlsym(void **handle, const char *lib_name, const char *name,
error = dlerror();
#endif
if (!result && exit_on_fail) {
- fprintf(stderr,"%s() not found in %s: %s\n", name, lib_name, error);
+ fprintf(stderr, "%s() not found: %s\n", name, error);
exit(1);
}
@@ -552,16 +550,27 @@ epoxy_internal_has_gl_extension(const char *ext, bool invalid_op_mode)
}
}
-void *
-epoxy_conservative_glx_dlsym(const char *name, bool exit_if_fails)
+static bool
+epoxy_load_glx(bool exit_if_fails)
{
#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);
#endif
+ if (!api.glx_handle)
+ get_dlopen_handle(&api.glx_handle, GLX_LIB, exit_if_fails);
+
+ return api.glx_handle != NULL;
+}
+
+void *
+epoxy_conservative_glx_dlsym(const char *name, bool exit_if_fails)
+{
+ if (epoxy_load_glx(exit_if_fails))
+ return do_dlsym(&api.glx_handle, name, exit_if_fails);
- return do_dlsym(&api.glx_handle, GLX_LIB, name, exit_if_fails);
+ return NULL;
}
/**
@@ -624,10 +633,19 @@ 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)
+{
+ return get_dlopen_handle(&api.egl_handle, EGL_LIB, exit_if_fails);
+}
+
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 (epoxy_load_egl(exit_if_fails))
+ return do_dlsym(&api.egl_handle, name, exit_if_fails);
+
+ return NULL;
}
void *
@@ -642,31 +660,32 @@ epoxy_glx_dlsym(const char *name)
return epoxy_conservative_glx_dlsym(name, true);
}
-void *
-epoxy_gl_dlsym(const char *name)
+static void
+epoxy_load_gl(void)
{
-#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);
+ if (api.gl_handle)
+ return;
+
+#if defined(_WIN32) || defined(__APPLE__)
+ get_dlopen_handle(&api.gl_handle, OPENGL_LIB, true);
#else
- void *sym;
-# if defined(OPENGL_LIB)
+#if defined(OPENGL_LIB)
if (!api.gl_handle)
get_dlopen_handle(&api.gl_handle, OPENGL_LIB, false);
-# endif
+#endif
- if (api.gl_handle)
- return do_dlsym(&api.gl_handle, NULL, name, true);
+ get_dlopen_handle(&api.glx_handle, GLX_LIB, true);
+ api.gl_handle = api.glx_handle;
+#endif
+}
- sym = do_dlsym(&api.glx_handle, GLX_LIB, name, true);
- api.gl_handle = api.glx_handle; /* skip the dlopen next time */
+void *
+epoxy_gl_dlsym(const char *name)
+{
+ epoxy_load_gl();
- return sym;
-#endif
+ return do_dlsym(&api.gl_handle, name, true);
}
void *
@@ -675,7 +694,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);
+ return do_dlsym(&api.gles1_handle, name, true);
}
}
@@ -685,7 +705,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);
+ return do_dlsym(&api.gles2_handle, name, true);
}
}
@@ -705,10 +726,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)) {
+ void *func = do_dlsym(&api.gles2_handle, GLES2_LIB, false);
- if (func)
- return func;
+ if (func)
+ return func;
+ }
return epoxy_get_proc_address(name);
}