summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorDentomologist <dentomologist@gmail.com>2025-04-25 15:21:54 -0700
committerDentomologist <dentomologist@gmail.com>2025-04-25 16:00:43 -0700
commit45b9def42c25203c6a18478dcddd87ea543a7e2c (patch)
tree8a75cb23af8469174cf2fdc8114c2ee45d41e12a /Source/Core
parentd0dc8ae5e1bfeec1dd3d19c5ddd532ac4156b66b (diff)
VideoConfig: Remove ConfigChangedCallback on shutdown
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/UICommon/UICommon.cpp6
-rw-r--r--Source/Core/VideoCommon/VideoConfig.cpp23
-rw-r--r--Source/Core/VideoCommon/VideoConfig.h1
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;