summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineD3D12
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2018-11-24 00:07:34 +0000
committerEgor Yusov <egor.yusov@gmail.com>2018-11-24 00:07:34 +0000
commit84d8fedc201a66835f5c234160bda63bbc40f682 (patch)
tree6edc9cac7e76058a5e2b6f61804ab3a04e562e6f /Graphics/GraphicsEngineD3D12
parentFixed issue with resource state transition in D3D11 backend (diff)
downloadDiligentCore-84d8fedc201a66835f5c234160bda63bbc40f682.tar.gz
DiligentCore-84d8fedc201a66835f5c234160bda63bbc40f682.zip
Added IShaderResourceBinding::InitializeStaticResources() method to allow explicit initialization of static shader resources in a SRB
Diffstat (limited to 'Graphics/GraphicsEngineD3D12')
-rw-r--r--Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.h2
-rw-r--r--Graphics/GraphicsEngineD3D12/include/ShaderResourceBindingD3D12Impl.h3
-rw-r--r--Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp15
-rw-r--r--Graphics/GraphicsEngineD3D12/src/RootSignature.cpp18
-rw-r--r--Graphics/GraphicsEngineD3D12/src/ShaderResourceBindingD3D12Impl.cpp25
5 files changed, 41 insertions, 22 deletions
diff --git a/Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.h b/Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.h
index a0f9ab76..0ecda4a1 100644
--- a/Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.h
+++ b/Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.h
@@ -51,7 +51,7 @@ public:
virtual ID3D12PipelineState *GetD3D12PipelineState()const override final{return m_pd3d12PSO;}
- virtual void CreateShaderResourceBinding( IShaderResourceBinding **ppShaderResourceBinding )override final;
+ virtual void CreateShaderResourceBinding( IShaderResourceBinding **ppShaderResourceBinding, bool InitStaticResources )override final;
virtual bool IsCompatibleWith(const IPipelineState *pPSO)const override final;
diff --git a/Graphics/GraphicsEngineD3D12/include/ShaderResourceBindingD3D12Impl.h b/Graphics/GraphicsEngineD3D12/include/ShaderResourceBindingD3D12Impl.h
index 5a237414..2685dde2 100644
--- a/Graphics/GraphicsEngineD3D12/include/ShaderResourceBindingD3D12Impl.h
+++ b/Graphics/GraphicsEngineD3D12/include/ShaderResourceBindingD3D12Impl.h
@@ -58,6 +58,8 @@ public:
virtual Uint32 GetVariableCount(SHADER_TYPE ShaderType) const override final;
virtual IShaderVariable* GetVariable(SHADER_TYPE ShaderType, Uint32 Index)override final;
+
+ virtual void InitializeStaticResources(const IPipelineState* pPipelineState)override final;
ShaderResourceCacheD3D12& GetResourceCache(){return m_ShaderResourceCache;}
@@ -66,7 +68,6 @@ public:
#endif
bool StaticResourcesInitialized()const{return m_bStaticResourcesInitialized;}
- void InitializeStaticResources(const PipelineStateD3D12Impl* pPSO);
private:
diff --git a/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp
index 85d8ee0a..8fc17cb2 100644
--- a/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp
+++ b/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp
@@ -224,6 +224,7 @@ PipelineStateD3D12Impl :: PipelineStateD3D12Impl(IReferenceCounters* pRefCo
auto& SRBAllocator = pDeviceD3D12->GetSRBAllocator();
// Default shader resource binding must be initialized after resource layouts are parsed!
m_pDefaultShaderResBinding.reset( NEW_RC_OBJ(SRBAllocator, "ShaderResourceBindingD3D12Impl instance", ShaderResourceBindingD3D12Impl, this)(this, true) );
+ m_pDefaultShaderResBinding->InitializeStaticResources(this);
}
m_ShaderResourceLayoutHash = m_RootSig.GetHash();
@@ -245,10 +246,12 @@ PipelineStateD3D12Impl::~PipelineStateD3D12Impl()
IMPLEMENT_QUERY_INTERFACE( PipelineStateD3D12Impl, IID_PipelineStateD3D12, TPipelineStateBase )
-void PipelineStateD3D12Impl::CreateShaderResourceBinding(IShaderResourceBinding** ppShaderResourceBinding)
+void PipelineStateD3D12Impl::CreateShaderResourceBinding(IShaderResourceBinding** ppShaderResourceBinding, bool InitStaticResources )
{
auto& SRBAllocator = m_pDevice->GetSRBAllocator();
auto pResBindingD3D12 = NEW_RC_OBJ(SRBAllocator, "ShaderResourceBindingD3D12Impl instance", ShaderResourceBindingD3D12Impl)(this, false);
+ if (InitStaticResources)
+ pResBindingD3D12->InitializeStaticResources(nullptr);
pResBindingD3D12->QueryInterface(IID_ShaderResourceBinding, reinterpret_cast<IObject**>(ppShaderResourceBinding));
}
@@ -341,13 +344,13 @@ ShaderResourceCacheD3D12* PipelineStateD3D12Impl::CommitAndTransitionShaderResou
return nullptr;
}
}
-#endif
- // First time only, copy static shader resources to the cache
- if(!pResBindingD3D12Impl->StaticResourcesInitialized())
- pResBindingD3D12Impl->InitializeStaticResources(this);
+ if( (m_RootSig.GetTotalSrvCbvUavSlots(SHADER_VARIABLE_TYPE_STATIC) != 0 ||
+ m_RootSig.GetTotalRootViews(SHADER_VARIABLE_TYPE_STATIC) != 0) && !pResBindingD3D12Impl->StaticResourcesInitialized() )
+ {
+ LOG_ERROR_MESSAGE("Static resources have not been initialized in the shader resource binding object. Please call IShaderResourceBinding::InitializeStaticResources().");
+ }
-#ifdef DEVELOPMENT
pResBindingD3D12Impl->dvpVerifyResourceBindings(this);
#endif
diff --git a/Graphics/GraphicsEngineD3D12/src/RootSignature.cpp b/Graphics/GraphicsEngineD3D12/src/RootSignature.cpp
index d874d45e..67369355 100644
--- a/Graphics/GraphicsEngineD3D12/src/RootSignature.cpp
+++ b/Graphics/GraphicsEngineD3D12/src/RootSignature.cpp
@@ -1055,15 +1055,17 @@ void RootSignature::CommitRootViews(ShaderResourceCacheD3D12& ResourceCache,
#endif
auto& Res = ResourceCache.GetRootTable(RootInd).GetResource(0, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, dbgShaderType);
- auto *pBuffToTransition = Res.pObject.RawPtr<BufferD3D12Impl>();
- if (pBuffToTransition->IsInKnownState() && !pBuffToTransition->CheckState(RESOURCE_STATE_CONSTANT_BUFFER) )
- Ctx.TransitionResource(pBuffToTransition, RESOURCE_STATE_CONSTANT_BUFFER);
+ if (auto* pBuffToTransition = Res.pObject.RawPtr<BufferD3D12Impl>())
+ {
+ if (pBuffToTransition->IsInKnownState() && !pBuffToTransition->CheckState(RESOURCE_STATE_CONSTANT_BUFFER) )
+ Ctx.TransitionResource(pBuffToTransition, RESOURCE_STATE_CONSTANT_BUFFER);
- D3D12_GPU_VIRTUAL_ADDRESS CBVAddress = pBuffToTransition->GetGPUAddress(pCtx);
- if(IsCompute)
- Ctx.GetCommandList()->SetComputeRootConstantBufferView(RootInd, CBVAddress);
- else
- Ctx.GetCommandList()->SetGraphicsRootConstantBufferView(RootInd, CBVAddress);
+ D3D12_GPU_VIRTUAL_ADDRESS CBVAddress = pBuffToTransition->GetGPUAddress(pCtx);
+ if(IsCompute)
+ Ctx.GetCommandList()->SetComputeRootConstantBufferView(RootInd, CBVAddress);
+ else
+ Ctx.GetCommandList()->SetGraphicsRootConstantBufferView(RootInd, CBVAddress);
+ }
}
}
diff --git a/Graphics/GraphicsEngineD3D12/src/ShaderResourceBindingD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/ShaderResourceBindingD3D12Impl.cpp
index cec03f11..ff569364 100644
--- a/Graphics/GraphicsEngineD3D12/src/ShaderResourceBindingD3D12Impl.cpp
+++ b/Graphics/GraphicsEngineD3D12/src/ShaderResourceBindingD3D12Impl.cpp
@@ -154,13 +154,26 @@ void ShaderResourceBindingD3D12Impl::dvpVerifyResourceBindings(const PipelineSta
#endif
-void ShaderResourceBindingD3D12Impl::InitializeStaticResources(const PipelineStateD3D12Impl* pPSO)
+void ShaderResourceBindingD3D12Impl::InitializeStaticResources(const IPipelineState* pPSO)
{
- VERIFY(!StaticResourcesInitialized(), "Static resources have already been initialized");
- VERIFY(pPSO->IsCompatibleWith(GetPipelineState()), "Currently bound pipeline state is not compatible with this SRB");
+ if (StaticResourcesInitialized())
+ {
+ LOG_WARNING_MESSAGE("Static resources have already been initialized in this shader resource binding object. The operation will be ignored.");
+ return;
+ }
+
+ if (pPSO == nullptr)
+ {
+ pPSO = GetPipelineState();
+ }
+ else
+ {
+ DEV_CHECK_ERR(pPSO->IsCompatibleWith(GetPipelineState()), "The pipeline state is not compatible with this SRB");
+ }
- auto NumShaders = pPSO->GetNumShaders();
- auto ppShaders = pPSO->GetShaders();
+ auto* pPSO12 = ValidatedCast<const PipelineStateD3D12Impl>(pPSO);
+ auto NumShaders = pPSO12->GetNumShaders();
+ auto ppShaders = pPSO12->GetShaders();
// Copy static resources
for (Uint32 s = 0; s < NumShaders; ++s)
{
@@ -168,7 +181,7 @@ void ShaderResourceBindingD3D12Impl::InitializeStaticResources(const PipelineSta
#ifdef DEVELOPMENT
pShader->DvpVerifyStaticResourceBindings();
#endif
- const auto& ShaderResLayout = pPSO->GetShaderResLayout(s);
+ const auto& ShaderResLayout = pPSO12->GetShaderResLayout(s);
auto& StaticResLayout = pShader->GetStaticResLayout();
auto& StaticResCache = pShader->GetStaticResCache();
StaticResLayout.CopyStaticResourceDesriptorHandles(StaticResCache, ShaderResLayout, m_ShaderResourceCache);