Commit c4799332 authored by Carlos Garnacho's avatar Carlos Garnacho Committed by Dylan Baker

wayland/egl: Ensure EGL surface is resized on DRI update_buffers()

Fullscreening and unfullscreening a totem window while playing a video
sometimes results in the video subsurface not changing size along. This
is also reproducible with epiphany.

If a surface gets resized while we have an active back buffer for it, the
resized dimensions won't get neither immediately applied on the resize
callback, nor correctly synchronized on update_buffers(), as the
(now stale) surface size and currently attached buffer size still do match.

There's actually 2 things to synchronize here, first the surface query
size might not be updated yet to the wl_egl_window's (i.e. resize_callback
happened while there is a back buffer), and second the wayland buffers
would need dropping if new surface size differs with the currently attached
buffer. These are done in separate steps now.

Fixes: a9fb331e ("wayland/egl: update surface size on window resize")
Signed-off-by: Carlos Garnacho's avatarCarlos Garnacho <>
Reviewed-by: Juan Suárez Romero's avatarJuan A. Suarez <>
Reviewed-by: Daniel Stone's avatarDaniel Stone <>
Tested-by: Bastien Nocera's avatarBastien Nocera <>
Tested-by: default avatarDenys Kostin <>
(cherry picked from commit 30a01cd9)
parent 73fa079b
......@@ -637,10 +637,8 @@ update_buffers(struct dri2_egl_surface *dri2_surf)
struct dri2_egl_display *dri2_dpy =
if (dri2_surf->base.Width != dri2_surf->wl_win->attached_width ||
dri2_surf->base.Height != dri2_surf->wl_win->attached_height) {
if (dri2_surf->base.Width != dri2_surf->wl_win->width ||
dri2_surf->base.Height != dri2_surf->wl_win->height) {
dri2_surf->base.Width = dri2_surf->wl_win->width;
dri2_surf->base.Height = dri2_surf->wl_win->height;
......@@ -648,6 +646,11 @@ update_buffers(struct dri2_egl_surface *dri2_surf)
dri2_surf->dy = dri2_surf->wl_win->dy;
if (dri2_surf->base.Width != dri2_surf->wl_win->attached_width ||
dri2_surf->base.Height != dri2_surf->wl_win->attached_height) {
if (get_back_bo(dri2_surf) < 0) {
_eglError(EGL_BAD_ALLOC, "failed to allocate color buffer");
return -1;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment