From 84d8fedc201a66835f5c234160bda63bbc40f682 Mon Sep 17 00:00:00 2001 From: Egor Yusov Date: Fri, 23 Nov 2018 16:07:34 -0800 Subject: Added IShaderResourceBinding::InitializeStaticResources() method to allow explicit initialization of static shader resources in a SRB --- .../GraphicsEngineD3D11/include/PipelineStateD3D11Impl.h | 2 +- .../include/ShaderResourceBindingD3D11Impl.h | 3 ++- .../GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp | 13 +++++++++---- .../GraphicsEngineD3D11/src/PipelineStateD3D11Impl.cpp | 5 ++++- .../src/ShaderResourceBindingD3D11Impl.cpp | 15 ++++++++++++--- 5 files changed, 28 insertions(+), 10 deletions(-) (limited to 'Graphics/GraphicsEngineD3D11') 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(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( 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(static_cast(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(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(pPipelineState); auto ppShaders = pPSOD3D11->GetShaders(); auto NumShaders = pPSOD3D11->GetNumShaders(); VERIFY_EXPR(NumShaders == m_NumActiveShaders); -- cgit v1.2.3