summaryrefslogtreecommitdiffstats
path: root/video/out
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2017-10-02 17:30:27 +0200
committerwm4 <wm4@nowhere>2017-10-02 17:30:27 +0200
commit0c04ce5f0d9c4fb7311edf0ae7bdf1eef0f61235 (patch)
tree8c205467cd0020a512f128e570f2da29d0f8d0f6 /video/out
parent51985e3dd630a5fc212f643781b4a0ca7f590782 (diff)
downloadmpv-0c04ce5f0d9c4fb7311edf0ae7bdf1eef0f61235.tar.bz2
mpv-0c04ce5f0d9c4fb7311edf0ae7bdf1eef0f61235.tar.xz
vo_gpu: gl: implement proper extension string search
The existing code in check_ext() avoided false positive due to sub-strings, but allowed false negatives. Fix this with slightly better search code, and make it available as function to other source files. (There are some cases of strstr() still around.)
Diffstat (limited to 'video/out')
-rw-r--r--video/out/opengl/common.c13
-rw-r--r--video/out/opengl/utils.c18
-rw-r--r--video/out/opengl/utils.h2
3 files changed, 23 insertions, 10 deletions
diff --git a/video/out/opengl/common.c b/video/out/opengl/common.c
index db317ee843..be3ff8e438 100644
--- a/video/out/opengl/common.c
+++ b/video/out/opengl/common.c
@@ -31,6 +31,7 @@
#include "common.h"
#include "common/common.h"
+#include "utils.h"
// This guesses if the current GL context is a suspected software renderer.
static bool is_software_gl(GL *gl)
@@ -49,14 +50,6 @@ static void GLAPIENTRY dummy_glBindFramebuffer(GLenum target, GLuint framebuffer
assert(framebuffer == 0);
}
-static bool check_ext(GL *gl, const char *name)
-{
- const char *exts = gl->extensions;
- char *s = strstr(exts, name);
- char *e = s ? s + strlen(name) : NULL;
- return s && (s == exts || s[-1] == ' ') && (e[0] == ' ' || !e[0]);
-}
-
#define FN_OFFS(name) offsetof(GL, name)
#define DEF_FN(name) {FN_OFFS(name), "gl" # name}
@@ -581,8 +574,8 @@ void mpgl_load_functions2(GL *gl, void *(*get_fn)(void *ctx, const char *n),
if (ver_core)
must_exist = version >= ver_core;
- if (section->extension && check_ext(gl, section->extension))
- exists = true;
+ if (section->extension)
+ exists = gl_check_extension(gl->extensions, section->extension);
exists |= must_exist;
if (!exists)
diff --git a/video/out/opengl/utils.c b/video/out/opengl/utils.c
index 3b296d52de..38982e501e 100644
--- a/video/out/opengl/utils.c
+++ b/video/out/opengl/utils.c
@@ -267,3 +267,21 @@ void gl_set_debug_logger(GL *gl, struct mp_log *log)
if (gl->DebugMessageCallback)
gl->DebugMessageCallback(log ? gl_debug_cb : NULL, log);
}
+
+// Given a GL combined extension string in extensions, find out whether ext
+// is included in it. Basically, a word search.
+bool gl_check_extension(const char *extensions, const char *ext)
+{
+ int len = strlen(ext);
+ const char *cur = extensions;
+ while (cur) {
+ cur = strstr(cur, ext);
+ if (!cur)
+ break;
+ if ((cur == extensions || cur[-1] == ' ') &&
+ (cur[len] == '\0' || cur[len] == ' '))
+ return true;
+ cur += len;
+ }
+ return false;
+}
diff --git a/video/out/opengl/utils.h b/video/out/opengl/utils.h
index 18cab476ed..53127e479e 100644
--- a/video/out/opengl/utils.h
+++ b/video/out/opengl/utils.h
@@ -51,4 +51,6 @@ void gl_vao_draw_data(struct gl_vao *vao, GLenum prim, void *ptr, size_t num);
void gl_set_debug_logger(GL *gl, struct mp_log *log);
+bool gl_check_extension(const char *extensions, const char *ext);
+
#endif