summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-05-31 21:53:04 +0200
committerwm4 <wm4@nowhere>2014-05-31 21:53:04 +0200
commit8178b80748e79b2aac9cb712a82c949cb34b1e6d (patch)
treebd4b6482ad0f5d6ba0a3e3baa2ab23f512a588f0
parent9f6e8d64de18d6bc57ee3338d6b900d669f35c0b (diff)
downloadmpv-8178b80748e79b2aac9cb712a82c949cb34b1e6d.tar.bz2
mpv-8178b80748e79b2aac9cb712a82c949cb34b1e6d.tar.xz
gl_x11: always require some GLX API functions, avoid dlsym()
The functions glXGetProcAddressARB() and glXQueryExtensionsString() were loaded using dlsym(). This could fail when compiling to libmpv, because then dlopen(NULL, ...) will look in the main program's list of libraries, and the libGL linked to libmpv is never considered. (Don't know if this somehow could be worked around.) The result is that using vo_opengl with libmpv can fail. Avoid this by not using dlsym(). glXGetProcAddressARB() was already used directly in the same file, and that never caused any problems. (Still add it to the configure test.) glXQueryExtensionsString() is documented as added in GLX 1.1 - that's ancient.
-rw-r--r--video/out/gl_common.c2
-rw-r--r--video/out/gl_common.h2
-rw-r--r--video/out/gl_x11.c22
-rw-r--r--waftools/fragments/gl_x11.c3
4 files changed, 9 insertions, 20 deletions
diff --git a/video/out/gl_common.c b/video/out/gl_common.c
index 271c2f3595..b8e5efbb6a 100644
--- a/video/out/gl_common.c
+++ b/video/out/gl_common.c
@@ -144,7 +144,7 @@ static bool is_software_gl(GL *gl)
#include <dlfcn.h>
#endif
-void *mp_getdladdr(const char *s)
+static void *mp_getdladdr(const char *s)
{
void *ret = NULL;
#if HAVE_LIBDL
diff --git a/video/out/gl_common.h b/video/out/gl_common.h
index 6f973e23be..622f1f2659 100644
--- a/video/out/gl_common.h
+++ b/video/out/gl_common.h
@@ -208,8 +208,6 @@ struct gl_hwdec_driver {
extern const struct gl_hwdec_driver *mpgl_hwdec_drivers[];
-void *mp_getdladdr(const char *s);
-
void mpgl_load_functions(GL *gl, void *(*getProcAddress)(const GLubyte *),
const char *ext2, struct mp_log *log);
diff --git a/video/out/gl_x11.c b/video/out/gl_x11.c
index a3733dea3a..78dfd8fbff 100644
--- a/video/out/gl_x11.c
+++ b/video/out/gl_x11.c
@@ -62,18 +62,9 @@ static bool create_context_x11_old(struct MPGLContext *ctx)
return false;
}
- void *(*getProcAddress)(const GLubyte *);
- getProcAddress = mp_getdladdr("glXGetProcAddress");
- if (!getProcAddress)
- getProcAddress = mp_getdladdr("glXGetProcAddressARB");
-
- const char *glxstr = "";
- const char *(*glXExtStr)(Display *, int)
- = mp_getdladdr("glXQueryExtensionsString");
- if (glXExtStr)
- glxstr = glXExtStr(display, ctx->vo->x11->screen);
-
- mpgl_load_functions(gl, getProcAddress, glxstr, vo->log);
+ const char *glxstr = glXQueryExtensionsString(display, ctx->vo->x11->screen);
+
+ mpgl_load_functions(gl, (void *)glXGetProcAddressARB, glxstr, vo->log);
if (!gl->GenPrograms && gl->GetString &&
gl->version < MPGL_VER(3, 0) &&
strstr(gl->GetString(GL_EXTENSIONS), "GL_ARB_vertex_program"))
@@ -105,11 +96,8 @@ static bool create_context_x11_gl3(struct MPGLContext *ctx, bool debug)
(glXCreateContextAttribsARBProc)
glXGetProcAddressARB((const GLubyte *)"glXCreateContextAttribsARB");
- const char *glxstr = "";
- const char *(*glXExtStr)(Display *, int)
- = mp_getdladdr("glXQueryExtensionsString");
- if (glXExtStr)
- glxstr = glXExtStr(vo->x11->display, vo->x11->screen);
+ const char *glxstr =
+ glXQueryExtensionsString(vo->x11->display, vo->x11->screen);
bool have_ctx_ext = glxstr && !!strstr(glxstr, "GLX_ARB_create_context");
if (!(have_ctx_ext && glXCreateContextAttribsARB)) {
diff --git a/waftools/fragments/gl_x11.c b/waftools/fragments/gl_x11.c
index 6c617d43ee..8f6c950f47 100644
--- a/waftools/fragments/gl_x11.c
+++ b/waftools/fragments/gl_x11.c
@@ -1,9 +1,12 @@
#include <X11/Xlib.h>
#include <GL/glx.h>
#include <GL/gl.h>
+#include <stddef.h>
int main(int argc, char *argv[]) {
glXCreateContext(NULL, NULL, NULL, True);
+ glXQueryExtensionsString(NULL, 0);
+ glXGetProcAddressARB("");
glFinish();
return 0;
}