mirror of
https://github.com/RPCSX/rpcsx.git
synced 2025-12-06 07:12:14 +01:00
68 lines
1.4 KiB
C++
68 lines
1.4 KiB
C++
#include "stdafx.h"
|
|
#include "RSXDMAWriter.h"
|
|
|
|
#include "util//Thread.h"
|
|
#include <rx/asm.hpp>
|
|
|
|
namespace rsx
|
|
{
|
|
void RSXDMAWriter::update()
|
|
{
|
|
if (m_dispatch_handlers.empty())
|
|
{
|
|
m_job_queue.clear();
|
|
return;
|
|
}
|
|
|
|
while (!m_job_queue.empty())
|
|
{
|
|
const auto job = m_job_queue.front();
|
|
|
|
if (const auto dispatch = m_dispatch_handlers.find(job.dispatch_class);
|
|
dispatch == m_dispatch_handlers.end() || dispatch->second.handler(m_host_context_ptr, &job))
|
|
{
|
|
// No handler registered, or callback consumed the job
|
|
m_job_queue.pop_front();
|
|
continue;
|
|
}
|
|
|
|
// Dispatcher found and rejected the job. Stop, we'll try again later.
|
|
break;
|
|
}
|
|
}
|
|
|
|
void RSXDMAWriter::register_handler(host_dispatch_handler_t handler)
|
|
{
|
|
m_dispatch_handlers[handler.dispatch_class] = handler;
|
|
}
|
|
|
|
void RSXDMAWriter::deregister_handler(int dispatch_class)
|
|
{
|
|
m_dispatch_handlers.erase(dispatch_class);
|
|
}
|
|
|
|
void RSXDMAWriter::enqueue(const host_gpu_write_op_t& request)
|
|
{
|
|
m_job_queue.push_back(request);
|
|
}
|
|
|
|
void RSXDMAWriter::drain_label_queue()
|
|
{
|
|
if (!m_host_context_ptr)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// FIXME: This is a busy wait, consider yield to improve responsiveness on weak devices.
|
|
while (!m_host_context_ptr->in_flight_commands_completed())
|
|
{
|
|
rx::pause();
|
|
|
|
if (thread_ctrl::state() == thread_state::aborting)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
} // namespace rsx
|