diff options
| author | Dentomologist <dentomologist@gmail.com> | 2025-04-25 15:21:54 -0700 |
|---|---|---|
| committer | Dentomologist <dentomologist@gmail.com> | 2025-04-25 16:00:43 -0700 |
| commit | 45b9def42c25203c6a18478dcddd87ea543a7e2c (patch) | |
| tree | 8a75cb23af8469174cf2fdc8114c2ee45d41e12a /Source/Core | |
| parent | d0dc8ae5e1bfeec1dd3d19c5ddd532ac4156b66b (diff) | |
VideoConfig: Remove ConfigChangedCallback on shutdown
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/UICommon/UICommon.cpp | 6 | ||||
| -rw-r--r-- | Source/Core/VideoCommon/VideoConfig.cpp | 23 | ||||
| -rw-r--r-- | 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 <IOKit/pwr_mgt/IOPMLib.h> #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 <algorithm> +#include <optional> #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<CPUThreadConfigCallback::ConfigChangedCallbackID> + 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; |
