summaryrefslogtreecommitdiff
path: root/hk21/vulkan/sync/sync.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'hk21/vulkan/sync/sync.hpp')
-rw-r--r--hk21/vulkan/sync/sync.hpp64
1 files changed, 64 insertions, 0 deletions
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 <asl/base/integers.hpp>
+#include <asl/base/utility.hpp>
+#include <asl/types/span.hpp>
+#include <vulkan.h>
+
+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