From 7e7943f962f0b02f3667612020d942957fcf7d1e Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 20 May 2025 20:49:29 +0200 Subject: [PATCH 1/2] 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) From c27d7db0a7cacab0f47b64cd8bc67c02e5a63bb9 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 20 May 2025 21:03:19 +0200 Subject: [PATCH 2/2] SDL: do not track emu state when initializing --- rpcs3/Emu/System.cpp | 4 ++-- rpcs3/Emu/System.h | 2 +- rpcs3/Input/sdl_instance.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 3fdcfae9ab..002075b5fa 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -185,13 +185,13 @@ void Emulator::CallFromMainThread(std::function&& func, atomic_t* w m_cb.call_from_main_thread(std::move(final_func), wake_up); } -void Emulator::BlockingCallFromMainThread(std::function&& func, std::source_location src_loc) const +void Emulator::BlockingCallFromMainThread(std::function&& func, bool track_emu_state, std::source_location src_loc) const { atomic_t wake_up = 0; sys_log.trace("Blocking Callback from thread '%s' at [%s] is queued", thread_ctrl::get_name(), src_loc); - CallFromMainThread(std::move(func), &wake_up, true, umax, src_loc); + CallFromMainThread(std::move(func), &wake_up, track_emu_state, umax, src_loc); bool logged = false; diff --git a/rpcs3/Emu/System.h b/rpcs3/Emu/System.h index 036215870f..417bef41b8 100644 --- a/rpcs3/Emu/System.h +++ b/rpcs3/Emu/System.h @@ -210,7 +210,7 @@ public: std::source_location src_loc = std::source_location::current()) const; // Blocking call from the GUI thread - void BlockingCallFromMainThread(std::function&& func, std::source_location src_loc = std::source_location::current()) const; + void BlockingCallFromMainThread(std::function&& func, bool track_emu_state = true, std::source_location src_loc = std::source_location::current()) const; enum class stop_counter_t : u64{}; diff --git a/rpcs3/Input/sdl_instance.cpp b/rpcs3/Input/sdl_instance.cpp index 4fbbfc9dc6..879333b513 100644 --- a/rpcs3/Input/sdl_instance.cpp +++ b/rpcs3/Input/sdl_instance.cpp @@ -63,7 +63,7 @@ bool sdl_instance::initialize() Emu.BlockingCallFromMainThread([this, &instance_success]() { instance_success = initialize_impl(); - }); + }, false); return instance_success; }