From dc6d6b91d4e596c523cbe2671f955ff69067b8c6 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Fri, 14 Feb 2025 18:59:39 +1000 Subject: [PATCH] PostProcessing: Fix abort on slow compile in big picture --- src/core/fullscreen_ui.cpp | 7 +++++++ src/core/fullscreen_ui.h | 2 ++ src/util/postprocessing.cpp | 14 ++++++++++++-- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/core/fullscreen_ui.cpp b/src/core/fullscreen_ui.cpp index 066e7446a..bfc658d97 100644 --- a/src/core/fullscreen_ui.cpp +++ b/src/core/fullscreen_ui.cpp @@ -8513,6 +8513,11 @@ LoadingScreenProgressCallback::LoadingScreenProgressCallback() } LoadingScreenProgressCallback::~LoadingScreenProgressCallback() +{ + Close(); +} + +void LoadingScreenProgressCallback::Close() { // Did we activate? if (m_last_progress_percent < 0) @@ -8531,6 +8536,8 @@ LoadingScreenProgressCallback::~LoadingScreenProgressCallback() // since this was pushing frames, we need to restore the context. do that by pushing a frame ourselves GPUThread::Internal::PresentFrameAndRestoreContext(); } + + m_last_progress_percent = -1; } void LoadingScreenProgressCallback::PushState() diff --git a/src/core/fullscreen_ui.h b/src/core/fullscreen_ui.h index f76c04a85..3f505f265 100644 --- a/src/core/fullscreen_ui.h +++ b/src/core/fullscreen_ui.h @@ -60,6 +60,8 @@ public: ALWAYS_INLINE void SetOpenDelay(float delay) { m_open_delay = delay; } + void Close(); + void PushState() override; void PopState() override; diff --git a/src/util/postprocessing.cpp b/src/util/postprocessing.cpp index 08cab71f0..d24473aa3 100644 --- a/src/util/postprocessing.cpp +++ b/src/util/postprocessing.cpp @@ -432,11 +432,11 @@ void PostProcessing::Chain::LoadStages(std::unique_lock& settings_lo return; } + progress.IncrementProgressValue(); + settings_lock.lock(); shader->LoadOptions(si, GetStageConfigSection(m_section, i)); m_stages.push_back(std::move(shader)); - - progress.IncrementProgressValue(); } if (stage_count > 0) @@ -455,6 +455,11 @@ void PostProcessing::Chain::LoadStages(std::unique_lock& settings_lo m_needs_depth_buffer = m_enabled && m_wants_depth_buffer; if (m_wants_depth_buffer) DEV_LOG("Depth buffer is needed."); + + // can't close/redraw with settings lock held because big picture + settings_lock.unlock(); + progress.Close(); + settings_lock.lock(); } void PostProcessing::Chain::UpdateSettings(std::unique_lock& settings_lock, const SettingsInterface& si) @@ -531,6 +536,11 @@ void PostProcessing::Chain::UpdateSettings(std::unique_lock& setting m_needs_depth_buffer = m_enabled && m_wants_depth_buffer; if (m_wants_depth_buffer) DEV_LOG("Depth buffer is needed."); + + // can't close/redraw with settings lock held because big picture + settings_lock.unlock(); + progress.Close(); + settings_lock.lock(); } void PostProcessing::Chain::Toggle()