|
|
@ -14,6 +14,7 @@ |
|
|
namespace Tegra { |
|
|
namespace Tegra { |
|
|
|
|
|
|
|
|
constexpr u32 MacroRegistersStart = 0xE00; |
|
|
constexpr u32 MacroRegistersStart = 0xE00; |
|
|
|
|
|
constexpr u32 ComputeInline = 0x6D; |
|
|
|
|
|
|
|
|
DmaPusher::DmaPusher(Core::System& system_, GPU& gpu_, MemoryManager& memory_manager_, |
|
|
DmaPusher::DmaPusher(Core::System& system_, GPU& gpu_, MemoryManager& memory_manager_, |
|
|
Control::ChannelState& channel_state_) |
|
|
Control::ChannelState& channel_state_) |
|
|
@ -83,20 +84,35 @@ bool DmaPusher::Step() { |
|
|
dma_state.dma_get, command_list_header.size * sizeof(u32)); |
|
|
dma_state.dma_get, command_list_header.size * sizeof(u32)); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
if (Settings::IsGPULevelHigh() && dma_state.method < MacroRegistersStart) { |
|
|
|
|
|
|
|
|
const auto safe_process = [&] { |
|
|
Core::Memory::GpuGuestMemory<Tegra::CommandHeader, |
|
|
Core::Memory::GpuGuestMemory<Tegra::CommandHeader, |
|
|
Core::Memory::GuestMemoryFlags::SafeRead> |
|
|
Core::Memory::GuestMemoryFlags::SafeRead> |
|
|
headers(memory_manager, dma_state.dma_get, command_list_header.size, |
|
|
headers(memory_manager, dma_state.dma_get, command_list_header.size, |
|
|
&command_headers); |
|
|
&command_headers); |
|
|
ProcessCommands(headers); |
|
|
ProcessCommands(headers); |
|
|
|
|
|
}; |
|
|
|
|
|
const auto unsafe_process = [&] { |
|
|
|
|
|
Core::Memory::GpuGuestMemory<Tegra::CommandHeader, |
|
|
|
|
|
Core::Memory::GuestMemoryFlags::UnsafeRead> |
|
|
|
|
|
headers(memory_manager, dma_state.dma_get, command_list_header.size, |
|
|
|
|
|
&command_headers); |
|
|
|
|
|
ProcessCommands(headers); |
|
|
|
|
|
}; |
|
|
|
|
|
if (Settings::IsGPULevelHigh()) { |
|
|
|
|
|
if (dma_state.method >= MacroRegistersStart) { |
|
|
|
|
|
unsafe_process(); |
|
|
|
|
|
return true; |
|
|
|
|
|
} |
|
|
|
|
|
if (subchannel_type[dma_state.subchannel] == Engines::EngineTypes::KeplerCompute && |
|
|
|
|
|
dma_state.method == ComputeInline) { |
|
|
|
|
|
unsafe_process(); |
|
|
|
|
|
return true; |
|
|
|
|
|
} |
|
|
|
|
|
safe_process(); |
|
|
return true; |
|
|
return true; |
|
|
} |
|
|
} |
|
|
Core::Memory::GpuGuestMemory<Tegra::CommandHeader, |
|
|
|
|
|
Core::Memory::GuestMemoryFlags::UnsafeRead> |
|
|
|
|
|
headers(memory_manager, dma_state.dma_get, command_list_header.size, &command_headers); |
|
|
|
|
|
ProcessCommands(headers); |
|
|
|
|
|
|
|
|
unsafe_process(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return true; |
|
|
return true; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|