From dcad3ec892f02a703eb732c5679125291e7f0033 Mon Sep 17 00:00:00 2001 From: Silent Date: Sun, 10 Nov 2019 21:52:52 +0100 Subject: Allow to interrupt shader precompilation by stopping emulation --- Source/Core/VideoCommon/AsyncShaderCompiler.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'Source/Core/VideoCommon/AsyncShaderCompiler.cpp') diff --git a/Source/Core/VideoCommon/AsyncShaderCompiler.cpp b/Source/Core/VideoCommon/AsyncShaderCompiler.cpp index 7e13168f69..7e6f960d7f 100644 --- a/Source/Core/VideoCommon/AsyncShaderCompiler.cpp +++ b/Source/Core/VideoCommon/AsyncShaderCompiler.cpp @@ -9,6 +9,8 @@ #include "Common/Logging/Log.h" #include "Common/Thread.h" +#include "Core/Core.h" + namespace VideoCommon { AsyncShaderCompiler::AsyncShaderCompiler() @@ -65,17 +67,11 @@ bool AsyncShaderCompiler::HasCompletedWork() return !m_completed_work.empty(); } -void AsyncShaderCompiler::WaitUntilCompletion() -{ - while (HasPendingWork()) - std::this_thread::sleep_for(std::chrono::milliseconds(1)); -} - -void AsyncShaderCompiler::WaitUntilCompletion( +bool AsyncShaderCompiler::WaitUntilCompletion( const std::function& progress_callback) { if (!HasPendingWork()) - return; + return true; // Wait a second before opening a progress dialog. // This way, if the operation completes quickly, we don't annoy the user. @@ -85,11 +81,11 @@ void AsyncShaderCompiler::WaitUntilCompletion( { std::this_thread::sleep_for(std::chrono::milliseconds(CHECK_INTERVAL)); if (!HasPendingWork()) - return; + return true; } // Grab the number of pending items. We use this to work out how many are left. - size_t total_items = 0; + size_t total_items; { // Safe to hold both locks here, since nowhere else does. std::lock_guard pending_guard(m_pending_work_lock); @@ -100,6 +96,9 @@ void AsyncShaderCompiler::WaitUntilCompletion( // Update progress while the compiles complete. for (;;) { + if (Core::GetState() == Core::State::Stopping) + return false; + size_t remaining_items; { std::lock_guard pending_guard(m_pending_work_lock); @@ -111,6 +110,7 @@ void AsyncShaderCompiler::WaitUntilCompletion( progress_callback(total_items - remaining_items, total_items); std::this_thread::sleep_for(CHECK_INTERVAL); } + return true; } bool AsyncShaderCompiler::StartWorkerThreads(u32 num_worker_threads) -- cgit v1.2.3