Hello. If I run Vulkan Configurator in Syncronization mode, I get the error:
ERROR Validation Error: [ SYNC-HAZARD-WRITE-AFTER-WRITE ] Object 0: handle = 0xb097c90000000027, type = VK_OBJECT_TYPE_RENDER_PASS; | MessageID = 0x5c0ec5d6 | vkCmdEndRenderPass: Hazard WRITE_AFTER_WRITE in subpass 2 for attachment 1 color aspect during store with storeOp VK_ATTACHMENT_STORE_OP_STORE. Access info (usage: SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE, prior_usage: SYNC_IMAGE_LAYOUT_TRANSITION, write_barriers: SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ|SYNC_FRAGMENT_SHADER_SHADER_SAMPLED_READ|SYNC_FRAGMENT_SHADER_SHADER_STORAGE_READ|SYNC_FRAGMENT_SHADER_UNIFORM_READ, command: vkCmdNextSubpass, seq_no: 5, subcmd: 1,renderpass: VkRenderPass 0xb097c90000000027, reset_no: 1)
I have 3 subpasses:
0: scene
1: UI
2: Composition subpass. It takes image results from 0 and 1 subpasses.
My render pass creation function:
void Swapchain::createRenderPass()
{
vk::AttachmentDescription mainpassAttachment;
mainpassAttachment.setFormat(_imageFormat)
.setSamples(vk::SampleCountFlagBits::e1)
.setLoadOp(vk::AttachmentLoadOp::eClear)
.setStoreOp(vk::AttachmentStoreOp::eStore)
.setStencilLoadOp(vk::AttachmentLoadOp::eDontCare)
.setStencilStoreOp(vk::AttachmentStoreOp::eDontCare)
.setInitialLayout(vk::ImageLayout::eUndefined)
.setFinalLayout(vk::ImageLayout::eShaderReadOnlyOptimal);
vk::AttachmentReference mainpassAttachmentRef(0, vk::ImageLayout::eColorAttachmentOptimal);
vk::AttachmentDescription overlayAttachment;
overlayAttachment.setFormat(_imageFormat)
.setSamples(vk::SampleCountFlagBits::e1)
.setLoadOp(vk::AttachmentLoadOp::eClear)
.setStoreOp(vk::AttachmentStoreOp::eStore)
.setStencilLoadOp(vk::AttachmentLoadOp::eDontCare)
.setStencilStoreOp(vk::AttachmentStoreOp::eDontCare)
.setInitialLayout(vk::ImageLayout::eUndefined)
.setFinalLayout(vk::ImageLayout::eShaderReadOnlyOptimal);
vk::AttachmentReference overlayAttachmentRef(1, vk::ImageLayout::eColorAttachmentOptimal);
vk::AttachmentDescription colorAttachment;
colorAttachment.setFormat(_imageFormat)
.setSamples(vk::SampleCountFlagBits::e1)
.setLoadOp(vk::AttachmentLoadOp::eClear)
.setStoreOp(vk::AttachmentStoreOp::eStore)
.setStencilLoadOp(vk::AttachmentLoadOp::eDontCare)
.setStencilStoreOp(vk::AttachmentStoreOp::eDontCare)
.setInitialLayout(vk::ImageLayout::eUndefined)
.setFinalLayout(vk::ImageLayout::ePresentSrcKHR);
vk::AttachmentReference colorAttachmentRef(2, vk::ImageLayout::eColorAttachmentOptimal);
vk::AttachmentDescription depthAttachment;
depthAttachment.setFormat(_depthFormat)
.setSamples(vk::SampleCountFlagBits::e1)
.setLoadOp(vk::AttachmentLoadOp::eClear)
.setStoreOp(vk::AttachmentStoreOp::eDontCare)
.setStencilLoadOp(vk::AttachmentLoadOp::eDontCare)
.setStencilStoreOp(vk::AttachmentStoreOp::eDontCare)
.setInitialLayout(vk::ImageLayout::eUndefined)
.setFinalLayout(vk::ImageLayout::eDepthStencilAttachmentOptimal);
vk::AttachmentReference depthAttachmentRef(3, vk::ImageLayout::eDepthStencilAttachmentOptimal);
vk::AttachmentReference unusedAttachmentRef;
unusedAttachmentRef.attachment = vk::AttachmentUnused;
unusedAttachmentRef.layout = vk::ImageLayout::eUndefined;
std::array<vk::SubpassDescription, 3> subpasses;
subpasses[0]
.setPipelineBindPoint(vk::PipelineBindPoint::eGraphics)
.setColorAttachmentCount(1)
.setPColorAttachments(&mainpassAttachmentRef)
.setPDepthStencilAttachment(&depthAttachmentRef);
subpasses[1]
.setPipelineBindPoint(vk::PipelineBindPoint::eGraphics)
.setColorAttachmentCount(1)
.setPColorAttachments(&overlayAttachmentRef)
.setPDepthStencilAttachment(&unusedAttachmentRef);
std::array<vk::AttachmentReference, 2> inputAttachments;
inputAttachments[0] = vk::AttachmentReference(0, vk::ImageLayout::eShaderReadOnlyOptimal);
inputAttachments[1] = vk::AttachmentReference(1, vk::ImageLayout::eShaderReadOnlyOptimal);
subpasses[2]
.setPipelineBindPoint(vk::PipelineBindPoint::eGraphics)
.setInputAttachmentCount(2)
.setPInputAttachments(inputAttachments.data())
.setColorAttachmentCount(1)
.setPColorAttachments(&colorAttachmentRef)
.setPDepthStencilAttachment(&unusedAttachmentRef);
std::array<vk::SubpassDependency, 4> dependencies;
dependencies[0]
.setSrcSubpass(VK_SUBPASS_EXTERNAL)
.setDstSubpass(0)
.setSrcStageMask(vk::PipelineStageFlagBits::eBottomOfPipe)
.setDstStageMask(vk::PipelineStageFlagBits::eColorAttachmentOutput |
vk::PipelineStageFlagBits::eEarlyFragmentTests)
.setSrcAccessMask(vk::AccessFlagBits::eMemoryRead)
.setDstAccessMask(vk::AccessFlagBits::eColorAttachmentRead | vk::AccessFlagBits::eShaderRead |
vk::AccessFlagBits::eColorAttachmentWrite | vk::AccessFlagBits::eDepthStencilAttachmentWrite)
.setDependencyFlags(vk::DependencyFlagBits::eByRegion);
dependencies[1]
.setSrcSubpass(0)
.setDstSubpass(1)
.setSrcStageMask(vk::PipelineStageFlagBits::eBottomOfPipe)
.setDstStageMask(vk::PipelineStageFlagBits::eColorAttachmentOutput)
.setSrcAccessMask(vk::AccessFlagBits::eMemoryRead)
.setDstAccessMask(vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eInputAttachmentRead |
vk::AccessFlagBits::eColorAttachmentWrite)
.setDependencyFlags(vk::DependencyFlagBits::eByRegion);
dependencies[2]
.setSrcSubpass(1)
.setDstSubpass(2)
.setSrcStageMask(vk::PipelineStageFlagBits::eColorAttachmentOutput)
.setDstStageMask(vk::PipelineStageFlagBits::eFragmentShader)
.setSrcAccessMask(vk::AccessFlagBits::eColorAttachmentWrite)
.setDstAccessMask(vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eInputAttachmentRead)
.setDependencyFlags(vk::DependencyFlagBits::eByRegion);
dependencies[3]
.setSrcSubpass(2)
.setDstSubpass(VK_SUBPASS_EXTERNAL)
.setSrcStageMask(vk::PipelineStageFlagBits::eColorAttachmentOutput)
.setDstStageMask(vk::PipelineStageFlagBits::eBottomOfPipe)
.setSrcAccessMask(vk::AccessFlagBits::eColorAttachmentRead | vk::AccessFlagBits::eColorAttachmentWrite)
.setDstAccessMask(vk::AccessFlagBits::eMemoryRead);
std::array<vk::AttachmentDescription, 4> attachments = {mainpassAttachment, overlayAttachment, colorAttachment,
depthAttachment};
vk::RenderPassCreateInfo renderPassInfo;
renderPassInfo.setAttachmentCount(static_cast<u32>(attachments.size()))
.setPAttachments(attachments.data())
.setSubpassCount(3)
.setPSubpasses(subpasses.data())
.setDependencyCount(dependencies.size())
.setPDependencies(dependencies.data());
if (_device.vkDevice().createRenderPass(&renderPassInfo, nullptr, &_renderPass, _device.vkLoader()) !=
vk::Result::eSuccess)
throw std::runtime_error("Failed to create render pass");
}
I tried to experiment with different masks in dependencies, but I still get the error. How can I solve this issue? Which dependency parameters should I use?
UPD: I cloned Sasha Williams examples, and Iâve faced the same errors when I try to launch ./build/bin/inputattachments.exe:
UNASSIGNED-CreateInstance-status-message(INFO / SPEC): msgNum: -2016116905 - Validation Information: [ UNASSIGNED-CreateInstance-status-message ] Object 0: handle = 0x1e4330c4bc0, type = VK_OBJECT_TYPE_INSTANCE; | MessageID = 0x87d47f57 | Khronos Validation Layer Active:
Settings File: Found at C:\Users\alekesej\AppData\Local\LunarG\vkconfig\override\vk_layer_settings.txt specified by VkConfig application override.
Current Enables: VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION, VALIDATION_CHECK_ENABLE_SYNCHRONIZATION_VALIDATION_QUEUE_SUBMIT.
Current Disables: None.
Objects: 1
[0] 0x1e4330c4bc0, type: 1, name: NULL
SYNC-HAZARD-WRITE-AFTER-WRITE(ERROR / SPEC): msgNum: 1544472022 - Validation Error: [ SYNC-HAZARD-WRITE-AFTER-WRITE ] Object 0: handle = 0x3a6cbb0000000025, type = VK_OBJECT_TYPE_RENDER_PASS; | MessageID = 0x5c0ec5d6 | vkCmdNextSubpass: Hazard WRITE_AFTER_WRITE in subpass 1 for attachment 2 image layout transition (old_layout: VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, new_layout: VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL). Access info (usage: SYNC_IMAGE_LAYOUT_TRANSITION, prior_usage: SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE, write_barriers: 0, command: vkCmdDrawIndexed, seq_no: 87, reset_no: 1).
Objects: 1
[0] 0x3a6cbb0000000025, type: 18, name: NULL
SYNC-HAZARD-READ-AFTER-WRITE(ERROR / SPEC): msgNum: -455515022 - Validation Error: [ SYNC-HAZARD-READ-AFTER-WRITE ] Object 0: handle = 0xd10d270000000018, type = VK_OBJECT_TYPE_IMAGE_VIEW; | MessageID = 0xe4d96472 | vkCmdDraw: Hazard READ_AFTER_WRITE for VkImageView 0xd10d270000000018[], in VkCommandBuffer 0x1e43f5264f0[], and VkPipeline 0xd84b930000000126[], VkDescriptorSet 0x32749b000000011e[], type: VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, imageLayout: VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, binding #1, index 0. Access info (usage: SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ, prior_usage: SYNC_IMAGE_LAYOUT_TRANSITION, write_barriers: SYNC_FRAGMENT_SHADER_SHADER_SAMPLED_READ|SYNC_FRAGMENT_SHADER_SHADER_STORAGE_READ|SYNC_FRAGMENT_SHADER_UNIFORM_READ, command: vkCmdNextSubpass, seq_no: 88, subcmd: 1,renderpass: VkRenderPass 0x3a6cbb0000000025[], reset_no: 1).
Objects: 1
[0] 0xd10d270000000018, type: 14, name: NULL