// 1. Depth Pre-Pass
commandBuffer.beginRendering(depthPrePassInfo);
// ... record depth draw calls ...
commandBuffer.endRendering();
// 2. Synchronization Barrier
auto depthBarrier = vk::ImageMemoryBarrier2{
.srcStageMask = vk::PipelineStageFlagBits2::eLateFragmentTests,
.srcAccessMask = vk::AccessFlagBits2::eDepthStencilAttachmentWrite,
.dstStageMask = vk::PipelineStageFlagBits2::eEarlyFragmentTests,
.dstAccessMask = vk::AccessFlagBits2::eDepthStencilAttachmentRead,
.oldLayout = vk::ImageLayout::eDepthAttachmentOptimal,
.newLayout = vk::ImageLayout::eDepthAttachmentOptimal, // No layout change needed
.image = depthBuffer.image(),
.subresourceRange = subresourceRange
};
commandBuffer.pipelineBarrier2(vk::DependencyInfo{.imageMemoryBarrierCount = 1, .pImageMemoryBarriers = &depthBarrier});
// 3. Main Pass
commandBuffer.beginRendering(mainPassInfo);
// ... record main draw calls ...
commandBuffer.endRendering();