diff options
-rw-r--r-- | video/out/opengl/context.c | 11 | ||||
-rw-r--r-- | video/out/opengl/context.h | 2 | ||||
-rw-r--r-- | video/out/opengl/context_x11.c | 19 |
3 files changed, 26 insertions, 6 deletions
diff --git a/video/out/opengl/context.c b/video/out/opengl/context.c index aada9df973..77e9709426 100644 --- a/video/out/opengl/context.c +++ b/video/out/opengl/context.c @@ -78,6 +78,17 @@ static const struct mpgl_driver *const backends[] = { #endif }; +// 0-terminated list of desktop GL versions a backend should try to +// initialize. The first entry is the most preferred version. +const int mpgl_preferred_gl_versions[] = { + 330, + 320, + 310, + 300, + 210, + 0 +}; + int mpgl_find_backend(const char *name) { if (name == NULL || strcmp(name, "auto") == 0) diff --git a/video/out/opengl/context.h b/video/out/opengl/context.h index cd12bb9f32..df842bc8a1 100644 --- a/video/out/opengl/context.h +++ b/video/out/opengl/context.h @@ -34,6 +34,8 @@ enum { VOFLAG_SW = 1 << 4, // Hint to accept a software GL renderer }; +extern const int mpgl_preferred_gl_versions[]; + struct MPGLContext; // A windowing backend (like X11, win32, ...), which provides OpenGL rendering. diff --git a/video/out/opengl/context_x11.c b/video/out/opengl/context_x11.c index 6a6441cd23..c02730c729 100644 --- a/video/out/opengl/context_x11.c +++ b/video/out/opengl/context_x11.c @@ -125,10 +125,8 @@ static bool create_context_x11_gl3(struct MPGLContext *ctx, int vo_flags, glx_ctx->fbc, 0, True, context_attribs); vo_x11_silence_xlib(-1); - if (!context) { - MP_VERBOSE(vo, "Could not create GL3 context. Retrying with legacy context.\n"); + if (!context) return false; - } // set context if (!glXMakeCurrent(vo->x11->display, vo->x11->window, context)) { @@ -253,9 +251,18 @@ static int glx_init(struct MPGLContext *ctx, int flags) bool success = false; if (!(flags & VOFLAG_GLES)) { - success = create_context_x11_gl3(ctx, flags, 300, false); - if (!success) - success = create_context_x11_old(ctx); + for (int n = 0; mpgl_preferred_gl_versions[n]; n++) { + int version = mpgl_preferred_gl_versions[n]; + MP_VERBOSE(vo, "Creating OpenGL %d.%d context...\n", + MPGL_VER_P(version)); + if (version >= 300) { + success = create_context_x11_gl3(ctx, flags, version, false); + } else { + success = create_context_x11_old(ctx); + } + if (success) + break; + } } if (!success) // try ES success = create_context_x11_gl3(ctx, flags, 200, true); |