From 9ca5751a789c8bf9cfd360cadad69599b15e4e7d Mon Sep 17 00:00:00 2001 From: Anish Bhobe Date: Sun, 23 Feb 2025 12:28:57 +0100 Subject: [PATCH] Fix sync issues in Triangle. --- samples/01_triangle/triangle.cpp | 37 +++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/samples/01_triangle/triangle.cpp b/samples/01_triangle/triangle.cpp index 0f8af1b..52ea71c 100644 --- a/samples/01_triangle/triangle.cpp +++ b/samples/01_triangle/triangle.cpp @@ -10,9 +10,9 @@ #include "aster/core/context.h" #include "aster/core/device.h" #include "aster/core/physical_device.h" -#include "aster/core/window.h" #include "aster/core/pipeline.h" #include "aster/core/swapchain.h" +#include "aster/core/window.h" #include "helpers.h" @@ -83,7 +83,10 @@ main(int, char **) INFO("Using {} as the primary device.", deviceToUse.m_DeviceProperties.deviceName.data()); - Features enabledDeviceFeatures = {.m_Vulkan13Features = {.dynamicRendering = true}}; + Features enabledDeviceFeatures = { + .m_Vulkan12Features = {.bufferDeviceAddress = true}, + .m_Vulkan13Features = {.synchronization2 = true, .dynamicRendering = true}, + }; QueueAllocation queueAllocation = FindAppropriateQueueAllocation(&deviceToUse); Device device = {&context, &deviceToUse, &enabledDeviceFeatures, {queueAllocation}, "Primary Device"}; vk::Queue commandQueue = device.GetQueue(queueAllocation.m_Family, 0); @@ -176,24 +179,40 @@ main(int, char **) .baseArrayLayer = 0, .layerCount = 1, }; - vk::ImageMemoryBarrier topOfThePipeBarrier = { + vk::ImageMemoryBarrier2 topOfThePipeBarrier = { + .srcStageMask = vk::PipelineStageFlagBits2::eColorAttachmentOutput, + .srcAccessMask = vk::AccessFlagBits2::eNone, + .dstStageMask = vk::PipelineStageFlagBits2::eColorAttachmentOutput, + .dstAccessMask = vk::AccessFlagBits2::eColorAttachmentWrite, .oldLayout = vk::ImageLayout::eUndefined, .newLayout = vk::ImageLayout::eColorAttachmentOptimal, .srcQueueFamilyIndex = queueAllocation.m_Family, .dstQueueFamilyIndex = queueAllocation.m_Family, .subresourceRange = subresourceRange, }; - vk::ImageMemoryBarrier renderToPresentBarrier = { + vk::DependencyInfo topOfThePipeDependency = { + .imageMemoryBarrierCount = 1, + .pImageMemoryBarriers = &topOfThePipeBarrier, + }; + vk::ImageMemoryBarrier2 renderToPresentBarrier = { + .srcStageMask = vk::PipelineStageFlagBits2::eColorAttachmentOutput, + .srcAccessMask = vk::AccessFlagBits2::eColorAttachmentWrite, + .dstStageMask = vk::PipelineStageFlagBits2::eBottomOfPipe, + .dstAccessMask = vk::AccessFlagBits2::eNone, .oldLayout = vk::ImageLayout::eColorAttachmentOptimal, .newLayout = vk::ImageLayout::ePresentSrcKHR, .srcQueueFamilyIndex = queueAllocation.m_Family, .dstQueueFamilyIndex = queueAllocation.m_Family, .subresourceRange = subresourceRange, }; + vk::DependencyInfo renderToPresentDependency = { + .imageMemoryBarrierCount = 1, + .pImageMemoryBarriers = &renderToPresentBarrier, + }; // Frames eastl::fixed_vector frames; - for (int i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) + for (u32 i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) { frames.emplace_back(&device, queueAllocation.m_Family, i); } @@ -250,8 +269,7 @@ main(int, char **) ERROR_IF(Failed(result), "Command buffer begin failed. Cause: {}", result) THEN_ABORT(result); - cmd.pipelineBarrier(vk::PipelineStageFlagBits::eTopOfPipe, vk::PipelineStageFlagBits::eColorAttachmentOutput, - {}, 0, nullptr, 0, nullptr, 1, &topOfThePipeBarrier); + cmd.pipelineBarrier2(&topOfThePipeDependency); // Render vk::RenderingAttachmentInfo attachmentInfo = { @@ -260,7 +278,7 @@ main(int, char **) .resolveMode = vk::ResolveModeFlagBits::eNone, .loadOp = vk::AttachmentLoadOp::eClear, .storeOp = vk::AttachmentStoreOp::eStore, - .clearValue = vk::ClearColorValue{0.0f, 0.0f, 0.0f, 1.0f}, + .clearValue = vk::ClearColorValue{0.0f, 0.0f, 0.0f, 0.0f}, }; vk::RenderingInfo renderingInfo = { @@ -281,8 +299,7 @@ main(int, char **) cmd.endRendering(); - cmd.pipelineBarrier(vk::PipelineStageFlagBits::eColorAttachmentOutput, vk::PipelineStageFlagBits::eBottomOfPipe, - {}, 0, nullptr, 0, nullptr, 1, &renderToPresentBarrier); + cmd.pipelineBarrier2(&renderToPresentDependency); result = cmd.end(); ERROR_IF(Failed(result), "Command buffer end failed. Cause: {}", result)