From 94f54c7bc715b76f0ec8cf1398ac648f68ecb10f Mon Sep 17 00:00:00 2001 From: MaranBr Date: Wed, 27 May 2026 19:09:15 -0400 Subject: [PATCH] Even better --- src/video_core/buffer_cache/buffer_cache.h | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index ebd5643fde..b9692bc2bc 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -1621,11 +1621,11 @@ bool BufferCache

::SynchronizeBuffer(Buffer& buffer, DAddr device_addr, u32 si upload_copies.clear(); u64 total_size_bytes = 0; u64 largest_copy = 0; - const DAddr buffer_start = buffer.cpu_addr_cached; + DAddr buffer_start = buffer.cpu_addr_cached; + bool needs_download = false; memory_tracker.ForEachUploadRange(device_addr, size, [&](u64 device_addr_out, u64 range_size) { - bool gpu_modified = false; - gpu_modified_ranges.ForEachInRange(device_addr_out, range_size, [&](u64, u64) { gpu_modified = true; }); - if (gpu_modified) { + if (IsRegionGpuModified(device_addr_out, range_size)) { + needs_download = true; return; } upload_copies.push_back(BufferCopy{ @@ -1636,10 +1636,14 @@ bool BufferCache

::SynchronizeBuffer(Buffer& buffer, DAddr device_addr, u32 si total_size_bytes += range_size; largest_copy = (std::max)(largest_copy, range_size); }); + if (needs_download) { + DownloadBufferMemory(buffer, device_addr, size); + return false; + } if (total_size_bytes == 0) { return true; } - const std::span copies_span(upload_copies.data(), upload_copies.size()); + std::span copies_span(upload_copies.data(), upload_copies.size()); UploadMemory(buffer, total_size_bytes, largest_copy, copies_span); any_buffer_uploaded = true; return false;