|
|
|
@ -17,12 +17,16 @@ Scheduler::Scheduler(GPU& gpu_) : gpu{gpu_} {} |
|
|
|
Scheduler::~Scheduler() = default; |
|
|
|
|
|
|
|
void Scheduler::Push(s32 channel, CommandList&& entries) { |
|
|
|
std::unique_lock lk(scheduling_guard); |
|
|
|
auto it = channels.find(channel); |
|
|
|
ASSERT(it != channels.end()); |
|
|
|
auto& channel_state = it->second; |
|
|
|
gpu.BindChannel(channel_state->bind_id); |
|
|
|
lk.unlock(); |
|
|
|
std::shared_ptr<ChannelState> channel_state; |
|
|
|
{ |
|
|
|
std::unique_lock lk(scheduling_guard); |
|
|
|
auto it = channels.find(channel); |
|
|
|
ASSERT(it != channels.end()); |
|
|
|
channel_state = it->second; |
|
|
|
gpu.BindChannel(channel_state->bind_id); |
|
|
|
} |
|
|
|
// Process commands outside the lock to reduce contention.
|
|
|
|
// Multiple channels can prepare their commands in parallel.
|
|
|
|
channel_state->dma_pusher->Push(std::move(entries)); |
|
|
|
channel_state->dma_pusher->DispatchCalls(); |
|
|
|
} |
|
|
|
|