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.
This commit is contained in:
Dudemanguy 2022-06-07 14:08:16 -05:00
parent aab9ab97f0
commit 661b5542de
1 changed files with 32 additions and 34 deletions

View File

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