// 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