0
0
mirror of https://github.com/mpv-player/mpv.git synced 2024-09-20 20:03:10 +02:00

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.)
This commit is contained in:
wm4 2017-10-02 17:30:27 +02:00
parent 51985e3dd6
commit 0c04ce5f0d
3 changed files with 23 additions and 10 deletions

View File

@ -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)

View File

@ -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;
}

View File

@ -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