summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/AsyncShaderCompiler.cpp
diff options
context:
space:
mode:
authorJMC47 <JMC4789@gmail.com>2025-12-22 13:33:25 -0500
committerGitHub <noreply@github.com>2025-12-22 13:33:25 -0500
commit38a89c6365239ebf2637b685c55ba1791842c2d4 (patch)
tree5962753d91599012bd86a1166d29976746de325b /Source/Core/VideoCommon/AsyncShaderCompiler.cpp
parentbc03aa72ac7ad3c2244ad4d43c9d2e4d163165e2 (diff)
parent506e3782891da702725b625c103edc61d4279d71 (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.cpp33
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));
}