diff options
Diffstat (limited to 'hk21/vulkan/sync/sync.hpp')
-rw-r--r-- | hk21/vulkan/sync/sync.hpp | 64 |
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 |