From 15a47d10ae9913bb74a58827e8580f9c4822da32 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sat, 15 Feb 2025 21:53:15 -0800 Subject: [PATCH] buffer_cache: Prevent false image-to-buffer sync. Lowering vertex fetch to formatted buffer surfaced an issue where a CPU modified range may be overwritten with stale GPU modified image data. --- src/video_core/buffer_cache/buffer_cache.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/video_core/buffer_cache/buffer_cache.cpp b/src/video_core/buffer_cache/buffer_cache.cpp index ccb45c095..7eb4ea9e1 100644 --- a/src/video_core/buffer_cache/buffer_cache.cpp +++ b/src/video_core/buffer_cache/buffer_cache.cpp @@ -608,7 +608,11 @@ bool BufferCache::SynchronizeBufferFromImage(Buffer& buffer, VAddr device_addr, return false; } Image& image = texture_cache.GetImage(image_id); - if (False(image.flags & ImageFlagBits::GpuModified)) { + // Only perform sync if image is: + // - GPU modified; otherwise there are no changes to synchronize. + // - Not CPU modified; otherwise we could overwrite CPU changes with stale GPU changes. + if (False(image.flags & ImageFlagBits::GpuModified) || + True(image.flags & ImageFlagBits::CpuDirty)) { return false; } ASSERT_MSG(device_addr == image.info.guest_address,