summaryrefslogtreecommitdiffstats
path: root/video/out
diff options
context:
space:
mode:
authorDudemanguy <random342@airmail.cc>2022-06-07 14:08:16 -0500
committerDudemanguy <random342@airmail.cc>2022-06-10 13:55:22 +0000
commit661b5542de21d46d4d7c4693e564f4eec0526812 (patch)
tree6266c1e70edb6b0208a85443c4f128822a454b85 /video/out
parentaab9ab97f0340fbb042b71fce100f334098e255f (diff)
downloadmpv-661b5542de21d46d4d7c4693e564f4eec0526812.tar.bz2
mpv-661b5542de21d46d4d7c4693e564f4eec0526812.tar.xz
wayland_gl: wait until resize to create egl_window
Some wayland compositors (i.e. weston) get extremely picky about committed buffer sizes not matching the configured state. In particular, weston throws an error on you if you attempt to launch with --window-maximized and use opengl (vo_vaapi_wayland actually errors as well in this case, but that's a different issue). The culprit here is actually wl_egl_window_create. This creates an initial buffer at the sizes passed in the arguments which is what weston doesn't like. Instead, move the egl_window creation call to the resize function. This ensures that mpv is using the size obtained via the toplevel event, and it should always be the buffer size we want.
Diffstat (limited to 'video/out')
-rw-r--r--video/out/opengl/context_wayland.c66
1 files changed, 32 insertions, 34 deletions
diff --git a/video/out/opengl/context_wayland.c b/video/out/opengl/context_wayland.c
index bf9d90d0e3..984d803fa4 100644
--- a/video/out/opengl/context_wayland.c
+++ b/video/out/opengl/context_wayland.c
@@ -36,12 +36,43 @@ struct priv {
struct wl_egl_window *egl_window;
};
+static void egl_create_window(struct ra_ctx *ctx)
+{
+ struct priv *p = ctx->priv;
+ struct vo_wayland_state *wl = ctx->vo->wl;
+
+ p->egl_window = wl_egl_window_create(wl->surface,
+ mp_rect_w(wl->geometry) * wl->scaling,
+ mp_rect_h(wl->geometry) * wl->scaling);
+
+ p->egl_surface = mpegl_create_window_surface(
+ p->egl_display, p->egl_config, p->egl_window);
+ if (p->egl_surface == EGL_NO_SURFACE) {
+ p->egl_surface = eglCreateWindowSurface(
+ p->egl_display, p->egl_config, p->egl_window, NULL);
+ }
+
+ eglMakeCurrent(p->egl_display, p->egl_surface, p->egl_surface, p->egl_context);
+ // eglMakeCurrent may not configure the draw or read buffers if the context
+ // has been made current previously. On nvidia GL_NONE is bound because EGL_NO_SURFACE
+ // is used initially and we must bind the read and draw buffers here.
+ if(!p->gl.es) {
+ p->gl.ReadBuffer(GL_BACK);
+ p->gl.DrawBuffer(GL_BACK);
+ }
+
+ eglSwapInterval(p->egl_display, 0);
+}
+
static void resize(struct ra_ctx *ctx)
{
struct priv *p = ctx->priv;
struct vo_wayland_state *wl = ctx->vo->wl;
- MP_VERBOSE(wl, "Handling resize on the egl side\n");
+ MP_VERBOSE(wl, "Handling resize on the egl sideĀ„n");
+
+ if (!p->egl_window)
+ egl_create_window(ctx);
const int32_t width = wl->scaling * mp_rect_w(wl->geometry);
const int32_t height = wl->scaling * mp_rect_h(wl->geometry);
@@ -118,44 +149,11 @@ static bool egl_create_context(struct ra_ctx *ctx)
return true;
}
-static void egl_create_window(struct ra_ctx *ctx)
-{
- struct priv *p = ctx->priv;
- struct vo_wayland_state *wl = ctx->vo->wl;
-
- p->egl_window = wl_egl_window_create(wl->surface,
- mp_rect_w(wl->geometry) * wl->scaling,
- mp_rect_h(wl->geometry) * wl->scaling);
-
- p->egl_surface = mpegl_create_window_surface(
- p->egl_display, p->egl_config, p->egl_window);
- if (p->egl_surface == EGL_NO_SURFACE) {
- p->egl_surface = eglCreateWindowSurface(
- p->egl_display, p->egl_config, p->egl_window, NULL);
- }
-
- eglMakeCurrent(p->egl_display, p->egl_surface, p->egl_surface, p->egl_context);
- // eglMakeCurrent may not configure the draw or read buffers if the context
- // has been made current previously. On nvidia GL_NONE is bound because EGL_NO_SURFACE
- // is used initially and we must bind the read and draw buffers here.
- if(!p->gl.es) {
- p->gl.ReadBuffer(GL_BACK);
- p->gl.DrawBuffer(GL_BACK);
- }
-
- eglSwapInterval(p->egl_display, 0);
-}
-
static bool wayland_egl_reconfig(struct ra_ctx *ctx)
{
- struct priv *p = ctx->priv;
-
if (!vo_wayland_reconfig(ctx->vo))
return false;
- if (!p->egl_window)
- egl_create_window(ctx);
-
return true;
}