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