From 7e2bc21ce3847b530d48d322ce60b6a5fbbbf5b3 Mon Sep 17 00:00:00 2001 From: sharkautarch <128002472+sharkautarch@users.noreply.github.com> Date: Wed, 28 Feb 2024 09:51:56 -0500 Subject: [PATCH] Prevent SDL_WaitEvent loop from running before wlserver has finished initializing fixes issue #661 --- src/backend.h | 3 +++ src/main.cpp | 12 +++++++----- src/sdlwindow.cpp | 15 +++++++++++++++ 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/backend.h b/src/backend.h index 66b3ff9646..4d896b96a2 100644 --- a/src/backend.h +++ b/src/backend.h @@ -130,6 +130,9 @@ namespace gamescope public: virtual ~IBackend() {} + virtual void latchWait() { return; } + virtual void releaseLatch() { return; } //currently only used by sdl + virtual bool Init() = 0; virtual bool PostInit() = 0; virtual std::span GetInstanceExtensions() const = 0; diff --git a/src/main.cpp b/src/main.cpp index bbc3649de5..254f12e41b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -803,7 +803,7 @@ int main(int argc, char **argv) if ( !GetBackend() ) { fprintf( stderr, "Failed to create backend.\n" ); - return 1; + exit(1); } g_ForcedNV12ColorSpace = parse_colorspace_string( getenv( "GAMESCOPE_NV12_COLORSPACE" ) ); @@ -811,13 +811,13 @@ int main(int argc, char **argv) if ( !vulkan_init_formats() ) { fprintf( stderr, "vulkan_init_formats failed\n" ); - return 1; + exit(1); } if ( !vulkan_make_output() ) { fprintf( stderr, "vulkan_make_output failed\n" ); - return 1; + exit(1); } // Prevent our clients from connecting to the parent compositor @@ -846,7 +846,7 @@ int main(int argc, char **argv) if ( g_nNestedWidth != 0 ) { fprintf( stderr, "Cannot specify -w without -h\n" ); - return 1; + exit(1); } g_nNestedWidth = g_nOutputWidth; g_nNestedHeight = g_nOutputHeight; @@ -857,7 +857,9 @@ int main(int argc, char **argv) if ( !wlserver_init() ) { fprintf( stderr, "Failed to initialize wlserver\n" ); - return 1; + exit(1); + } else { + GetBackend()->releaseLatch(); } gamescope_xwayland_server_t *base_server = wlserver_get_xwayland_server(0); diff --git a/src/sdlwindow.cpp b/src/sdlwindow.cpp index d07a6bcf04..bf5753453d 100644 --- a/src/sdlwindow.cpp +++ b/src/sdlwindow.cpp @@ -115,6 +115,8 @@ namespace gamescope // IBackend ///////////// + virtual void latchWait() override; + virtual void releaseLatch() override; virtual bool Init() override; virtual bool PostInit() override; virtual std::span GetInstanceExtensions() const override; @@ -179,6 +181,7 @@ namespace gamescope std::thread m_SDLThread; std::atomic m_eSDLInit = { SDLInitState::SDLInit_Waiting }; + std::atomic m_sdlLatch = {false}; std::atomic m_bApplicationGrabbed = { false }; std::atomic m_bApplicationVisible = { false }; std::atomic> m_pApplicationCursor; @@ -336,6 +339,17 @@ namespace gamescope return true; } + void CSDLBackend::releaseLatch() + { + m_sdlLatch = true; + m_sdlLatch.notify_one(); + } + + void CSDLBackend::latchWait() + { + m_sdlLatch.wait(false); + } + std::span CSDLBackend::GetInstanceExtensions() const { return std::span{ m_pszInstanceExtensions.begin(), m_pszInstanceExtensions.end() }; @@ -631,6 +645,7 @@ namespace gamescope static uint32_t fake_timestamp = 0; + latchWait(); SDL_Event event; while( SDL_WaitEvent( &event ) ) {