From 30fb249d6396c3b8c9831bec9d6e74505e879770 Mon Sep 17 00:00:00 2001 From: David Date: Tue, 20 Jan 2026 14:31:09 +0100 Subject: [PATCH 1/4] Fix vkCmdBeginRenderPass SYNC-HAZARD-WRITE-AFTER-READ error Add VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT to colorDependency.srcAccessMask and depthDependency.dstAccessMask Add VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT to depthDependency.srcStageMask and depthDependency.dstStageMask --- src/vsg/vk/RenderPass.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/vsg/vk/RenderPass.cpp b/src/vsg/vk/RenderPass.cpp index 40d448ee14..ef2b15615f 100644 --- a/src/vsg/vk/RenderPass.cpp +++ b/src/vsg/vk/RenderPass.cpp @@ -333,7 +333,7 @@ ref_ptr vsg::createRenderPass(Device* device, VkFormat imageFormat, colorDependency.dstSubpass = 0; colorDependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; colorDependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - colorDependency.srcAccessMask = 0; + colorDependency.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; colorDependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; colorDependency.dependencyFlags = 0; @@ -341,10 +341,13 @@ ref_ptr vsg::createRenderPass(Device* device, VkFormat imageFormat, SubpassDependency depthDependency = {}; depthDependency.srcSubpass = VK_SUBPASS_EXTERNAL; depthDependency.dstSubpass = 0; - depthDependency.srcStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; - depthDependency.dstStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + depthDependency.srcStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + depthDependency.dstStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; depthDependency.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; - depthDependency.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + depthDependency.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; depthDependency.dependencyFlags = 0; RenderPass::Dependencies dependencies{colorDependency, depthDependency}; From cb53140182a623efd3456d988c4b041dd659b028 Mon Sep 17 00:00:00 2001 From: David Date: Tue, 20 Jan 2026 14:32:05 +0100 Subject: [PATCH 2/4] =?UTF-8?q?Fix=20vkCmdCopyBuffer=20SYNC-HAZARD-WRITE-A?= =?UTF-8?q?FTER-WRITE=20error=20Added=20a=20per=E2=80=91TransferTask=20fen?= =?UTF-8?q?ce=20to=20serialize=20transfer=20submissions=20so=20back?= =?UTF-8?q?=E2=80=91to=E2=80=91back=20vkCmdCopyBuffer=20writes=20can't=20o?= =?UTF-8?q?verlap=20on=20the=20same=20queue.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/vsg/app/TransferTask.h | 2 ++ src/vsg/app/TransferTask.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/include/vsg/app/TransferTask.h b/include/vsg/app/TransferTask.h index b098bbb0b6..d444939828 100644 --- a/include/vsg/app/TransferTask.h +++ b/include/vsg/app/TransferTask.h @@ -97,6 +97,8 @@ namespace vsg VkDeviceSize dataTotalSize = 0; VkDeviceSize imageTotalSize = 0; + ref_ptr transferCompleteFence; + bool waitOnTransferFence = false; ref_ptr transferCompleteSemaphore; ref_ptr transferConsumerCompletedSemaphore; diff --git a/src/vsg/app/TransferTask.cpp b/src/vsg/app/TransferTask.cpp index cf320b2a59..c7b0d8e540 100644 --- a/src/vsg/app/TransferTask.cpp +++ b/src/vsg/app/TransferTask.cpp @@ -415,7 +415,7 @@ TransferTask::TransferResult TransferTask::_transferData(DataToCopy& dataToCopy) log(level, " totalSize = ", totalSize); auto& frame = *(dataToCopy.frames[dataToCopy.frameIndex]); - auto& fence = frame.fence; + auto& fence = dataToCopy.transferCompleteFence; auto& staging = frame.staging; auto& commandBuffer = frame.transferCommandBuffer; auto& newSignalSemaphore = dataToCopy.transferCompleteSemaphore; @@ -432,13 +432,13 @@ TransferTask::TransferResult TransferTask::_transferData(DataToCopy& dataToCopy) log(level, " newSignalSemaphore = ", newSignalSemaphore, ", ", newSignalSemaphore ? newSignalSemaphore->vk() : VK_NULL_HANDLE); log(level, " copyRegions.size() = ", copyRegions.size()); - if (frame.waitOnFence && fence) + if (dataToCopy.waitOnTransferFence && fence) { uint64_t timeout = std::numeric_limits::max(); if (VkResult result = fence->wait(timeout); result != VK_SUCCESS) return TransferResult{result, {}}; fence->resetFenceAndDependencies(); } - frame.waitOnFence = false; + dataToCopy.waitOnTransferFence = false; // advance frameIndex dataToCopy.frameIndex = (dataToCopy.frameIndex + 1) % dataToCopy.frames.size(); @@ -545,7 +545,7 @@ TransferTask::TransferResult TransferTask::_transferData(DataToCopy& dataToCopy) result = transferQueue->submit(submitInfo, fence); - frame.waitOnFence = true; + dataToCopy.waitOnTransferFence = true; dataToCopy.transferConsumerCompletedSemaphore.reset(); From cf020f418888b9dcf55c42f2f7063f5a1353331c Mon Sep 17 00:00:00 2001 From: David Date: Tue, 20 Jan 2026 15:26:33 +0100 Subject: [PATCH 3/4] Add missing include --- include/vsg/app/TransferTask.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/vsg/app/TransferTask.h b/include/vsg/app/TransferTask.h index d444939828..d783bf60f5 100644 --- a/include/vsg/app/TransferTask.h +++ b/include/vsg/app/TransferTask.h @@ -17,6 +17,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI #include #include #include +#include namespace vsg { From d20979a80e3551f5721600c2478ddf62ab6903b4 Mon Sep 17 00:00:00 2001 From: David Date: Tue, 20 Jan 2026 15:47:45 +0100 Subject: [PATCH 4/4] Fix vkCmdBeginRenderPass SYNC-HAZARD-WRITE-AFTER-WRITE error for multi-sampled window Add VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT to dependency.dstStageMask and dependency2.srcStageMask Add VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT to dependency.dstAccessMask and dependency2.srcAccessMask --- src/vsg/vk/RenderPass.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/vsg/vk/RenderPass.cpp b/src/vsg/vk/RenderPass.cpp index ef2b15615f..7cf0f88fd5 100644 --- a/src/vsg/vk/RenderPass.cpp +++ b/src/vsg/vk/RenderPass.cpp @@ -447,15 +447,19 @@ ref_ptr vsg::createMultisampledRenderPass(Device* device, VkFormat i dependency.dstSubpass = 0; dependency.srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; dependency.srcAccessMask = VK_ACCESS_MEMORY_READ_BIT; - dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; dependency.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; SubpassDependency dependency2 = {}; dependency2.srcSubpass = 0; dependency2.dstSubpass = VK_SUBPASS_EXTERNAL; - dependency2.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - dependency2.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + dependency2.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + dependency2.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; dependency2.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; dependency2.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; dependency2.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;