diff --git a/attachments/15_hello_triangle.cpp b/attachments/15_hello_triangle.cpp index de98ba03..cb00d9fc 100644 --- a/attachments/15_hello_triangle.cpp +++ b/attachments/15_hello_triangle.cpp @@ -375,10 +375,10 @@ class HelloTriangleApplication { imageIndex, vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, // srcAccessMask (no need to wait for previous operations) - vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask - vk::PipelineStageFlagBits2::eTopOfPipe, // srcStage - vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage ); vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f); vk::RenderingAttachmentInfo attachmentInfo = { @@ -407,9 +407,9 @@ class HelloTriangleApplication { vk::ImageLayout::eColorAttachmentOptimal, vk::ImageLayout::ePresentSrcKHR, vk::AccessFlagBits2::eColorAttachmentWrite, // srcAccessMask - {}, // dstAccessMask - vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage - vk::PipelineStageFlagBits2::eBottomOfPipe // dstStage + {}, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eBottomOfPipe // dstStage ); commandBuffer.end(); } diff --git a/attachments/16_frames_in_flight.cpp b/attachments/16_frames_in_flight.cpp index 81231588..ef5c1ad2 100644 --- a/attachments/16_frames_in_flight.cpp +++ b/attachments/16_frames_in_flight.cpp @@ -379,10 +379,10 @@ class HelloTriangleApplication { imageIndex, vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, // srcAccessMask (no need to wait for previous operations) - vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask - vk::PipelineStageFlagBits2::eTopOfPipe, // srcStage - vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage ); vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f); vk::RenderingAttachmentInfo attachmentInfo = { diff --git a/attachments/17_swap_chain_recreation.cpp b/attachments/17_swap_chain_recreation.cpp index dc51946b..5c52dd97 100644 --- a/attachments/17_swap_chain_recreation.cpp +++ b/attachments/17_swap_chain_recreation.cpp @@ -408,10 +408,10 @@ class HelloTriangleApplication { imageIndex, vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, // srcAccessMask (no need to wait for previous operations) - vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask - vk::PipelineStageFlagBits2::eTopOfPipe, // srcStage - vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage ); vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f); vk::RenderingAttachmentInfo attachmentInfo = { diff --git a/attachments/18_vertex_input.cpp b/attachments/18_vertex_input.cpp index 96027af4..16632fd1 100644 --- a/attachments/18_vertex_input.cpp +++ b/attachments/18_vertex_input.cpp @@ -427,10 +427,10 @@ class HelloTriangleApplication { imageIndex, vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, // srcAccessMask (no need to wait for previous operations) - vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask - vk::PipelineStageFlagBits2::eTopOfPipe, // srcStage - vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage ); vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f); vk::RenderingAttachmentInfo attachmentInfo = { diff --git a/attachments/19_vertex_buffer.cpp b/attachments/19_vertex_buffer.cpp index 78e79c94..69fdce01 100644 --- a/attachments/19_vertex_buffer.cpp +++ b/attachments/19_vertex_buffer.cpp @@ -458,10 +458,10 @@ class HelloTriangleApplication { imageIndex, vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, // srcAccessMask (no need to wait for previous operations) - vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask - vk::PipelineStageFlagBits2::eTopOfPipe, // srcStage - vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage ); vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f); vk::RenderingAttachmentInfo attachmentInfo = { diff --git a/attachments/20_staging_buffer.cpp b/attachments/20_staging_buffer.cpp index e95be4f5..b48c46fb 100644 --- a/attachments/20_staging_buffer.cpp +++ b/attachments/20_staging_buffer.cpp @@ -477,10 +477,10 @@ class HelloTriangleApplication { imageIndex, vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, // srcAccessMask (no need to wait for previous operations) - vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask - vk::PipelineStageFlagBits2::eTopOfPipe, // srcStage - vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage ); vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f); vk::RenderingAttachmentInfo attachmentInfo = { diff --git a/attachments/21_index_buffer.cpp b/attachments/21_index_buffer.cpp index 7f0611e4..ddea42c3 100644 --- a/attachments/21_index_buffer.cpp +++ b/attachments/21_index_buffer.cpp @@ -501,10 +501,10 @@ class HelloTriangleApplication { imageIndex, vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, // srcAccessMask (no need to wait for previous operations) - vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask - vk::PipelineStageFlagBits2::eTopOfPipe, // srcStage - vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage ); vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f); vk::RenderingAttachmentInfo attachmentInfo = { diff --git a/attachments/22_descriptor_layout.cpp b/attachments/22_descriptor_layout.cpp index 8617a930..c3ca36fc 100644 --- a/attachments/22_descriptor_layout.cpp +++ b/attachments/22_descriptor_layout.cpp @@ -540,10 +540,10 @@ class HelloTriangleApplication { imageIndex, vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, // srcAccessMask (no need to wait for previous operations) - vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask - vk::PipelineStageFlagBits2::eTopOfPipe, // srcStage - vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage ); vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f); vk::RenderingAttachmentInfo attachmentInfo = { diff --git a/attachments/23_descriptor_sets.cpp b/attachments/23_descriptor_sets.cpp index 7606e43e..2205dbb6 100644 --- a/attachments/23_descriptor_sets.cpp +++ b/attachments/23_descriptor_sets.cpp @@ -564,10 +564,10 @@ class HelloTriangleApplication { imageIndex, vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, // srcAccessMask (no need to wait for previous operations) - vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask - vk::PipelineStageFlagBits2::eTopOfPipe, // srcStage - vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage ); vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f); vk::RenderingAttachmentInfo attachmentInfo = { diff --git a/attachments/24_texture_image.cpp b/attachments/24_texture_image.cpp index 4eb5bb59..f0e19e26 100644 --- a/attachments/24_texture_image.cpp +++ b/attachments/24_texture_image.cpp @@ -668,10 +668,10 @@ class HelloTriangleApplication { imageIndex, vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, // srcAccessMask (no need to wait for previous operations) - vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask - vk::PipelineStageFlagBits2::eTopOfPipe, // srcStage - vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage ); vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f); vk::RenderingAttachmentInfo attachmentInfo = { diff --git a/attachments/25_sampler.cpp b/attachments/25_sampler.cpp index be60c5e6..6336f6cf 100644 --- a/attachments/25_sampler.cpp +++ b/attachments/25_sampler.cpp @@ -701,10 +701,10 @@ class HelloTriangleApplication { imageIndex, vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, // srcAccessMask (no need to wait for previous operations) - vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask - vk::PipelineStageFlagBits2::eTopOfPipe, // srcStage - vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage ); vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f); vk::RenderingAttachmentInfo attachmentInfo = { diff --git a/attachments/26_texture_mapping.cpp b/attachments/26_texture_mapping.cpp index a08347ef..baef7d45 100644 --- a/attachments/26_texture_mapping.cpp +++ b/attachments/26_texture_mapping.cpp @@ -778,10 +778,10 @@ class HelloTriangleApplication { imageIndex, vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, // srcAccessMask (no need to wait for previous operations) - vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask - vk::PipelineStageFlagBits2::eTopOfPipe, // srcStage - vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage ); vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f); vk::RenderingAttachmentInfo attachmentInfo = { diff --git a/attachments/27_depth_buffering.cpp b/attachments/27_depth_buffering.cpp index 162852cd..a1d0fda1 100644 --- a/attachments/27_depth_buffering.cpp +++ b/attachments/27_depth_buffering.cpp @@ -855,39 +855,26 @@ class HelloTriangleApplication { commandBuffers[currentFrame].begin({}); // Before starting rendering, transition the swapchain image to COLOR_ATTACHMENT_OPTIMAL transition_image_layout( - imageIndex, + swapChainImages[imageIndex], vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, // srcAccessMask (no need to wait for previous operations) - vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask - vk::PipelineStageFlagBits2::eTopOfPipe, // srcStage - vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // dstStage + vk::ImageAspectFlagBits::eColor ); // Transition depth image to depth attachment optimal layout - vk::ImageMemoryBarrier2 depthBarrier = { - .srcStageMask = vk::PipelineStageFlagBits2::eTopOfPipe, - .srcAccessMask = {}, - .dstStageMask = vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, - .dstAccessMask = vk::AccessFlagBits2::eDepthStencilAttachmentRead | vk::AccessFlagBits2::eDepthStencilAttachmentWrite, - .oldLayout = vk::ImageLayout::eUndefined, - .newLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal, - .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = depthImage, - .subresourceRange = { - .aspectMask = vk::ImageAspectFlagBits::eDepth, - .baseMipLevel = 0, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = 1 - } - }; - vk::DependencyInfo depthDependencyInfo = { - .dependencyFlags = {}, - .imageMemoryBarrierCount = 1, - .pImageMemoryBarriers = &depthBarrier - }; - commandBuffers[currentFrame].pipelineBarrier2(depthDependencyInfo); + transition_image_layout( + *depthImage, + vk::ImageLayout::eUndefined, + vk::ImageLayout::eDepthAttachmentOptimal, + vk::AccessFlagBits2::eDepthStencilAttachmentWrite, + vk::AccessFlagBits2::eDepthStencilAttachmentWrite, + vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, + vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, + vk::ImageAspectFlagBits::eDepth + ); vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f); vk::ClearValue clearDepth = vk::ClearDepthStencilValue(1.0f, 0); @@ -902,7 +889,7 @@ class HelloTriangleApplication { vk::RenderingAttachmentInfo depthAttachmentInfo = { .imageView = depthImageView, - .imageLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal, + .imageLayout = vk::ImageLayout::eDepthAttachmentOptimal, .loadOp = vk::AttachmentLoadOp::eClear, .storeOp = vk::AttachmentStoreOp::eDontCare, .clearValue = clearDepth @@ -926,25 +913,27 @@ class HelloTriangleApplication { commandBuffers[currentFrame].endRendering(); // After rendering, transition the swapchain image to PRESENT_SRC transition_image_layout( - imageIndex, + swapChainImages[imageIndex], vk::ImageLayout::eColorAttachmentOptimal, vk::ImageLayout::ePresentSrcKHR, vk::AccessFlagBits2::eColorAttachmentWrite, // srcAccessMask - {}, // dstAccessMask - vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage - vk::PipelineStageFlagBits2::eBottomOfPipe // dstStage + {}, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eBottomOfPipe, // dstStage + vk::ImageAspectFlagBits::eColor ); commandBuffers[currentFrame].end(); } void transition_image_layout( - uint32_t imageIndex, + vk::Image image, vk::ImageLayout old_layout, vk::ImageLayout new_layout, vk::AccessFlags2 src_access_mask, vk::AccessFlags2 dst_access_mask, vk::PipelineStageFlags2 src_stage_mask, - vk::PipelineStageFlags2 dst_stage_mask + vk::PipelineStageFlags2 dst_stage_mask, + vk::ImageAspectFlags image_aspect_flags ) { vk::ImageMemoryBarrier2 barrier = { .srcStageMask = src_stage_mask, @@ -955,9 +944,9 @@ class HelloTriangleApplication { .newLayout = new_layout, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = swapChainImages[imageIndex], + .image = image, .subresourceRange = { - .aspectMask = vk::ImageAspectFlagBits::eColor, + .aspectMask = image_aspect_flags, .baseMipLevel = 0, .levelCount = 1, .baseArrayLayer = 0, diff --git a/attachments/28_model_loading.cpp b/attachments/28_model_loading.cpp index ab116914..df77c8a6 100644 --- a/attachments/28_model_loading.cpp +++ b/attachments/28_model_loading.cpp @@ -899,39 +899,26 @@ class HelloTriangleApplication { commandBuffers[currentFrame].begin({}); // Before starting rendering, transition the swapchain image to COLOR_ATTACHMENT_OPTIMAL transition_image_layout( - imageIndex, + swapChainImages[imageIndex], vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, // srcAccessMask (no need to wait for previous operations) - vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask - vk::PipelineStageFlagBits2::eTopOfPipe, // srcStage - vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // dstStage + vk::ImageAspectFlagBits::eColor ); // Transition depth image to depth attachment optimal layout - vk::ImageMemoryBarrier2 depthBarrier = { - .srcStageMask = vk::PipelineStageFlagBits2::eTopOfPipe, - .srcAccessMask = {}, - .dstStageMask = vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, - .dstAccessMask = vk::AccessFlagBits2::eDepthStencilAttachmentRead | vk::AccessFlagBits2::eDepthStencilAttachmentWrite, - .oldLayout = vk::ImageLayout::eUndefined, - .newLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal, - .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = depthImage, - .subresourceRange = { - .aspectMask = vk::ImageAspectFlagBits::eDepth, - .baseMipLevel = 0, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = 1 - } - }; - vk::DependencyInfo depthDependencyInfo = { - .dependencyFlags = {}, - .imageMemoryBarrierCount = 1, - .pImageMemoryBarriers = &depthBarrier - }; - commandBuffers[currentFrame].pipelineBarrier2(depthDependencyInfo); + transition_image_layout( + *depthImage, + vk::ImageLayout::eUndefined, + vk::ImageLayout::eDepthAttachmentOptimal, + vk::AccessFlagBits2::eDepthStencilAttachmentWrite, + vk::AccessFlagBits2::eDepthStencilAttachmentWrite, + vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, + vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, + vk::ImageAspectFlagBits::eDepth + ); vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f); vk::ClearValue clearDepth = vk::ClearDepthStencilValue(1.0f, 0); @@ -970,26 +957,28 @@ class HelloTriangleApplication { commandBuffers[currentFrame].endRendering(); // After rendering, transition the swapchain image to PRESENT_SRC transition_image_layout( - imageIndex, + swapChainImages[imageIndex], vk::ImageLayout::eColorAttachmentOptimal, vk::ImageLayout::ePresentSrcKHR, vk::AccessFlagBits2::eColorAttachmentWrite, // srcAccessMask - {}, // dstAccessMask - vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage - vk::PipelineStageFlagBits2::eBottomOfPipe // dstStage + {}, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eBottomOfPipe, // dstStage + vk::ImageAspectFlagBits::eColor ); commandBuffers[currentFrame].end(); } void transition_image_layout( - uint32_t imageIndex, + vk::Image image, vk::ImageLayout old_layout, vk::ImageLayout new_layout, vk::AccessFlags2 src_access_mask, vk::AccessFlags2 dst_access_mask, vk::PipelineStageFlags2 src_stage_mask, - vk::PipelineStageFlags2 dst_stage_mask - ) { + vk::PipelineStageFlags2 dst_stage_mask, + vk::ImageAspectFlags image_aspect_flags + ) { vk::ImageMemoryBarrier2 barrier = { .srcStageMask = src_stage_mask, .srcAccessMask = src_access_mask, @@ -999,9 +988,9 @@ class HelloTriangleApplication { .newLayout = new_layout, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = swapChainImages[imageIndex], + .image = image, .subresourceRange = { - .aspectMask = vk::ImageAspectFlagBits::eColor, + .aspectMask = image_aspect_flags, .baseMipLevel = 0, .levelCount = 1, .baseArrayLayer = 0, diff --git a/attachments/29_mipmapping.cpp b/attachments/29_mipmapping.cpp index 3dc2160a..d9d3264d 100644 --- a/attachments/29_mipmapping.cpp +++ b/attachments/29_mipmapping.cpp @@ -965,39 +965,26 @@ class HelloTriangleApplication { commandBuffers[currentFrame].begin({}); // Before starting rendering, transition the swapchain image to COLOR_ATTACHMENT_OPTIMAL transition_image_layout( - imageIndex, + swapChainImages[imageIndex], vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, // srcAccessMask (no need to wait for previous operations) - vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask - vk::PipelineStageFlagBits2::eTopOfPipe, // srcStage - vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // dstStage + vk::ImageAspectFlagBits::eColor ); // Transition depth image to depth attachment optimal layout - vk::ImageMemoryBarrier2 depthBarrier = { - .srcStageMask = vk::PipelineStageFlagBits2::eTopOfPipe, - .srcAccessMask = {}, - .dstStageMask = vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, - .dstAccessMask = vk::AccessFlagBits2::eDepthStencilAttachmentRead | vk::AccessFlagBits2::eDepthStencilAttachmentWrite, - .oldLayout = vk::ImageLayout::eUndefined, - .newLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal, - .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = depthImage, - .subresourceRange = { - .aspectMask = vk::ImageAspectFlagBits::eDepth, - .baseMipLevel = 0, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = 1 - } - }; - vk::DependencyInfo depthDependencyInfo = { - .dependencyFlags = {}, - .imageMemoryBarrierCount = 1, - .pImageMemoryBarriers = &depthBarrier - }; - commandBuffers[currentFrame].pipelineBarrier2(depthDependencyInfo); + transition_image_layout( + *depthImage, + vk::ImageLayout::eUndefined, + vk::ImageLayout::eDepthAttachmentOptimal, + vk::AccessFlagBits2::eDepthStencilAttachmentWrite, + vk::AccessFlagBits2::eDepthStencilAttachmentWrite, + vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, + vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, + vk::ImageAspectFlagBits::eDepth + ); vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f); vk::ClearValue clearDepth = vk::ClearDepthStencilValue(1.0f, 0); @@ -1036,26 +1023,28 @@ class HelloTriangleApplication { commandBuffers[currentFrame].endRendering(); // After rendering, transition the swapchain image to PRESENT_SRC transition_image_layout( - imageIndex, + swapChainImages[imageIndex], vk::ImageLayout::eColorAttachmentOptimal, vk::ImageLayout::ePresentSrcKHR, vk::AccessFlagBits2::eColorAttachmentWrite, // srcAccessMask - {}, // dstAccessMask - vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage - vk::PipelineStageFlagBits2::eBottomOfPipe // dstStage + {}, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eBottomOfPipe, // dstStage + vk::ImageAspectFlagBits::eColor ); commandBuffers[currentFrame].end(); } void transition_image_layout( - uint32_t imageIndex, + vk::Image image, vk::ImageLayout old_layout, vk::ImageLayout new_layout, vk::AccessFlags2 src_access_mask, vk::AccessFlags2 dst_access_mask, vk::PipelineStageFlags2 src_stage_mask, - vk::PipelineStageFlags2 dst_stage_mask - ) { + vk::PipelineStageFlags2 dst_stage_mask, + vk::ImageAspectFlags image_aspect_flags + ) { vk::ImageMemoryBarrier2 barrier = { .srcStageMask = src_stage_mask, .srcAccessMask = src_access_mask, @@ -1065,9 +1054,9 @@ class HelloTriangleApplication { .newLayout = new_layout, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = swapChainImages[imageIndex], + .image = image, .subresourceRange = { - .aspectMask = vk::ImageAspectFlagBits::eColor, + .aspectMask = image_aspect_flags, .baseMipLevel = 0, .levelCount = 1, .baseArrayLayer = 0, diff --git a/attachments/30_multisampling.cpp b/attachments/30_multisampling.cpp index c8971828..c3f4da7f 100644 --- a/attachments/30_multisampling.cpp +++ b/attachments/30_multisampling.cpp @@ -993,41 +993,40 @@ class HelloTriangleApplication { void recordCommandBuffer(uint32_t imageIndex) { commandBuffers[currentFrame].begin({}); - // Before starting rendering, transition the images to the appropriate layouts - // Transition the swapchain image to COLOR_ATTACHMENT_OPTIMAL + // Before starting rendering, transition the swapchain image to COLOR_ATTACHMENT_OPTIMAL transition_image_layout( - imageIndex, + swapChainImages[imageIndex], vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, // srcAccessMask (no need to wait for previous operations) - vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask - vk::PipelineStageFlagBits2::eTopOfPipe, // srcStage - vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // dstStage + vk::ImageAspectFlagBits::eColor ); - // Transition the multisampled color image to COLOR_ATTACHMENT_OPTIMAL - transition_image_layout_custom( - colorImage, + transition_image_layout( + *colorImage, vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, vk::AccessFlagBits2::eColorAttachmentWrite, - vk::PipelineStageFlagBits2::eTopOfPipe, + vk::AccessFlagBits2::eColorAttachmentWrite, + vk::PipelineStageFlagBits2::eColorAttachmentOutput, vk::PipelineStageFlagBits2::eColorAttachmentOutput, vk::ImageAspectFlagBits::eColor ); - // Transition the depth image to DEPTH_ATTACHMENT_OPTIMAL - transition_image_layout_custom( - depthImage, + transition_image_layout( + *depthImage, vk::ImageLayout::eUndefined, vk::ImageLayout::eDepthAttachmentOptimal, - {}, vk::AccessFlagBits2::eDepthStencilAttachmentWrite, - vk::PipelineStageFlagBits2::eTopOfPipe, - vk::PipelineStageFlagBits2::eEarlyFragmentTests, + vk::AccessFlagBits2::eDepthStencilAttachmentWrite, + vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, + vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, vk::ImageAspectFlagBits::eDepth ); + vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f); vk::ClearValue clearDepth = vk::ClearDepthStencilValue(1.0f, 0); @@ -1068,66 +1067,30 @@ class HelloTriangleApplication { commandBuffers[currentFrame].bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipelineLayout, 0, *descriptorSets[currentFrame], nullptr); commandBuffers[currentFrame].drawIndexed(indices.size(), 1, 0, 0, 0); commandBuffers[currentFrame].endRendering(); - // After rendering, transition the images to appropriate layouts - - // Transition the swapchain image to PRESENT_SRC + // After rendering, transition the swapchain image to PRESENT_SRC transition_image_layout( - imageIndex, + swapChainImages[imageIndex], vk::ImageLayout::eColorAttachmentOptimal, vk::ImageLayout::ePresentSrcKHR, vk::AccessFlagBits2::eColorAttachmentWrite, // srcAccessMask - {}, // dstAccessMask - vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage - vk::PipelineStageFlagBits2::eBottomOfPipe // dstStage + {}, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eBottomOfPipe, // dstStage + vk::ImageAspectFlagBits::eColor ); commandBuffers[currentFrame].end(); } void transition_image_layout( - uint32_t imageIndex, - vk::ImageLayout old_layout, - vk::ImageLayout new_layout, - vk::AccessFlags2 src_access_mask, - vk::AccessFlags2 dst_access_mask, - vk::PipelineStageFlags2 src_stage_mask, - vk::PipelineStageFlags2 dst_stage_mask - ) { - vk::ImageMemoryBarrier2 barrier = { - .srcStageMask = src_stage_mask, - .srcAccessMask = src_access_mask, - .dstStageMask = dst_stage_mask, - .dstAccessMask = dst_access_mask, - .oldLayout = old_layout, - .newLayout = new_layout, - .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = swapChainImages[imageIndex], - .subresourceRange = { - .aspectMask = vk::ImageAspectFlagBits::eColor, - .baseMipLevel = 0, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = 1 - } - }; - vk::DependencyInfo dependency_info = { - .dependencyFlags = {}, - .imageMemoryBarrierCount = 1, - .pImageMemoryBarriers = &barrier - }; - commandBuffers[currentFrame].pipelineBarrier2(dependency_info); - } - - void transition_image_layout_custom( - vk::raii::Image& image, + vk::Image image, vk::ImageLayout old_layout, vk::ImageLayout new_layout, vk::AccessFlags2 src_access_mask, vk::AccessFlags2 dst_access_mask, vk::PipelineStageFlags2 src_stage_mask, vk::PipelineStageFlags2 dst_stage_mask, - vk::ImageAspectFlags aspect_mask - ) { + vk::ImageAspectFlags image_aspect_flags + ) { vk::ImageMemoryBarrier2 barrier = { .srcStageMask = src_stage_mask, .srcAccessMask = src_access_mask, @@ -1139,7 +1102,7 @@ class HelloTriangleApplication { .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .image = image, .subresourceRange = { - .aspectMask = aspect_mask, + .aspectMask = image_aspect_flags, .baseMipLevel = 0, .levelCount = 1, .baseArrayLayer = 0, diff --git a/attachments/31_compute_shader.cpp b/attachments/31_compute_shader.cpp index c5210dd3..6abefadb 100644 --- a/attachments/31_compute_shader.cpp +++ b/attachments/31_compute_shader.cpp @@ -674,10 +674,10 @@ class ComputeShaderApplication { imageIndex, vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, // srcAccessMask (no need to wait for previous operations) - vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask - vk::PipelineStageFlagBits2::eTopOfPipe, // srcStage - vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage ); vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f); vk::RenderingAttachmentInfo attachmentInfo = { diff --git a/attachments/32_ecosystem_utilities.cpp b/attachments/32_ecosystem_utilities.cpp index 2d9716e6..7dd3c3cb 100644 --- a/attachments/32_ecosystem_utilities.cpp +++ b/attachments/32_ecosystem_utilities.cpp @@ -1273,8 +1273,8 @@ class HelloTriangleApplication { if (appInfo.synchronization2Supported) { // Use Synchronization2 API for image transitions vk::ImageMemoryBarrier2 colorBarrier{ - .srcStageMask = vk::PipelineStageFlagBits2::eTopOfPipe, - .srcAccessMask = vk::AccessFlagBits2::eNone, + .srcStageMask = vk::PipelineStageFlagBits2::eColorAttachmentOutput, + .srcAccessMask = vk::AccessFlagBits2::eColorAttachmentWrite, .dstStageMask = vk::PipelineStageFlagBits2::eColorAttachmentOutput, .dstAccessMask = vk::AccessFlagBits2::eColorAttachmentWrite, .oldLayout = vk::ImageLayout::eUndefined, @@ -1285,7 +1285,7 @@ class HelloTriangleApplication { vk::ImageMemoryBarrier2 depthBarrier{ .srcStageMask = vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, - .srcAccessMask = vk::AccessFlagBits2::eNone, + .srcAccessMask = vk::AccessFlagBits2::eDepthStencilAttachmentWrite, .dstStageMask = vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, .dstAccessMask = vk::AccessFlagBits2::eDepthStencilAttachmentWrite, .oldLayout = vk::ImageLayout::eUndefined, @@ -1295,7 +1295,7 @@ class HelloTriangleApplication { }; vk::ImageMemoryBarrier2 swapchainBarrier{ - .srcStageMask = vk::PipelineStageFlagBits2::eTopOfPipe, + .srcStageMask = vk::PipelineStageFlagBits2::eColorAttachmentOutput, .srcAccessMask = vk::AccessFlagBits2::eNone, .dstStageMask = vk::PipelineStageFlagBits2::eColorAttachmentOutput, .dstAccessMask = vk::AccessFlagBits2::eColorAttachmentWrite, diff --git a/attachments/33_vulkan_profiles.cpp b/attachments/33_vulkan_profiles.cpp index 0b99f6f7..e62a79a2 100644 --- a/attachments/33_vulkan_profiles.cpp +++ b/attachments/33_vulkan_profiles.cpp @@ -1330,67 +1330,40 @@ class HelloTriangleApplication { commandBuffers[currentFrame].begin({}); // Transition the attachments to the correct layouts for dynamic rendering - // 1) Multisampled color attachment image -> ColorAttachmentOptimal - vk::ImageMemoryBarrier colorAttachmentBarrier{ - .srcAccessMask = vk::AccessFlagBits::eNone, - .dstAccessMask = vk::AccessFlagBits::eColorAttachmentWrite, - .oldLayout = vk::ImageLayout::eUndefined, - .newLayout = vk::ImageLayout::eColorAttachmentOptimal, - .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = *colorImage, - .subresourceRange = { - .aspectMask = vk::ImageAspectFlagBits::eColor, - .baseMipLevel = 0, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = 1 - } - }; + // Before starting rendering, transition the swapchain image to COLOR_ATTACHMENT_OPTIMAL + // 1) Multisampled color attachment image -> ColorAttachmentOptimal + transition_image_layout( + *colorImage, + vk::ImageLayout::eUndefined, + vk::ImageLayout::eColorAttachmentOptimal, + vk::AccessFlagBits2::eColorAttachmentWrite, + vk::AccessFlagBits2::eColorAttachmentWrite, + vk::PipelineStageFlagBits2::eColorAttachmentOutput, + vk::PipelineStageFlagBits2::eColorAttachmentOutput, + vk::ImageAspectFlagBits::eColor + ); // 2) Depth attachment image -> DepthStencilAttachmentOptimal - vk::ImageMemoryBarrier depthAttachmentBarrier{ - .srcAccessMask = vk::AccessFlagBits::eNone, - .dstAccessMask = vk::AccessFlagBits::eDepthStencilAttachmentWrite, - .oldLayout = vk::ImageLayout::eUndefined, - .newLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal, - .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = *depthImage, - .subresourceRange = { - .aspectMask = vk::ImageAspectFlagBits::eDepth, - .baseMipLevel = 0, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = 1 - } - }; - + transition_image_layout( + *depthImage, + vk::ImageLayout::eUndefined, + vk::ImageLayout::eDepthAttachmentOptimal, + vk::AccessFlagBits2::eDepthStencilAttachmentWrite, + vk::AccessFlagBits2::eDepthStencilAttachmentWrite, + vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, + vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, + vk::ImageAspectFlagBits::eDepth + ); // 3) Resolve (swapchain) image -> ColorAttachmentOptimal - vk::ImageMemoryBarrier swapchainResolveBarrier{ - .srcAccessMask = vk::AccessFlagBits::eNone, - .dstAccessMask = vk::AccessFlagBits::eColorAttachmentWrite, - .oldLayout = vk::ImageLayout::eUndefined, - .newLayout = vk::ImageLayout::eColorAttachmentOptimal, - .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = swapChainImages[imageIndex], - .subresourceRange = { - .aspectMask = vk::ImageAspectFlagBits::eColor, - .baseMipLevel = 0, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = 1 - } - }; - - commandBuffers[currentFrame].pipelineBarrier( - vk::PipelineStageFlagBits::eTopOfPipe, - vk::PipelineStageFlagBits::eColorAttachmentOutput | vk::PipelineStageFlagBits::eEarlyFragmentTests, - vk::DependencyFlagBits::eByRegion, - std::array{}, - std::array{}, - std::array{colorAttachmentBarrier, depthAttachmentBarrier, swapchainResolveBarrier} + transition_image_layout( + swapChainImages[imageIndex], + vk::ImageLayout::eUndefined, + vk::ImageLayout::eColorAttachmentOptimal, + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // dstStage + vk::ImageAspectFlagBits::eColor ); // Clear values for color and depth @@ -1475,30 +1448,15 @@ class HelloTriangleApplication { commandBuffers[currentFrame].endRendering(); // Transition the swapchain image to the correct layout for presentation - vk::ImageMemoryBarrier barrier{ - .srcAccessMask = vk::AccessFlagBits::eColorAttachmentWrite, - .dstAccessMask = vk::AccessFlagBits::eNone, - .oldLayout = vk::ImageLayout::eColorAttachmentOptimal, - .newLayout = vk::ImageLayout::ePresentSrcKHR, - .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = swapChainImages[imageIndex], - .subresourceRange = { - .aspectMask = vk::ImageAspectFlagBits::eColor, - .baseMipLevel = 0, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = 1 - } - }; - - commandBuffers[currentFrame].pipelineBarrier( - vk::PipelineStageFlagBits::eColorAttachmentOutput, - vk::PipelineStageFlagBits::eBottomOfPipe, - vk::DependencyFlagBits::eByRegion, - std::array{}, - std::array{}, - std::array{barrier} + transition_image_layout( + swapChainImages[imageIndex], + vk::ImageLayout::eColorAttachmentOptimal, + vk::ImageLayout::ePresentSrcKHR, + vk::AccessFlagBits2::eColorAttachmentWrite, // srcAccessMask + {}, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eBottomOfPipe, // dstStage + vk::ImageAspectFlagBits::eColor ); } else { commandBuffers[currentFrame].endRenderPass(); @@ -1508,6 +1466,42 @@ class HelloTriangleApplication { commandBuffers[currentFrame].end(); } + void transition_image_layout( + vk::Image image, + vk::ImageLayout old_layout, + vk::ImageLayout new_layout, + vk::AccessFlags2 src_access_mask, + vk::AccessFlags2 dst_access_mask, + vk::PipelineStageFlags2 src_stage_mask, + vk::PipelineStageFlags2 dst_stage_mask, + vk::ImageAspectFlags image_aspect_flags + ) { + vk::ImageMemoryBarrier2 barrier = { + .srcStageMask = src_stage_mask, + .srcAccessMask = src_access_mask, + .dstStageMask = dst_stage_mask, + .dstAccessMask = dst_access_mask, + .oldLayout = old_layout, + .newLayout = new_layout, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .image = image, + .subresourceRange = { + .aspectMask = image_aspect_flags, + .baseMipLevel = 0, + .levelCount = 1, + .baseArrayLayer = 0, + .layerCount = 1 + } + }; + vk::DependencyInfo dependency_info = { + .dependencyFlags = {}, + .imageMemoryBarrierCount = 1, + .pImageMemoryBarriers = &barrier + }; + commandBuffers[currentFrame].pipelineBarrier2(dependency_info); + } + void createSyncObjects() { imageAvailableSemaphores.reserve(MAX_FRAMES_IN_FLIGHT); renderFinishedSemaphores.reserve(MAX_FRAMES_IN_FLIGHT); diff --git a/attachments/35_gltf_ktx.cpp b/attachments/35_gltf_ktx.cpp index 46c67f4b..a8b98131 100644 --- a/attachments/35_gltf_ktx.cpp +++ b/attachments/35_gltf_ktx.cpp @@ -1181,38 +1181,26 @@ class VulkanApplication { void recordCommandBuffer(uint32_t imageIndex) { commandBuffers[currentFrame].begin({}); transition_image_layout( - imageIndex, + swapChainImages[imageIndex], vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, - vk::AccessFlagBits2::eColorAttachmentWrite, - vk::PipelineStageFlagBits2::eTopOfPipe, - vk::PipelineStageFlagBits2::eColorAttachmentOutput + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // dstStage + vk::ImageAspectFlagBits::eColor + ); + // Transition depth image to depth attachment optimal layout + transition_image_layout( + *depthImage, + vk::ImageLayout::eUndefined, + vk::ImageLayout::eDepthAttachmentOptimal, + vk::AccessFlagBits2::eDepthStencilAttachmentWrite, + vk::AccessFlagBits2::eDepthStencilAttachmentWrite, + vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, + vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, + vk::ImageAspectFlagBits::eDepth ); - vk::ImageMemoryBarrier2 depthBarrier = { - .srcStageMask = vk::PipelineStageFlagBits2::eTopOfPipe, - .srcAccessMask = {}, - .dstStageMask = vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, - .dstAccessMask = vk::AccessFlagBits2::eDepthStencilAttachmentRead | vk::AccessFlagBits2::eDepthStencilAttachmentWrite, - .oldLayout = vk::ImageLayout::eUndefined, - .newLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal, - .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = *depthImage, - .subresourceRange = { - .aspectMask = vk::ImageAspectFlagBits::eDepth, - .baseMipLevel = 0, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = 1 - } - }; - vk::DependencyInfo depthDependencyInfo = { - .dependencyFlags = {}, - .imageMemoryBarrierCount = 1, - .pImageMemoryBarriers = &depthBarrier - }; - commandBuffers[currentFrame].pipelineBarrier2(depthDependencyInfo); vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f); vk::RenderingAttachmentInfo attachmentInfo = { @@ -1246,27 +1234,30 @@ class VulkanApplication { commandBuffers[currentFrame].bindDescriptorSets(vk::PipelineBindPoint::eGraphics, *pipelineLayout, 0, *descriptorSets[currentFrame], nullptr); commandBuffers[currentFrame].drawIndexed(indices.size(), 1, 0, 0, 0); commandBuffers[currentFrame].endRendering(); + // After rendering, transition the swapchain image to PRESENT_SRC transition_image_layout( - imageIndex, + swapChainImages[imageIndex], vk::ImageLayout::eColorAttachmentOptimal, vk::ImageLayout::ePresentSrcKHR, - vk::AccessFlagBits2::eColorAttachmentWrite, - {}, - vk::PipelineStageFlagBits2::eColorAttachmentOutput, - vk::PipelineStageFlagBits2::eBottomOfPipe + vk::AccessFlagBits2::eColorAttachmentWrite, // srcAccessMask + {}, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eBottomOfPipe, // dstStage + vk::ImageAspectFlagBits::eColor ); commandBuffers[currentFrame].end(); } void transition_image_layout( - uint32_t imageIndex, + vk::Image image, vk::ImageLayout old_layout, vk::ImageLayout new_layout, vk::AccessFlags2 src_access_mask, vk::AccessFlags2 dst_access_mask, vk::PipelineStageFlags2 src_stage_mask, - vk::PipelineStageFlags2 dst_stage_mask - ) { + vk::PipelineStageFlags2 dst_stage_mask, + vk::ImageAspectFlags image_aspect_flags + ) { vk::ImageMemoryBarrier2 barrier = { .srcStageMask = src_stage_mask, .srcAccessMask = src_access_mask, @@ -1276,9 +1267,9 @@ class VulkanApplication { .newLayout = new_layout, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = swapChainImages[imageIndex], + .image = image, .subresourceRange = { - .aspectMask = vk::ImageAspectFlagBits::eColor, + .aspectMask = image_aspect_flags, .baseMipLevel = 0, .levelCount = 1, .baseArrayLayer = 0, diff --git a/attachments/36_multiple_objects.cpp b/attachments/36_multiple_objects.cpp index 127cc595..016700ce 100644 --- a/attachments/36_multiple_objects.cpp +++ b/attachments/36_multiple_objects.cpp @@ -1266,39 +1266,28 @@ class VulkanApplication { void recordCommandBuffer(uint32_t imageIndex) { commandBuffers[currentFrame].begin({}); + // Before starting rendering, transition the swapchain image to COLOR_ATTACHMENT_OPTIMAL transition_image_layout( - imageIndex, + swapChainImages[imageIndex], vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, - vk::AccessFlagBits2::eColorAttachmentWrite, - vk::PipelineStageFlagBits2::eTopOfPipe, - vk::PipelineStageFlagBits2::eColorAttachmentOutput + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // dstStage + vk::ImageAspectFlagBits::eColor + ); + // Transition depth image to depth attachment optimal layout + transition_image_layout( + *depthImage, + vk::ImageLayout::eUndefined, + vk::ImageLayout::eDepthAttachmentOptimal, + vk::AccessFlagBits2::eDepthStencilAttachmentWrite, + vk::AccessFlagBits2::eDepthStencilAttachmentWrite, + vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, + vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, + vk::ImageAspectFlagBits::eDepth ); - vk::ImageMemoryBarrier2 depthBarrier = { - .srcStageMask = vk::PipelineStageFlagBits2::eTopOfPipe, - .srcAccessMask = {}, - .dstStageMask = vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, - .dstAccessMask = vk::AccessFlagBits2::eDepthStencilAttachmentRead | vk::AccessFlagBits2::eDepthStencilAttachmentWrite, - .oldLayout = vk::ImageLayout::eUndefined, - .newLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal, - .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = *depthImage, - .subresourceRange = { - .aspectMask = vk::ImageAspectFlagBits::eDepth, - .baseMipLevel = 0, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = 1 - } - }; - vk::DependencyInfo depthDependencyInfo = { - .dependencyFlags = {}, - .imageMemoryBarrierCount = 1, - .pImageMemoryBarriers = &depthBarrier - }; - commandBuffers[currentFrame].pipelineBarrier2(depthDependencyInfo); vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f); vk::RenderingAttachmentInfo attachmentInfo = { @@ -1348,27 +1337,30 @@ class VulkanApplication { } commandBuffers[currentFrame].endRendering(); + // After rendering, transition the swapchain image to PRESENT_SRC transition_image_layout( - imageIndex, + swapChainImages[imageIndex], vk::ImageLayout::eColorAttachmentOptimal, vk::ImageLayout::ePresentSrcKHR, - vk::AccessFlagBits2::eColorAttachmentWrite, - {}, - vk::PipelineStageFlagBits2::eColorAttachmentOutput, - vk::PipelineStageFlagBits2::eBottomOfPipe + vk::AccessFlagBits2::eColorAttachmentWrite, // srcAccessMask + {}, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eBottomOfPipe, // dstStage + vk::ImageAspectFlagBits::eColor ); commandBuffers[currentFrame].end(); } void transition_image_layout( - uint32_t imageIndex, + vk::Image image, vk::ImageLayout old_layout, vk::ImageLayout new_layout, vk::AccessFlags2 src_access_mask, vk::AccessFlags2 dst_access_mask, vk::PipelineStageFlags2 src_stage_mask, - vk::PipelineStageFlags2 dst_stage_mask - ) { + vk::PipelineStageFlags2 dst_stage_mask, + vk::ImageAspectFlags image_aspect_flags + ) { vk::ImageMemoryBarrier2 barrier = { .srcStageMask = src_stage_mask, .srcAccessMask = src_access_mask, @@ -1378,9 +1370,9 @@ class VulkanApplication { .newLayout = new_layout, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = swapChainImages[imageIndex], + .image = image, .subresourceRange = { - .aspectMask = vk::ImageAspectFlagBits::eColor, + .aspectMask = image_aspect_flags, .baseMipLevel = 0, .levelCount = 1, .baseArrayLayer = 0, diff --git a/attachments/37_multithreading.cpp b/attachments/37_multithreading.cpp index 1488714c..2dac43dd 100644 --- a/attachments/37_multithreading.cpp +++ b/attachments/37_multithreading.cpp @@ -949,14 +949,16 @@ class MultithreadedApplication { }; graphicsCommandBuffers[currentFrame].begin(beginInfo); + // Before starting rendering, transition the swapchain image to COLOR_ATTACHMENT_OPTIMAL transition_image_layout( - imageIndex, + swapChainImages[imageIndex], vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, - vk::AccessFlagBits2::eColorAttachmentWrite, - vk::PipelineStageFlagBits2::eTopOfPipe, - vk::PipelineStageFlagBits2::eColorAttachmentOutput + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // dstStage + vk::ImageAspectFlagBits::eColor ); vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f); @@ -983,28 +985,31 @@ class MultithreadedApplication { graphicsCommandBuffers[currentFrame].draw( PARTICLE_COUNT, 1, 0, 0 ); graphicsCommandBuffers[currentFrame].endRendering(); + // After rendering, transition the swapchain image to PRESENT_SRC transition_image_layout( - imageIndex, + swapChainImages[imageIndex], vk::ImageLayout::eColorAttachmentOptimal, vk::ImageLayout::ePresentSrcKHR, - vk::AccessFlagBits2::eColorAttachmentWrite, - {}, - vk::PipelineStageFlagBits2::eColorAttachmentOutput, - vk::PipelineStageFlagBits2::eBottomOfPipe + vk::AccessFlagBits2::eColorAttachmentWrite, // srcAccessMask + {}, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eBottomOfPipe, // dstStage + vk::ImageAspectFlagBits::eColor ); graphicsCommandBuffers[currentFrame].end(); } void transition_image_layout( - uint32_t imageIndex, - vk::ImageLayout old_layout, - vk::ImageLayout new_layout, - vk::AccessFlags2 src_access_mask, - vk::AccessFlags2 dst_access_mask, - vk::PipelineStageFlags2 src_stage_mask, - vk::PipelineStageFlags2 dst_stage_mask - ) { + vk::Image image, + vk::ImageLayout old_layout, + vk::ImageLayout new_layout, + vk::AccessFlags2 src_access_mask, + vk::AccessFlags2 dst_access_mask, + vk::PipelineStageFlags2 src_stage_mask, + vk::PipelineStageFlags2 dst_stage_mask, + vk::ImageAspectFlags image_aspect_flags + ) { vk::ImageMemoryBarrier2 barrier = { .srcStageMask = src_stage_mask, .srcAccessMask = src_access_mask, @@ -1014,9 +1019,9 @@ class MultithreadedApplication { .newLayout = new_layout, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = swapChainImages[imageIndex], + .image = image, .subresourceRange = { - .aspectMask = vk::ImageAspectFlagBits::eColor, + .aspectMask = image_aspect_flags, .baseMipLevel = 0, .levelCount = 1, .baseArrayLayer = 0, diff --git a/attachments/38_ray_tracing.cpp b/attachments/38_ray_tracing.cpp index addc390b..746fa9bb 100644 --- a/attachments/38_ray_tracing.cpp +++ b/attachments/38_ray_tracing.cpp @@ -1556,39 +1556,26 @@ class VulkanRaytracingApplication { commandBuffers[currentFrame].begin({}); // Before starting rendering, transition the swapchain image to COLOR_ATTACHMENT_OPTIMAL transition_image_layout( - imageIndex, + swapChainImages[imageIndex], vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, // srcAccessMask (no need to wait for previous operations) - vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask - vk::PipelineStageFlagBits2::eTopOfPipe, // srcStage - vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // dstStage + vk::ImageAspectFlagBits::eColor ); // Transition depth image to depth attachment optimal layout - vk::ImageMemoryBarrier2 depthBarrier = { - .srcStageMask = vk::PipelineStageFlagBits2::eTopOfPipe, - .srcAccessMask = {}, - .dstStageMask = vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, - .dstAccessMask = vk::AccessFlagBits2::eDepthStencilAttachmentRead | vk::AccessFlagBits2::eDepthStencilAttachmentWrite, - .oldLayout = vk::ImageLayout::eUndefined, - .newLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal, - .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = depthImage, - .subresourceRange = { - .aspectMask = vk::ImageAspectFlagBits::eDepth, - .baseMipLevel = 0, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = 1 - } - }; - vk::DependencyInfo depthDependencyInfo = { - .dependencyFlags = {}, - .imageMemoryBarrierCount = 1, - .pImageMemoryBarriers = &depthBarrier - }; - commandBuffers[currentFrame].pipelineBarrier2(depthDependencyInfo); + transition_image_layout( + *depthImage, + vk::ImageLayout::eUndefined, + vk::ImageLayout::eDepthAttachmentOptimal, + vk::AccessFlagBits2::eDepthStencilAttachmentWrite, + vk::AccessFlagBits2::eDepthStencilAttachmentWrite, + vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, + vk::PipelineStageFlagBits2::eEarlyFragmentTests | vk::PipelineStageFlagBits2::eLateFragmentTests, + vk::ImageAspectFlagBits::eDepth + ); vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f); vk::ClearValue clearDepth = vk::ClearDepthStencilValue(1.0f, 0); @@ -1654,27 +1641,29 @@ class VulkanRaytracingApplication { // After rendering, transition the swapchain image to PRESENT_SRC transition_image_layout( - imageIndex, + swapChainImages[imageIndex], vk::ImageLayout::eColorAttachmentOptimal, vk::ImageLayout::ePresentSrcKHR, - vk::AccessFlagBits2::eColorAttachmentWrite, // srcAccessMask - {}, // dstAccessMask - vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage - vk::PipelineStageFlagBits2::eBottomOfPipe // dstStage + vk::AccessFlagBits2::eColorAttachmentWrite, // srcAccessMask + {}, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eBottomOfPipe, // dstStage + vk::ImageAspectFlagBits::eColor ); commandBuffers[currentFrame].end(); } void transition_image_layout( - uint32_t imageIndex, + vk::Image image, vk::ImageLayout old_layout, vk::ImageLayout new_layout, vk::AccessFlags2 src_access_mask, vk::AccessFlags2 dst_access_mask, vk::PipelineStageFlags2 src_stage_mask, - vk::PipelineStageFlags2 dst_stage_mask - ) { + vk::PipelineStageFlags2 dst_stage_mask, + vk::ImageAspectFlags image_aspect_flags + ) { vk::ImageMemoryBarrier2 barrier = { .srcStageMask = src_stage_mask, .srcAccessMask = src_access_mask, @@ -1684,9 +1673,9 @@ class VulkanRaytracingApplication { .newLayout = new_layout, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = swapChainImages[imageIndex], + .image = image, .subresourceRange = { - .aspectMask = vk::ImageAspectFlagBits::eColor, + .aspectMask = image_aspect_flags, .baseMipLevel = 0, .levelCount = 1, .baseArrayLayer = 0, diff --git a/en/03_Drawing_a_triangle/03_Drawing/00_Framebuffers.adoc b/en/03_Drawing_a_triangle/03_Drawing/00_Framebuffers.adoc index 2edcdd07..c5456836 100644 --- a/en/03_Drawing_a_triangle/03_Drawing/00_Framebuffers.adoc +++ b/en/03_Drawing_a_triangle/03_Drawing/00_Framebuffers.adoc @@ -31,7 +31,7 @@ void recordCommandBuffer(uint32_t imageIndex) { vk::ImageLayout::eColorAttachmentOptimal, {}, vk::AccessFlagBits2::eColorAttachmentWrite, - vk::PipelineStageFlagBits2::eTopOfPipe, + vk::PipelineStageFlagBits2::eColorAttachmentOutput, vk::PipelineStageFlagBits2::eColorAttachmentOutput ); diff --git a/en/03_Drawing_a_triangle/03_Drawing/01_Command_buffers.adoc b/en/03_Drawing_a_triangle/03_Drawing/01_Command_buffers.adoc index 8007e17f..b51c5f96 100644 --- a/en/03_Drawing_a_triangle/03_Drawing/01_Command_buffers.adoc +++ b/en/03_Drawing_a_triangle/03_Drawing/01_Command_buffers.adoc @@ -216,10 +216,10 @@ transition_image_layout( imageIndex, vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal, - {}, // srcAccessMask (no need to wait for previous operations) - vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask - vk::PipelineStageFlagBits2::eTopOfPipe, // srcStage - vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage + {}, // srcAccessMask (no need to wait for previous operations) + vk::AccessFlagBits2::eColorAttachmentWrite, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eColorAttachmentOutput // dstStage ); ---- @@ -318,10 +318,10 @@ transition_image_layout( imageIndex, vk::ImageLayout::eColorAttachmentOptimal, vk::ImageLayout::ePresentSrcKHR, - vk::AccessFlagBits2::eColorAttachmentWrite, // srcAccessMask - {}, // dstAccessMask - vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage - vk::PipelineStageFlagBits2::eBottomOfPipe // dstStage + vk::AccessFlagBits2::eColorAttachmentWrite, // srcAccessMask + {}, // dstAccessMask + vk::PipelineStageFlagBits2::eColorAttachmentOutput, // srcStage + vk::PipelineStageFlagBits2::eBottomOfPipe // dstStage ); ----