mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-06-16 12:58:33 +02:00
Allow to interrupt shader precompilation by stopping emulation
This commit is contained in:
@ -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<void(size_t, size_t)>& 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<std::mutex> 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<std::mutex> 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)
|
||||
|
Reference in New Issue
Block a user