From dda2e71bd0134b226709fe59c2ebe62337a62b60 Mon Sep 17 00:00:00 2001 From: IndecisiveTurtle <47210458+raphaelthegreat@users.noreply.github.com> Date: Sun, 23 Mar 2025 01:53:43 +0200 Subject: [PATCH] buffer_cache: Fix CopyBuffers bug --- src/video_core/buffer_cache/buffer_cache.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/video_core/buffer_cache/buffer_cache.cpp b/src/video_core/buffer_cache/buffer_cache.cpp index a53b8004b..69a6363b7 100644 --- a/src/video_core/buffer_cache/buffer_cache.cpp +++ b/src/video_core/buffer_cache/buffer_cache.cpp @@ -288,13 +288,17 @@ void BufferCache::CopyBuffer(VAddr dst, VAddr src, u32 num_bytes, bool dst_gds, if (src_gds) { return gds_buffer; } - const auto [buffer, offset] = ObtainBuffer(src, num_bytes, false); - return *buffer; + // Avoid using ObtainBuffer here as that might give us the stream buffer. + const BufferId buffer_id = FindBuffer(src, num_bytes); + auto& buffer = slot_buffers[buffer_id]; + SynchronizeBuffer(buffer, src, num_bytes, false); + return buffer; }(); auto& dst_buffer = [&] -> const Buffer& { if (dst_gds) { return gds_buffer; } + // Prefer using ObtainBuffer here as that will auto-mark the region as GPU modified. const auto [buffer, offset] = ObtainBuffer(dst, num_bytes, true); return *buffer; }();