diff options
| author | Jordan Woyak <jordan.woyak@gmail.com> | 2025-10-25 16:40:56 -0500 |
|---|---|---|
| committer | Jordan Woyak <jordan.woyak@gmail.com> | 2025-10-28 17:22:04 -0500 |
| commit | 09a125fec4ba077006bc0add7a8bfcdc0a572bc9 (patch) | |
| tree | 73c518a81dd485cefb91171e238e370ba930ce96 /Source/Core/VideoCommon/AsyncRequests.cpp | |
| parent | 3d764f7b42b860db834159bb2db12e88abdffbed (diff) | |
VideoCommon: Clean up and eliminate the mutex in AsyncRequests using WaitableSPSCQueue.
Diffstat (limited to 'Source/Core/VideoCommon/AsyncRequests.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/AsyncRequests.cpp | 30 |
1 files changed, 9 insertions, 21 deletions
diff --git a/Source/Core/VideoCommon/AsyncRequests.cpp b/Source/Core/VideoCommon/AsyncRequests.cpp index 6671f93293..7348724e43 100644 --- a/Source/Core/VideoCommon/AsyncRequests.cpp +++ b/Source/Core/VideoCommon/AsyncRequests.cpp @@ -3,8 +3,6 @@ #include "VideoCommon/AsyncRequests.h" -#include <mutex> - #include "Core/System.h" #include "VideoCommon/Fifo.h" @@ -16,33 +14,25 @@ AsyncRequests AsyncRequests::s_singleton; AsyncRequests::AsyncRequests() = default; -void AsyncRequests::PullEventsInternal() +void AsyncRequests::PullEvents() { + if (m_queue.Empty()) + return; + // This is only called if the queue isn't empty. // So just flush the pipeline to get accurate results. g_vertex_manager->Flush(); - std::unique_lock<std::mutex> lock(m_mutex); - m_empty.Set(); - - while (!m_queue.empty()) + while (!m_queue.Empty()) { - Event e = std::move(m_queue.front()); - lock.unlock(); - std::invoke(e); - lock.lock(); - - m_queue.pop(); + std::invoke(std::move(m_queue.Front())); + m_queue.Pop(); } - - m_cond.notify_one(); } void AsyncRequests::QueueEvent(Event&& event) { - m_empty.Clear(); - - m_queue.push(std::move(event)); + m_queue.Push(std::move(event)); auto& system = Core::System::GetInstance(); system.GetFifo().RunGpu(); @@ -50,12 +40,10 @@ void AsyncRequests::QueueEvent(Event&& event) void AsyncRequests::WaitForEmptyQueue() { - std::unique_lock<std::mutex> lock(m_mutex); - m_cond.wait(lock, [this] { return m_queue.empty(); }); + m_queue.WaitForEmpty(); } void AsyncRequests::SetPassthrough(bool enable) { - std::unique_lock<std::mutex> lock(m_mutex); m_passthrough = enable; } |
