diff options
author | wm4 <wm4@nowhere> | 2014-05-31 21:53:04 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2014-05-31 21:53:04 +0200 |
commit | 8178b80748e79b2aac9cb712a82c949cb34b1e6d (patch) | |
tree | bd4b6482ad0f5d6ba0a3e3baa2ab23f512a588f0 /video | |
parent | 9f6e8d64de18d6bc57ee3338d6b900d669f35c0b (diff) | |
download | mpv-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.
Diffstat (limited to 'video')
-rw-r--r-- | video/out/gl_common.c | 2 | ||||
-rw-r--r-- | video/out/gl_common.h | 2 | ||||
-rw-r--r-- | video/out/gl_x11.c | 22 |
3 files changed, 6 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)) { |