mirror of
https://github.com/yuzu-emu/yuzu.git
synced 2024-11-30 05:34:22 +01:00
dma_pusher: Rework command_headers usage
Uses ScratchBuffer and avoids overwriting the command_headers buffer with the prefetch_command_list
This commit is contained in:
parent
bdef22ff85
commit
61e4f2d931
@ -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{};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user