Wayland: Resizing a window does not reset backbuffer in some situations leading to incorrect buffer sizes
The problematic sequence of events comes when a client calls the following:
- We create an EGL window of a given arbitrary size
- We make that surface current temporarily for some admin tasks without swapping
- We resize the window
- we make the surface current then render and swap
We would expect the buffer to be of the newly configured size however instead the size from the first create is used.
The bug can be reproduced in mesa demos with the following patch:
--- a/src/egl/eglut/eglut_wayland.c
+++ b/src/egl/eglut/eglut_wayland.c
@@ -198,6 +198,7 @@ _eglutNativeInitWindow(struct eglut_window *win, const char *title,
xdg_toplevel_add_listener(window.xdg_toplevel, &xdg_toplevel_listener, win);
xdg_toplevel_set_title(window.xdg_toplevel, title);
xdg_toplevel_set_app_id(window.xdg_toplevel, title);
+ xdg_toplevel_set_fullscreen(window.xdg_toplevel, NULL);
wl_surface_commit(window.surface);
native = wl_egl_window_create(window.surface, w, h);
and running es2gears_wayland. The first buffer will be the hardcoded 300,300 not the full window size. On kwin future buffers remain wrong, Weston continually reconfigures so it appears to fix itself, but the first frame is still wrong.
The upstream Qt bug report can be found here: https://bugreports.qt.io/browse/QTBUG-106273 with the same cause as the above. We don't swap buffers before we get that first configure which might be a different size.
The reason is that when we make the surface current we implicitly create a backbuffer. calling wl_egl_window_resize
then effectively no-ops within update_buffers_if_needed
as a back buffer exists without recreating it.
This is a regression starting from b5619464