summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd
diff options
context:
space:
mode:
author Julian Sikorski <belegdol+github@gmail.com>2023-09-28 17:24:59 +0200
committer GitHub <noreply@github.com>2023-09-29 01:24:59 +1000
commit117c384d4ac65c06481f7a0631051c8ba273c0b5 (patch)
tree9aa97bb580be3bc24c50ceaa7a1463f2fbae4db7 /src/osd
parent80155dfa8c8fd3ebcdb304ab97e967d276014f74 (diff)
render/drawbgfx.cpp: Added initial support for Wayland on Linux. (#11451)
Diffstat (limited to 'src/osd')
-rw-r--r--src/osd/modules/render/drawbgfx.cpp48
-rw-r--r--src/osd/sdl/osdsdl.cpp4
2 files changed, 44 insertions, 8 deletions
diff --git a/src/osd/modules/render/drawbgfx.cpp b/src/osd/modules/render/drawbgfx.cpp
index f1a8d2611f5..19da01898e1 100644
--- a/src/osd/modules/render/drawbgfx.cpp
+++ b/src/osd/modules/render/drawbgfx.cpp
@@ -56,6 +56,10 @@ extern void *GetOSWindow(void *wincontroller);
#endif
#endif
+#if defined(SDLMAME_USE_WAYLAND)
+#include <wayland-egl.h>
+#endif
+
#include <bgfx/bgfx.h>
#include <bgfx/platform.h>
@@ -383,6 +387,36 @@ bool video_bgfx::init_bgfx_library(osd_window &window)
//============================================================
+// Helper for creating a wayland window
+//============================================================
+
+#if defined(SDLMAME_USE_WAYLAND)
+wl_egl_window *create_wl_egl_window(SDL_Window *window, struct wl_surface *surface)
+{
+ if (!surface)
+ {
+ osd_printf_error("Wayland surface missing, aborting\n");
+ return nullptr;
+ }
+ wl_egl_window *win_impl = (wl_egl_window *)SDL_GetWindowData(window, "wl_egl_window");
+ if (!win_impl)
+ {
+ int width, height;
+ SDL_GetWindowSize(window, &width, &height);
+ win_impl = wl_egl_window_create(surface, width, height);
+ if (!win_impl)
+ {
+ osd_printf_error("Creating wayland window failed\n");
+ return nullptr;
+ }
+ SDL_SetWindowData(window, "wl_egl_window", win_impl);
+ }
+ return win_impl;
+}
+#endif
+
+
+//============================================================
// Utility for setting up window handle
//============================================================
@@ -423,10 +457,16 @@ bool video_bgfx::set_platform_data(bgfx::PlatformData &platform_data, osd_window
platform_data.nwh = wmi.info.cocoa.window;
break;
#endif
-#if defined(SDL_VIDEO_DRIVER_WAYLAND) && SDL_VERSION_ATLEAST(2, 0, 16)
+#if defined(SDL_VIDEO_DRIVER_WAYLAND) && SDL_VERSION_ATLEAST(2, 0, 16) && defined(SDLMAME_USE_WAYLAND)
case SDL_SYSWM_WAYLAND:
platform_data.ndt = wmi.info.wl.display;
- platform_data.nwh = wmi.info.wl.egl_window;
+ platform_data.nwh = create_wl_egl_window(dynamic_cast<sdl_window_info const &>(window).platform_window(), wmi.info.wl.surface);
+ if (!platform_data.nwh)
+ {
+ osd_printf_error("BGFX: Error creating a Wayland window\n");
+ return false;
+ }
+ platform_data.type = bgfx::NativeWindowHandleType::Wayland;
break;
#endif
#if defined(SDL_VIDEO_DRIVER_ANDROID)
@@ -513,9 +553,9 @@ static void *sdlNativeWindowHandle(SDL_Window *window)
case SDL_SYSWM_COCOA:
return wmi.info.cocoa.window;
#endif
-#if defined(SDL_VIDEO_DRIVER_WAYLAND) && SDL_VERSION_ATLEAST(2, 0, 16)
+#if defined(SDL_VIDEO_DRIVER_WAYLAND) && SDL_VERSION_ATLEAST(2, 0, 16) && defined(SDLMAME_USE_WAYLAND)
case SDL_SYSWM_WAYLAND:
- return wmi.info.wl.egl_window;
+ return osd::create_wl_egl_window(window, wmi.info.wl.surface);
#endif
#if defined(SDL_VIDEO_DRIVER_ANDROID)
case SDL_SYSWM_ANDROID:
diff --git a/src/osd/sdl/osdsdl.cpp b/src/osd/sdl/osdsdl.cpp
index 147244ef0d4..6c5aef9f08c 100644
--- a/src/osd/sdl/osdsdl.cpp
+++ b/src/osd/sdl/osdsdl.cpp
@@ -271,10 +271,6 @@ void sdl_osd_interface::init(running_machine &machine)
exit(-1);
}
- // bgfx does not work with wayland
- if ((strcmp(SDL_GetCurrentVideoDriver(), "wayland") == 0) && (strcmp(options().video(), "bgfx") == 0))
- fatalerror("Error: BGFX video does not work with wayland videodriver. Please change either of the options.");
-
osd_sdl_info();
defines_verbose();