Plasma Engine  2.0
Loading...
Searching...
No Matches
PipelineBarrierVulkan.h
1#pragma once
2
3#include <RendererVulkan/RendererVulkanDLL.h>
4
5#include <Foundation/Containers/Bitfield.h>
6
7#include <vulkan/vulkan.hpp>
8
16
18class PL_RENDERERVULKAN_DLL plPipelineBarrierVulkan
19{
20public:
22
25
27 void SetCommandBuffer(vk::CommandBuffer* pCommandBuffer);
28
30 void Flush();
31
33 void Submit();
34
36 void FullBarrier();
37
38 bool IsDirty() const;
39
43
45 void BufferDestroyed(const plGALBufferVulkan* pBuffer);
46
47 void AccessBuffer(const plGALBufferVulkan* pBuffer, vk::DeviceSize offset, vk::DeviceSize length, vk::PipelineStageFlags srcStages, vk::AccessFlags srcAccess, vk::PipelineStageFlags dstStages, vk::AccessFlags dstAccess);
48 bool IsDirty(vk::Buffer buffer, vk::DeviceSize offset, vk::DeviceSize length, vk::AccessFlags dstAccess);
52
58 void SetInitialImageState(const plGALTextureVulkan* pTexture, vk::ImageLayout dstLayout, vk::PipelineStageFlags dstStages = vk::PipelineStageFlagBits::eTopOfPipe, vk::AccessFlags dstAccess = {});
59
61 void TextureDestroyed(const plGALTextureVulkan* pTexture);
62
69 void EnsureImageLayout(const plGALTextureVulkan* pTexture, vk::ImageLayout dstLayout, vk::PipelineStageFlags dstStages, vk::AccessFlags dstAccess, bool bDiscardSource = false);
70 void EnsureImageLayout(const plGALRenderTargetViewVulkan* pTextureView, vk::ImageLayout dstLayout, vk::PipelineStageFlags dstStages, vk::AccessFlags dstAccess, bool bDiscardSource = false);
71 void EnsureImageLayout(const plGALTextureResourceViewVulkan* pTextureView, vk::ImageLayout dstLayout, vk::PipelineStageFlags dstStages, vk::AccessFlags dstAccess, bool bDiscardSource = false);
72 void EnsureImageLayout(const plGALTextureUnorderedAccessViewVulkan* pTextureView, vk::ImageLayout dstLayout, vk::PipelineStageFlags dstStages, vk::AccessFlags dstAccess, bool bDiscardSource = false);
73 void EnsureImageLayout(const plGALTextureVulkan* pTexture, vk::ImageSubresourceRange subResources, vk::ImageLayout dstLayout, vk::PipelineStageFlags dstStages, vk::AccessFlags dstAccess, bool bDiscardSource = false);
74
75 bool IsDirty(vk::Image image, const vk::ImageSubresourceRange& subResources) const;
77
78private:
79 struct SubElementState
80 {
81 vk::PipelineStageFlags m_stages;
82 vk::AccessFlags m_accessMask;
83 vk::ImageLayout m_layout;
84
85 bool operator==(const SubElementState& rhs) const
86 {
87 return m_stages == rhs.m_stages && m_accessMask == rhs.m_accessMask && m_layout == rhs.m_layout;
88 }
89 };
90
91 struct ImageState
92 {
93 const plGALTextureVulkan* m_pTexture = nullptr;
95 plHybridArray<SubElementState, 1> m_subElementLayout;
96 };
97
98 struct SubBufferState
99 {
100 vk::DeviceSize m_offset;
101 vk::DeviceSize m_length;
102 vk::PipelineStageFlags m_stages;
103 vk::AccessFlags m_accessMask;
104 };
105
106 struct BufferState
107 {
108 const plGALBufferVulkan* m_pBuffer = nullptr;
110 plHybridArray<SubBufferState, 1> m_subBufferState;
111 };
112
113 bool AddBufferBarrierInternal(vk::Buffer buffer, vk::DeviceSize offset, vk::DeviceSize length,
114 vk::PipelineStageFlags srcStages, vk::AccessFlags srcAccess,
115 vk::PipelineStageFlags dstStages, vk::AccessFlags dstAccess);
116 bool IsDirtyInternal(const BufferState& state, const SubBufferState& subState) const;
117
118 bool AddImageBarrierInternal(vk::Image image, const vk::ImageSubresourceRange& subResources,
119 vk::ImageLayout srcLayout, vk::AccessFlags srcAccess,
120 vk::ImageLayout dstLayout, vk::AccessFlags dstAccess, bool bDiscardSource);
121 bool IsDirtyInternal(const ImageState& state, const vk::ImageSubresourceRange& subResources) const;
122
123private:
124 static constexpr vk::AccessFlags s_readAccess = vk::AccessFlagBits::eIndirectCommandRead | vk::AccessFlagBits::eIndexRead |
125 vk::AccessFlagBits::eVertexAttributeRead | vk::AccessFlagBits::eUniformRead |
126 vk::AccessFlagBits::eInputAttachmentRead | vk::AccessFlagBits::eShaderRead |
127 vk::AccessFlagBits::eColorAttachmentRead | vk::AccessFlagBits::eDepthStencilAttachmentRead |
128 vk::AccessFlagBits::eTransferRead | vk::AccessFlagBits::eHostRead |
129 vk::AccessFlagBits::eMemoryRead // | vk::AccessFlagBits::eTransformFeedbackCounterReadEXT |
130 // vk::AccessFlagBits::eConditionalRenderingReadEXT | vk::AccessFlagBits::eColorAttachmentReadNoncoherentEXT |
131 // vk::AccessFlagBits::eAccelerationStructureReadKHR | vk::AccessFlagBits::eFragmentDensityMapReadEXT |
132 // vk::AccessFlagBits::eFragmentShadingRateAttachmentReadKHR | vk::AccessFlagBits::eCommandPreprocessReadNV |
133 // vk::AccessFlagBits::eAccelerationStructureReadKHR | vk::AccessFlagBits::eFragmentDensityMapReadEXT |
134 /*vk::AccessFlagBits::eFragmentShadingRateAttachmentReadKHR | vk::AccessFlagBits::eCommandPreprocessReadNV*/;
135 static constexpr vk::AccessFlags s_writeAccess = vk::AccessFlagBits::eShaderWrite | vk::AccessFlagBits::eColorAttachmentWrite |
136 vk::AccessFlagBits::eDepthStencilAttachmentWrite | vk::AccessFlagBits::eTransferWrite |
137 vk::AccessFlagBits::eHostWrite | vk::AccessFlagBits::eMemoryWrite
138 // vk::AccessFlagBits::eTransformFeedbackWriteEXT | vk::AccessFlagBits::eTransformFeedbackCounterWriteEXT |
139 /*vk::AccessFlagBits::eAccelerationStructureWriteKHR | vk::AccessFlagBits::eCommandPreprocessWriteNV*/;
140
141 vk::CommandBuffer* m_pCommandBuffer = nullptr;
142
143 vk::PipelineStageFlags m_srcStageMask;
144 vk::PipelineStageFlags m_dstStageMask;
145
146 vk::AccessFlags m_srcAccess;
147 vk::AccessFlags m_dstAccess;
148
151
152 plMap<vk::Image, ImageState> m_imageState;
153 plMap<vk::Buffer, BufferState> m_bufferState;
154};
Base class for all memory allocators.
Definition Allocator.h:23
A template interface, that turns any array class into a bitfield.
Definition Bitfield.h:17
Definition ResourceViewVulkan.h:33
Definition UnorderedAccessViewVulkan.h:34
Definition BufferVulkan.h:11
Definition RenderTargetViewVulkan.h:11
Definition ResourceViewVulkan.h:12
Definition UnorderedAccessViewVulkan.h:11
Definition TextureVulkan.h:11
A hybrid array uses in-place storage to handle the first few elements without any allocation....
Definition HybridArray.h:12
Definition Map.h:408
Definition PipelineBarrierVulkan.h:19