From 96058f5d7ecc3d7e9950c59aa9dfbedad1715e84 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Fri, 31 Jan 2025 12:56:14 +1000 Subject: [PATCH] System: Use recreation logic for toggling GPU threading --- src/core/system.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/core/system.cpp b/src/core/system.cpp index fb4728ab5..0c1f3d5a0 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -170,6 +170,7 @@ static void ClearRunningGame(); static void DestroySystem(); static void RecreateGPU(GPURenderer new_renderer); +static void SetGPUThreadEnabled(bool enabled); static std::string GetScreenshotPath(const char* extension); static bool StartMediaCapture(std::string path, bool capture_video, bool capture_audio, u32 video_width, u32 video_height); @@ -1203,6 +1204,27 @@ void System::RecreateGPU(GPURenderer renderer) GPUThread::PresentCurrentFrame(); } +void System::SetGPUThreadEnabled(bool enabled) +{ + // can be called without valid system + if (!IsValid()) + { + GPUThread::Internal::SetThreadEnabled(g_settings.gpu_use_thread); + return; + } + + FreeMemoryStateStorage(false, true, false); + StopMediaCapture(); + + GPUThread::Internal::SetThreadEnabled(g_settings.gpu_use_thread); + + ClearMemorySaveStates(true, false); + + g_gpu.UpdateDisplay(false); + if (IsPaused()) + GPUThread::PresentCurrentFrame(); +} + void System::LoadSettings(bool display_osd_messages) { std::unique_lock lock = Host::GetSettingsLock(); @@ -4676,7 +4698,7 @@ void System::CheckForSettingsChanges(const Settings& old_settings) if (g_settings.gpu_use_thread != old_settings.gpu_use_thread) [[unlikely]] { - GPUThread::Internal::SetThreadEnabled(g_settings.gpu_use_thread); + SetGPUThreadEnabled(g_settings.gpu_use_thread); } else if (g_settings.gpu_use_thread && g_settings.gpu_max_queued_frames != old_settings.gpu_max_queued_frames) [[unlikely]]