From 45b9def42c25203c6a18478dcddd87ea543a7e2c Mon Sep 17 00:00:00 2001 From: Dentomologist Date: Fri, 25 Apr 2025 15:21:54 -0700 Subject: [PATCH] VideoConfig: Remove ConfigChangedCallback on shutdown --- Source/Core/UICommon/UICommon.cpp | 6 ++++-- Source/Core/VideoCommon/VideoConfig.cpp | 23 ++++++++++++++++++----- Source/Core/VideoCommon/VideoConfig.h | 1 + 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/Source/Core/UICommon/UICommon.cpp b/Source/Core/UICommon/UICommon.cpp index f1e19d2292..309d563864 100644 --- a/Source/Core/UICommon/UICommon.cpp +++ b/Source/Core/UICommon/UICommon.cpp @@ -50,6 +50,9 @@ #include "UICommon/DiscordPresence.h" #include "UICommon/USBUtils.h" +#include "VideoCommon/VideoBackendBase.h" +#include "VideoCommon/VideoConfig.h" + #ifdef HAVE_QTDBUS #include "UICommon/DBusUtils.h" #endif @@ -58,8 +61,6 @@ #include #endif -#include "VideoCommon/VideoBackendBase.h" - namespace UICommon { static Config::ConfigChangedCallbackID s_config_changed_callback_id; @@ -152,6 +153,7 @@ void Shutdown() WiimoteReal::Shutdown(); Common::Log::LogManager::Shutdown(); Discord::Shutdown(); + g_Config.Shutdown(); SConfig::Shutdown(); Config::Shutdown(); } diff --git a/Source/Core/VideoCommon/VideoConfig.cpp b/Source/Core/VideoCommon/VideoConfig.cpp index b540358fb1..fb5fb41b05 100644 --- a/Source/Core/VideoCommon/VideoConfig.cpp +++ b/Source/Core/VideoCommon/VideoConfig.cpp @@ -4,6 +4,7 @@ #include "VideoCommon/VideoConfig.h" #include +#include #include "Common/CPUDetect.h" #include "Common/CommonTypes.h" @@ -33,7 +34,8 @@ VideoConfig g_Config; VideoConfig g_ActiveConfig; BackendInfo g_backend_info; -static bool s_has_registered_callback = false; +static std::optional + s_config_changed_callback_id = std::nullopt; static bool IsVSyncActive(bool enabled) { @@ -50,14 +52,14 @@ void UpdateActiveConfig() void VideoConfig::Refresh() { - if (!s_has_registered_callback) + if (!s_config_changed_callback_id.has_value()) { // There was a race condition between the video thread and the host thread here, if // corrections need to be made by VerifyValidity(). Briefly, the config will contain // invalid values. Instead, pause the video thread first, update the config and correct // it, then resume emulation, after which the video thread will detect the config has // changed and act accordingly. - CPUThreadConfigCallback::AddConfigChangedCallback([]() { + const auto config_changed_callback = []() { auto& system = Core::System::GetInstance(); const bool lock_gpu_thread = Core::IsRunning(system); @@ -69,8 +71,10 @@ void VideoConfig::Refresh() if (lock_gpu_thread) system.GetFifo().PauseAndLock(false, true); - }); - s_has_registered_callback = true; + }; + + s_config_changed_callback_id = + CPUThreadConfigCallback::AddConfigChangedCallback(config_changed_callback); } bVSync = Config::Get(Config::GFX_VSYNC); @@ -212,6 +216,15 @@ void VideoConfig::VerifyValidity() } } +void VideoConfig::Shutdown() +{ + if (!s_config_changed_callback_id.has_value()) + return; + + CPUThreadConfigCallback::RemoveConfigChangedCallback(*s_config_changed_callback_id); + s_config_changed_callback_id.reset(); +} + bool VideoConfig::UsingUberShaders() const { return iShaderCompilationMode == ShaderCompilationMode::SynchronousUberShaders || diff --git a/Source/Core/VideoCommon/VideoConfig.h b/Source/Core/VideoCommon/VideoConfig.h index 4caa48bd7c..a268278eca 100644 --- a/Source/Core/VideoCommon/VideoConfig.h +++ b/Source/Core/VideoCommon/VideoConfig.h @@ -190,6 +190,7 @@ struct VideoConfig final VideoConfig() = default; void Refresh(); void VerifyValidity(); + static void Shutdown(); // General bool bVSync = false;