Skip to content

Commit b8189a6

Browse files
authored
Resolve write-after-read hazard in extensions sample color_write_enable. (#1519)
1 parent bc561a2 commit b8189a6

1 file changed

Lines changed: 24 additions & 14 deletions

File tree

samples/extensions/color_write_enable/color_write_enable.cpp

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -357,9 +357,9 @@ void ColorWriteEnable::setup_render_pass()
357357
subpass_descriptions[1].pInputAttachments = input_references.data();
358358

359359
// Subpass dependencies for layout transitions.
360-
std::array<VkSubpassDependency, 3> dependencies = {};
360+
std::array<VkSubpassDependency, 4> dependencies = {};
361361

362-
// External to color pass.
362+
// External to color pass (for attachments whose first use is subpass 0).
363363
dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL;
364364
dependencies[0].dstSubpass = 0;
365365
dependencies[0].srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
@@ -368,24 +368,34 @@ void ColorWriteEnable::setup_render_pass()
368368
dependencies[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
369369
dependencies[0].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
370370

371-
// Color pass to composition pass.
372-
dependencies[1].srcSubpass = 0;
371+
// External to composition pass (for attachments whose first use is subpass 1).
372+
// This is REQUIRED for the composition image (attachment 0) because its first use is subpass 1.
373+
dependencies[1].srcSubpass = VK_SUBPASS_EXTERNAL;
373374
dependencies[1].dstSubpass = 1;
374-
dependencies[1].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
375-
dependencies[1].dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
376-
dependencies[1].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
377-
dependencies[1].dstAccessMask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
375+
dependencies[1].srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
376+
dependencies[1].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
377+
dependencies[1].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;
378+
dependencies[1].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
378379
dependencies[1].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
379380

380-
// Composition pass to external.
381-
dependencies[2].srcSubpass = 1;
382-
dependencies[2].dstSubpass = VK_SUBPASS_EXTERNAL;
381+
// Color pass to composition pass.
382+
dependencies[2].srcSubpass = 0;
383+
dependencies[2].dstSubpass = 1;
383384
dependencies[2].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
384-
dependencies[2].dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
385-
dependencies[2].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
386-
dependencies[2].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
385+
dependencies[2].dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
386+
dependencies[2].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
387+
dependencies[2].dstAccessMask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
387388
dependencies[2].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
388389

390+
// Composition pass to external.
391+
dependencies[3].srcSubpass = 1;
392+
dependencies[3].dstSubpass = VK_SUBPASS_EXTERNAL;
393+
dependencies[3].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
394+
dependencies[3].dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
395+
dependencies[3].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
396+
dependencies[3].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
397+
dependencies[3].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
398+
389399
// Create render pass.
390400
VkRenderPassCreateInfo render_pass_create_info = {};
391401
render_pass_create_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;

0 commit comments

Comments
 (0)