From 6386004b2cffaba63310b400e0e37dcde4be20e3 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Tue, 26 Jul 2022 21:46:18 +1000 Subject: [PATCH] FullscreenUI: Fix incorrect vsync state on unpause --- src/core/system.cpp | 10 +++++++--- src/core/system.h | 3 +++ src/duckstation-qt/qthost.cpp | 16 +++++++++++----- src/frontend-common/fullscreen_ui.cpp | 18 +++--------------- 4 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/core/system.cpp b/src/core/system.cpp index 42eb8f5a0..9ede85cbb 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -2192,11 +2192,10 @@ void System::UpdateSpeedLimiterState() } } - const bool is_non_standard_speed = (std::abs(target_speed - 1.0f) > 0.05f); + const bool is_non_standard_speed = IsRunningAtNonStandardSpeed(); const bool audio_sync_enabled = !IsRunning() || (m_throttler_enabled && g_settings.audio_sync_enabled && !is_non_standard_speed); - const bool video_sync_enabled = - !IsRunning() || (m_throttler_enabled && g_settings.video_sync_enabled && !is_non_standard_speed); + const bool video_sync_enabled = ShouldUseVSync(); const float max_display_fps = (!IsRunning() || m_throttler_enabled) ? 0.0f : g_settings.display_max_fps; Log_InfoPrintf("Target speed: %f%%", target_speed * 100.0f); Log_InfoPrintf("Syncing to %s%s", audio_sync_enabled ? "audio" : "", @@ -2241,6 +2240,11 @@ void System::UpdateSpeedLimiterState() } } +bool System::ShouldUseVSync() +{ + return (!IsRunning() || (m_throttler_enabled && g_settings.video_sync_enabled && !IsRunningAtNonStandardSpeed())); +} + bool System::IsFastForwardEnabled() { return m_fast_forward_enabled; diff --git a/src/core/system.h b/src/core/system.h index 0a6d16731..b77f02ff0 100644 --- a/src/core/system.h +++ b/src/core/system.h @@ -400,6 +400,9 @@ void ToggleWidescreen(); /// Returns true if fast forwarding or slow motion is currently active. bool IsRunningAtNonStandardSpeed(); +/// Returns true if vsync should be used. +bool ShouldUseVSync(); + /// Quick switch between software and hardware rendering. void ToggleSoftwareRendering(); diff --git a/src/duckstation-qt/qthost.cpp b/src/duckstation-qt/qthost.cpp index add82a74b..c2eca1595 100644 --- a/src/duckstation-qt/qthost.cpp +++ b/src/duckstation-qt/qthost.cpp @@ -870,12 +870,18 @@ bool EmuThread::acquireHostDisplay(HostDisplay::RenderAPI api) m_is_exclusive_fullscreen = g_host_display->IsFullscreen(); - if (m_run_fullscreen_ui && !FullscreenUI::Initialize()) + if (m_run_fullscreen_ui) { - Log_ErrorPrint("Failed to initialize fullscreen UI"); - releaseHostDisplay(); - m_run_fullscreen_ui = false; - return false; + if (!FullscreenUI::Initialize()) + { + Log_ErrorPrint("Failed to initialize fullscreen UI"); + releaseHostDisplay(); + m_run_fullscreen_ui = false; + return false; + } + + // start with vsync on + g_host_display->SetVSync(true); } return true; diff --git a/src/frontend-common/fullscreen_ui.cpp b/src/frontend-common/fullscreen_ui.cpp index f6feceaea..9eb7d203a 100644 --- a/src/frontend-common/fullscreen_ui.cpp +++ b/src/frontend-common/fullscreen_ui.cpp @@ -166,7 +166,6 @@ static std::string TimeToPrintableString(time_t t); ////////////////////////////////////////////////////////////////////////// // Main ////////////////////////////////////////////////////////////////////////// -static void UpdateForcedVsync(bool should_force); static void PauseForMenuOpen(); static void ClosePauseMenu(); static void OpenPauseSubMenu(PauseSubMenu submenu); @@ -440,10 +439,6 @@ bool FullscreenUI::Initialize() if (!System::IsValid()) SwitchToLanding(); - // force vsync on so we don't run at thousands of fps - // Initialize is called on the GS thread, so we can access the display directly. - UpdateForcedVsync(System::GetState() != System::State::Running); - return true; } @@ -458,13 +453,6 @@ bool FullscreenUI::HasActiveWindow() ImGuiFullscreen::IsChoiceDialogOpen() || ImGuiFullscreen::IsFileSelectorOpen()); } -void FullscreenUI::UpdateForcedVsync(bool should_force) -{ - // force vsync on so we don't run at thousands of fps - // toss it through regardless of the mode, because options can change it - g_host_display->SetVSync((should_force && !g_settings.video_sync_enabled) ? true : false); -} - void FullscreenUI::OnSystemStarted() { if (!IsInitialized()) @@ -479,7 +467,7 @@ void FullscreenUI::OnSystemPaused() if (!IsInitialized()) return; - UpdateForcedVsync(true); + g_host_display->SetVSync(true); } void FullscreenUI::OnSystemResumed() @@ -487,7 +475,7 @@ void FullscreenUI::OnSystemResumed() if (!IsInitialized()) return; - UpdateForcedVsync(false); + g_host_display->SetVSync(System::ShouldUseVSync()); } void FullscreenUI::OnSystemDestroyed() @@ -495,9 +483,9 @@ void FullscreenUI::OnSystemDestroyed() if (!IsInitialized()) return; + g_host_display->SetVSync(true); s_pause_menu_was_open = false; SwitchToLanding(); - UpdateForcedVsync(true); } void FullscreenUI::OnRunningGameChanged()