Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 955592b

Browse files
committed
Fix potential synchronization problem with depth buffer transition and load operation
1 parent 274e8ad commit 955592b

5 files changed

Lines changed: 21 additions & 13 deletions

File tree

code/26_depth_buffering.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -568,10 +568,10 @@ class HelloTriangleApplication {
568568
VkSubpassDependency dependency{};
569569
dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
570570
dependency.dstSubpass = 0;
571-
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
571+
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;
572572
dependency.srcAccessMask = 0;
573-
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
574-
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
573+
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;
574+
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
575575

576576
std::array<VkAttachmentDescription, 2> attachments = {colorAttachment, depthAttachment};
577577
VkRenderPassCreateInfo renderPassInfo{};

code/27_model_loading.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -575,10 +575,10 @@ class HelloTriangleApplication {
575575
VkSubpassDependency dependency{};
576576
dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
577577
dependency.dstSubpass = 0;
578-
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
578+
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;
579579
dependency.srcAccessMask = 0;
580-
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
581-
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
580+
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;
581+
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
582582

583583
std::array<VkAttachmentDescription, 2> attachments = {colorAttachment, depthAttachment};
584584
VkRenderPassCreateInfo renderPassInfo{};

code/28_mipmapping.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -576,10 +576,10 @@ class HelloTriangleApplication {
576576
VkSubpassDependency dependency{};
577577
dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
578578
dependency.dstSubpass = 0;
579-
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
579+
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;
580580
dependency.srcAccessMask = 0;
581-
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
582-
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
581+
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;
582+
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
583583

584584
std::array<VkAttachmentDescription, 2> attachments = {colorAttachment, depthAttachment};
585585
VkRenderPassCreateInfo renderPassInfo{};

code/29_multisampling.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -603,10 +603,10 @@ class HelloTriangleApplication {
603603
VkSubpassDependency dependency{};
604604
dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
605605
dependency.dstSubpass = 0;
606-
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
606+
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;
607607
dependency.srcAccessMask = 0;
608-
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
609-
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
608+
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;
609+
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
610610

611611
std::array<VkAttachmentDescription, 3> attachments = {colorAttachment, depthAttachment, colorAttachmentResolve };
612612
VkRenderPassCreateInfo renderPassInfo{};

en/07_Depth_buffering.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,9 +421,17 @@ renderPassInfo.dependencyCount = 1;
421421
renderPassInfo.pDependencies = &dependency;
422422
```
423423
424-
Finally, update the `VkRenderPassCreateInfo` struct to refer to both
424+
Next, update the `VkRenderPassCreateInfo` struct to refer to both
425425
attachments.
426426
427+
```c++
428+
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;
429+
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;
430+
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
431+
```
432+
433+
Finally, we need to extend our subpass dependencies to make sure that there is no conflict between the transitioning of the depth image and it being cleared as part of its load operation. The depth image is first accessed in the early fragment test pipeline stage and because we have a load operation that *clears*, we should specify the access mask for writes.
434+
427435
## Framebuffer
428436

429437
The next step is to modify the framebuffer creation to bind the depth image to

0 commit comments

Comments
 (0)