diff options
| author | Egor Yusov <egor.yusov@gmail.com> | 2018-11-24 00:07:34 +0000 |
|---|---|---|
| committer | Egor Yusov <egor.yusov@gmail.com> | 2018-11-24 00:07:34 +0000 |
| commit | 84d8fedc201a66835f5c234160bda63bbc40f682 (patch) | |
| tree | 6edc9cac7e76058a5e2b6f61804ab3a04e562e6f /Graphics/GraphicsEngineD3D11 | |
| parent | Fixed issue with resource state transition in D3D11 backend (diff) | |
| download | DiligentCore-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/GraphicsEngineD3D11')
5 files changed, 28 insertions, 10 deletions
diff --git a/Graphics/GraphicsEngineD3D11/include/PipelineStateD3D11Impl.h b/Graphics/GraphicsEngineD3D11/include/PipelineStateD3D11Impl.h index 2ea2d8da..4d3776c8 100644 --- a/Graphics/GraphicsEngineD3D11/include/PipelineStateD3D11Impl.h +++ b/Graphics/GraphicsEngineD3D11/include/PipelineStateD3D11Impl.h @@ -68,7 +68,7 @@ public: virtual ID3D11HullShader* GetD3D11HullShader()override final; virtual ID3D11ComputeShader* GetD3D11ComputeShader()override final; - 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/GraphicsEngineD3D11/include/ShaderResourceBindingD3D11Impl.h b/Graphics/GraphicsEngineD3D11/include/ShaderResourceBindingD3D11Impl.h index 479ec282..9c6c354d 100755 --- a/Graphics/GraphicsEngineD3D11/include/ShaderResourceBindingD3D11Impl.h +++ b/Graphics/GraphicsEngineD3D11/include/ShaderResourceBindingD3D11Impl.h @@ -58,10 +58,11 @@ public: virtual IShaderVariable* GetVariable(SHADER_TYPE ShaderType, Uint32 Index)override final;
+ virtual void InitializeStaticResources(const IPipelineState* pPipelineState)override final;
+
ShaderResourceCacheD3D11& GetResourceCache (Uint32 Ind){VERIFY_EXPR(Ind < m_NumActiveShaders); return m_pBoundResourceCaches[Ind];}
ShaderResourceLayoutD3D11& GetResourceLayout(Uint32 Ind){VERIFY_EXPR(Ind < m_NumActiveShaders); return m_pResourceLayouts[Ind];}
- void BindStaticShaderResources();
inline bool IsStaticResourcesBound(){return m_bIsStaticResourcesBound;}
Uint32 GetNumActiveShaders()
diff --git a/Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp b/Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp index 3456ee47..f64409cc 100755 --- a/Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp +++ b/Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp @@ -175,17 +175,22 @@ namespace Diligent }
#endif
- if(!pShaderResBindingD3D11->IsStaticResourcesBound())
- pShaderResBindingD3D11->BindStaticShaderResources();
-
auto NumShaders = pShaderResBindingD3D11->GetNumActiveShaders();
VERIFY(NumShaders == pdbgPipelineStateD3D11->GetNumShaders(), "Number of active shaders in shader resource binding is not consistent with the number of shaders in the pipeline state");
#ifdef DEVELOPMENT
+ bool StaticResourcesPresent = false;
for (Uint32 s = 0; s < NumShaders; ++s)
{
pShaderResBindingD3D11->GetResourceLayout(s).dvpVerifyBindings();
// Static resource bindings are verified in BindStaticShaderResources()
+ auto* pShaderD3D11 = ValidatedCast<ShaderD3D11Impl>(ppdbgShaders[s]);
+ if (pShaderD3D11->GetStaticResourceLayout().GetTotalResourceCount() > 0)
+ StaticResourcesPresent = true;
+ }
+ if (StaticResourcesPresent && !pShaderResBindingD3D11->IsStaticResourcesBound())
+ {
+ LOG_ERROR_MESSAGE("Static resources have not been initialized in the shader resource binding object. Please call IShaderResourceBinding::InitializeStaticResources().");
}
#endif
@@ -767,7 +772,7 @@ namespace Diligent auto* pd3d11InputLayout = m_pPipelineState->GetD3D11InputLayout();
if (pd3d11InputLayout != nullptr && !m_bCommittedD3D11VBsUpToDate)
{
- VERIFY( m_NumVertexStreams >= m_pPipelineState->GetNumBufferSlotsUsed(), "Currently bound pipeline state '", m_pPipelineState->GetDesc().Name, "' expects ", m_pPipelineState->GetNumBufferSlotsUsed(), " input buffer slots, but only ", m_NumVertexStreams, " is bound");
+ DEV_CHECK_ERR( m_NumVertexStreams >= m_pPipelineState->GetNumBufferSlotsUsed(), "Currently bound pipeline state '", m_pPipelineState->GetDesc().Name, "' expects ", m_pPipelineState->GetNumBufferSlotsUsed(), " input buffer slots, but only ", m_NumVertexStreams, " is bound");
CommitD3D11VertexBuffers(m_pPipelineState, drawAttribs.Flags & DRAW_FLAG_TRANSITION_VERTEX_BUFFERS);
}
diff --git a/Graphics/GraphicsEngineD3D11/src/PipelineStateD3D11Impl.cpp b/Graphics/GraphicsEngineD3D11/src/PipelineStateD3D11Impl.cpp index d61c85e1..f3a37ddc 100644 --- a/Graphics/GraphicsEngineD3D11/src/PipelineStateD3D11Impl.cpp +++ b/Graphics/GraphicsEngineD3D11/src/PipelineStateD3D11Impl.cpp @@ -129,6 +129,7 @@ PipelineStateD3D11Impl::PipelineStateD3D11Impl(IReferenceCounters* pRefCoun auto &SRBAllocator = pRenderDeviceD3D11->GetSRBAllocator(); m_pDefaultShaderResBinding.reset( NEW_RC_OBJ(SRBAllocator, "ShaderResourceBindingD3D11Impl instance", ShaderResourceBindingD3D11Impl, this)(this, true) ); + m_pDefaultShaderResBinding->InitializeStaticResources(nullptr); } @@ -159,11 +160,13 @@ ID3D11InputLayout* PipelineStateD3D11Impl::GetD3D11InputLayout() return m_pd3d11InputLayout; } -void PipelineStateD3D11Impl::CreateShaderResourceBinding(IShaderResourceBinding** ppShaderResourceBinding) +void PipelineStateD3D11Impl::CreateShaderResourceBinding(IShaderResourceBinding** ppShaderResourceBinding, bool InitStaticResources) { auto* pRenderDeviceD3D11 = ValidatedCast<RenderDeviceD3D11Impl>( GetDevice() ); auto &SRBAllocator = pRenderDeviceD3D11->GetSRBAllocator(); auto pShaderResBinding = NEW_RC_OBJ(SRBAllocator, "ShaderResourceBindingD3D11Impl instance", ShaderResourceBindingD3D11Impl)(this, false); + if (InitStaticResources) + pShaderResBinding->InitializeStaticResources(nullptr); pShaderResBinding->QueryInterface(IID_ShaderResourceBinding, reinterpret_cast<IObject**>(static_cast<IShaderResourceBinding**>(ppShaderResourceBinding))); } diff --git a/Graphics/GraphicsEngineD3D11/src/ShaderResourceBindingD3D11Impl.cpp b/Graphics/GraphicsEngineD3D11/src/ShaderResourceBindingD3D11Impl.cpp index 83f0dac1..f63e64f0 100644 --- a/Graphics/GraphicsEngineD3D11/src/ShaderResourceBindingD3D11Impl.cpp +++ b/Graphics/GraphicsEngineD3D11/src/ShaderResourceBindingD3D11Impl.cpp @@ -111,15 +111,24 @@ void ShaderResourceBindingD3D11Impl::BindResources(Uint32 ShaderFlags, IResource } } -void ShaderResourceBindingD3D11Impl::BindStaticShaderResources() +void ShaderResourceBindingD3D11Impl::InitializeStaticResources(const IPipelineState* pPipelineState) { if (m_bIsStaticResourcesBound) { - LOG_ERROR("Static resources already bound"); + LOG_WARNING_MESSAGE("Static resources have already been initialized in this shader resource binding object. The operation will be ignored."); return; } - auto *pPSOD3D11 = ValidatedCast<PipelineStateD3D11Impl>(GetPipelineState()); + if (pPipelineState == nullptr) + { + pPipelineState = GetPipelineState(); + } + else + { + DEV_CHECK_ERR(pPipelineState->IsCompatibleWith(GetPipelineState()), "The pipeline state is not compatible with this SRB"); + } + + const auto *pPSOD3D11 = ValidatedCast<const PipelineStateD3D11Impl>(pPipelineState); auto ppShaders = pPSOD3D11->GetShaders(); auto NumShaders = pPSOD3D11->GetNumShaders(); VERIFY_EXPR(NumShaders == m_NumActiveShaders); |
