From 12a4a81be02c879e0e3419ce4f490dbe45d988be Mon Sep 17 00:00:00 2001 From: MaranBr Date: Sat, 23 May 2026 14:30:19 -0400 Subject: [PATCH 1/2] Conditionally use safe ReadBlock for GPU-modified uploads --- src/video_core/buffer_cache/buffer_cache.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 60e0e8449b..1d0fc3b83e 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -1687,8 +1687,12 @@ void BufferCache

::MappedUploadMemory([[maybe_unused]] Buffer& buffer, for (BufferCopy& copy : copies) { u8* const src_pointer = staging_pointer.data() + copy.src_offset; const DAddr device_addr = buffer.CpuAddr() + copy.dst_offset; - device_memory.ReadBlockUnsafe(device_addr, src_pointer, copy.size); - + const bool needs_safe = memory_tracker.IsRegionGpuModified(device_addr, copy.size); + if (needs_safe) { + device_memory.ReadBlock(device_addr, src_pointer, copy.size); + } else { + device_memory.ReadBlockUnsafe(device_addr, src_pointer, copy.size); + } // Apply the staging offset copy.src_offset += upload_staging.offset; } From 7617cc324a64e3a2cabfcbbf08cfd8a5597037b7 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Sat, 23 May 2026 00:13:07 +0200 Subject: [PATCH 2/2] Another approach --- src/video_core/buffer_cache/buffer_cache.h | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 1d0fc3b83e..5d1ec7cad2 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -1687,12 +1687,10 @@ void BufferCache

::MappedUploadMemory([[maybe_unused]] Buffer& buffer, for (BufferCopy& copy : copies) { u8* const src_pointer = staging_pointer.data() + copy.src_offset; const DAddr device_addr = buffer.CpuAddr() + copy.dst_offset; - const bool needs_safe = memory_tracker.IsRegionGpuModified(device_addr, copy.size); - if (needs_safe) { - device_memory.ReadBlock(device_addr, src_pointer, copy.size); - } else { - device_memory.ReadBlockUnsafe(device_addr, src_pointer, copy.size); + if (IsRegionGpuModified(device_addr, copy.size)) { + DownloadBufferMemory(buffer, device_addr, copy.size); } + device_memory.ReadBlockUnsafe(device_addr, src_pointer, copy.size); // Apply the staging offset copy.src_offset += upload_staging.offset; }