From 7c255bd58d8d5841a42d4d3a8016e41e27346ca7 Mon Sep 17 00:00:00 2001 From: TJnotJT Date: Thu, 14 May 2026 18:46:05 -0400 Subject: [PATCH] GS/VK: Fix for broken feedback transitions on Windows RDNA2. Co-authored-by: TheLastRar --- pcsx2/GS/Renderers/Vulkan/GSTextureVK.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pcsx2/GS/Renderers/Vulkan/GSTextureVK.cpp b/pcsx2/GS/Renderers/Vulkan/GSTextureVK.cpp index 23c2e7d3b0..4b859a2b66 100644 --- a/pcsx2/GS/Renderers/Vulkan/GSTextureVK.cpp +++ b/pcsx2/GS/Renderers/Vulkan/GSTextureVK.cpp @@ -609,6 +609,20 @@ void GSTextureVK::TransitionToLayout(VkCommandBuffer command_buffer, Layout new_ void GSTextureVK::TransitionSubresourcesToLayout( VkCommandBuffer command_buffer, int start_level, int num_levels, Layout old_layout, Layout new_layout) { + // Windows RDNA2 drivers don't always correctly transition the layout(?) when ROV is involved. + // ReadWriteImage -> Feedback transitions are broken. + // ReadWriteImage -> Read only layout -> Feedback transitions are broken. + // ReadWriteImage -> General layout -> Feedback transitions are broken. + // ReadWriteImage -> Write only layout -> Feedback transitions works fine. + // Not every broken transition gives broken rendering, the Shadow of the colossus eagle dump is fine after the 1st frame. + // Transition to a write only layout using an extra barrier, then to feedback fixes this issue. + if (old_layout == Layout::ReadWriteImage && new_layout != Layout::ColorAttachment && new_layout != Layout::ReadWriteImage) + { + GL_INS("VK: Doing extra transition for broken RDNA2 feedback transitions"); + TransitionSubresourcesToLayout(command_buffer, 0, num_levels, old_layout, Layout::ColorAttachment); + old_layout = Layout::ColorAttachment; + } + VkImageAspectFlags aspect; if (IsDepthStencil()) {