|
|
@ -27,6 +27,8 @@ void DmaPusher::DispatchCalls() { |
|
|
|
|
|
|
|
|
dma_pushbuffer_subindex = 0; |
|
|
dma_pushbuffer_subindex = 0; |
|
|
|
|
|
|
|
|
|
|
|
dma_state.is_last_call = true; |
|
|
|
|
|
|
|
|
while (system.IsPoweredOn()) { |
|
|
while (system.IsPoweredOn()) { |
|
|
if (!Step()) { |
|
|
if (!Step()) { |
|
|
break; |
|
|
break; |
|
|
@ -82,9 +84,11 @@ bool DmaPusher::Step() { |
|
|
index); |
|
|
index); |
|
|
CallMultiMethod(&command_header.argument, max_write); |
|
|
CallMultiMethod(&command_header.argument, max_write); |
|
|
dma_state.method_count -= max_write; |
|
|
dma_state.method_count -= max_write; |
|
|
|
|
|
dma_state.is_last_call = true; |
|
|
index += max_write; |
|
|
index += max_write; |
|
|
continue; |
|
|
continue; |
|
|
} else { |
|
|
} else { |
|
|
|
|
|
dma_state.is_last_call = dma_state.method_count <= 1; |
|
|
CallMethod(command_header.argument); |
|
|
CallMethod(command_header.argument); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -144,12 +148,22 @@ void DmaPusher::SetState(const CommandHeader& command_header) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void DmaPusher::CallMethod(u32 argument) const { |
|
|
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 { |
|
|
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
|
|
|
} // namespace Tegra
|