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