Diligent Engine  v.2.4.g
RootSignature.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 // Root signature object combines multiple pipeline resource signatures into a single
34 // d3d12 root signature. The signatures "stack" on top of each other. Their "local"
35 // root indices and register spaces are biased by the root indices and spaces of
36 // previous signatures.
37 //
38 // __________________________________________________________
39 // | |
40 // | Pipeline Resource Signature 2 (NRootIndices2, NSpaces2) | BaseRootIndex2 = BaseRootIndex1 + NRootIndices1
41 // |__________________________________________________________| BaseSpace2 = BaseSpace1 + NSpaces1
42 // | |
43 // | Pipeline Resource Signature 1 (NRootIndices1, NSpaces1) | BaseRootIndex1 = BaseRootIndex0 + NRootIndices0
44 // |__________________________________________________________| BaseSpace1 = BaseSpace0 + NSpaces0
45 // | |
46 // | Pipeline Resource Signature 0 (NRootIndices0, NSpaces0) | BaseRootIndex0 = 0
47 // |__________________________________________________________| BaseSpace0 = 0
48 //
49 
50 #include <mutex>
51 #include <unordered_map>
52 #include <memory>
53 
54 #include "PrivateConstants.h"
55 #include "ShaderResources.hpp"
56 #include "ObjectBase.hpp"
57 #include "ResourceBindingMap.hpp"
58 
59 namespace Diligent
60 {
61 
62 class RenderDeviceD3D12Impl;
63 class RootSignatureCacheD3D12;
64 class PipelineResourceSignatureD3D12Impl;
65 
67 class RootSignatureD3D12 final : public ObjectBase<IObject>
68 {
69 public:
71  RenderDeviceD3D12Impl* pDeviceD3D12Impl,
73  Uint32 SignatureCount,
74  size_t Hash);
76 
77  size_t GetHash() const { return m_Hash; }
78 
79  Uint32 GetSignatureCount() const { return m_SignatureCount; }
80 
82  {
83  VERIFY_EXPR(index < m_SignatureCount);
84  return m_ResourceSignatures[index].pSignature;
85  }
86 
87  ID3D12RootSignature* GetD3D12RootSignature() const
88  {
89  VERIFY_EXPR(m_pd3d12RootSignature);
90  return m_pd3d12RootSignature;
91  }
92 
93  Uint32 GetBaseRootIndex(Uint32 BindingIndex) const
94  {
95  VERIFY_EXPR(BindingIndex < m_SignatureCount);
96  return m_ResourceSignatures[BindingIndex].BaseRootIndex;
97  }
98 
99  Uint32 GetBaseRegisterSpace(Uint32 BindingIndex) const
100  {
101  VERIFY_EXPR(BindingIndex <= m_SignatureCount);
102  return m_ResourceSignatures[BindingIndex].BaseRegisterSpace;
103  }
104 
107  {
108  return m_TotalSpacesUsed;
109  }
110 
111  bool IsCompatibleWith(const RefCntAutoPtr<PipelineResourceSignatureD3D12Impl> ppSignatures[], Uint32 SignatureCount) const noexcept;
112 
113 private:
114  // The number of pipeline resource signatures used to initialize this root signature.
115  const Uint32 m_SignatureCount;
116 
117  // The total number of register spaces used by this root signature.
118  Uint32 m_TotalSpacesUsed = 0;
119 
120  // Root signature hash.
121  const size_t m_Hash;
122 
123  CComPtr<ID3D12RootSignature> m_pd3d12RootSignature;
124 
125  struct ResourceSignatureInfo
126  {
128 
129  Uint32 BaseRootIndex = 0;
130  Uint32 BaseRegisterSpace = 0;
131  };
132  std::unique_ptr<ResourceSignatureInfo[]> m_ResourceSignatures;
133 
134  RootSignatureCacheD3D12& m_Cache;
135 };
136 
137 
138 
140 {
141 public:
142  LocalRootSignatureD3D12(const char* pCBName, Uint32 ShaderRecordSize);
143 
144  bool IsShaderRecord(const D3DShaderResourceAttribs& CB) const;
145 
146  bool Create(ID3D12Device* pDevice, Uint32 RegisterSpace);
147 
148  ID3D12RootSignature* GetD3D12RootSignature() const { return m_pd3d12RootSignature; }
149  bool IsDefined() const { return m_ShaderRecordSize > 0 && !m_Name.empty(); }
150  const char* GetName() const { return m_Name.c_str(); }
151  Uint32 GetShaderRegister() const { return 0; }
152 
154  {
155  VERIFY_EXPR(m_RegisterSpace != ~0U);
156  return m_RegisterSpace;
157  }
158 
159 private:
160  const std::string m_Name;
161  const Uint32 m_ShaderRecordSize = 0;
162  Uint32 m_RegisterSpace = ~0u;
163  CComPtr<ID3D12RootSignature> m_pd3d12RootSignature;
164 };
165 
166 
169 {
170 public:
172 
173  // clang-format off
178  // clang-format on
179 
181 
183 
184  void OnDestroyRootSig(RootSignatureD3D12* pRootSig);
185 
186 private:
187  RenderDeviceD3D12Impl& m_DeviceD3D12Impl;
188 
189  std::mutex m_RootSigCacheMtx;
190  std::unordered_multimap<size_t, RefCntWeakPtr<RootSignatureD3D12>> m_RootSigCache;
191 };
192 
193 } // namespace Diligent
ObjectBase.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::LocalRootSignatureD3D12::LocalRootSignatureD3D12
LocalRootSignatureD3D12(const char *pCBName, Uint32 ShaderRecordSize)
Definition: RootSignature.cpp:248
Diligent::LocalRootSignatureD3D12::GetRegisterSpace
Uint32 GetRegisterSpace() const
Definition: RootSignature.hpp:153
Diligent::RootSignatureD3D12::GetResourceSignature
PipelineResourceSignatureD3D12Impl * GetResourceSignature(Uint32 index) const
Definition: RootSignature.hpp:81
Diligent::RootSignatureD3D12::GetHash
size_t GetHash() const
Definition: RootSignature.hpp:77
Diligent::LocalRootSignatureD3D12::GetShaderRegister
Uint32 GetShaderRegister() const
Definition: RootSignature.hpp:151
Diligent::RootSignatureD3D12
Implementation of the Diligent::RootSignature class.
Definition: RootSignature.hpp:67
Diligent::PipelineResourceSignatureD3D12Impl
Implementation of the Diligent::PipelineResourceSignatureD3D12Impl class.
Definition: PipelineResourceSignatureD3D12Impl.hpp:55
Diligent::RootSignatureCacheD3D12::~RootSignatureCacheD3D12
~RootSignatureCacheD3D12()
Definition: RootSignature.cpp:323
ShaderResources.hpp
PrivateConstants.h
Diligent::RootSignatureD3D12::GetSignatureCount
Uint32 GetSignatureCount() const
Definition: RootSignature.hpp:79
Diligent::ObjectBase
Template class implementing base functionality for an object.
Definition: ObjectBase.hpp:66
Diligent::RootSignatureCacheD3D12::OnDestroyRootSig
void OnDestroyRootSig(RootSignatureD3D12 *pRootSig)
Definition: RootSignature.cpp:366
Diligent::RootSignatureD3D12::GetBaseRootIndex
Uint32 GetBaseRootIndex(Uint32 BindingIndex) const
Definition: RootSignature.hpp:93
Diligent::RootSignatureD3D12::RootSignatureD3D12
RootSignatureD3D12(IReferenceCounters *pRefCounters, RenderDeviceD3D12Impl *pDeviceD3D12Impl, const RefCntAutoPtr< PipelineResourceSignatureD3D12Impl > ppSignatures[], Uint32 SignatureCount, size_t Hash)
Definition: RootSignature.cpp:41
Diligent::RenderDeviceD3D12Impl
Render device implementation in Direct3D12 backend.
Definition: RenderDeviceD3D12Impl.hpp:70
Diligent::RootSignatureCacheD3D12
Root signature cache that deduplicates RootSignatureD3D12 objects.
Definition: RootSignature.hpp:168
Diligent::RootSignatureCacheD3D12::RootSignatureCacheD3D12
RootSignatureCacheD3D12(RenderDeviceD3D12Impl &DeviceD3D12Impl)
Definition: RootSignature.cpp:319
Diligent::LocalRootSignatureD3D12::Create
bool Create(ID3D12Device *pDevice, Uint32 RegisterSpace)
Definition: RootSignature.cpp:262
Diligent::RootSignatureD3D12::IsCompatibleWith
bool IsCompatibleWith(const RefCntAutoPtr< PipelineResourceSignatureD3D12Impl > ppSignatures[], Uint32 SignatureCount) const noexcept
Definition: RootSignature.cpp:294
Diligent::RootSignatureD3D12::GetTotalSpaces
Uint32 GetTotalSpaces() const
Returns the total number of register spaces used by all resource signatures.
Definition: RootSignature.hpp:106
Diligent::RefCntAutoPtr
Template class that implements reference counting.
Definition: RefCntAutoPtr.hpp:73
Diligent::LocalRootSignatureD3D12::GetName
const char * GetName() const
Definition: RootSignature.hpp:150
Diligent::Uint32
uint32_t Uint32
32-bit unsigned integer
Definition: BasicTypes.h:51
Diligent::LocalRootSignatureD3D12::GetD3D12RootSignature
ID3D12RootSignature * GetD3D12RootSignature() const
Definition: RootSignature.hpp:148
ResourceBindingMap.hpp
Diligent::RootSignatureD3D12::GetD3D12RootSignature
ID3D12RootSignature * GetD3D12RootSignature() const
Definition: RootSignature.hpp:87
Diligent::LocalRootSignatureD3D12::IsShaderRecord
bool IsShaderRecord(const D3DShaderResourceAttribs &CB) const
Definition: RootSignature.cpp:255
Diligent::D3DShaderResourceAttribs
Definition: ShaderResources.hpp:80
Diligent::LocalRootSignatureD3D12::IsDefined
bool IsDefined() const
Definition: RootSignature.hpp:149
Diligent::RootSignatureD3D12::~RootSignatureD3D12
~RootSignatureD3D12()
Definition: RootSignature.cpp:243
VERIFY_EXPR
#define VERIFY_EXPR(...)
Definition: DebugUtilities.hpp:79
Diligent::LocalRootSignatureD3D12
Definition: RootSignature.hpp:139
Diligent::RootSignatureCacheD3D12::operator=
RootSignatureCacheD3D12 & operator=(const RootSignatureCacheD3D12 &)=delete
Diligent::RootSignatureCacheD3D12::GetRootSig
RefCntAutoPtr< RootSignatureD3D12 > GetRootSig(const RefCntAutoPtr< PipelineResourceSignatureD3D12Impl > *ppSignatures, Uint32 SignatureCount)
Definition: RootSignature.cpp:329
Diligent::RootSignatureD3D12::GetBaseRegisterSpace
Uint32 GetBaseRegisterSpace(Uint32 BindingIndex) const
Definition: RootSignature.hpp:99
Diligent
The library uses Direct3D-style math:
Definition: AdvancedMath.hpp:37