65 lines
1.5 KiB
C++
65 lines
1.5 KiB
C++
// 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
|