123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 |
- From 9c397af0dabfff7177bcb76409af5b8f9ae608cf Mon Sep 17 00:00:00 2001
- From: Drew DeVault <sir@cmpwn.com>
- Date: Thu, 27 Apr 2017 17:19:58 -0400
- Subject: [PATCH 1/4] --opengl-backend: support multiple backends
- Will attempt each backend specified in order. The x11 backend is still
- preferred, even on Wayland, but the user can now use
- --opengl-backend=wayland,x11 to prefer wayland and fall back to x11 if
- wayland is unavailable.
- ---
- video/out/opengl/context.c | 66 +++++++++++++++++++++++++++++++++++++++++-----
- video/out/opengl/context.h | 8 ++----
- video/out/vo_opengl.c | 7 +++--
- 3 files changed, 64 insertions(+), 17 deletions(-)
- diff --git a/video/out/opengl/context.c b/video/out/opengl/context.c
- index 72311e11fa..568bb662b8 100644
- --- a/video/out/opengl/context.c
- +++ b/video/out/opengl/context.c
- @@ -89,6 +89,30 @@ static const struct mpgl_driver *const backends[] = {
- #endif
- };
-
- +static bool get_desc(struct m_obj_desc *dst, int index)
- +{
- + if (index >= MP_ARRAY_SIZE(backends) - 1)
- + return false;
- + const struct mpgl_driver *driver = backends[index];
- + *dst = (struct m_obj_desc) {
- + .name = driver->name,
- + .description = driver->name,
- + .priv_size = sizeof(struct mpgl_driver),
- + .p = driver,
- + };
- + return true;
- +}
- +
- +// for backend option
- +const struct m_obj_list mpgl_backend_list = {
- + .get_desc = get_desc,
- + .description = "OpenGL windowing backends",
- + .allow_unknown_entries = true,
- + .allow_disable_entries = true,
- + .allow_trailer = true,
- + .disallow_positional_parameters = true,
- +};
- +
- // 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[] = {
- @@ -100,7 +124,7 @@ const int mpgl_preferred_gl_versions[] = {
- 0
- };
-
- -int mpgl_find_backend(const char *name)
- +static int mpgl_find_backend(const char *name)
- {
- if (name == NULL || strcmp(name, "auto") == 0)
- return -1;
- @@ -126,7 +150,7 @@ int mpgl_validate_backend_opt(struct mp_log *log, const struct m_option *opt,
- return mpgl_find_backend(s) >= -1 ? 1 : M_OPT_INVALID;
- }
-
- -static void *get_native_display(void *pctx, const char *name)
- +static void *get_native_display(const char *name)
- {
- MPGLContext *ctx = pctx;
- if (!ctx->native_display_type || !name)
- @@ -186,11 +210,41 @@ cleanup:
-
- // Create a VO window and create a GL context on it.
- // vo_flags: passed to the backend's create window function
- -MPGLContext *mpgl_init(struct vo *vo, const char *backend_name, int vo_flags)
- +MPGLContext *mpgl_init(struct vo *vo, struct m_obj_settings *backend_list, int vo_flags)
- {
- MPGLContext *ctx = NULL;
- - int index = mpgl_find_backend(backend_name);
- - if (index == -1) {
- + if (backend_list && backend_list[0].name) {
- + int n;
- + for (n = 0; backend_list[n].name; n++) {
- + // Something like "--opengl-backend=name," allows fallback to autoprobing.
- + int index = mpgl_find_backend(backend_list[n].name);
- + if (index == -1 || strlen(backend_list[n].name) == 0)
- + goto autoprobe;
- + if (index == -2) {
- + MP_FATAL(vo, "Unknown opengl backend '%s'\n", backend_list[n].name);
- + exit(-2);
- + return NULL;
- + }
- + ctx = init_backend(vo, backends[index], true, vo_flags);
- + if (ctx)
- + break;
- + }
- + if (!ctx && !vo->probing) {
- + // Now try with probing off
- + for (n = 0; backend_list[n].name; n++) {
- + int index = mpgl_find_backend(backend_list[n].name);
- + ctx = init_backend(vo, backends[index], false, vo_flags);
- + if (ctx)
- + break;
- + }
- + if (!ctx) {
- + // Backend explicitly requested, but unable to fulfill
- + return NULL;
- + }
- + }
- + }
- + if (!ctx) {
- +autoprobe:
- for (int n = 0; n < MP_ARRAY_SIZE(backends); n++) {
- ctx = init_backend(vo, backends[n], true, vo_flags);
- if (ctx)
- @@ -204,8 +258,6 @@ MPGLContext *mpgl_init(struct vo *vo, const char *backend_name, int vo_flags)
- break;
- }
- }
- - } else if (index >= 0) {
- - ctx = init_backend(vo, backends[index], false, vo_flags);
- }
- return ctx;
- }
- diff --git a/video/out/opengl/context.h b/video/out/opengl/context.h
- index 229c5ef54f..7cf439c1a0 100644
- --- a/video/out/opengl/context.h
- +++ b/video/out/opengl/context.h
- @@ -100,17 +100,13 @@ typedef struct MPGLContext {
- void *priv;
- } MPGLContext;
-
- -MPGLContext *mpgl_init(struct vo *vo, const char *backend_name, int vo_flags);
- +MPGLContext *mpgl_init(struct vo *vo, struct m_obj_settings *backend_list, int vo_flags);
- void mpgl_uninit(MPGLContext *ctx);
- int mpgl_reconfig_window(struct MPGLContext *ctx);
- int mpgl_control(struct MPGLContext *ctx, int *events, int request, void *arg);
- void mpgl_start_frame(struct MPGLContext *ctx);
- void mpgl_swap_buffers(struct MPGLContext *ctx);
-
- -int mpgl_find_backend(const char *name);
- -
- -struct m_option;
- -int mpgl_validate_backend_opt(struct mp_log *log, const struct m_option *opt,
- - struct bstr name, struct bstr param);
- +extern const struct m_obj_list mpgl_backend_list;
-
- #endif
- diff --git a/video/out/vo_opengl.c b/video/out/vo_opengl.c
- index 9b3f944e21..91e55b3b2f 100644
- --- a/video/out/vo_opengl.c
- +++ b/video/out/vo_opengl.c
- @@ -55,7 +55,7 @@ struct vo_opengl_opts {
- int allow_sw;
- int swap_interval;
- int vsync_fences;
- - char *backend;
- + struct m_obj_settings *backend_list;
- int es;
- int pattern[2];
- };
- @@ -383,7 +383,7 @@ static int preinit(struct vo *vo)
- if (p->opts.allow_sw)
- vo_flags |= VOFLAG_SW;
-
- - p->glctx = mpgl_init(vo, p->opts.backend, vo_flags);
- + p->glctx = mpgl_init(vo, p->opts.backend_list, vo_flags);
- if (!p->glctx)
- goto err_out;
- p->gl = p->glctx->gl;
- @@ -438,8 +438,7 @@ const struct vo_driver video_out_opengl = {
- OPT_FLAG("opengl-waitvsync", opts.waitvsync, 0),
- OPT_INT("opengl-swapinterval", opts.swap_interval, 0),
- OPT_FLAG("opengl-debug", opts.use_gl_debug, 0),
- - OPT_STRING_VALIDATE("opengl-backend", opts.backend, 0,
- - mpgl_validate_backend_opt),
- + OPT_SETTINGSLIST("opengl-backend", opts.backend_list, 0, &mpgl_backend_list ),
- OPT_FLAG("opengl-sw", opts.allow_sw, 0),
- OPT_CHOICE("opengl-es", opts.es, 0, ({"no", -1}, {"auto", 0},
- {"yes", 1}, {"force2", 2})),
- From 4e89fae50f70d065ff8ffee40aa8dffe8131210e Mon Sep 17 00:00:00 2001
- From: Drew DeVault <sir@cmpwn.com>
- Date: Thu, 27 Apr 2017 17:51:39 -0400
- Subject: [PATCH 2/4] Update mpv.1
- ---
- DOCS/man/options.rst | 7 ++++---
- 1 file changed, 4 insertions(+), 3 deletions(-)
- diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst
- index 925c501881..5d57720e3d 100644
- --- a/DOCS/man/options.rst
- +++ b/DOCS/man/options.rst
- @@ -4480,9 +4480,10 @@ The following video options are currently all specific to ``--vo=opengl`` and
- Continue even if a software renderer is detected.
-
- ``--opengl-backend=<sys>``
- - The value ``auto`` (the default) selects the windowing backend. You can
- - also pass ``help`` to get a complete list of compiled in backends (sorted
- - by autoprobe order).
- + Specify a priority list of windowing backends to use with OpenGL. The value
- + ``auto`` (the default) automatically probes for the most suitable backend.
- + You can also pass ``help`` to get a complete list of compiled in backends
- + (sorted by autoprobe order).
-
- auto
- auto-select (default)
- From 3fb437fa09ebf20635c02f41ce0e3d13423d1454 Mon Sep 17 00:00:00 2001
- From: Drew DeVault <sir@cmpwn.com>
- Date: Thu, 27 Apr 2017 20:12:51 -0400
- Subject: [PATCH 3/4] Let options handle invalid backends
- ---
- video/out/opengl/context.c | 17 +++++++++--------
- 1 file changed, 9 insertions(+), 8 deletions(-)
- diff --git a/video/out/opengl/context.c b/video/out/opengl/context.c
- index 568bb662b8..8aa44b67cc 100644
- --- a/video/out/opengl/context.c
- +++ b/video/out/opengl/context.c
- @@ -91,6 +91,14 @@ static const struct mpgl_driver *const backends[] = {
-
- static bool get_desc(struct m_obj_desc *dst, int index)
- {
- + if (index == 0) {
- + *dst = (struct m_obj_desc) {
- + .name = "auto",
- + .description = "automatically select most suitable backend"
- + };
- + return true;
- + }
- + index--;
- if (index >= MP_ARRAY_SIZE(backends) - 1)
- return false;
- const struct mpgl_driver *driver = backends[index];
- @@ -107,8 +115,6 @@ static bool get_desc(struct m_obj_desc *dst, int index)
- const struct m_obj_list mpgl_backend_list = {
- .get_desc = get_desc,
- .description = "OpenGL windowing backends",
- - .allow_unknown_entries = true,
- - .allow_disable_entries = true,
- .allow_trailer = true,
- .disallow_positional_parameters = true,
- };
- @@ -218,13 +224,8 @@ MPGLContext *mpgl_init(struct vo *vo, struct m_obj_settings *backend_list, int v
- for (n = 0; backend_list[n].name; n++) {
- // Something like "--opengl-backend=name," allows fallback to autoprobing.
- int index = mpgl_find_backend(backend_list[n].name);
- - if (index == -1 || strlen(backend_list[n].name) == 0)
- + if (index < 0 || strlen(backend_list[n].name) == 0)
- goto autoprobe;
- - if (index == -2) {
- - MP_FATAL(vo, "Unknown opengl backend '%s'\n", backend_list[n].name);
- - exit(-2);
- - return NULL;
- - }
- ctx = init_backend(vo, backends[index], true, vo_flags);
- if (ctx)
- break;
- From 605785c4846ecaa969309f7fb63cfba59751ba61 Mon Sep 17 00:00:00 2001
- From: Drew DeVault <sir@cmpwn.com>
- Date: Fri, 26 May 2017 15:31:24 -0400
- Subject: [PATCH 4/4] Updates following HEAD
- ---
- video/out/opengl/context.c | 17 +----------------
- 1 file changed, 1 insertion(+), 16 deletions(-)
- diff --git a/video/out/opengl/context.c b/video/out/opengl/context.c
- index 8aa44b67cc..4cc0829c90 100644
- --- a/video/out/opengl/context.c
- +++ b/video/out/opengl/context.c
- @@ -141,22 +141,7 @@ static int mpgl_find_backend(const char *name)
- return -2;
- }
-
- -int mpgl_validate_backend_opt(struct mp_log *log, const struct m_option *opt,
- - struct bstr name, struct bstr param)
- -{
- - if (bstr_equals0(param, "help")) {
- - mp_info(log, "OpenGL windowing backends:\n");
- - mp_info(log, " auto (autodetect)\n");
- - for (int n = 0; n < MP_ARRAY_SIZE(backends); n++)
- - mp_info(log, " %s\n", backends[n]->name);
- - return M_OPT_EXIT;
- - }
- - char s[20];
- - snprintf(s, sizeof(s), "%.*s", BSTR_P(param));
- - return mpgl_find_backend(s) >= -1 ? 1 : M_OPT_INVALID;
- -}
- -
- -static void *get_native_display(const char *name)
- +static void *get_native_display(void *pctx, const char *name)
- {
- MPGLContext *ctx = pctx;
- if (!ctx->native_display_type || !name)
|