From 871c11191bfc7214061a3da37c112522a102ddf5 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Tue, 27 Jul 2021 18:24:09 -0400 Subject: [PATCH] wayland: handle pending resizes immediately, not on SwapWindow. This was originally a workaround for an old Mesa bug, since fixed, apparently, and causes other problems. Fixes #4326. --- src/video/wayland/SDL_waylandopengles.c | 3 --- src/video/wayland/SDL_waylandwindow.c | 18 +++++++----------- src/video/wayland/SDL_waylandwindow.h | 2 -- 3 files changed, 7 insertions(+), 16 deletions(-) diff --git a/src/video/wayland/SDL_waylandopengles.c b/src/video/wayland/SDL_waylandopengles.c index f4736e12f..55cd789e2 100644 --- a/src/video/wayland/SDL_waylandopengles.c +++ b/src/video/wayland/SDL_waylandopengles.c @@ -148,9 +148,6 @@ Wayland_GLES_SwapWindow(_THIS, SDL_Window *window) return SDL_EGL_SetError("unable to show color buffer in an OS-native window", "eglSwapBuffers"); } - // Wayland-EGL forbids drawing calls in-between SwapBuffers and wl_egl_window_resize - Wayland_HandlePendingResize(window); - WAYLAND_wl_display_flush( data->waylandData->display ); return 0; diff --git a/src/video/wayland/SDL_waylandwindow.c b/src/video/wayland/SDL_waylandwindow.c index 344de837a..81d16076b 100644 --- a/src/video/wayland/SDL_waylandwindow.c +++ b/src/video/wayland/SDL_waylandwindow.c @@ -164,6 +164,9 @@ static const struct wl_callback_listener surface_frame_listener = { handle_surface_frame_done }; + +static void Wayland_HandlePendingResize(SDL_Window *window); + static void handle_configure_xdg_shell_surface(void *data, struct xdg_surface *xdg, uint32_t serial) { @@ -198,9 +201,7 @@ handle_configure_xdg_shell_surface(void *data, struct xdg_surface *xdg, uint32_t wind->resize.pending = SDL_TRUE; wind->resize.configure = SDL_TRUE; wind->resize.serial = serial; - if (!(window->flags & SDL_WINDOW_OPENGL)) { - Wayland_HandlePendingResize(window); /* OpenGL windows handle this in SwapWindow */ - } + Wayland_HandlePendingResize(window); } } @@ -457,9 +458,7 @@ update_scale_factor(SDL_WindowData *window) window->resize.height = window->sdlwindow->h; window->resize.scale_factor = new_factor; window->resize.pending = SDL_TRUE; - if (!(window->sdlwindow->flags & SDL_WINDOW_OPENGL)) { - Wayland_HandlePendingResize(window->sdlwindow); /* OpenGL windows handle this in SwapWindow */ - } + Wayland_HandlePendingResize(window->sdlwindow); } } @@ -929,10 +928,7 @@ Wayland_SetWindowFullscreen(_THIS, SDL_Window * window, wind->resize.width = window->windowed.w; wind->resize.height = window->windowed.h; wind->resize.pending = SDL_TRUE; - - if (!(window->flags & SDL_WINDOW_OPENGL)) { - Wayland_HandlePendingResize(window); - } + Wayland_HandlePendingResize(window); } } @@ -1204,7 +1200,7 @@ int Wayland_CreateWindow(_THIS, SDL_Window *window) } -void +static void Wayland_HandlePendingResize(SDL_Window *window) { SDL_WindowData *data = (SDL_WindowData *) window->driverdata; diff --git a/src/video/wayland/SDL_waylandwindow.h b/src/video/wayland/SDL_waylandwindow.h index 01f1614f2..35774bc73 100644 --- a/src/video/wayland/SDL_waylandwindow.h +++ b/src/video/wayland/SDL_waylandwindow.h @@ -114,8 +114,6 @@ Wayland_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info); extern int Wayland_SetWindowHitTest(SDL_Window *window, SDL_bool enabled); extern int Wayland_FlashWindow(_THIS, SDL_Window * window, SDL_FlashOperation operation); -extern void Wayland_HandlePendingResize(SDL_Window *window); - extern SDL_bool SDL_WAYLAND_own_surface(struct wl_surface *surface); #endif /* SDL_waylandwindow_h_ */