render/drawbgfx.cpp: Added initial support for Wayland on Linux. (#11451)

This commit is contained in:
Julian Sikorski 2023-09-28 17:24:59 +02:00 committed by GitHub
parent 80155dfa8c
commit 117c384d4a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 75 additions and 8 deletions

View file

@ -37,6 +37,7 @@
# USE_PCAP = 1
# USE_QTDEBUG = 1
# NO_X11 = 1
# USE_WAYLAND = 1
# NO_USE_XINPUT = 1
# NO_USE_XINPUT_WII_LIGHTGUN_HACK = 1
# FORCE_DRC_C_BACKEND = 1
@ -792,6 +793,10 @@ ifdef MESA_INSTALL_ROOT
PARAMS += --MESA_INSTALL_ROOT='$(MESA_INSTALL_ROOT)'
endif
ifdef USE_WAYLAND
PARAMS += --USE_WAYLAND='$(USE_WAYLAND)'
endif
ifdef NO_X11
PARAMS += --NO_X11='$(NO_X11)'
endif

View file

@ -1469,6 +1469,11 @@ end
"BGFX_CONFIG_RENDERER_OPENGL=0",
}
end
if _OPTIONS["USE_WAYLAND"]=="1" then
defines {
"WL_EGL_PLATFORM=1",
}
end
end
if _OPTIONS["targetos"]=="macosx" and _OPTIONS["gcc"]~=nil then

View file

@ -37,6 +37,12 @@ function maintargetosdoptions(_target,_subtarget)
end
end
if _OPTIONS["USE_WAYLAND"]=="1" then
links {
"wayland-egl"
}
end
if _OPTIONS["NO_USE_XINPUT"]~="1" then
links {
"Xext",
@ -141,6 +147,15 @@ if not _OPTIONS["NO_X11"] then
end
end
newoption {
trigger = "USE_WAYLAND",
description = "Use Wayland",
allowed = {
{ "0", "Do not use Wayland (use XWayland or X11)" },
{ "1", "Use Wayland" },
},
}
newoption {
trigger = "NO_USE_XINPUT",
description = "Disable use of Xinput",

View file

@ -50,6 +50,12 @@ else
}
end
if _OPTIONS["USE_WAYLAND"]=="1" then
defines {
"SDLMAME_USE_WAYLAND",
}
end
if _OPTIONS["NO_USE_XINPUT"]=="1" then
defines {
"USE_XINPUT=0",

View file

@ -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>
@ -382,6 +386,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:

View file

@ -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();