From 3fbf0d871c94e3a9edee33393535b08bc679c4d0 Mon Sep 17 00:00:00 2001 From: Jeremy Gebben Date: Mon, 31 Aug 2026 13:16:47 -0600 Subject: [PATCH] Add missing pipeline barrier in Apply_InitialState() The commands to initialize srcBuf must complete before it is copied. Sync validation reports this as a READ_AFTER_WRITE hazard. This also fixes a VK_Image_Layouts test failure when running with KosmicKrisp. --- renderdoc/driver/vulkan/vk_initstate.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/renderdoc/driver/vulkan/vk_initstate.cpp b/renderdoc/driver/vulkan/vk_initstate.cpp index b6ec3be83..d33e9fb10 100644 --- a/renderdoc/driver/vulkan/vk_initstate.cpp +++ b/renderdoc/driver/vulkan/vk_initstate.cpp @@ -2084,6 +2084,22 @@ void WrappedVulkan::Apply_InitialState(WrappedVkRes *res, VkInitialContents &ini } else { + // srcBuf was initilized with a vkCmdCopyBuffer() or vkCmdFillBuffer() earlier + // in this command buffer. Add a barrier to make sure that command finishes + // before this copy. + VkBufferMemoryBarrier srcBufBarrier = { + VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, + NULL, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_ACCESS_TRANSFER_READ_BIT, + VK_QUEUE_FAMILY_IGNORED, + VK_QUEUE_FAMILY_IGNORED, + Unwrap(srcBuf), + 0, + VK_WHOLE_SIZE, + }; + DoPipelineBarrier(cmd, 1, &srcBufBarrier); + VkBufferCopy bufCopy; bufCopy.srcOffset = boundMemoryOffset; bufCopy.size = boundMemorySize;