dma_pusher: Rework command_headers usage

Uses ScratchBuffer and avoids overwriting the command_headers buffer with the prefetch_command_list
master
ameerj 2022-12-07 00:45:06 +07:00
parent bdef22ff85
commit 61e4f2d931
2 changed files with 16 additions and 9 deletions

@ -56,7 +56,7 @@ bool DmaPusher::Step() {
if (command_list.prefetch_command_list.size()) { if (command_list.prefetch_command_list.size()) {
// Prefetched command list from nvdrv, used for things like synchronization // Prefetched command list from nvdrv, used for things like synchronization
command_headers = std::move(command_list.prefetch_command_list); ProcessCommands(command_list.prefetch_command_list);
dma_pushbuffer.pop(); dma_pushbuffer.pop();
} else { } else {
const CommandListHeader command_list_header{ const CommandListHeader command_list_header{
@ -82,16 +82,21 @@ bool DmaPusher::Step() {
memory_manager.ReadBlockUnsafe(dma_get, command_headers.data(), memory_manager.ReadBlockUnsafe(dma_get, command_headers.data(),
command_list_header.size * sizeof(u32)); command_list_header.size * sizeof(u32));
} }
ProcessCommands(command_headers);
} }
for (std::size_t index = 0; index < command_headers.size();) {
const CommandHeader& command_header = command_headers[index]; return true;
}
void DmaPusher::ProcessCommands(std::span<const CommandHeader> commands) {
for (std::size_t index = 0; index < commands.size();) {
const CommandHeader& command_header = commands[index];
if (dma_state.method_count) { if (dma_state.method_count) {
// Data word of methods command // Data word of methods command
if (dma_state.non_incrementing) { if (dma_state.non_incrementing) {
const u32 max_write = static_cast<u32>( const u32 max_write = static_cast<u32>(
std::min<std::size_t>(index + dma_state.method_count, command_headers.size()) - std::min<std::size_t>(index + dma_state.method_count, commands.size()) - 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; dma_state.is_last_call = true;
@ -142,8 +147,6 @@ bool DmaPusher::Step() {
} }
index++; index++;
} }
return true;
} }
void DmaPusher::SetState(const CommandHeader& command_header) { void DmaPusher::SetState(const CommandHeader& command_header) {

@ -4,11 +4,13 @@
#pragma once #pragma once
#include <array> #include <array>
#include <span>
#include <vector> #include <vector>
#include <queue> #include <queue>
#include "common/bit_field.h" #include "common/bit_field.h"
#include "common/common_types.h" #include "common/common_types.h"
#include "common/scratch_buffer.h"
#include "video_core/engines/engine_interface.h" #include "video_core/engines/engine_interface.h"
#include "video_core/engines/puller.h" #include "video_core/engines/puller.h"
@ -136,13 +138,15 @@ private:
static constexpr u32 non_puller_methods = 0x40; static constexpr u32 non_puller_methods = 0x40;
static constexpr u32 max_subchannels = 8; static constexpr u32 max_subchannels = 8;
bool Step(); bool Step();
void ProcessCommands(std::span<const CommandHeader> commands);
void SetState(const CommandHeader& command_header); void SetState(const CommandHeader& command_header);
void CallMethod(u32 argument) const; void CallMethod(u32 argument) const;
void CallMultiMethod(const u32* base_start, u32 num_methods) const; void CallMultiMethod(const u32* base_start, u32 num_methods) const;
std::vector<CommandHeader> command_headers; ///< Buffer for list of commands fetched at once Common::ScratchBuffer<CommandHeader>
command_headers; ///< Buffer for list of commands fetched at once
std::queue<CommandList> dma_pushbuffer; ///< Queue of command lists to be processed std::queue<CommandList> dma_pushbuffer; ///< Queue of command lists to be processed
std::size_t dma_pushbuffer_subindex{}; ///< Index within a command list within the pushbuffer std::size_t dma_pushbuffer_subindex{}; ///< Index within a command list within the pushbuffer
@ -159,7 +163,7 @@ private:
DmaState dma_state{}; DmaState dma_state{};
bool dma_increment_once{}; bool dma_increment_once{};
bool ib_enable{true}; ///< IB mode enabled const bool ib_enable{true}; ///< IB mode enabled
std::array<Engines::EngineInterface*, max_subchannels> subchannels{}; std::array<Engines::EngineInterface*, max_subchannels> subchannels{};