diff options
Diffstat (limited to 'src/osd')
-rw-r--r-- | src/osd/modules/render/drawbgfx.cpp | 48 | ||||
-rw-r--r-- | src/osd/sdl/osdsdl.cpp | 4 |
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(); |