Skip to content

Commit ce3c521

Browse files
Fixed IsCompatibleWith method for reloadable pipelines
1 parent 66c51db commit ce3c521

File tree

4 files changed

+55
-5
lines changed

4 files changed

+55
-5
lines changed

Graphics/GraphicsEngine/include/PipelineStateBase.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -506,8 +506,11 @@ class PipelineStateBase : public DeviceObjectBase<typename EngineImplTraits::Pip
506506
if (pPSO == this)
507507
return true;
508508

509+
RefCntAutoPtr<PipelineStateImplType> pPSOImpl{const_cast<IPipelineState*>(pPSO), PipelineStateImplType::IID_InternalImpl};
510+
VERIFY(pPSOImpl, "Unknown PSO implementation type");
511+
509512
const auto& lhs = *static_cast<const PipelineStateImplType*>(this);
510-
const auto& rhs = *ClassPtrCast<const PipelineStateImplType>(pPSO);
513+
const auto& rhs = *pPSOImpl;
511514

512515
const auto SignCount = lhs.GetResourceSignatureCount();
513516
if (SignCount != rhs.GetResourceSignatureCount())

Graphics/GraphicsEngineD3D11/src/PipelineStateD3D11Impl.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,10 @@ bool PipelineStateD3D11Impl::IsCompatibleWith(const IPipelineState* pPSO) const
390390
if (!TPipelineStateBase::IsCompatibleWith(pPSO))
391391
return false;
392392

393-
const auto& rhs = *ClassPtrCast<const PipelineStateD3D11Impl>(pPSO);
393+
RefCntAutoPtr<PipelineStateD3D11Impl> pPSOImpl{const_cast<IPipelineState*>(pPSO), PipelineStateImplType::IID_InternalImpl};
394+
VERIFY(pPSOImpl, "Unknown PSO implementation type");
395+
396+
const auto& rhs = *pPSOImpl;
394397
if (m_ActiveShaderStages != rhs.m_ActiveShaderStages)
395398
return false;
396399

Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1017,7 +1017,10 @@ bool PipelineStateD3D12Impl::IsCompatibleWith(const IPipelineState* pPSO) const
10171017
if (pPSO == this)
10181018
return true;
10191019

1020-
bool IsCompatible = (m_RootSig == ClassPtrCast<const PipelineStateD3D12Impl>(pPSO)->m_RootSig);
1020+
RefCntAutoPtr<PipelineStateD3D12Impl> pPSOImpl{const_cast<IPipelineState*>(pPSO), PipelineStateImplType::IID_InternalImpl};
1021+
VERIFY(pPSOImpl, "Unknown PSO implementation type");
1022+
1023+
bool IsCompatible = (m_RootSig == pPSOImpl->m_RootSig);
10211024
VERIFY_EXPR(IsCompatible == TPipelineStateBase::IsCompatibleWith(pPSO));
10221025
return IsCompatible;
10231026
}

Tests/DiligentCoreAPITest/src/RenderStateCacheTest.cpp

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,17 @@ void CreateGraphicsPSO(IRenderStateCache* pCache, bool PresentInCache, IShader*
412412
PsoCI.GraphicsPipeline.RTVFormats[0] = ColorBufferFormat;
413413
}
414414

415-
EXPECT_EQ(pCache->CreateGraphicsPipelineState(PsoCI, ppPSO), PresentInCache);
415+
if (pCache != nullptr)
416+
{
417+
EXPECT_EQ(pCache->CreateGraphicsPipelineState(PsoCI, ppPSO), PresentInCache);
418+
}
419+
else
420+
{
421+
EXPECT_FALSE(PresentInCache);
422+
pEnv->GetDevice()->CreateGraphicsPipelineState(PsoCI, ppPSO);
423+
ASSERT_NE(*ppPSO, nullptr);
424+
}
425+
416426
if (*ppPSO != nullptr)
417427
{
418428
const auto& Desc = (*ppPSO)->GetDesc();
@@ -443,6 +453,10 @@ void TestGraphicsPSO(bool UseRenderPass)
443453
ASSERT_NE(pUncachedVS, nullptr);
444454
ASSERT_NE(pUncachedPS, nullptr);
445455

456+
RefCntAutoPtr<IPipelineState> pRefPSO;
457+
CreateGraphicsPSO(nullptr, false, pUncachedVS, pUncachedPS, UseRenderPass, &pRefPSO);
458+
ASSERT_NE(pRefPSO, nullptr);
459+
446460
for (Uint32 HotReload = 0; HotReload < 2; ++HotReload)
447461
{
448462
RefCntAutoPtr<IDataBlob> pData;
@@ -463,6 +477,8 @@ void TestGraphicsPSO(bool UseRenderPass)
463477
RefCntAutoPtr<IPipelineState> pPSO;
464478
CreateGraphicsPSO(pCache, pData != nullptr, pVS1, pPS1, UseRenderPass, &pPSO);
465479
ASSERT_NE(pPSO, nullptr);
480+
EXPECT_TRUE(pRefPSO->IsCompatibleWith(pPSO));
481+
EXPECT_TRUE(pPSO->IsCompatibleWith(pRefPSO));
466482

467483
VerifyGraphicsPSO(pPSO, UseRenderPass);
468484

@@ -476,6 +492,9 @@ void TestGraphicsPSO(bool UseRenderPass)
476492
{
477493
RefCntAutoPtr<IPipelineState> pPSO2;
478494
CreateGraphicsPSO(pCache, pData != nullptr, pUncachedVS, pUncachedPS, UseRenderPass, &pPSO2);
495+
ASSERT_NE(pPSO2, nullptr);
496+
EXPECT_TRUE(pRefPSO->IsCompatibleWith(pPSO2));
497+
EXPECT_TRUE(pPSO2->IsCompatibleWith(pRefPSO));
479498
VerifyGraphicsPSO(pPSO2, UseRenderPass);
480499
}
481500

@@ -539,7 +558,17 @@ void CreateComputePSO(IRenderStateCache* pCache, bool PresentInCache, IShader* p
539558
PsoCI.PSODesc.ResourceLayout.NumVariables = _countof(Variables);
540559
}
541560

542-
EXPECT_EQ(pCache->CreateComputePipelineState(PsoCI, ppPSO), PresentInCache);
561+
if (pCache != nullptr)
562+
{
563+
EXPECT_EQ(pCache->CreateComputePipelineState(PsoCI, ppPSO), PresentInCache);
564+
}
565+
else
566+
{
567+
EXPECT_FALSE(PresentInCache);
568+
pEnv->GetDevice()->CreateComputePipelineState(PsoCI, ppPSO);
569+
ASSERT_NE(*ppPSO, nullptr);
570+
}
571+
543572
if (*ppPSO != nullptr)
544573
{
545574
const auto& Desc = (*ppPSO)->GetDesc();
@@ -569,6 +598,16 @@ void TestComputePSO(bool UseSignature)
569598
pDevice->GetEngineFactory()->CreateDefaultShaderSourceStreamFactory("shaders/RenderStateCache", &pShaderSourceFactory);
570599
ASSERT_TRUE(pShaderSourceFactory);
571600

601+
RefCntAutoPtr<IPipelineState> pRefPSO;
602+
{
603+
RefCntAutoPtr<IShader> pUncachedCS;
604+
CreateComputeShader(nullptr, pShaderSourceFactory, pUncachedCS, false);
605+
ASSERT_NE(pUncachedCS, nullptr);
606+
607+
CreateComputePSO(nullptr, false, pUncachedCS, UseSignature, &pRefPSO);
608+
ASSERT_NE(pRefPSO, nullptr);
609+
}
610+
572611
for (Uint32 HotReload = 0; HotReload < 2; ++HotReload)
573612
{
574613
RefCntAutoPtr<IDataBlob> pData;
@@ -588,6 +627,8 @@ void TestComputePSO(bool UseSignature)
588627
RefCntAutoPtr<IPipelineState> pPSO;
589628
CreateComputePSO(pCache, pData != nullptr, pCS, UseSignature, &pPSO);
590629
ASSERT_NE(pPSO, nullptr);
630+
EXPECT_TRUE(pRefPSO->IsCompatibleWith(pPSO));
631+
EXPECT_TRUE(pPSO->IsCompatibleWith(pRefPSO));
591632

592633
VerifyComputePSO(pPSO, /* UseSignature = */ true);
593634

0 commit comments

Comments
 (0)