From 72caf740182697a8134d1c1ae10927b50b73de71 Mon Sep 17 00:00:00 2001 From: xbzk Date: Tue, 17 Feb 2026 22:49:20 -0300 Subject: [PATCH] dma step ondemand flush --- src/video_core/dma_pusher.cpp | 37 +++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/src/video_core/dma_pusher.cpp b/src/video_core/dma_pusher.cpp index 3844a8e2f9..32017d26f9 100644 --- a/src/video_core/dma_pusher.cpp +++ b/src/video_core/dma_pusher.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -83,12 +83,37 @@ bool DmaPusher::Step() { } if (header.size > 0) { - if (Settings::IsDMALevelDefault() ? (Settings::IsGPULevelMedium() || Settings::IsGPULevelHigh()) : Settings::IsDMALevelSafe()) { - Tegra::Memory::GpuGuestMemoryheaders(memory_manager, dma_state.dma_get, header.size, &command_headers); - ProcessCommands(headers); + if (Settings::getDebugKnobAt(0)) { + const size_t command_bytes = static_cast(header.size) * sizeof(CommandHeader); + + if (memory_manager.IsMemoryDirty(dma_state.dma_get, command_bytes)) { + memory_manager.FlushRegion(dma_state.dma_get, command_bytes); + } + + command_headers.resize_destructive(header.size); + if (Settings::IsDMALevelDefault() + ? (Settings::IsGPULevelMedium() || Settings::IsGPULevelHigh()) + : Settings::IsDMALevelSafe()) { + memory_manager.ReadBlock(dma_state.dma_get, command_headers.data(), command_bytes); + } else { + memory_manager.ReadBlockUnsafe(dma_state.dma_get, command_headers.data(), + command_bytes); + } + ProcessCommands(command_headers); } else { - Tegra::Memory::GpuGuestMemoryheaders(memory_manager, dma_state.dma_get, header.size, &command_headers); - ProcessCommands(headers); + if (Settings::IsDMALevelDefault() + ? (Settings::IsGPULevelMedium() || Settings::IsGPULevelHigh()) + : Settings::IsDMALevelSafe()) { + Tegra::Memory::GpuGuestMemory + headers(memory_manager, dma_state.dma_get, header.size, &command_headers); + ProcessCommands(headers); + } else { + Tegra::Memory::GpuGuestMemory + headers(memory_manager, dma_state.dma_get, header.size, &command_headers); + ProcessCommands(headers); + } } }