Fix sync issues in Triangle.

This commit is contained in:
Anish Bhobe 2025-02-23 12:28:57 +01:00
parent 15df13730d
commit 9ca5751a78
1 changed files with 27 additions and 10 deletions

View File

@ -10,9 +10,9 @@
#include "aster/core/context.h" #include "aster/core/context.h"
#include "aster/core/device.h" #include "aster/core/device.h"
#include "aster/core/physical_device.h" #include "aster/core/physical_device.h"
#include "aster/core/window.h"
#include "aster/core/pipeline.h" #include "aster/core/pipeline.h"
#include "aster/core/swapchain.h" #include "aster/core/swapchain.h"
#include "aster/core/window.h"
#include "helpers.h" #include "helpers.h"
@ -83,7 +83,10 @@ main(int, char **)
INFO("Using {} as the primary device.", deviceToUse.m_DeviceProperties.deviceName.data()); 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); QueueAllocation queueAllocation = FindAppropriateQueueAllocation(&deviceToUse);
Device device = {&context, &deviceToUse, &enabledDeviceFeatures, {queueAllocation}, "Primary Device"}; Device device = {&context, &deviceToUse, &enabledDeviceFeatures, {queueAllocation}, "Primary Device"};
vk::Queue commandQueue = device.GetQueue(queueAllocation.m_Family, 0); vk::Queue commandQueue = device.GetQueue(queueAllocation.m_Family, 0);
@ -176,24 +179,40 @@ main(int, char **)
.baseArrayLayer = 0, .baseArrayLayer = 0,
.layerCount = 1, .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, .oldLayout = vk::ImageLayout::eUndefined,
.newLayout = vk::ImageLayout::eColorAttachmentOptimal, .newLayout = vk::ImageLayout::eColorAttachmentOptimal,
.srcQueueFamilyIndex = queueAllocation.m_Family, .srcQueueFamilyIndex = queueAllocation.m_Family,
.dstQueueFamilyIndex = queueAllocation.m_Family, .dstQueueFamilyIndex = queueAllocation.m_Family,
.subresourceRange = subresourceRange, .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, .oldLayout = vk::ImageLayout::eColorAttachmentOptimal,
.newLayout = vk::ImageLayout::ePresentSrcKHR, .newLayout = vk::ImageLayout::ePresentSrcKHR,
.srcQueueFamilyIndex = queueAllocation.m_Family, .srcQueueFamilyIndex = queueAllocation.m_Family,
.dstQueueFamilyIndex = queueAllocation.m_Family, .dstQueueFamilyIndex = queueAllocation.m_Family,
.subresourceRange = subresourceRange, .subresourceRange = subresourceRange,
}; };
vk::DependencyInfo renderToPresentDependency = {
.imageMemoryBarrierCount = 1,
.pImageMemoryBarriers = &renderToPresentBarrier,
};
// Frames // Frames
eastl::fixed_vector<Frame, MAX_FRAMES_IN_FLIGHT> frames; eastl::fixed_vector<Frame, MAX_FRAMES_IN_FLIGHT> 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); 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) ERROR_IF(Failed(result), "Command buffer begin failed. Cause: {}", result)
THEN_ABORT(result); THEN_ABORT(result);
cmd.pipelineBarrier(vk::PipelineStageFlagBits::eTopOfPipe, vk::PipelineStageFlagBits::eColorAttachmentOutput, cmd.pipelineBarrier2(&topOfThePipeDependency);
{}, 0, nullptr, 0, nullptr, 1, &topOfThePipeBarrier);
// Render // Render
vk::RenderingAttachmentInfo attachmentInfo = { vk::RenderingAttachmentInfo attachmentInfo = {
@ -260,7 +278,7 @@ main(int, char **)
.resolveMode = vk::ResolveModeFlagBits::eNone, .resolveMode = vk::ResolveModeFlagBits::eNone,
.loadOp = vk::AttachmentLoadOp::eClear, .loadOp = vk::AttachmentLoadOp::eClear,
.storeOp = vk::AttachmentStoreOp::eStore, .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 = { vk::RenderingInfo renderingInfo = {
@ -281,8 +299,7 @@ main(int, char **)
cmd.endRendering(); cmd.endRendering();
cmd.pipelineBarrier(vk::PipelineStageFlagBits::eColorAttachmentOutput, vk::PipelineStageFlagBits::eBottomOfPipe, cmd.pipelineBarrier2(&renderToPresentDependency);
{}, 0, nullptr, 0, nullptr, 1, &renderToPresentBarrier);
result = cmd.end(); result = cmd.end();
ERROR_IF(Failed(result), "Command buffer end failed. Cause: {}", result) ERROR_IF(Failed(result), "Command buffer end failed. Cause: {}", result)