Skip to content

Commit 593d488

Browse files
authored
Resolve WRITE_AFTER_WRITE hazard in extensions sample debug_utils (#1539)
1 parent 8af932b commit 593d488

1 file changed

Lines changed: 20 additions & 8 deletions

File tree

samples/extensions/debug_utils/debug_utils.cpp

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,11 @@ void DebugUtils::build_command_buffers()
470470
vkCmdEndRenderPass(draw_cmd_buffers[i]);
471471

472472
cmd_end_label(draw_cmd_buffers[i]);
473-
cmd_end_label(draw_cmd_buffers[i]);
473+
474+
if (bloom)
475+
{
476+
cmd_end_label(draw_cmd_buffers[i]);
477+
}
474478
}
475479

476480
VK_CHECK(vkEndCommandBuffer(draw_cmd_buffers[i]));
@@ -595,27 +599,35 @@ void DebugUtils::prepare_offscreen_buffer()
595599
// Use subpass dependencies for attachment layout transitions
596600
std::array<VkSubpassDependency, 2> dependencies{};
597601

602+
// vkCmdBeginRenderPass clears the color aspect of attachment 0 (offscreen.color[0]) and 1 (offscreen.color[1]) in subpass 0 of VkRenderPass offscreen.render_pass
603+
// (loadOp VK_ATTACHMENT_LOAD_OP_CLEAR), which was previously written during an image layout transition initiated by the same command.
604+
// For correct synchronization, the dependency from external to subpass 0 must allow VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT access at VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT.
598605
dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL;
599606
dependencies[0].dstSubpass = 0;
600607
dependencies[0].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
601608
dependencies[0].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
602609
dependencies[0].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
603-
dependencies[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
610+
dependencies[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
604611

605-
dependencies[1].srcSubpass = 0;
606-
dependencies[1].dstSubpass = VK_SUBPASS_EXTERNAL;
612+
// vkCmdBeginRenderPass clears the depth aspect of attachment 2 (offscreen.depth) in subpass 0 of VkRenderPass offscreen.render_pass (loadOp VK_ATTACHMENT_LOAD_OP_CLEAR),
613+
// which was previously written during an image layout transition initiated by the same command.
614+
// For correct synchronization, the dependency from external to subpass 0 must also allow VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT access at VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT.
615+
dependencies[1].srcSubpass = VK_SUBPASS_EXTERNAL;
616+
dependencies[1].dstSubpass = 0;
607617
dependencies[1].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
608-
dependencies[1].dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
609-
dependencies[1].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
610-
dependencies[1].dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
618+
dependencies[1].dstStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;
619+
dependencies[1].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
620+
dependencies[1].dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
621+
622+
// No need for a dependency from subpass 0 to external
611623

612624
VkRenderPassCreateInfo render_pass_create_info = {};
613625
render_pass_create_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
614626
render_pass_create_info.pAttachments = attachment_descriptions.data();
615627
render_pass_create_info.attachmentCount = static_cast<uint32_t>(attachment_descriptions.size());
616628
render_pass_create_info.subpassCount = 1;
617629
render_pass_create_info.pSubpasses = &subpass;
618-
render_pass_create_info.dependencyCount = 2;
630+
render_pass_create_info.dependencyCount = static_cast<uint32_t>(dependencies.size());
619631
render_pass_create_info.pDependencies = dependencies.data();
620632

621633
VK_CHECK(vkCreateRenderPass(get_device().get_handle(), &render_pass_create_info, nullptr, &offscreen.render_pass));

0 commit comments

Comments
 (0)