Always initialize SDL from main thread

This commit is contained in:
Megamouse 2025-05-20 20:49:29 +02:00
parent cb5fd17635
commit 7e7943f962
3 changed files with 29 additions and 16 deletions

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,9 +33,12 @@ 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();
});
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)