Skip to content

Commit 4247443

Browse files
Added ProxyPipelineState class
1 parent 7870aa1 commit 4247443

File tree

4 files changed

+149
-97
lines changed

4 files changed

+149
-97
lines changed

Graphics/GraphicsTools/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ set(SOURCE
4646
src/VertexPool.cpp
4747
)
4848

49-
set(INCLUDE)
49+
set(INCLUDE include/ProxyPipelineState.hpp)
5050

5151
if(ARCHIVER_SUPPORTED)
5252
list(APPEND INTERFACE
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
/*
2+
* Copyright 2024 Diligent Graphics LLC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*
16+
* In no event and under no legal theory, whether in tort (including negligence),
17+
* contract, or otherwise, unless required by applicable law (such as deliberate
18+
* and grossly negligent acts) or agreed to in writing, shall any Contributor be
19+
* liable for any damages, including any direct, indirect, special, incidental,
20+
* or consequential damages of any character arising as a result of this License or
21+
* out of the use or inability to use the software (including but not limited to damages
22+
* for loss of goodwill, work stoppage, computer failure or malfunction, or any and
23+
* all other commercial damages or losses), even if such Contributor has been advised
24+
* of the possibility of such damages.
25+
*/
26+
27+
#pragma once
28+
29+
/// \file
30+
/// Definition of the Diligent::ProxyPipelineState class
31+
32+
#include "PipelineState.h"
33+
#include "RefCntAutoPtr.hpp"
34+
35+
namespace Diligent
36+
{
37+
38+
/// Proxy pipeline state delegates all calls to the internal pipeline object.
39+
40+
template <typename Base>
41+
class ProxyPipelineState : public Base
42+
{
43+
public:
44+
template <typename... Args>
45+
ProxyPipelineState(Args&&... args) :
46+
Base{std::forward<Args>(args)...}
47+
{}
48+
49+
virtual const PipelineStateDesc& DILIGENT_CALL_TYPE GetDesc() const override
50+
{
51+
return m_pPipeline->GetDesc();
52+
}
53+
54+
virtual Int32 DILIGENT_CALL_TYPE GetUniqueID() const override
55+
{
56+
return m_pPipeline->GetUniqueID();
57+
}
58+
59+
virtual void DILIGENT_CALL_TYPE SetUserData(IObject* pUserData) override
60+
{
61+
m_pPipeline->SetUserData(pUserData);
62+
}
63+
64+
virtual IObject* DILIGENT_CALL_TYPE GetUserData() const override
65+
{
66+
return m_pPipeline->GetUserData();
67+
}
68+
69+
virtual const GraphicsPipelineDesc& DILIGENT_CALL_TYPE GetGraphicsPipelineDesc() const override
70+
{
71+
return m_pPipeline->GetGraphicsPipelineDesc();
72+
}
73+
74+
virtual const RayTracingPipelineDesc& DILIGENT_CALL_TYPE GetRayTracingPipelineDesc() const override
75+
{
76+
return m_pPipeline->GetRayTracingPipelineDesc();
77+
}
78+
79+
virtual const TilePipelineDesc& DILIGENT_CALL_TYPE GetTilePipelineDesc() const override
80+
{
81+
return m_pPipeline->GetTilePipelineDesc();
82+
}
83+
84+
virtual void DILIGENT_CALL_TYPE BindStaticResources(SHADER_TYPE ShaderStages, IResourceMapping* pResourceMapping, BIND_SHADER_RESOURCES_FLAGS Flags) override
85+
{
86+
m_pPipeline->BindStaticResources(ShaderStages, pResourceMapping, Flags);
87+
}
88+
89+
virtual Uint32 DILIGENT_CALL_TYPE GetStaticVariableCount(SHADER_TYPE ShaderType) const override
90+
{
91+
return m_pPipeline->GetStaticVariableCount(ShaderType);
92+
}
93+
94+
virtual IShaderResourceVariable* DILIGENT_CALL_TYPE GetStaticVariableByName(SHADER_TYPE ShaderType, const Char* Name) override
95+
{
96+
return m_pPipeline->GetStaticVariableByName(ShaderType, Name);
97+
}
98+
99+
virtual IShaderResourceVariable* DILIGENT_CALL_TYPE GetStaticVariableByIndex(SHADER_TYPE ShaderType, Uint32 Index) override
100+
{
101+
return m_pPipeline->GetStaticVariableByIndex(ShaderType, Index);
102+
}
103+
104+
virtual void DILIGENT_CALL_TYPE CreateShaderResourceBinding(IShaderResourceBinding** ppShaderResourceBinding, bool InitStaticResources) override
105+
{
106+
m_pPipeline->CreateShaderResourceBinding(ppShaderResourceBinding, InitStaticResources);
107+
}
108+
109+
virtual void DILIGENT_CALL_TYPE InitializeStaticSRBResources(IShaderResourceBinding* pShaderResourceBinding) const override
110+
{
111+
m_pPipeline->InitializeStaticSRBResources(pShaderResourceBinding);
112+
}
113+
114+
virtual void DILIGENT_CALL_TYPE CopyStaticResources(IPipelineState* pPSO) const override
115+
{
116+
m_pPipeline->CopyStaticResources(pPSO);
117+
}
118+
119+
virtual bool DILIGENT_CALL_TYPE IsCompatibleWith(const IPipelineState* pPSO) const override
120+
{
121+
return m_pPipeline->IsCompatibleWith(pPSO);
122+
}
123+
124+
virtual Uint32 DILIGENT_CALL_TYPE GetResourceSignatureCount() const override
125+
{
126+
return m_pPipeline->GetResourceSignatureCount();
127+
}
128+
129+
virtual IPipelineResourceSignature* DILIGENT_CALL_TYPE GetResourceSignature(Uint32 Index) const override
130+
{
131+
return m_pPipeline->GetResourceSignature(Index);
132+
}
133+
134+
virtual PIPELINE_STATE_STATUS DILIGENT_CALL_TYPE GetStatus(bool WaitForCompletion) override
135+
{
136+
return m_pPipeline->GetStatus(WaitForCompletion);
137+
}
138+
139+
protected:
140+
RefCntAutoPtr<IPipelineState> m_pPipeline;
141+
};
142+
143+
} // namespace Diligent

Graphics/GraphicsTools/include/ReloadablePipelineState.hpp

Lines changed: 3 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include "RenderStateCache.h"
3636
#include "ObjectBase.hpp"
3737
#include "RefCntAutoPtr.hpp"
38+
#include "ProxyPipelineState.hpp"
3839

3940
namespace Diligent
4041
{
@@ -43,10 +44,10 @@ class RenderStateCacheImpl;
4344

4445
/// Reloadable pipeline state implements the IPipelineState interface and delegates all
4546
/// calls to the internal pipeline object, which can be replaced at run-time.
46-
class ReloadablePipelineState final : public ObjectBase<IPipelineState>
47+
class ReloadablePipelineState final : public ProxyPipelineState<ObjectBase<IPipelineState>>
4748
{
4849
public:
49-
using TBase = ObjectBase<IPipelineState>;
50+
using TBase = ProxyPipelineState<ObjectBase<IPipelineState>>;
5051

5152
// {1F325E25-496B-41B4-A1F9-242302ABCDD4}
5253
static constexpr INTERFACE_ID IID_InternalImpl =
@@ -60,98 +61,6 @@ class ReloadablePipelineState final : public ObjectBase<IPipelineState>
6061

6162
virtual void DILIGENT_CALL_TYPE QueryInterface(const INTERFACE_ID& IID, IObject** ppInterface) override final;
6263

63-
// Delegate all calls to the internal pipeline object
64-
65-
virtual const PipelineStateDesc& DILIGENT_CALL_TYPE GetDesc() const override final
66-
{
67-
return m_pPipeline->GetDesc();
68-
}
69-
70-
virtual Int32 DILIGENT_CALL_TYPE GetUniqueID() const override final
71-
{
72-
return m_pPipeline->GetUniqueID();
73-
}
74-
75-
virtual void DILIGENT_CALL_TYPE SetUserData(IObject* pUserData) override final
76-
{
77-
m_pPipeline->SetUserData(pUserData);
78-
}
79-
80-
virtual IObject* DILIGENT_CALL_TYPE GetUserData() const override final
81-
{
82-
return m_pPipeline->GetUserData();
83-
}
84-
85-
virtual const GraphicsPipelineDesc& DILIGENT_CALL_TYPE GetGraphicsPipelineDesc() const override final
86-
{
87-
return m_pPipeline->GetGraphicsPipelineDesc();
88-
}
89-
90-
virtual const RayTracingPipelineDesc& DILIGENT_CALL_TYPE GetRayTracingPipelineDesc() const override final
91-
{
92-
return m_pPipeline->GetRayTracingPipelineDesc();
93-
}
94-
95-
virtual const TilePipelineDesc& DILIGENT_CALL_TYPE GetTilePipelineDesc() const override final
96-
{
97-
return m_pPipeline->GetTilePipelineDesc();
98-
}
99-
100-
virtual void DILIGENT_CALL_TYPE BindStaticResources(SHADER_TYPE ShaderStages, IResourceMapping* pResourceMapping, BIND_SHADER_RESOURCES_FLAGS Flags) override final
101-
{
102-
m_pPipeline->BindStaticResources(ShaderStages, pResourceMapping, Flags);
103-
}
104-
105-
virtual Uint32 DILIGENT_CALL_TYPE GetStaticVariableCount(SHADER_TYPE ShaderType) const override final
106-
{
107-
return m_pPipeline->GetStaticVariableCount(ShaderType);
108-
}
109-
110-
virtual IShaderResourceVariable* DILIGENT_CALL_TYPE GetStaticVariableByName(SHADER_TYPE ShaderType, const Char* Name) override final
111-
{
112-
return m_pPipeline->GetStaticVariableByName(ShaderType, Name);
113-
}
114-
115-
virtual IShaderResourceVariable* DILIGENT_CALL_TYPE GetStaticVariableByIndex(SHADER_TYPE ShaderType, Uint32 Index) override final
116-
{
117-
return m_pPipeline->GetStaticVariableByIndex(ShaderType, Index);
118-
}
119-
120-
virtual void DILIGENT_CALL_TYPE CreateShaderResourceBinding(IShaderResourceBinding** ppShaderResourceBinding, bool InitStaticResources) override final
121-
{
122-
m_pPipeline->CreateShaderResourceBinding(ppShaderResourceBinding, InitStaticResources);
123-
}
124-
125-
virtual void DILIGENT_CALL_TYPE InitializeStaticSRBResources(IShaderResourceBinding* pShaderResourceBinding) const override final
126-
{
127-
m_pPipeline->InitializeStaticSRBResources(pShaderResourceBinding);
128-
}
129-
130-
virtual void DILIGENT_CALL_TYPE CopyStaticResources(IPipelineState* pPSO) const override final
131-
{
132-
m_pPipeline->CopyStaticResources(pPSO);
133-
}
134-
135-
virtual bool DILIGENT_CALL_TYPE IsCompatibleWith(const IPipelineState* pPSO) const override final
136-
{
137-
return m_pPipeline->IsCompatibleWith(pPSO);
138-
}
139-
140-
virtual Uint32 DILIGENT_CALL_TYPE GetResourceSignatureCount() const override final
141-
{
142-
return m_pPipeline->GetResourceSignatureCount();
143-
}
144-
145-
virtual IPipelineResourceSignature* DILIGENT_CALL_TYPE GetResourceSignature(Uint32 Index) const override final
146-
{
147-
return m_pPipeline->GetResourceSignature(Index);
148-
}
149-
150-
virtual PIPELINE_STATE_STATUS DILIGENT_CALL_TYPE GetStatus(bool WaitForCompletion) override final
151-
{
152-
return m_pPipeline->GetStatus(WaitForCompletion);
153-
}
154-
15564
static void Create(RenderStateCacheImpl* pStateCache,
15665
IPipelineState* pPipeline,
15766
const PipelineStateCreateInfo& CreateInfo,
@@ -172,7 +81,6 @@ class ReloadablePipelineState final : public ObjectBase<IPipelineState>
17281
struct CreateInfoWrapper;
17382

17483
RefCntAutoPtr<RenderStateCacheImpl> m_pStateCache;
175-
RefCntAutoPtr<IPipelineState> m_pPipeline;
17684
std::unique_ptr<DynamicHeapObjectBase> m_pCreateInfo;
17785
const PIPELINE_TYPE m_Type;
17886
};

Graphics/GraphicsTools/src/ReloadablePipelineState.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,10 @@ ReloadablePipelineState::ReloadablePipelineState(IReferenceCounters*
8383
const PipelineStateCreateInfo& CreateInfo) :
8484
TBase{pRefCounters},
8585
m_pStateCache{pStateCache},
86-
m_pPipeline{pPipeline},
8786
m_Type{CreateInfo.PSODesc.PipelineType}
8887
{
88+
m_pPipeline = pPipeline;
89+
8990
static_assert(PIPELINE_TYPE_COUNT == 5, "Did you add a new pipeline type? You may need to handle it here.");
9091
switch (CreateInfo.PSODesc.PipelineType)
9192
{

0 commit comments

Comments
 (0)