From 7ec394db8961009e6ac23fea909f8353d865f7a3 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Fri, 9 May 2025 00:32:33 +0200 Subject: Add and use Vulkan synchronization library --- hk21/vulkan/sync/sync.hpp | 64 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 hk21/vulkan/sync/sync.hpp (limited to 'hk21/vulkan/sync/sync.hpp') diff --git a/hk21/vulkan/sync/sync.hpp b/hk21/vulkan/sync/sync.hpp new file mode 100644 index 0000000..b89b625 --- /dev/null +++ b/hk21/vulkan/sync/sync.hpp @@ -0,0 +1,64 @@ +// Copyright 2025 Steven Le Rouzic +// +// SPDX-License-Identifier: BSD-3-Clause + +#pragma once + +#include +#include +#include +#include + +namespace vulkan_sync +{ + +class DependencyInfoBuilder +{ +public: + DependencyInfoBuilder() = default; + ASL_DEFAULT_COPY_MOVE(DependencyInfoBuilder); + virtual ~DependencyInfoBuilder() = default; + + virtual void add_image_barrier(const VkImageMemoryBarrier2&) = 0; + virtual void add_buffer_barrier(const VkBufferMemoryBarrier2&) = 0; +}; + +struct ResourceState +{ + VkAccessFlags2 last_writer_access_mask{}; + VkPipelineStageFlags2 last_writer_pipeline_stage_mask{}; + + VkAccessFlags2 active_readers_access_mask{}; + VkPipelineStageFlags2 active_readers_pipeline_stage_mask{}; + + // Which StageAccess-es have seen the previous write. + uint32_t has_seen_last_write{}; +}; + +struct BufferState : public ResourceState {}; + +struct ImageState : public ResourceState +{ + VkImageLayout current_layout = VK_IMAGE_LAYOUT_UNDEFINED; +}; + +enum class Usage : uint32_t +{ + kImageClear, + kImagePresent, + kImageSampledInFragmentShader, + kImageSampledInVertexShader, + kImageColorWriteAttachment, + + kCount_, +}; + +void synchronize_resource( + VkImage, VkImageAspectFlags, + ImageState*, Usage new_usage, DependencyInfoBuilder*); + +void synchronize_resource( + VkBuffer, BufferState*, + Usage new_usage, DependencyInfoBuilder*); + +} // namespace vulkan_sync -- cgit