Fixed bug 5451 - Can't create EGLSurface in Wayland from SDLWindow (no EGLNativeWindow pointer)

sashikknox

In some cases, need create EGLWindow with SDLWindow. In X11 i can get pointer to NativeWindow from **struct SDL_SysWMinfo wmInfo**
```C++
struct SDL_SysWMinfo wmInfo;
SDL_GetWindowWMInfo(ptSDLWindow, &wmInfo)
#if defined(__unix__) && defined(SDL_VIDEO_DRIVER_X11)
nativeWindow=(EGLNativeWindowType)wmInfo.info.x11.window;
nativeDisplay=(EGLNativeDisplayType)wmInfo.info.x11.display;
#endif
```
than i can create EGLSurface
```
eglCreateWindowSurface(nativeDisplay, EGL_CONFIG, nativeWindow, SURFACE_ATTRIBUTES);
```
in Wayland i can do it with same way, just need pointer to **EGLWindow**, we already have pointer to **wl_display** from **SDL_sysWMInfo**, need add to **wl** struct in SDL_SysWMInfo another pointer to **struct wl_egl_window *egl_window;**. And in wayland backend, in function **Wayland_GetWindowWMInfo** return pointer to **egl_window** from **SDL_WindowData**
Now i use patched statically built SDL2 in port of Quake 2 GLES2 for SailfishOS (it use QtWayland):
link to SDL2 commit and changed string for patch:
- 6858a618cd
- b1e29e87b9/SDL2/src/video/wayland/SDL_waylandwindow.c (L463)

link to use in Quake2 port:
1. here i get pointer to EGLNativeWindowType:  6d94fedb1b/Engine/Sources/Compatibility/OpenGLES/EGLWrapper.c (L319)
2. then use it for create EGLSurface: 6d94fedb1b/Engine/Sources/Compatibility/OpenGLES/EGLWrapper.c (L391)
This commit is contained in:
Sam Lantinga 2021-01-14 14:42:53 -08:00
parent b2aaab3d53
commit 6a342954e8
2 changed files with 10 additions and 6 deletions

View File

@ -274,9 +274,10 @@ struct SDL_SysWMinfo
#if defined(SDL_VIDEO_DRIVER_WAYLAND) #if defined(SDL_VIDEO_DRIVER_WAYLAND)
struct struct
{ {
struct wl_display *display; /**< Wayland display */ struct wl_display *display; /**< Wayland display */
struct wl_surface *surface; /**< Wayland surface */ struct wl_surface *surface; /**< Wayland surface */
struct wl_shell_surface *shell_surface; /**< Wayland shell_surface (window manager handle) */ struct wl_shell_surface *shell_surface; /**< Wayland shell_surface (window manager handle) */
struct wl_egl_window *egl_window; /**< Wayland EGL window (native window) */
} wl; } wl;
#endif #endif
#if defined(SDL_VIDEO_DRIVER_MIR) /* no longer available, left for API/ABI compatibility. Remove in 2.1! */ #if defined(SDL_VIDEO_DRIVER_MIR) /* no longer available, left for API/ABI compatibility. Remove in 2.1! */

View File

@ -437,9 +437,9 @@ SDL_bool
Wayland_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info) Wayland_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info)
{ {
SDL_WindowData *data = (SDL_WindowData *) window->driverdata; SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
const Uint32 version = ((((Uint32) info->version.major) * 1000000) + const Uint32 version = SDL_VERSIONNUM((Uint32)info->version.major,
(((Uint32) info->version.minor) * 10000) + (Uint32)info->version.minor,
(((Uint32) info->version.patch))); (Uint32)info->version.patch);
/* Before 2.0.6, it was possible to build an SDL with Wayland support /* Before 2.0.6, it was possible to build an SDL with Wayland support
(SDL_SysWMinfo will be large enough to hold Wayland info), but build (SDL_SysWMinfo will be large enough to hold Wayland info), but build
@ -451,7 +451,7 @@ Wayland_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info)
just return an error for older apps using this function. Those apps just return an error for older apps using this function. Those apps
will need to be recompiled against newer headers or not use Wayland, will need to be recompiled against newer headers or not use Wayland,
maybe by forcing SDL_VIDEODRIVER=x11. */ maybe by forcing SDL_VIDEODRIVER=x11. */
if (version < 2000006) { if (version < SDL_VERSIONNUM(2, 0, 6)) {
info->subsystem = SDL_SYSWM_UNKNOWN; info->subsystem = SDL_SYSWM_UNKNOWN;
SDL_SetError("Version must be 2.0.6 or newer"); SDL_SetError("Version must be 2.0.6 or newer");
return SDL_FALSE; return SDL_FALSE;
@ -460,6 +460,9 @@ Wayland_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info)
info->info.wl.display = data->waylandData->display; info->info.wl.display = data->waylandData->display;
info->info.wl.surface = data->surface; info->info.wl.surface = data->surface;
info->info.wl.shell_surface = data->shell_surface.wl; info->info.wl.shell_surface = data->shell_surface.wl;
if (version >= SDL_VERSIONNUM(2, 0, 15)) {
info->info.wl.egl_window = data->egl_window;
}
info->subsystem = SDL_SYSWM_WAYLAND; info->subsystem = SDL_SYSWM_WAYLAND;
return SDL_TRUE; return SDL_TRUE;