Compare commits

...

2 commits

Author SHA1 Message Date
Megamouse
c27d7db0a7 SDL: do not track emu state when initializing
Some checks are pending
Generate Translation Template / Generate Translation Template (push) Waiting to run
Build RPCS3 / RPCS3 Linux ubuntu-24.04 gcc (push) Waiting to run
Build RPCS3 / RPCS3 Linux ubuntu-24.04-arm clang (push) Waiting to run
Build RPCS3 / RPCS3 Linux ubuntu-24.04 clang (push) Waiting to run
Build RPCS3 / RPCS3 Windows (push) Waiting to run
2025-05-21 07:01:11 +02:00
Megamouse
7e7943f962 Always initialize SDL from main thread 2025-05-21 07:01:11 +02:00
5 changed files with 32 additions and 19 deletions

View file

@ -185,13 +185,13 @@ void Emulator::CallFromMainThread(std::function<void()>&& func, atomic_t<u32>* w
m_cb.call_from_main_thread(std::move(final_func), wake_up);
}
void Emulator::BlockingCallFromMainThread(std::function<void()>&& func, std::source_location src_loc) const
void Emulator::BlockingCallFromMainThread(std::function<void()>&& func, bool track_emu_state, std::source_location src_loc) const
{
atomic_t<u32> 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;

View file

@ -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<void()>&& func, std::source_location src_loc = std::source_location::current()) const;
void BlockingCallFromMainThread(std::function<void()>&& func, bool track_emu_state = true, std::source_location src_loc = std::source_location::current()) const;
enum class stop_counter_t : u64{};

View file

@ -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,10 +33,13 @@ sdl_instance& sdl_instance::get_instance()
void sdl_instance::pump_events()
{
const std::lock_guard<std::mutex> 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<std::mutex> 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();
}, false);
return instance_success;
}
bool sdl_instance::initialize_impl()
{
// Only init SDL once. SDL uses a global state internally...
if (m_initialized)
{

View file

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

View file

@ -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 <mutex>
@ -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)