diff options
| author | JMC47 <JMC4789@gmail.com> | 2025-12-22 13:33:25 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-12-22 13:33:25 -0500 |
| commit | 38a89c6365239ebf2637b685c55ba1791842c2d4 (patch) | |
| tree | 5962753d91599012bd86a1166d29976746de325b /Source/Core/VideoCommon/AsyncShaderCompiler.cpp | |
| parent | bc03aa72ac7ad3c2244ad4d43c9d2e4d163165e2 (diff) | |
| parent | 506e3782891da702725b625c103edc61d4279d71 (diff) | |
Merge pull request #14150 from iwubcode/clear_async_compiler_work_items
VideoCommon: add method to async shader compiler to clear pending/completed work, use on shutdown
Diffstat (limited to 'Source/Core/VideoCommon/AsyncShaderCompiler.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/AsyncShaderCompiler.cpp | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/Source/Core/VideoCommon/AsyncShaderCompiler.cpp b/Source/Core/VideoCommon/AsyncShaderCompiler.cpp index c69354628d..83eaa2e23e 100644 --- a/Source/Core/VideoCommon/AsyncShaderCompiler.cpp +++ b/Source/Core/VideoCommon/AsyncShaderCompiler.cpp @@ -35,7 +35,7 @@ void AsyncShaderCompiler::QueueWorkItem(WorkItemPtr item, u32 priority) } else { - std::lock_guard<std::mutex> guard(m_pending_work_lock); + std::lock_guard guard(m_pending_work_lock); m_pending_work.emplace(priority, std::move(item)); m_worker_thread_wake.notify_one(); } @@ -45,7 +45,7 @@ void AsyncShaderCompiler::RetrieveWorkItems() { std::deque<WorkItemPtr> completed_work; { - std::lock_guard<std::mutex> guard(m_completed_work_lock); + std::lock_guard guard(m_completed_work_lock); m_completed_work.swap(completed_work); } @@ -58,16 +58,29 @@ void AsyncShaderCompiler::RetrieveWorkItems() bool AsyncShaderCompiler::HasPendingWork() { - std::lock_guard<std::mutex> guard(m_pending_work_lock); + std::lock_guard guard(m_pending_work_lock); return !m_pending_work.empty() || m_busy_workers.load() != 0; } bool AsyncShaderCompiler::HasCompletedWork() { - std::lock_guard<std::mutex> guard(m_completed_work_lock); + std::lock_guard guard(m_completed_work_lock); return !m_completed_work.empty(); } +void AsyncShaderCompiler::ClearAllWork() +{ + { + std::lock_guard guard(m_pending_work_lock); + m_pending_work.clear(); + } + + { + std::lock_guard guard(m_completed_work_lock); + m_completed_work.clear(); + } +} + bool AsyncShaderCompiler::WaitUntilCompletion( const std::function<void(size_t, size_t)>& progress_callback) { @@ -89,8 +102,8 @@ bool AsyncShaderCompiler::WaitUntilCompletion( 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); - std::lock_guard<std::mutex> completed_guard(m_completed_work_lock); + std::lock_guard pending_guard(m_pending_work_lock); + std::lock_guard completed_guard(m_completed_work_lock); total_items = m_completed_work.size() + m_pending_work.size() + m_busy_workers.load() + 1; } @@ -99,7 +112,7 @@ bool AsyncShaderCompiler::WaitUntilCompletion( { size_t remaining_items; { - std::lock_guard<std::mutex> pending_guard(m_pending_work_lock); + std::lock_guard pending_guard(m_pending_work_lock); if (m_pending_work.empty() && !m_busy_workers.load()) return true; remaining_items = m_pending_work.size(); @@ -164,7 +177,7 @@ void AsyncShaderCompiler::StopWorkerThreads() // Signal worker threads to stop, and wake all of them. { - std::lock_guard<std::mutex> guard(m_pending_work_lock); + std::lock_guard guard(m_pending_work_lock); m_exit_flag.Set(); m_worker_thread_wake.notify_all(); } @@ -213,7 +226,7 @@ void AsyncShaderCompiler::WorkerThreadEntryPoint(void* param) void AsyncShaderCompiler::WorkerThreadRun() { - std::unique_lock<std::mutex> pending_lock(m_pending_work_lock); + std::unique_lock pending_lock(m_pending_work_lock); while (!m_exit_flag.IsSet()) { m_worker_thread_wake.wait(pending_lock); @@ -228,7 +241,7 @@ void AsyncShaderCompiler::WorkerThreadRun() if (item->Compile()) { - std::lock_guard<std::mutex> completed_guard(m_completed_work_lock); + std::lock_guard completed_guard(m_completed_work_lock); m_completed_work.push_back(std::move(item)); } |
