diff options
Diffstat (limited to 'src/video_core/dma_pusher.cpp')
-rw-r--r-- | src/video_core/dma_pusher.cpp | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/src/video_core/dma_pusher.cpp b/src/video_core/dma_pusher.cpp index 16311f05e..bdc023d54 100644 --- a/src/video_core/dma_pusher.cpp +++ b/src/video_core/dma_pusher.cpp @@ -27,6 +27,8 @@ void DmaPusher::DispatchCalls() { dma_pushbuffer_subindex = 0; + dma_state.is_last_call = true; + while (system.IsPoweredOn()) { if (!Step()) { break; @@ -82,9 +84,11 @@ bool DmaPusher::Step() { index); CallMultiMethod(&command_header.argument, max_write); dma_state.method_count -= max_write; + dma_state.is_last_call = true; index += max_write; continue; } else { + dma_state.is_last_call = dma_state.method_count <= 1; CallMethod(command_header.argument); } @@ -144,12 +148,22 @@ void DmaPusher::SetState(const CommandHeader& command_header) { } void DmaPusher::CallMethod(u32 argument) const { - gpu.CallMethod({dma_state.method, argument, dma_state.subchannel, dma_state.method_count}); + if (dma_state.method < non_puller_methods) { + gpu.CallMethod({dma_state.method, argument, dma_state.subchannel, dma_state.method_count}); + } else { + subchannels[dma_state.subchannel]->CallMethod(dma_state.method, argument, + dma_state.is_last_call); + } } void DmaPusher::CallMultiMethod(const u32* base_start, u32 num_methods) const { - gpu.CallMultiMethod(dma_state.method, dma_state.subchannel, base_start, num_methods, - dma_state.method_count); + if (dma_state.method < non_puller_methods) { + gpu.CallMultiMethod(dma_state.method, dma_state.subchannel, base_start, num_methods, + dma_state.method_count); + } else { + subchannels[dma_state.subchannel]->CallMultiMethod(dma_state.method, base_start, + num_methods, dma_state.method_count); + } } } // namespace Tegra |