From 4b6df8923854a9e5661fa18775470397da956077 Mon Sep 17 00:00:00 2001 From: Frank Praznik Date: Sun, 7 Jan 2024 12:25:49 -0500 Subject: [PATCH] wayland: Add a property to allow creation of a wl_egl_window object even if OpenGL is not enabled Useful if the application handles OpenGL outside of SDL and wants to use the window without having to pull in Wayland as a dependency. --- include/SDL3/SDL_video.h | 4 ++++ src/video/wayland/SDL_waylandwindow.c | 8 ++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/include/SDL3/SDL_video.h b/include/SDL3/SDL_video.h index 7c223fe40d..d64f015a5e 100644 --- a/include/SDL3/SDL_video.h +++ b/include/SDL3/SDL_video.h @@ -872,6 +872,9 @@ extern DECLSPEC SDL_Window *SDLCALL SDL_CreatePopupWindow(SDL_Window *parent, in * if the application wants to use the Wayland surface for a custom role and * does not want it attached to an XDG toplevel window. See * docs/README-wayland.md for more information on using custom surfaces. + * - `SDL_PROPERTY_WINDOW_CREATE_WAYLAND_CREATE_EGL_WINDOW_BOOLEAN - true if + * the application wants an associated `wl_egl_window` object to be created, + * even if the window does not have the OpenGL property or flag set. * * These are additional supported properties on Windows: * @@ -927,6 +930,7 @@ extern DECLSPEC SDL_Window *SDLCALL SDL_CreateWindowWithProperties(SDL_Propertie #define SDL_PROPERTY_WINDOW_CREATE_COCOA_WINDOW_POINTER "cocoa.window" #define SDL_PROPERTY_WINDOW_CREATE_COCOA_VIEW_POINTER "cocoa.view" #define SDL_PROPERTY_WINDOW_CREATE_WAYLAND_SURFACE_ROLE_CUSTOM_BOOLEAN "wayland.surface_role_custom" +#define SDL_PROPERTY_WINDOW_CREATE_WAYLAND_CREATE_EGL_WINDOW_BOOLEAN "wayland.create_egl_window" #define SDL_PROPERTY_WINDOW_CREATE_WIN32_HWND_POINTER "win32.hwnd" #define SDL_PROPERTY_WINDOW_CREATE_WIN32_PIXEL_FORMAT_HWND_POINTER "win32.pixel_format_hwnd" #define SDL_PROPERTY_WINDOW_CREATE_X11_WINDOW_NUMBER "x11.window" diff --git a/src/video/wayland/SDL_waylandwindow.c b/src/video/wayland/SDL_waylandwindow.c index ddc585d2e4..7866b06671 100644 --- a/src/video/wayland/SDL_waylandwindow.c +++ b/src/video/wayland/SDL_waylandwindow.c @@ -2056,6 +2056,8 @@ int Wayland_CreateWindow(SDL_VideoDevice *_this, SDL_Window *window, SDL_Propert SDL_WindowData *data; SDL_VideoData *c; const SDL_bool custom_surface_role = SDL_GetBooleanProperty(create_props, SDL_PROPERTY_WINDOW_CREATE_WAYLAND_SURFACE_ROLE_CUSTOM_BOOLEAN, SDL_FALSE); + const SDL_bool create_egl_window = !!(window->flags & SDL_WINDOW_OPENGL) || + SDL_GetBooleanProperty(create_props, SDL_PROPERTY_WINDOW_CREATE_WAYLAND_CREATE_EGL_WINDOW_BOOLEAN, SDL_FALSE); data = SDL_calloc(1, sizeof(*data)); if (!data) { @@ -2129,18 +2131,20 @@ int Wayland_CreateWindow(SDL_VideoDevice *_this, SDL_Window *window, SDL_Propert } } - if (window->flags & SDL_WINDOW_OPENGL) { + if (create_egl_window) { data->egl_window = WAYLAND_wl_egl_window_create(data->surface, data->drawable_width, data->drawable_height); + } #ifdef SDL_VIDEO_OPENGL_EGL + if (window->flags & SDL_WINDOW_OPENGL) { /* Create the GLES window surface */ data->egl_surface = SDL_EGL_CreateSurface(_this, window, (NativeWindowType)data->egl_window); if (data->egl_surface == EGL_NO_SURFACE) { return -1; /* SDL_EGL_CreateSurface should have set error */ } -#endif } +#endif if (c->relative_mouse_mode) { Wayland_input_lock_pointer(c->input);