summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineD3D12
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2021-03-06 22:06:26 +0000
committerassiduous <assiduous@diligentgraphics.com>2021-03-19 00:38:16 +0000
commit30a65df99cfc678a431a89b0cff02a515416c78a (patch)
tree2d3ed68bf8ec028879e22ff6d1ec386df723677e /Graphics/GraphicsEngineD3D12
parentMoved GetResourceAttribution() function to PipelineStateBase to eliminate dup... (diff)
downloadDiligentCore-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.hpp13
-rw-r--r--Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp47
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