diff options
| author | assiduous <assiduous@diligentgraphics.com> | 2021-03-06 22:06:26 +0000 |
|---|---|---|
| committer | assiduous <assiduous@diligentgraphics.com> | 2021-03-19 00:38:16 +0000 |
| commit | 30a65df99cfc678a431a89b0cff02a515416c78a (patch) | |
| tree | 2d3ed68bf8ec028879e22ff6d1ec386df723677e /Graphics/GraphicsEngineD3D12 | |
| parent | Moved GetResourceAttribution() function to PipelineStateBase to eliminate dup... (diff) | |
| download | DiligentCore-30a65df99cfc678a431a89b0cff02a515416c78a.tar.gz DiligentCore-30a65df99cfc678a431a89b0cff02a515416c78a.zip | |
Unified resource signature handling by pipeline state in D3D12, Vk and GL
Diffstat (limited to 'Graphics/GraphicsEngineD3D12')
| -rw-r--r-- | Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.hpp | 13 | ||||
| -rw-r--r-- | Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp | 47 |
2 files changed, 19 insertions, 41 deletions
diff --git a/Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.hpp b/Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.hpp index 4c0f954b..c8f35d36 100644 --- a/Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.hpp +++ b/Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.hpp @@ -60,16 +60,6 @@ public: /// Implementation of IPipelineState::IsCompatibleWith() in Direct3D12 backend. virtual bool DILIGENT_CALL_TYPE IsCompatibleWith(const IPipelineState* pPSO) const override final; - /// Implementation of IPipelineState::GetResourceSignatureCount() in Direct3D12 backend. - virtual Uint32 DILIGENT_CALL_TYPE GetResourceSignatureCount() const override final { return m_RootSig->GetSignatureCount(); } - - /// Implementation of IPipelineState::GetResourceSignature() in Direct3D12 backend. - virtual PipelineResourceSignatureD3D12Impl* DILIGENT_CALL_TYPE GetResourceSignature(Uint32 Index) const override final - { - VERIFY_EXPR(Index < GetResourceSignatureCount()); - return m_ResourceSignatures[Index]; - } - /// Implementation of IPipelineStateD3D12::GetD3D12PipelineState(). virtual ID3D12PipelineState* DILIGENT_CALL_TYPE GetD3D12PipelineState() const override final { return static_cast<ID3D12PipelineState*>(m_pd3d12PSO.p); } @@ -111,7 +101,7 @@ private: TShaderStages& ShaderStages, LocalRootSignatureD3D12* pLocalRootSig); - static RefCntAutoPtr<IPipelineResourceSignature> CreateDefaultResourceSignature( + static RefCntAutoPtr<PipelineResourceSignatureD3D12Impl> CreateDefaultResourceSignature( RenderDeviceD3D12Impl* pDevice, const PipelineStateCreateInfo& CreateInfo, TShaderStages& ShaderStages, @@ -128,7 +118,6 @@ private: // NB: Pipeline resource signatures used to create the PSO may NOT be the same as // pipeline resource signatures in m_RootSig, because the latter may be used from the // cache. While the two signatures may be compatible, they resource names may not be identical. - std::unique_ptr<RefCntAutoPtr<PipelineResourceSignatureD3D12Impl>[]> m_ResourceSignatures; #ifdef DILIGENT_DEVELOPMENT // Shader resources for all shaders in all shader stages in the pipeline. diff --git a/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp index f27d39dc..94e8b8b4 100644 --- a/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp +++ b/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp @@ -414,7 +414,7 @@ size_t PipelineStateD3D12Impl::ShaderStageInfo::Count() const } -RefCntAutoPtr<IPipelineResourceSignature> PipelineStateD3D12Impl::CreateDefaultResourceSignature( +RefCntAutoPtr<PipelineResourceSignatureD3D12Impl> PipelineStateD3D12Impl::CreateDefaultResourceSignature( RenderDeviceD3D12Impl* pDevice, const PipelineStateCreateInfo& CreateInfo, TShaderStages& ShaderStages, @@ -513,7 +513,7 @@ RefCntAutoPtr<IPipelineResourceSignature> PipelineStateD3D12Impl::CreateDefaultR } } - RefCntAutoPtr<IPipelineResourceSignature> pImplicitSignature; + RefCntAutoPtr<PipelineResourceSignatureD3D12Impl> pImplicitSignature; if (Resources.size()) { PipelineResourceSignatureDesc ResSignDesc; @@ -526,7 +526,11 @@ RefCntAutoPtr<IPipelineResourceSignature> PipelineStateD3D12Impl::CreateDefaultR ResSignDesc.UseCombinedTextureSamplers = pCombinedSamplerSuffix != nullptr; ResSignDesc.CombinedSamplerSuffix = pCombinedSamplerSuffix; - pDevice->CreatePipelineResourceSignature(ResSignDesc, &pImplicitSignature, true); + // Always initialize default resource signature as internal device object. + // This is necessary to avoud cyclic references from GenerateMips. + // This may never be a problem as the PSO keeps the reference to the device if necessary. + constexpr bool bIsDeviceInternal = true; + pDevice->CreatePipelineResourceSignature(ResSignDesc, pImplicitSignature.DblPtr<IPipelineResourceSignature>(), bIsDeviceInternal); if (!pImplicitSignature) LOG_ERROR_AND_THROW("Failed to create implicit resource signature for pipeline state '", (CreateInfo.PSODesc.Name ? CreateInfo.PSODesc.Name : ""), "'."); @@ -539,31 +543,14 @@ void PipelineStateD3D12Impl::InitRootSignature(const PipelineStateCreateInfo& Cr TShaderStages& ShaderStages, LocalRootSignatureD3D12* pLocalRootSig) { - Uint32 SignatureCount = 0; - if (CreateInfo.ResourceSignaturesCount == 0 || CreateInfo.ppResourceSignatures == nullptr) + if (m_UsingImplicitSignature) { - auto pImplicitSignature = CreateDefaultResourceSignature(GetDevice(), CreateInfo, ShaderStages, pLocalRootSig); - if (pImplicitSignature) - { - VERIFY_EXPR(pImplicitSignature->GetDesc().BindingIndex == 0); - SignatureCount = 1; - m_ResourceSignatures.reset(new RefCntAutoPtr<PipelineResourceSignatureD3D12Impl>[SignatureCount]); - m_ResourceSignatures[0] = pImplicitSignature.RawPtr<PipelineResourceSignatureD3D12Impl>(); - } - } - else - { - Uint32 MaxSignatureBindingIndex = PipelineResourceSignatureD3D12Impl::CalcMaxSignatureBindIndex(CreateInfo.ResourceSignaturesCount, CreateInfo.ppResourceSignatures); - SignatureCount = MaxSignatureBindingIndex + 1; - m_ResourceSignatures.reset(new RefCntAutoPtr<PipelineResourceSignatureD3D12Impl>[SignatureCount]); - - auto DbgMaxSignatureBindingIndex = - PipelineResourceSignatureD3D12Impl::CopyResourceSignatures(CreateInfo.PSODesc.PipelineType, CreateInfo.ResourceSignaturesCount, - CreateInfo.ppResourceSignatures, m_ResourceSignatures.get(), SignatureCount); - VERIFY_EXPR(DbgMaxSignatureBindingIndex == MaxSignatureBindingIndex); + VERIFY_EXPR(m_SignatureCount == 1); + m_Signatures[0] = CreateDefaultResourceSignature(GetDevice(), CreateInfo, ShaderStages, pLocalRootSig); + VERIFY_EXPR(!m_Signatures[0] || m_Signatures[0]->GetDesc().BindingIndex == 0); } - m_RootSig = GetDevice()->GetRootSignatureCache().GetRootSig(m_ResourceSignatures.get(), SignatureCount); + m_RootSig = GetDevice()->GetRootSignatureCache().GetRootSig(m_Signatures, m_SignatureCount); if (!m_RootSig) LOG_ERROR_AND_THROW("Failed to create root signature for pipeline '", m_Desc.Name, "'."); @@ -587,9 +574,9 @@ void PipelineStateD3D12Impl::InitRootSignature(const PipelineStateCreateInfo& Cr ResourceBinding::TMap ResourceMap; // Note that we must use signatures from m_ResourceSignatures for resource binding map, // because signatures from m_RootSig may have resources with different names. - for (Uint32 sign = 0; sign < SignatureCount; ++sign) + for (Uint32 sign = 0; sign < m_SignatureCount; ++sign) { - const PipelineResourceSignatureD3D12Impl* const pSignature = m_ResourceSignatures[sign]; + const PipelineResourceSignatureD3D12Impl* const pSignature = m_Signatures[sign]; if (pSignature == nullptr) continue; @@ -1118,12 +1105,14 @@ void PipelineStateD3D12Impl::Destruct() bool PipelineStateD3D12Impl::IsCompatibleWith(const IPipelineState* pPSO) const { - VERIFY_EXPR(pPSO != nullptr); + DEV_CHECK_ERR(pPSO != nullptr, "pPSO must not be null"); if (pPSO == this) return true; - return (m_RootSig == ValidatedCast<const PipelineStateD3D12Impl>(pPSO)->m_RootSig); + bool IsCompatible = (m_RootSig == ValidatedCast<const PipelineStateD3D12Impl>(pPSO)->m_RootSig); + VERIFY_EXPR(IsCompatible == TPipelineStateBase::IsCompatibleWith(pPSO)); + return IsCompatible; } } // namespace Diligent |
