From 7e7943f962f0b02f3667612020d942957fcf7d1e Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 20 May 2025 20:49:29 +0200 Subject: [PATCH] Always initialize SDL from main thread --- rpcs3/Input/sdl_instance.cpp | 31 +++++++++++++++++++++++++------ rpcs3/Input/sdl_instance.h | 3 ++- rpcs3/Input/sdl_pad_handler.cpp | 11 ++--------- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/rpcs3/Input/sdl_instance.cpp b/rpcs3/Input/sdl_instance.cpp index e27ed5f8ac..4fbbfc9dc6 100644 --- a/rpcs3/Input/sdl_instance.cpp +++ b/rpcs3/Input/sdl_instance.cpp @@ -1,6 +1,8 @@ #ifdef HAVE_SDL3 #include "stdafx.h" +#include "sdl_instance.h" +#include "Emu/System.h" #ifndef _MSC_VER #pragma GCC diagnostic push @@ -11,10 +13,6 @@ #pragma GCC diagnostic pop #endif -#include "util/logs.hpp" - -#include "sdl_instance.h" - LOG_CHANNEL(sdl_log, "SDL"); sdl_instance::~sdl_instance() @@ -35,9 +33,12 @@ sdl_instance& sdl_instance::get_instance() void sdl_instance::pump_events() { - const std::lock_guard lock(m_instance_mutex); + std::lock_guard lock(m_instance_mutex); + if (m_initialized) + { SDL_PumpEvents(); + } } void sdl_instance::set_hint(const char* name, const char* value) @@ -50,7 +51,25 @@ void sdl_instance::set_hint(const char* name, const char* value) bool sdl_instance::initialize() { - const std::lock_guard lock(m_instance_mutex); + std::lock_guard lock(m_instance_mutex); + + if (m_initialized) + { + return true; + } + + bool instance_success = false; + + Emu.BlockingCallFromMainThread([this, &instance_success]() + { + instance_success = initialize_impl(); + }); + + return instance_success; +} + +bool sdl_instance::initialize_impl() +{ // Only init SDL once. SDL uses a global state internally... if (m_initialized) { diff --git a/rpcs3/Input/sdl_instance.h b/rpcs3/Input/sdl_instance.h index 9463b36900..23fc1b6d59 100644 --- a/rpcs3/Input/sdl_instance.h +++ b/rpcs3/Input/sdl_instance.h @@ -8,7 +8,7 @@ struct sdl_instance { public: sdl_instance() = default; - ~sdl_instance(); + virtual ~sdl_instance(); static sdl_instance& get_instance(); @@ -17,6 +17,7 @@ public: private: void set_hint(const char* name, const char* value); + bool initialize_impl(); bool m_initialized = false; std::mutex m_instance_mutex; diff --git a/rpcs3/Input/sdl_pad_handler.cpp b/rpcs3/Input/sdl_pad_handler.cpp index 0d4fb72a56..ef73c81a20 100644 --- a/rpcs3/Input/sdl_pad_handler.cpp +++ b/rpcs3/Input/sdl_pad_handler.cpp @@ -2,10 +2,10 @@ #include "stdafx.h" #include "sdl_pad_handler.h" +#include "sdl_instance.h" #include "Emu/system_utils.hpp" #include "Emu/system_config.h" #include "Emu/System.h" -#include "sdl_instance.h" #include @@ -180,14 +180,7 @@ bool sdl_pad_handler::Init() if (m_is_init) return true; - bool instance_success; - - Emu.BlockingCallFromMainThread([&instance_success]() - { - instance_success = sdl_instance::get_instance().initialize(); - }); - - if (!instance_success) + if (!sdl_instance::get_instance().initialize()) return false; if (g_cfg.io.load_sdl_mappings)