@@ -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