mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2026-03-23 13:01:42 -04:00
VideoCommon: Clean up and eliminate the mutex in AsyncRequests using WaitableSPSCQueue.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user