summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/VideoConfig.cpp
diff options
context:
space:
mode:
authorAdmiral H. Curtiss <pikachu025@gmail.com>2023-08-26 16:34:46 +0200
committerGitHub <noreply@github.com>2023-08-26 16:34:46 +0200
commit2502e412b3ca333a866b36c14c232bb1f33af068 (patch)
treee2c2cb420b64ac6388799d017a7992ee553b0081 /Source/Core/VideoCommon/VideoConfig.cpp
parentd8e35438bd1314d650c88e367782120b55f12327 (diff)
parentb62c25864f6d549976b94eda60763524413e896e (diff)
Merge pull request #12117 from JosJuice/config-callback-cpu
Don't call RunAsCPUThread in config callbacks
Diffstat (limited to 'Source/Core/VideoCommon/VideoConfig.cpp')
-rw-r--r--Source/Core/VideoCommon/VideoConfig.cpp25
1 files changed, 17 insertions, 8 deletions
diff --git a/Source/Core/VideoCommon/VideoConfig.cpp b/Source/Core/VideoCommon/VideoConfig.cpp
index 02db6db9f7..d9a35b727e 100644
--- a/Source/Core/VideoCommon/VideoConfig.cpp
+++ b/Source/Core/VideoCommon/VideoConfig.cpp
@@ -9,6 +9,7 @@
#include "Common/CommonTypes.h"
#include "Common/StringUtil.h"
+#include "Core/CPUThreadConfigCallback.h"
#include "Core/Config/GraphicsSettings.h"
#include "Core/Config/MainSettings.h"
#include "Core/ConfigManager.h"
@@ -19,6 +20,7 @@
#include "VideoCommon/AbstractGfx.h"
#include "VideoCommon/BPFunctions.h"
#include "VideoCommon/DriverDetails.h"
+#include "VideoCommon/Fifo.h"
#include "VideoCommon/FramebufferManager.h"
#include "VideoCommon/FreeLookCamera.h"
#include "VideoCommon/GraphicsModSystem/Config/GraphicsMod.h"
@@ -57,14 +59,21 @@ void VideoConfig::Refresh()
{
// 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 emulation first, which will flush the video thread,
- // update the config and correct it, then resume emulation, after which the video
- // thread will detect the config has changed and act accordingly.
- Config::AddConfigChangedCallback([]() {
- Core::RunAsCPUThread([]() {
- g_Config.Refresh();
- g_Config.VerifyValidity();
- });
+ // 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([]() {
+ auto& system = Core::System::GetInstance();
+
+ const bool lock_gpu_thread = Core::IsRunningAndStarted();
+ if (lock_gpu_thread)
+ system.GetFifo().PauseAndLock(system, true, false);
+
+ g_Config.Refresh();
+ g_Config.VerifyValidity();
+
+ if (lock_gpu_thread)
+ system.GetFifo().PauseAndLock(system, false, true);
});
s_has_registered_callback = true;
}