Skip to content

Commit b173003

Browse files
committed
Fix sync issues for color and depth attachments
Except for chapter 33, which doesn't seem to be easil fixable
1 parent 39a26a3 commit b173003

File tree

9 files changed

+212
-305
lines changed

9 files changed

+212
-305
lines changed

attachments/27_depth_buffering.cpp

Lines changed: 24 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -855,39 +855,26 @@ class HelloTriangleApplication {
855855
commandBuffers[currentFrame].begin({});
856856
// Before starting rendering, transition the swapchain image to COLOR_ATTACHMENT_OPTIMAL
857857
transition_image_layout(
858-
imageIndex,
858+
swapChainImages[imageIndex],
859859
vk::ImageLayout::eUndefined,
860860
vk::ImageLayout::eColorAttachmentOptimal,
861861
{}, // srcAccessMask (no need to wait for previous operations)
862862
vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask
863863
vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage
864-
vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage
864+
vk::PipelineStageFlagBits2::eColorAttachmentOutput, // dstStage
865+
vk::ImageAspectFlagBits::eColor
865866
);
866867
// Transition depth image to depth attachment optimal layout
867-
vk::ImageMemoryBarrier2 depthBarrier = {
868-
.srcStageMask = vk::PipelineStageFlagBits2::eTopOfPipe,
869-
.srcAccessMask = {},
870-
.dstStageMask = vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests,
871-
.dstAccessMask = vk::AccessFlagBits2::eDepthStencilAttachmentRead | vk::AccessFlagBits2::eDepthStencilAttachmentWrite,
872-
.oldLayout = vk::ImageLayout::eUndefined,
873-
.newLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal,
874-
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
875-
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
876-
.image = depthImage,
877-
.subresourceRange = {
878-
.aspectMask = vk::ImageAspectFlagBits::eDepth,
879-
.baseMipLevel = 0,
880-
.levelCount = 1,
881-
.baseArrayLayer = 0,
882-
.layerCount = 1
883-
}
884-
};
885-
vk::DependencyInfo depthDependencyInfo = {
886-
.dependencyFlags = {},
887-
.imageMemoryBarrierCount = 1,
888-
.pImageMemoryBarriers = &depthBarrier
889-
};
890-
commandBuffers[currentFrame].pipelineBarrier2(depthDependencyInfo);
868+
transition_image_layout(
869+
depthImage,
870+
vk::ImageLayout::eUndefined,
871+
vk::ImageLayout::eDepthAttachmentOptimal,
872+
vk::AccessFlagBits2::eDepthStencilAttachmentWrite,
873+
vk::AccessFlagBits2::eDepthStencilAttachmentWrite,
874+
vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests,
875+
vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests,
876+
vk::ImageAspectFlagBits::eDepth
877+
);
891878

892879
vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f);
893880
vk::ClearValue clearDepth = vk::ClearDepthStencilValue(1.0f, 0);
@@ -902,7 +889,7 @@ class HelloTriangleApplication {
902889

903890
vk::RenderingAttachmentInfo depthAttachmentInfo = {
904891
.imageView = depthImageView,
905-
.imageLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal,
892+
.imageLayout = vk::ImageLayout::eDepthAttachmentOptimal,
906893
.loadOp = vk::AttachmentLoadOp::eClear,
907894
.storeOp = vk::AttachmentStoreOp::eDontCare,
908895
.clearValue = clearDepth
@@ -926,25 +913,27 @@ class HelloTriangleApplication {
926913
commandBuffers[currentFrame].endRendering();
927914
// After rendering, transition the swapchain image to PRESENT_SRC
928915
transition_image_layout(
929-
imageIndex,
916+
swapChainImages[imageIndex],
930917
vk::ImageLayout::eColorAttachmentOptimal,
931918
vk::ImageLayout::ePresentSrcKHR,
932919
vk::AccessFlagBits2::eColorAttachmentWrite, // srcAccessMask
933-
{}, // dstAccessMask
934-
vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage
935-
vk::PipelineStageFlagBits2::eBottomOfPipe // dstStage
920+
{}, // dstAccessMask
921+
vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage
922+
vk::PipelineStageFlagBits2::eBottomOfPipe, // dstStage
923+
vk::ImageAspectFlagBits::eColor
936924
);
937925
commandBuffers[currentFrame].end();
938926
}
939927

940928
void transition_image_layout(
941-
uint32_t imageIndex,
929+
vk::Image image,
942930
vk::ImageLayout old_layout,
943931
vk::ImageLayout new_layout,
944932
vk::AccessFlags2 src_access_mask,
945933
vk::AccessFlags2 dst_access_mask,
946934
vk::PipelineStageFlags2 src_stage_mask,
947-
vk::PipelineStageFlags2 dst_stage_mask
935+
vk::PipelineStageFlags2 dst_stage_mask,
936+
vk::ImageAspectFlags image_aspect_flags
948937
) {
949938
vk::ImageMemoryBarrier2 barrier = {
950939
.srcStageMask = src_stage_mask,
@@ -955,9 +944,9 @@ class HelloTriangleApplication {
955944
.newLayout = new_layout,
956945
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
957946
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
958-
.image = swapChainImages[imageIndex],
947+
.image = image,
959948
.subresourceRange = {
960-
.aspectMask = vk::ImageAspectFlagBits::eColor,
949+
.aspectMask = image_aspect_flags,
961950
.baseMipLevel = 0,
962951
.levelCount = 1,
963952
.baseArrayLayer = 0,

attachments/28_model_loading.cpp

Lines changed: 24 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -899,39 +899,26 @@ class HelloTriangleApplication {
899899
commandBuffers[currentFrame].begin({});
900900
// Before starting rendering, transition the swapchain image to COLOR_ATTACHMENT_OPTIMAL
901901
transition_image_layout(
902-
imageIndex,
902+
swapChainImages[imageIndex],
903903
vk::ImageLayout::eUndefined,
904904
vk::ImageLayout::eColorAttachmentOptimal,
905905
{}, // srcAccessMask (no need to wait for previous operations)
906906
vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask
907907
vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage
908-
vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage
908+
vk::PipelineStageFlagBits2::eColorAttachmentOutput, // dstStage
909+
vk::ImageAspectFlagBits::eColor
909910
);
910911
// Transition depth image to depth attachment optimal layout
911-
vk::ImageMemoryBarrier2 depthBarrier = {
912-
.srcStageMask = vk::PipelineStageFlagBits2::eTopOfPipe,
913-
.srcAccessMask = {},
914-
.dstStageMask = vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests,
915-
.dstAccessMask = vk::AccessFlagBits2::eDepthStencilAttachmentRead | vk::AccessFlagBits2::eDepthStencilAttachmentWrite,
916-
.oldLayout = vk::ImageLayout::eUndefined,
917-
.newLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal,
918-
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
919-
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
920-
.image = depthImage,
921-
.subresourceRange = {
922-
.aspectMask = vk::ImageAspectFlagBits::eDepth,
923-
.baseMipLevel = 0,
924-
.levelCount = 1,
925-
.baseArrayLayer = 0,
926-
.layerCount = 1
927-
}
928-
};
929-
vk::DependencyInfo depthDependencyInfo = {
930-
.dependencyFlags = {},
931-
.imageMemoryBarrierCount = 1,
932-
.pImageMemoryBarriers = &depthBarrier
933-
};
934-
commandBuffers[currentFrame].pipelineBarrier2(depthDependencyInfo);
912+
transition_image_layout(
913+
depthImage,
914+
vk::ImageLayout::eUndefined,
915+
vk::ImageLayout::eDepthAttachmentOptimal,
916+
vk::AccessFlagBits2::eDepthStencilAttachmentWrite,
917+
vk::AccessFlagBits2::eDepthStencilAttachmentWrite,
918+
vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests,
919+
vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests,
920+
vk::ImageAspectFlagBits::eDepth
921+
);
935922

936923
vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f);
937924
vk::ClearValue clearDepth = vk::ClearDepthStencilValue(1.0f, 0);
@@ -970,26 +957,28 @@ class HelloTriangleApplication {
970957
commandBuffers[currentFrame].endRendering();
971958
// After rendering, transition the swapchain image to PRESENT_SRC
972959
transition_image_layout(
973-
imageIndex,
960+
swapChainImages[imageIndex],
974961
vk::ImageLayout::eColorAttachmentOptimal,
975962
vk::ImageLayout::ePresentSrcKHR,
976963
vk::AccessFlagBits2::eColorAttachmentWrite, // srcAccessMask
977-
{}, // dstAccessMask
978-
vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage
979-
vk::PipelineStageFlagBits2::eBottomOfPipe // dstStage
964+
{}, // dstAccessMask
965+
vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage
966+
vk::PipelineStageFlagBits2::eBottomOfPipe, // dstStage
967+
vk::ImageAspectFlagBits::eColor
980968
);
981969
commandBuffers[currentFrame].end();
982970
}
983971

984972
void transition_image_layout(
985-
uint32_t imageIndex,
973+
vk::Image image,
986974
vk::ImageLayout old_layout,
987975
vk::ImageLayout new_layout,
988976
vk::AccessFlags2 src_access_mask,
989977
vk::AccessFlags2 dst_access_mask,
990978
vk::PipelineStageFlags2 src_stage_mask,
991-
vk::PipelineStageFlags2 dst_stage_mask
992-
) {
979+
vk::PipelineStageFlags2 dst_stage_mask,
980+
vk::ImageAspectFlags image_aspect_flags
981+
) {
993982
vk::ImageMemoryBarrier2 barrier = {
994983
.srcStageMask = src_stage_mask,
995984
.srcAccessMask = src_access_mask,
@@ -999,9 +988,9 @@ class HelloTriangleApplication {
999988
.newLayout = new_layout,
1000989
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
1001990
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
1002-
.image = swapChainImages[imageIndex],
991+
.image = image,
1003992
.subresourceRange = {
1004-
.aspectMask = vk::ImageAspectFlagBits::eColor,
993+
.aspectMask = image_aspect_flags,
1005994
.baseMipLevel = 0,
1006995
.levelCount = 1,
1007996
.baseArrayLayer = 0,

attachments/29_mipmapping.cpp

Lines changed: 24 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -965,39 +965,26 @@ class HelloTriangleApplication {
965965
commandBuffers[currentFrame].begin({});
966966
// Before starting rendering, transition the swapchain image to COLOR_ATTACHMENT_OPTIMAL
967967
transition_image_layout(
968-
imageIndex,
968+
swapChainImages[imageIndex],
969969
vk::ImageLayout::eUndefined,
970970
vk::ImageLayout::eColorAttachmentOptimal,
971971
{}, // srcAccessMask (no need to wait for previous operations)
972972
vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask
973973
vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage
974-
vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage
974+
vk::PipelineStageFlagBits2::eColorAttachmentOutput, // dstStage
975+
vk::ImageAspectFlagBits::eColor
975976
);
976977
// Transition depth image to depth attachment optimal layout
977-
vk::ImageMemoryBarrier2 depthBarrier = {
978-
.srcStageMask = vk::PipelineStageFlagBits2::eTopOfPipe,
979-
.srcAccessMask = {},
980-
.dstStageMask = vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests,
981-
.dstAccessMask = vk::AccessFlagBits2::eDepthStencilAttachmentRead | vk::AccessFlagBits2::eDepthStencilAttachmentWrite,
982-
.oldLayout = vk::ImageLayout::eUndefined,
983-
.newLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal,
984-
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
985-
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
986-
.image = depthImage,
987-
.subresourceRange = {
988-
.aspectMask = vk::ImageAspectFlagBits::eDepth,
989-
.baseMipLevel = 0,
990-
.levelCount = 1,
991-
.baseArrayLayer = 0,
992-
.layerCount = 1
993-
}
994-
};
995-
vk::DependencyInfo depthDependencyInfo = {
996-
.dependencyFlags = {},
997-
.imageMemoryBarrierCount = 1,
998-
.pImageMemoryBarriers = &depthBarrier
999-
};
1000-
commandBuffers[currentFrame].pipelineBarrier2(depthDependencyInfo);
978+
transition_image_layout(
979+
depthImage,
980+
vk::ImageLayout::eUndefined,
981+
vk::ImageLayout::eDepthAttachmentOptimal,
982+
vk::AccessFlagBits2::eDepthStencilAttachmentWrite,
983+
vk::AccessFlagBits2::eDepthStencilAttachmentWrite,
984+
vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests,
985+
vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests,
986+
vk::ImageAspectFlagBits::eDepth
987+
);
1001988

1002989
vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f);
1003990
vk::ClearValue clearDepth = vk::ClearDepthStencilValue(1.0f, 0);
@@ -1036,26 +1023,28 @@ class HelloTriangleApplication {
10361023
commandBuffers[currentFrame].endRendering();
10371024
// After rendering, transition the swapchain image to PRESENT_SRC
10381025
transition_image_layout(
1039-
imageIndex,
1026+
swapChainImages[imageIndex],
10401027
vk::ImageLayout::eColorAttachmentOptimal,
10411028
vk::ImageLayout::ePresentSrcKHR,
10421029
vk::AccessFlagBits2::eColorAttachmentWrite, // srcAccessMask
1043-
{}, // dstAccessMask
1044-
vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage
1045-
vk::PipelineStageFlagBits2::eBottomOfPipe // dstStage
1030+
{}, // dstAccessMask
1031+
vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage
1032+
vk::PipelineStageFlagBits2::eBottomOfPipe, // dstStage
1033+
vk::ImageAspectFlagBits::eColor
10461034
);
10471035
commandBuffers[currentFrame].end();
10481036
}
10491037

10501038
void transition_image_layout(
1051-
uint32_t imageIndex,
1039+
vk::Image image,
10521040
vk::ImageLayout old_layout,
10531041
vk::ImageLayout new_layout,
10541042
vk::AccessFlags2 src_access_mask,
10551043
vk::AccessFlags2 dst_access_mask,
10561044
vk::PipelineStageFlags2 src_stage_mask,
1057-
vk::PipelineStageFlags2 dst_stage_mask
1058-
) {
1045+
vk::PipelineStageFlags2 dst_stage_mask,
1046+
vk::ImageAspectFlags image_aspect_flags
1047+
) {
10591048
vk::ImageMemoryBarrier2 barrier = {
10601049
.srcStageMask = src_stage_mask,
10611050
.srcAccessMask = src_access_mask,
@@ -1065,9 +1054,9 @@ class HelloTriangleApplication {
10651054
.newLayout = new_layout,
10661055
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
10671056
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
1068-
.image = swapChainImages[imageIndex],
1057+
.image = image,
10691058
.subresourceRange = {
1070-
.aspectMask = vk::ImageAspectFlagBits::eColor,
1059+
.aspectMask = image_aspect_flags,
10711060
.baseMipLevel = 0,
10721061
.levelCount = 1,
10731062
.baseArrayLayer = 0,

0 commit comments

Comments
 (0)