VideoCommon: Clean up and eliminate the mutex in AsyncRequests using WaitableSPSCQueue.

This commit is contained in:
Jordan Woyak
2025-10-25 16:40:56 -05:00
parent 3d764f7b42
commit 09a125fec4
2 changed files with 24 additions and 47 deletions

View File

@@ -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;
}