diff options
author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2020-04-20 08:16:56 +0200 |
---|---|---|
committer | Fernando Sahmkow <fsahmkow27@gmail.com> | 2020-04-23 14:52:55 +0200 |
commit | 3fedcc2f6e001f0ed1fd791de4f9692570359eef (patch) | |
tree | 49109516beab33d825cc653d4e885107304da332 /src/video_core/dma_pusher.cpp | |
parent | Merge pull request #3730 from lioncash/time (diff) | |
download | yuzu-3fedcc2f6e001f0ed1fd791de4f9692570359eef.tar yuzu-3fedcc2f6e001f0ed1fd791de4f9692570359eef.tar.gz yuzu-3fedcc2f6e001f0ed1fd791de4f9692570359eef.tar.bz2 yuzu-3fedcc2f6e001f0ed1fd791de4f9692570359eef.tar.lz yuzu-3fedcc2f6e001f0ed1fd791de4f9692570359eef.tar.xz yuzu-3fedcc2f6e001f0ed1fd791de4f9692570359eef.tar.zst yuzu-3fedcc2f6e001f0ed1fd791de4f9692570359eef.zip |
Diffstat (limited to 'src/video_core/dma_pusher.cpp')
-rw-r--r-- | src/video_core/dma_pusher.cpp | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/src/video_core/dma_pusher.cpp b/src/video_core/dma_pusher.cpp index 324dafdcd..16311f05e 100644 --- a/src/video_core/dma_pusher.cpp +++ b/src/video_core/dma_pusher.cpp @@ -71,16 +71,22 @@ bool DmaPusher::Step() { gpu.MemoryManager().ReadBlockUnsafe(dma_get, command_headers.data(), command_list_header.size * sizeof(u32)); - for (const CommandHeader& command_header : command_headers) { - - // now, see if we're in the middle of a command - if (dma_state.length_pending) { - // Second word of long non-inc methods command - method count - dma_state.length_pending = 0; - dma_state.method_count = command_header.method_count_; - } else if (dma_state.method_count) { + for (std::size_t index = 0; index < command_headers.size();) { + const CommandHeader& command_header = command_headers[index]; + + if (dma_state.method_count) { // Data word of methods command - CallMethod(command_header.argument); + if (dma_state.non_incrementing) { + const u32 max_write = static_cast<u32>( + std::min<std::size_t>(index + dma_state.method_count, command_headers.size()) - + index); + CallMultiMethod(&command_header.argument, max_write); + dma_state.method_count -= max_write; + index += max_write; + continue; + } else { + CallMethod(command_header.argument); + } if (!dma_state.non_incrementing) { dma_state.method++; @@ -120,6 +126,7 @@ bool DmaPusher::Step() { break; } } + index++; } if (!non_main) { @@ -140,4 +147,9 @@ void DmaPusher::CallMethod(u32 argument) const { gpu.CallMethod({dma_state.method, argument, dma_state.subchannel, dma_state.method_count}); } +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); +} + } // namespace Tegra |