diff options
| author | Takoroka <137927095+Takoroka@users.noreply.github.com> | 2026-10-30 15:39:08 -0400 |
|---|---|---|
| committer | Takoroka <137927095+Takoroka@users.noreply.github.com> | 2026-10-30 15:39:21 -0400 |
| commit | bef001c1515a13a9b8e361a5a7d372fc2e01094c (patch) | |
| tree | 094fefa42ab2f13ec6cd4aeaa0de9a9bbceb48fc /src/core/hle | |
| parent | d2ac2275247a9ecb3e1404606f7026c6402533b8 (diff) | |
nx2: read command lists the GPU wrote from the GPU's copy
Mario Kart World runs small command lists (20-byte entries) that its
culling dispatches fill in each frame. Accurate GPU mode reads every
command list through the caches; Fast mode reads guest memory directly
(on the split's front thread too), where those entries were still the
words of an older frame, so the draws behind them were left out: the
trees around the courses vanished in Fast mode only.
The buffer cache now also marks the device pages the GPU writes (shader
stores, copies of GPU-written data) in a bitmap the split's front can
read. A command list on such a page waits for the back to run what was
queued before it and is flushed when its words are still only in host
buffers. In a race that is ~5% of command lists (13,500 a second of
262,000) and ~400 flushes a second.
Diffstat (limited to 'src/core/hle')
| -rw-r--r-- | src/core/hle/service/nvdrv/nvdrv.cpp | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/src/core/hle/service/nvdrv/nvdrv.cpp b/src/core/hle/service/nvdrv/nvdrv.cpp index 2be24e3f57..96ba045bc9 100644 --- a/src/core/hle/service/nvdrv/nvdrv.cpp +++ b/src/core/hle/service/nvdrv/nvdrv.cpp @@ -132,6 +132,7 @@ Module::Module(Core::System& system) // (their table filled up, so the new game's GPU waits never completed) and the Switch 2 flags. Devices::Nx2GpuMemoryRegistry::Get().Reset(); Tegra::Nx2ClearSemaphoreRegions(); + Tegra::Nx2ClearGpuWrittenPages(); Devices::g_nx2_driver = false; Tegra::g_nx2_ampere = false; Core::g_nx2_present_count = 0; |
