diff options
Diffstat (limited to 'Graphics/GraphicsEngineD3D12')
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); |
