Diligent Engine  v.2.4.g
PipelineResourceSignatureVkImpl.hpp
Go to the documentation of this file.
1 /*
2  * Copyright 2019-2021 Diligent Graphics LLC
3  * Copyright 2015-2019 Egor Yusov
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * In no event and under no legal theory, whether in tort (including negligence),
18  * contract, or otherwise, unless required by applicable law (such as deliberate
19  * and grossly negligent acts) or agreed to in writing, shall any Contributor be
20  * liable for any damages, including any direct, indirect, special, incidental,
21  * or consequential damages of any character arising as a result of this License or
22  * out of the use or inability to use the software (including but not limited to damages
23  * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
24  * all other commercial damages or losses), even if such Contributor has been advised
25  * of the possibility of such damages.
26  */
27 
28 #pragma once
29 
32 
33 #include <array>
34 
35 #include "EngineVkImplTraits.hpp"
37 
38 // ShaderVariableManagerVk, ShaderResourceCacheVk, and ShaderResourceBindingVkImpl
39 // are required by PipelineResourceSignatureBase
43 
46 #include "SRBMemoryAllocator.hpp"
47 
48 namespace Diligent
49 {
50 
51 struct SPIRVShaderResourceAttribs;
52 
54 class PipelineResourceSignatureVkImpl final : public PipelineResourceSignatureBase<EngineVkImplTraits>
55 {
56 public:
58 
60 
61  // Descriptor set identifier (this is not the descriptor set index in the set layout!)
62  enum DESCRIPTOR_SET_ID : size_t
63  {
64  // Static/mutable variables descriptor set id
66 
67  // Dynamic variables descriptor set id
69 
71  };
72 
73  // Static/mutable and dynamic descriptor sets
75 
76  static_assert(ResourceAttribs::MaxDescriptorSets >= MAX_DESCRIPTOR_SETS, "Not enough bits to store descriptor set index");
77 
79  RenderDeviceVkImpl* pDevice,
81  bool bIsDeviceInternal = false);
83 
84  Uint32 GetDynamicOffsetCount() const { return m_DynamicUniformBufferCount + m_DynamicStorageBufferCount; }
85  Uint32 GetDynamicUniformBufferCount() const { return m_DynamicUniformBufferCount; }
86  Uint32 GetDynamicStorageBufferCount() const { return m_DynamicStorageBufferCount; }
88  {
89  static_assert(DESCRIPTOR_SET_ID_NUM_SETS == 2, "Please update this method with new descriptor set id");
91  }
92 
93  const ResourceAttribs& GetResourceAttribs(Uint32 ResIndex) const
94  {
95  VERIFY_EXPR(ResIndex < m_Desc.NumResources);
96  return m_pResourceAttribs[ResIndex];
97  }
98 
100  {
102 
105  };
106 
108  {
110  return m_ImmutableSamplers[SampIndex];
111  }
112 
113  VkDescriptorSetLayout GetVkDescriptorSetLayout(DESCRIPTOR_SET_ID SetId) const { return m_VkDescrSetLayouts[SetId]; }
114 
115  bool HasDescriptorSet(DESCRIPTOR_SET_ID SetId) const { return m_VkDescrSetLayouts[SetId] != VK_NULL_HANDLE; }
116 
117  void InitSRBResourceCache(ShaderResourceCacheVk& ResourceCache);
118 
119  // Copies static resources from the static resource cache to the destination cache
120  void CopyStaticResources(ShaderResourceCacheVk& ResourceCache) const;
121 
122  // Commits dynamic resources from ResourceCache to vkDynamicDescriptorSet
123  void CommitDynamicResources(const ShaderResourceCacheVk& ResourceCache,
124  VkDescriptorSet vkDynamicDescriptorSet) const;
125 
126 #ifdef DILIGENT_DEVELOPMENT
127  bool DvpValidateCommittedResource(const SPIRVShaderResourceAttribs& SPIRVAttribs,
129  Uint32 ResIndex,
130  const ShaderResourceCacheVk& ResourceCache,
131  const char* ShaderName,
132  const char* PSOName) const;
133 #endif
134 
135  // Returns the descriptor set index in the resource cache
136  template <DESCRIPTOR_SET_ID SetId>
138 
139 private:
140  // Resource cache group identifier
141  enum CACHE_GROUP : size_t
142  {
143  CACHE_GROUP_DYN_UB = 0, // Uniform buffer with dynamic offset
144  CACHE_GROUP_DYN_SB, // Storage buffer with dynamic offset
145  CACHE_GROUP_OTHER, // Other resource type
146  CACHE_GROUP_COUNT_PER_VAR_TYPE, // Cache group count per shader variable type
147 
148  CACHE_GROUP_DYN_UB_STAT_VAR = CACHE_GROUP_DYN_UB, // Uniform buffer with dynamic offset, static variable
149  CACHE_GROUP_DYN_SB_STAT_VAR = CACHE_GROUP_DYN_SB, // Storage buffer with dynamic offset, static variable
150  CACHE_GROUP_OTHER_STAT_VAR = CACHE_GROUP_OTHER, // Other resource type, static variable
151 
152  CACHE_GROUP_DYN_UB_DYN_VAR, // Uniform buffer with dynamic offset, dynamic variable
153  CACHE_GROUP_DYN_SB_DYN_VAR, // Storage buffer with dynamic offset, dynamic variable
154  CACHE_GROUP_OTHER_DYN_VAR, // Other resource type, dynamic variable
155 
156  CACHE_GROUP_COUNT
157  };
158  static_assert(CACHE_GROUP_COUNT == CACHE_GROUP_COUNT_PER_VAR_TYPE * MAX_DESCRIPTOR_SETS, "Inconsistent cache group count");
159 
160  using CacheOffsetsType = std::array<Uint32, CACHE_GROUP_COUNT>; // [dynamic uniform buffers, dynamic storage buffers, other] x [descriptor sets] including ArraySize
161  using BindingCountType = std::array<Uint32, CACHE_GROUP_COUNT>; // [dynamic uniform buffers, dynamic storage buffers, other] x [descriptor sets] not counting ArraySize
162 
163  void Destruct();
164 
165  void CreateSetLayouts();
166 
167  static inline CACHE_GROUP GetResourceCacheGroup(const PipelineResourceDesc& Res);
168  static inline DESCRIPTOR_SET_ID VarTypeToDescriptorSetId(SHADER_RESOURCE_VARIABLE_TYPE VarType);
169 
170 private:
171  std::array<VulkanUtilities::DescriptorSetLayoutWrapper, DESCRIPTOR_SET_ID_NUM_SETS> m_VkDescrSetLayouts;
172 
173  // Descriptor set sizes indexed by the set index in the layout (not DESCRIPTOR_SET_ID!)
174  std::array<Uint32, MAX_DESCRIPTOR_SETS> m_DescriptorSetSizes = {~0U, ~0U};
175 
176  ResourceAttribs* m_pResourceAttribs = nullptr; // [m_Desc.NumResources]
177 
178  // The total number of uniform buffers with dynamic offsets in both descriptor sets,
179  // accounting for array size.
180  Uint16 m_DynamicUniformBufferCount = 0;
181  // The total number storage buffers with dynamic offsets in both descriptor sets,
182  // accounting for array size.
183  Uint16 m_DynamicStorageBufferCount = 0;
184 
185  ImmutableSamplerAttribs* m_ImmutableSamplers = nullptr; // [m_Desc.NumImmutableSamplers]
186 };
187 
188 template <> Uint32 PipelineResourceSignatureVkImpl::GetDescriptorSetIndex<PipelineResourceSignatureVkImpl::DESCRIPTOR_SET_ID_STATIC_MUTABLE>() const;
189 template <> Uint32 PipelineResourceSignatureVkImpl::GetDescriptorSetIndex<PipelineResourceSignatureVkImpl::DESCRIPTOR_SET_ID_DYNAMIC>() const;
190 
191 } // namespace Diligent
ShaderVariableManagerVk.hpp
Diligent::IReferenceCounters
Base interface for a reference counter object that stores the number of strong and weak references an...
Definition: ReferenceCounters.h:44
Diligent::RenderDeviceVkImpl
Render device implementation in Vulkan backend.
Definition: RenderDeviceVkImpl.hpp:58
Diligent::PipelineResourceAttribsVk::MaxDescriptorSets
static constexpr Uint32 MaxDescriptorSets
Definition: PipelineResourceAttribsVk.hpp:84
Diligent::PipelineResourceSignatureVkImpl::DESCRIPTOR_SET_ID_NUM_SETS
@ DESCRIPTOR_SET_ID_NUM_SETS
Definition: PipelineResourceSignatureVkImpl.hpp:70
Diligent::PipelineResourceSignatureVkImpl::ImmutableSamplerAttribs
Definition: PipelineResourceSignatureVkImpl.hpp:99
Diligent::PipelineResourceSignatureDesc
Pipeline resource signature description.
Definition: PipelineResourceSignature.h:166
Diligent::PipelineResourceSignatureVkImpl::GetNumDescriptorSets
Uint32 GetNumDescriptorSets() const
Definition: PipelineResourceSignatureVkImpl.hpp:87
Diligent::PipelineResourceSignatureVkImpl::GetImmutableSamplerAttribs
const ImmutableSamplerAttribs & GetImmutableSamplerAttribs(Uint32 SampIndex) const
Definition: PipelineResourceSignatureVkImpl.hpp:107
Diligent::SPIRVShaderResourceAttribs
Definition: SPIRVShaderResources.hpp:59
Diligent::PipelineResourceSignatureVkImpl::CommitDynamicResources
void CommitDynamicResources(const ShaderResourceCacheVk &ResourceCache, VkDescriptorSet vkDynamicDescriptorSet) const
Definition: PipelineResourceSignatureVkImpl.cpp:604
Diligent::DeviceObjectBase< EngineVkImplTraits ::PipelineResourceSignatureInterface, EngineVkImplTraits ::RenderDeviceImplType, PipelineResourceSignatureDesc >::m_Desc
PipelineResourceSignatureDesc m_Desc
Object description.
Definition: DeviceObjectBase.hpp:182
Diligent::PipelineResourceSignatureVkImpl::DESCRIPTOR_SET_ID
DESCRIPTOR_SET_ID
Definition: PipelineResourceSignatureVkImpl.hpp:62
Diligent::PipelineResourceSignatureVkImpl::ImmutableSamplerAttribs::DescrSet
Uint32 DescrSet
Definition: PipelineResourceSignatureVkImpl.hpp:103
Diligent::PipelineResourceSignatureVkImpl::ResourceAttribs
PipelineResourceAttribsVk ResourceAttribs
Definition: PipelineResourceSignatureVkImpl.hpp:59
Diligent::ShaderResourceCacheVk
Definition: ShaderResourceCacheVk.hpp:72
Diligent::PipelineResourceSignatureDesc::NumResources
Uint32 NumResources
The number of resources in Resources array.
Definition: PipelineResourceSignature.h:172
Diligent::PipelineResourceSignatureVkImpl::ImmutableSamplerAttribs::Ptr
RefCntAutoPtr< ISampler > Ptr
Definition: PipelineResourceSignatureVkImpl.hpp:101
Diligent::PipelineResourceSignatureVkImpl::GetDescriptorSetIndex
Uint32 GetDescriptorSetIndex() const
Diligent::PipelineResourceSignatureVkImpl::GetDynamicStorageBufferCount
Uint32 GetDynamicStorageBufferCount() const
Definition: PipelineResourceSignatureVkImpl.hpp:86
Diligent::PipelineResourceSignatureDesc::NumImmutableSamplers
Uint32 NumImmutableSamplers
The number of immutable samplers in ImmutableSamplers array.
Definition: PipelineResourceSignature.h:178
SRBMemoryAllocator.hpp
Diligent::PipelineResourceSignatureVkImpl::InitSRBResourceCache
void InitSRBResourceCache(ShaderResourceCacheVk &ResourceCache)
Definition: PipelineResourceSignatureVkImpl.cpp:500
Diligent::RefCntAutoPtr
Template class that implements reference counting.
Definition: RefCntAutoPtr.hpp:73
Diligent::PipelineResourceSignatureVkImpl::~PipelineResourceSignatureVkImpl
~PipelineResourceSignatureVkImpl()
Definition: PipelineResourceSignatureVkImpl.cpp:473
Diligent::PipelineResourceSignatureVkImpl::ImmutableSamplerAttribs::BindingIndex
Uint32 BindingIndex
Definition: PipelineResourceSignatureVkImpl.hpp:104
Diligent::PipelineResourceSignatureVkImpl::HasDescriptorSet
bool HasDescriptorSet(DESCRIPTOR_SET_ID SetId) const
Definition: PipelineResourceSignatureVkImpl.hpp:115
Diligent::Uint32
uint32_t Uint32
32-bit unsigned integer
Definition: BasicTypes.h:51
ShaderResourceBindingVkImpl.hpp
ShaderResourceCacheVk.hpp
PipelineResourceSignatureBase.hpp
Diligent::PipelineResourceSignatureVkImpl::GetDynamicOffsetCount
Uint32 GetDynamicOffsetCount() const
Definition: PipelineResourceSignatureVkImpl.hpp:84
Diligent::PipelineResourceSignatureVkImpl::GetDynamicUniformBufferCount
Uint32 GetDynamicUniformBufferCount() const
Definition: PipelineResourceSignatureVkImpl.hpp:85
Diligent::Uint16
uint16_t Uint16
16-bit unsigned integer
Definition: BasicTypes.h:52
Diligent::PipelineResourceSignatureVkImpl::DESCRIPTOR_SET_ID_DYNAMIC
@ DESCRIPTOR_SET_ID_DYNAMIC
Definition: PipelineResourceSignatureVkImpl.hpp:68
Diligent::PipelineResourceSignatureVkImpl::GetVkDescriptorSetLayout
VkDescriptorSetLayout GetVkDescriptorSetLayout(DESCRIPTOR_SET_ID SetId) const
Definition: PipelineResourceSignatureVkImpl.hpp:113
Diligent::PipelineResourceDesc
struct PipelineResourceDesc PipelineResourceDesc
Definition: PipelineResourceSignature.h:162
Diligent::PipelineResourceSignatureVkImpl::DESCRIPTOR_SET_ID_STATIC_MUTABLE
@ DESCRIPTOR_SET_ID_STATIC_MUTABLE
Definition: PipelineResourceSignatureVkImpl.hpp:65
VERIFY_EXPR
#define VERIFY_EXPR(...)
Definition: DebugUtilities.hpp:79
Diligent::PipelineResourceSignatureVkImpl::MAX_DESCRIPTOR_SETS
static constexpr Uint32 MAX_DESCRIPTOR_SETS
Definition: PipelineResourceSignatureVkImpl.hpp:74
Diligent::PipelineResourceSignatureVkImpl::GetResourceAttribs
const ResourceAttribs & GetResourceAttribs(Uint32 ResIndex) const
Definition: PipelineResourceSignatureVkImpl.hpp:93
VulkanObjectWrappers.hpp
EngineVkImplTraits.hpp
Diligent::PipelineResourceSignatureVkImpl::PipelineResourceSignatureVkImpl
PipelineResourceSignatureVkImpl(IReferenceCounters *pRefCounters, RenderDeviceVkImpl *pDevice, const PipelineResourceSignatureDesc &Desc, bool bIsDeviceInternal=false)
Definition: PipelineResourceSignatureVkImpl.cpp:140
Diligent::PipelineResourceSignatureBase
Template class implementing base functionality of the pipeline resource signature object.
Definition: PipelineResourceSignatureBase.hpp:78
Diligent::PipelineResourceAttribsVk
Definition: PipelineResourceAttribsVk.hpp:65
Diligent::PipelineResourceSignatureVkImpl::CopyStaticResources
void CopyStaticResources(ShaderResourceCacheVk &ResourceCache) const
Definition: PipelineResourceSignatureVkImpl.cpp:538
Diligent::PipelineResourceSignatureVkImpl
Implementation of the Diligent::PipelineResourceSignatureVkImpl class.
Definition: PipelineResourceSignatureVkImpl.hpp:54
Diligent
The library uses Direct3D-style math:
Definition: AdvancedMath.hpp:37
Diligent::SHADER_RESOURCE_VARIABLE_TYPE
SHADER_RESOURCE_VARIABLE_TYPE
Describes the type of the shader resource variable.
Definition: ShaderResourceVariable.h:48
PipelineResourceAttribsVk.hpp