summaryrefslogtreecommitdiffstats
path: root/video
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2017-01-20 13:38:28 +0100
committerwm4 <wm4@nowhere>2017-01-20 13:40:59 +0100
commitd890e0731c0a0c002c32e8be89130e178059d3ba (patch)
tree4e8d805b00283d24f1ee2edb72350b3bc5fe7e5c /video
parenta35a5bb5f3c67f867ac6a21cad479657085f0230 (diff)
downloadmpv-d890e0731c0a0c002c32e8be89130e178059d3ba.tar.bz2
mpv-d890e0731c0a0c002c32e8be89130e178059d3ba.tar.xz
options: refactor how --opengl-dcomposition is declared
vo_opengl used to have it as sub-option, which made it very hard to pass down option values to backends in a generic way (even if these options were completely backend-specific). For --opengl-dcomposition we used a VOFLAG to deal with this. Fortunately, sub-options are gone, and we can just add it as global option. Move the option to context_angle.c and add it as global option. I thought about adding a mechanism to let backends declare options, which would get magically picked up my m_config instead of having to add them to the global option list manually (similar to VO vo_driver.options), but decided against this complexity just for 1 or 2 backends. Likewise, it could have been added as a single option to avoid the boilerplate of an option struct, but then again there are probably going to be more angle suboptions, and it's cleaner.
Diffstat (limited to 'video')
-rw-r--r--video/out/opengl/context.c1
-rw-r--r--video/out/opengl/context.h2
-rw-r--r--video/out/opengl/context_angle.c22
-rw-r--r--video/out/vo_opengl.c6
4 files changed, 23 insertions, 8 deletions
diff --git a/video/out/opengl/context.c b/video/out/opengl/context.c
index fb3471cd3b..478421385c 100644
--- a/video/out/opengl/context.c
+++ b/video/out/opengl/context.c
@@ -159,6 +159,7 @@ static MPGLContext *init_backend(struct vo *vo, const struct mpgl_driver *driver
*ctx = (MPGLContext) {
.gl = talloc_zero(ctx, GL),
.vo = vo,
+ .global = vo->global,
.driver = driver,
};
if (probing)
diff --git a/video/out/opengl/context.h b/video/out/opengl/context.h
index d0588ddbd9..119bba0ba6 100644
--- a/video/out/opengl/context.h
+++ b/video/out/opengl/context.h
@@ -32,7 +32,6 @@ enum {
VOFLAG_GL_DEBUG = 1 << 2, // Hint to request debug OpenGL context
VOFLAG_ALPHA = 1 << 3, // Hint to request alpha framebuffer
VOFLAG_SW = 1 << 4, // Hint to accept a software GL renderer
- VOFLAG_ANGLE_DCOMP = 1 << 5, // Whether DirectComposition is allowed
VOFLAG_PROBING = 1 << 6, // The backend is being auto-probed.
};
@@ -78,6 +77,7 @@ typedef struct MPGLContext {
GL *gl;
struct vo *vo;
const struct mpgl_driver *driver;
+ struct mpv_global *global;
// For hwdec_vaegl.c.
const char *native_display_type;
diff --git a/video/out/opengl/context_angle.c b/video/out/opengl/context_angle.c
index 44aed340e3..5af18e9928 100644
--- a/video/out/opengl/context_angle.c
+++ b/video/out/opengl/context_angle.c
@@ -24,6 +24,7 @@
#include "angle_dynamic.h"
#include "common/common.h"
+#include "options/m_config.h"
#include "video/out/w32_common.h"
#include "context.h"
@@ -36,6 +37,22 @@
// Windows 8 enum value, not present in mingw-w64 headers
#define DXGI_ADAPTER_FLAG_SOFTWARE (2)
+struct angle_opts {
+ int allow_direct_composition;
+};
+
+#define OPT_BASE_STRUCT struct angle_opts
+const struct m_sub_options angle_conf = {
+ .opts = (const struct m_option[]) {
+ OPT_FLAG("opengl-dcomposition", allow_direct_composition, 0),
+ {0}
+ },
+ .defaults = &(const struct angle_opts) {
+ .allow_direct_composition = 1,
+ },
+ .size = sizeof(struct angle_opts),
+};
+
struct priv {
EGLDisplay egl_display;
EGLContext egl_context;
@@ -43,6 +60,7 @@ struct priv {
bool use_es2;
bool sw_adapter_msg_shown;
PFNEGLPOSTSUBBUFFERNVPROC eglPostSubBufferNV;
+ struct angle_opts *opts;
};
static void angle_uninit(MPGLContext *ctx)
@@ -217,6 +235,8 @@ static int angle_init(struct MPGLContext *ctx, int flags)
struct priv *p = ctx->priv;
struct vo *vo = ctx->vo;
+ p->opts = mp_get_config_group(ctx, ctx->global, &angle_conf);
+
if (!angle_load()) {
MP_VERBOSE(vo, "Failed to load LIBEGL.DLL\n");
goto fail;
@@ -309,7 +329,7 @@ static int angle_init(struct MPGLContext *ctx, int flags)
// behavior with some drivers (Intel? symptom - whole desktop is black for
// some seconds after spending some minutes in fullscreen and then leaving
// fullscreen).
- if ((flags & VOFLAG_ANGLE_DCOMP) &&
+ if (p->opts->allow_direct_composition &&
strstr(exts, "EGL_ANGLE_direct_composition"))
{
MP_TARRAY_APPEND(NULL, window_attribs, window_attribs_len,
diff --git a/video/out/vo_opengl.c b/video/out/vo_opengl.c
index be187f63c3..72e889931e 100644
--- a/video/out/vo_opengl.c
+++ b/video/out/vo_opengl.c
@@ -55,7 +55,6 @@ struct vo_opengl_opts {
int allow_sw;
int swap_interval;
int dwm_flush;
- int allow_direct_composition;
int vsync_fences;
char *backend;
int es;
@@ -383,9 +382,6 @@ static int preinit(struct vo *vo)
if (p->opts.allow_sw)
vo_flags |= VOFLAG_SW;
- if (p->opts.allow_direct_composition)
- vo_flags |= VOFLAG_ANGLE_DCOMP;
-
p->glctx = mpgl_init(vo, p->opts.backend, vo_flags);
if (!p->glctx)
goto err_out;
@@ -444,7 +440,6 @@ const struct vo_driver video_out_opengl = {
OPT_INT("opengl-swapinterval", opts.swap_interval, 0),
OPT_CHOICE("opengl-dwmflush", opts.dwm_flush, 0,
({"no", -1}, {"auto", 0}, {"windowed", 1}, {"yes", 2})),
- OPT_FLAG("opengl-dcomposition", opts.allow_direct_composition, 0),
OPT_FLAG("opengl-debug", opts.use_gl_debug, 0),
OPT_STRING_VALIDATE("opengl-backend", opts.backend, 0,
mpgl_validate_backend_opt),
@@ -459,7 +454,6 @@ const struct vo_driver video_out_opengl = {
.priv_defaults = &(const struct gl_priv){
.opts = {
.swap_interval = 1,
- .allow_direct_composition = 1,
},
},
};