Skip to content

Commit db8390f

Browse files
committed
Fix sync issues for color and depth attachments
Use functions similar to other chapters
1 parent b09d67c commit db8390f

File tree

1 file changed

+76
-82
lines changed

1 file changed

+76
-82
lines changed

attachments/33_vulkan_profiles.cpp

Lines changed: 76 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1330,67 +1330,40 @@ class HelloTriangleApplication {
13301330
commandBuffers[currentFrame].begin({});
13311331

13321332
// Transition the attachments to the correct layouts for dynamic rendering
1333-
// 1) Multisampled color attachment image -> ColorAttachmentOptimal
1334-
vk::ImageMemoryBarrier colorAttachmentBarrier{
1335-
.srcAccessMask = vk::AccessFlagBits::eNone,
1336-
.dstAccessMask = vk::AccessFlagBits::eColorAttachmentWrite,
1337-
.oldLayout = vk::ImageLayout::eUndefined,
1338-
.newLayout = vk::ImageLayout::eColorAttachmentOptimal,
1339-
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
1340-
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
1341-
.image = *colorImage,
1342-
.subresourceRange = {
1343-
.aspectMask = vk::ImageAspectFlagBits::eColor,
1344-
.baseMipLevel = 0,
1345-
.levelCount = 1,
1346-
.baseArrayLayer = 0,
1347-
.layerCount = 1
1348-
}
1349-
};
13501333

1334+
// Before starting rendering, transition the swapchain image to COLOR_ATTACHMENT_OPTIMAL
1335+
// 1) Multisampled color attachment image -> ColorAttachmentOptimal
1336+
transition_image_layout(
1337+
*colorImage,
1338+
vk::ImageLayout::eUndefined,
1339+
vk::ImageLayout::eColorAttachmentOptimal,
1340+
vk::AccessFlagBits2::eColorAttachmentWrite,
1341+
vk::AccessFlagBits2::eColorAttachmentWrite,
1342+
vk::PipelineStageFlagBits2::eColorAttachmentOutput,
1343+
vk::PipelineStageFlagBits2::eColorAttachmentOutput,
1344+
vk::ImageAspectFlagBits::eColor
1345+
);
13511346
// 2) Depth attachment image -> DepthStencilAttachmentOptimal
1352-
vk::ImageMemoryBarrier depthAttachmentBarrier{
1353-
.srcAccessMask = vk::AccessFlagBits::eNone,
1354-
.dstAccessMask = vk::AccessFlagBits::eDepthStencilAttachmentWrite,
1355-
.oldLayout = vk::ImageLayout::eUndefined,
1356-
.newLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal,
1357-
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
1358-
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
1359-
.image = *depthImage,
1360-
.subresourceRange = {
1361-
.aspectMask = vk::ImageAspectFlagBits::eDepth,
1362-
.baseMipLevel = 0,
1363-
.levelCount = 1,
1364-
.baseArrayLayer = 0,
1365-
.layerCount = 1
1366-
}
1367-
};
1368-
1347+
transition_image_layout(
1348+
*depthImage,
1349+
vk::ImageLayout::eUndefined,
1350+
vk::ImageLayout::eDepthAttachmentOptimal,
1351+
vk::AccessFlagBits2::eDepthStencilAttachmentWrite,
1352+
vk::AccessFlagBits2::eDepthStencilAttachmentWrite,
1353+
vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests,
1354+
vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests,
1355+
vk::ImageAspectFlagBits::eDepth
1356+
);
13691357
// 3) Resolve (swapchain) image -> ColorAttachmentOptimal
1370-
vk::ImageMemoryBarrier swapchainResolveBarrier{
1371-
.srcAccessMask = vk::AccessFlagBits::eNone,
1372-
.dstAccessMask = vk::AccessFlagBits::eColorAttachmentWrite,
1373-
.oldLayout = vk::ImageLayout::eUndefined,
1374-
.newLayout = vk::ImageLayout::eColorAttachmentOptimal,
1375-
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
1376-
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
1377-
.image = swapChainImages[imageIndex],
1378-
.subresourceRange = {
1379-
.aspectMask = vk::ImageAspectFlagBits::eColor,
1380-
.baseMipLevel = 0,
1381-
.levelCount = 1,
1382-
.baseArrayLayer = 0,
1383-
.layerCount = 1
1384-
}
1385-
};
1386-
1387-
commandBuffers[currentFrame].pipelineBarrier(
1388-
vk::PipelineStageFlagBits::eTopOfPipe,
1389-
vk::PipelineStageFlagBits::eColorAttachmentOutput | vk::PipelineStageFlagBits::eEarlyFragmentTests,
1390-
vk::DependencyFlagBits::eByRegion,
1391-
std::array<vk::MemoryBarrier, 0>{},
1392-
std::array<vk::BufferMemoryBarrier, 0>{},
1393-
std::array<vk::ImageMemoryBarrier, 3>{colorAttachmentBarrier, depthAttachmentBarrier, swapchainResolveBarrier}
1358+
transition_image_layout(
1359+
swapChainImages[imageIndex],
1360+
vk::ImageLayout::eUndefined,
1361+
vk::ImageLayout::eColorAttachmentOptimal,
1362+
{}, // srcAccessMask (no need to wait for previous operations)
1363+
vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask
1364+
vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage
1365+
vk::PipelineStageFlagBits2::eColorAttachmentOutput, // dstStage
1366+
vk::ImageAspectFlagBits::eColor
13941367
);
13951368

13961369
// Clear values for color and depth
@@ -1475,30 +1448,15 @@ class HelloTriangleApplication {
14751448
commandBuffers[currentFrame].endRendering();
14761449

14771450
// Transition the swapchain image to the correct layout for presentation
1478-
vk::ImageMemoryBarrier barrier{
1479-
.srcAccessMask = vk::AccessFlagBits::eColorAttachmentWrite,
1480-
.dstAccessMask = vk::AccessFlagBits::eNone,
1481-
.oldLayout = vk::ImageLayout::eColorAttachmentOptimal,
1482-
.newLayout = vk::ImageLayout::ePresentSrcKHR,
1483-
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
1484-
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
1485-
.image = swapChainImages[imageIndex],
1486-
.subresourceRange = {
1487-
.aspectMask = vk::ImageAspectFlagBits::eColor,
1488-
.baseMipLevel = 0,
1489-
.levelCount = 1,
1490-
.baseArrayLayer = 0,
1491-
.layerCount = 1
1492-
}
1493-
};
1494-
1495-
commandBuffers[currentFrame].pipelineBarrier(
1496-
vk::PipelineStageFlagBits::eColorAttachmentOutput,
1497-
vk::PipelineStageFlagBits::eBottomOfPipe,
1498-
vk::DependencyFlagBits::eByRegion,
1499-
std::array<vk::MemoryBarrier, 0>{},
1500-
std::array<vk::BufferMemoryBarrier, 0>{},
1501-
std::array<vk::ImageMemoryBarrier, 1>{barrier}
1451+
transition_image_layout(
1452+
swapChainImages[imageIndex],
1453+
vk::ImageLayout::eColorAttachmentOptimal,
1454+
vk::ImageLayout::ePresentSrcKHR,
1455+
vk::AccessFlagBits2::eColorAttachmentWrite, // srcAccessMask
1456+
{}, // dstAccessMask
1457+
vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage
1458+
vk::PipelineStageFlagBits2::eBottomOfPipe, // dstStage
1459+
vk::ImageAspectFlagBits::eColor
15021460
);
15031461
} else {
15041462
commandBuffers[currentFrame].endRenderPass();
@@ -1508,6 +1466,42 @@ class HelloTriangleApplication {
15081466
commandBuffers[currentFrame].end();
15091467
}
15101468

1469+
void transition_image_layout(
1470+
vk::Image image,
1471+
vk::ImageLayout old_layout,
1472+
vk::ImageLayout new_layout,
1473+
vk::AccessFlags2 src_access_mask,
1474+
vk::AccessFlags2 dst_access_mask,
1475+
vk::PipelineStageFlags2 src_stage_mask,
1476+
vk::PipelineStageFlags2 dst_stage_mask,
1477+
vk::ImageAspectFlags image_aspect_flags
1478+
) {
1479+
vk::ImageMemoryBarrier2 barrier = {
1480+
.srcStageMask = src_stage_mask,
1481+
.srcAccessMask = src_access_mask,
1482+
.dstStageMask = dst_stage_mask,
1483+
.dstAccessMask = dst_access_mask,
1484+
.oldLayout = old_layout,
1485+
.newLayout = new_layout,
1486+
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
1487+
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
1488+
.image = image,
1489+
.subresourceRange = {
1490+
.aspectMask = image_aspect_flags,
1491+
.baseMipLevel = 0,
1492+
.levelCount = 1,
1493+
.baseArrayLayer = 0,
1494+
.layerCount = 1
1495+
}
1496+
};
1497+
vk::DependencyInfo dependency_info = {
1498+
.dependencyFlags = {},
1499+
.imageMemoryBarrierCount = 1,
1500+
.pImageMemoryBarriers = &barrier
1501+
};
1502+
commandBuffers[currentFrame].pipelineBarrier2(dependency_info);
1503+
}
1504+
15111505
void createSyncObjects() {
15121506
imageAvailableSemaphores.reserve(MAX_FRAMES_IN_FLIGHT);
15131507
renderFinishedSemaphores.reserve(MAX_FRAMES_IN_FLIGHT);

0 commit comments

Comments
 (0)