3131
3232#include " RenderStateCacheImpl.hpp"
3333#include " ReloadableShader.hpp"
34+ #include " GraphicsTypesX.hpp"
3435
3536namespace Diligent
3637{
@@ -39,43 +40,24 @@ constexpr INTERFACE_ID ReloadablePipelineState::IID_InternalImpl;
3940
4041
4142template <typename CreateInfoType>
42- struct ReloadablePipelineState ::CreateInfoWrapperBase : DynamicHeapObjectBase
43+ struct ReloadablePipelineState ::CreateInfoWrapper : DynamicHeapObjectBase
4344{
44- CreateInfoWrapperBase (const CreateInfoType& CI) :
45- m_CI{CI},
46- m_Variables{CI.PSODesc .ResourceLayout .Variables , CI.PSODesc .ResourceLayout .Variables + CI.PSODesc .ResourceLayout .NumVariables },
47- m_ImtblSamplers{CI.PSODesc .ResourceLayout .ImmutableSamplers , CI.PSODesc .ResourceLayout .ImmutableSamplers + CI.PSODesc .ResourceLayout .NumImmutableSamplers },
48- m_ppSignatures{CI.ppResourceSignatures , CI.ppResourceSignatures + CI.ResourceSignaturesCount }
45+ CreateInfoWrapper (const CreateInfoType& CI) :
46+ m_CI{CI}
4947 {
50- if (CI.PSODesc .Name != nullptr )
51- m_CI.PSODesc .Name = m_Strings.emplace (CI.PSODesc .Name ).first ->c_str ();
48+ ProcessPipelineStateCreateInfoShaders (static_cast <const CreateInfoType&>(m_CI), [](IShader* pShader) {
49+ if (pShader == nullptr )
50+ return ;
5251
53- for (auto & Var : m_Variables)
54- Var.Name = m_Strings.emplace (Var.Name ).first ->c_str ();
55- for (auto & ImtblSam : m_ImtblSamplers)
56- ImtblSam.SamplerOrTextureName = m_Strings.emplace (ImtblSam.SamplerOrTextureName ).first ->c_str ();
57-
58- m_CI.PSODesc .ResourceLayout .Variables = m_Variables.data ();
59- m_CI.PSODesc .ResourceLayout .ImmutableSamplers = m_ImtblSamplers.data ();
60-
61- m_CI.ppResourceSignatures = !m_ppSignatures.empty () ? m_ppSignatures.data () : nullptr ;
62- for (auto * pSign : m_ppSignatures)
63- m_Objects.emplace_back (pSign);
64-
65- m_Objects.emplace_back (m_CI.pPSOCache );
66-
67- // Replace shaders with reloadable shaders
68- ProcessPsoCreateInfoShaders (m_CI,
69- [&](IShader*& pShader) {
70- AddShader (pShader);
71- });
52+ if (!RefCntAutoPtr<IShader>{pShader, ReloadableShader::IID_InternalImpl})
53+ {
54+ const auto * Name = pShader->GetDesc ().Name ;
55+ LOG_WARNING_MESSAGE (" Shader '" , (Name ? Name : " <unnamed>" ),
56+ " ' is not a reloadable shader. To enable hot pipeline state reload, all shaders must be created through the render state cache." );
57+ }
58+ });
7259 }
7360
74- CreateInfoWrapperBase (const CreateInfoWrapperBase&) = delete ;
75- CreateInfoWrapperBase (CreateInfoWrapperBase&&) = delete ;
76- CreateInfoWrapperBase& operator =(const CreateInfoWrapperBase&) = delete ;
77- CreateInfoWrapperBase& operator =(CreateInfoWrapperBase&&) = delete ;
78-
7961 const CreateInfoType& Get () const
8062 {
8163 return m_CI;
@@ -91,98 +73,8 @@ struct ReloadablePipelineState::CreateInfoWrapperBase : DynamicHeapObjectBase
9173 return m_CI;
9274 }
9375
94- void AddShader (IShader* pShader)
95- {
96- if (pShader == nullptr )
97- return ;
98-
99- if (!RefCntAutoPtr<IShader>{pShader, ReloadableShader::IID_InternalImpl})
100- {
101- const auto * Name = pShader->GetDesc ().Name ;
102- LOG_WARNING_MESSAGE (" Shader '" , (Name ? Name : " <unnamed>" ),
103- " ' is not a reloadable shader. To enable hot pipeline state reload, all shaders must be created through the render state cache." );
104- }
105-
106- m_Objects.emplace_back (pShader);
107- }
108-
10976protected:
110- CreateInfoType m_CI;
111-
112- std::unordered_set<std::string> m_Strings;
113- std::vector<ShaderResourceVariableDesc> m_Variables;
114- std::vector<ImmutableSamplerDesc> m_ImtblSamplers;
115- std::vector<IPipelineResourceSignature*> m_ppSignatures;
116- std::vector<RefCntAutoPtr<IObject>> m_Objects;
117- };
118-
119-
120- template <>
121- struct ReloadablePipelineState ::CreateInfoWrapper<GraphicsPipelineStateCreateInfo> : CreateInfoWrapperBase<GraphicsPipelineStateCreateInfo>
122- {
123- CreateInfoWrapper (const GraphicsPipelineStateCreateInfo& CI) :
124- CreateInfoWrapperBase<GraphicsPipelineStateCreateInfo>{CI},
125- m_LayoutElements{CI.GraphicsPipeline .InputLayout .LayoutElements , CI.GraphicsPipeline .InputLayout .LayoutElements + CI.GraphicsPipeline .InputLayout .NumElements }
126- {
127- m_Objects.emplace_back (CI.GraphicsPipeline .pRenderPass );
128-
129- for (auto & Elem : m_LayoutElements)
130- Elem.HLSLSemantic = m_Strings.emplace (Elem.HLSLSemantic != nullptr ? Elem.HLSLSemantic : LayoutElement{}.HLSLSemantic ).first ->c_str ();
131-
132- m_CI.GraphicsPipeline .InputLayout .LayoutElements = m_LayoutElements.data ();
133- }
134-
135- private:
136- std::vector<LayoutElement> m_LayoutElements;
137- };
138-
139- template <>
140- struct ReloadablePipelineState ::CreateInfoWrapper<ComputePipelineStateCreateInfo> : CreateInfoWrapperBase<ComputePipelineStateCreateInfo>
141- {
142- CreateInfoWrapper (const ComputePipelineStateCreateInfo& CI) :
143- CreateInfoWrapperBase<ComputePipelineStateCreateInfo>{CI}
144- {
145- }
146- };
147-
148- template <>
149- struct ReloadablePipelineState ::CreateInfoWrapper<TilePipelineStateCreateInfo> : CreateInfoWrapperBase<TilePipelineStateCreateInfo>
150- {
151- CreateInfoWrapper (const TilePipelineStateCreateInfo& CI) :
152- CreateInfoWrapperBase<TilePipelineStateCreateInfo>{CI}
153- {
154- }
155- };
156-
157- template <>
158- struct ReloadablePipelineState ::CreateInfoWrapper<RayTracingPipelineStateCreateInfo> : CreateInfoWrapperBase<RayTracingPipelineStateCreateInfo>
159- {
160- CreateInfoWrapper (const RayTracingPipelineStateCreateInfo& CI) :
161- CreateInfoWrapperBase<RayTracingPipelineStateCreateInfo>{CI},
162- // clang-format off
163- m_pGeneralShaders {CI.pGeneralShaders , CI.pGeneralShaders + CI.GeneralShaderCount },
164- m_pTriangleHitShaders {CI.pTriangleHitShaders , CI.pTriangleHitShaders + CI.TriangleHitShaderCount },
165- m_pProceduralHitShaders{CI.pProceduralHitShaders , CI.pProceduralHitShaders + CI.ProceduralHitShaderCount }
166- // clang-format on
167- {
168- m_CI.pGeneralShaders = m_pGeneralShaders.data ();
169- m_CI.pTriangleHitShaders = m_pTriangleHitShaders.data ();
170- m_CI.pProceduralHitShaders = m_pProceduralHitShaders.data ();
171-
172- if (m_CI.pShaderRecordName != nullptr )
173- m_CI.pShaderRecordName = m_Strings.emplace (m_CI.pShaderRecordName ).first ->c_str ();
174-
175- // Replace shaders with reloadable shaders
176- ProcessRtPsoCreateInfoShaders (m_pGeneralShaders, m_pTriangleHitShaders, m_pProceduralHitShaders,
177- [&](IShader*& pShader) {
178- AddShader (pShader);
179- });
180- }
181-
182- private:
183- std::vector<RayTracingGeneralShaderGroup> m_pGeneralShaders;
184- std::vector<RayTracingTriangleHitShaderGroup> m_pTriangleHitShaders;
185- std::vector<RayTracingProceduralHitShaderGroup> m_pProceduralHitShaders;
77+ typename PipelineStateCreateInfoXTraits<CreateInfoType>::CreateInfoXType m_CI;
18678};
18779
18880ReloadablePipelineState::ReloadablePipelineState (IReferenceCounters* pRefCounters,
0 commit comments