mirror of https://github.com/mpv-player/mpv
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:
parent
aab9ab97f0
commit
661b5542de
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue