From 41a81ab5e3d88b53b634ed765385874728634e9f Mon Sep 17 00:00:00 2001 From: néo Luigi <85024393+neoluigi4123@users.noreply.github.com> Date: Sat, 31 Oct 2026 20:08:24 +0100 Subject: Gpu buffer readback to cpu. Fixing visible glitches such as missing collision on some object, but can extend to more. Assisted-by: Claude Opus 5.5 (debugging & implementation) --- src/video_core/buffer_cache/buffer_cache.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'src/video_core/buffer_cache/buffer_cache.h') diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 42d7ba066d..e90af3214d 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -279,8 +279,10 @@ bool BufferCache
::DMACopy(GPUVAddr src_address, GPUVAddr dest_address, u64 am const DAddr diff = base_address - *cpu_src_address; const DAddr new_base_address = *cpu_dest_address + diff; tmp_intervals.push_back({new_base_address, size}); - if (AsyncBufferDownloads()) { + if (DownloadsAtFence(new_base_address, size)) { uncommitted_gpu_modified_ranges.Add(new_base_address, size); + } else { + ArmReadTraps(new_base_address, size); } }; gpu_modified_ranges.ForEachInRange(*cpu_src_address, amount, mirror); @@ -1603,8 +1605,10 @@ void BufferCache
::MarkWrittenBuffer(BufferId buffer_id, DAddr device_addr, u3 } memory_tracker.MarkRegionAsGpuModified(device_addr, size); gpu_modified_ranges.Add(device_addr, size); - if (AsyncBufferDownloads()) { + if (DownloadsAtFence(device_addr, size)) { uncommitted_gpu_modified_ranges.Add(device_addr, size); + } else { + ArmReadTraps(device_addr, size); } } @@ -2090,6 +2094,8 @@ void BufferCache
::DeleteBuffer(BufferId buffer_id, bool do_not_mark) {
if constexpr (requires { runtime.OnBufferDeleted(slot_buffers[buffer_id]); }) {
runtime.OnBufferDeleted(slot_buffers[buffer_id]);
}
+ read_trapped_ranges.Subtract(slot_buffers[buffer_id].CpuAddr(),
+ slot_buffers[buffer_id].SizeBytes());
bool dirty_index{false};
boost::container::small_vector