Skip to content

Commit 0aab310

Browse files
GraphicsAccessories: added GetShaderStatusString and GetPipelineStateStatusString functions
1 parent 42fdb91 commit 0aab310

File tree

4 files changed

+98
-11
lines changed

4 files changed

+98
-11
lines changed

Graphics/GraphicsAccessories/interface/GraphicsAccessories.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,15 @@ String GetCommandQueueTypeString(COMMAND_QUEUE_TYPE Type);
398398
/// Returns the string containing the fence type
399399
const Char* GetFenceTypeString(FENCE_TYPE Type);
400400

401+
/// Returns the string containing the shader status (e.g. "SHADER_STATUS_UNINITIALIZED" when GetEnumString is true,
402+
/// or "Uninitialized" when GetEnumString is false).
403+
const Char* GetShaderStatusString(SHADER_STATUS ShaderStatus, bool GetEnumString = false);
404+
405+
/// Returns the string containing the pipeline state status (e.g. "PIPELINE_STATE_STATUS_UNINITIALIZED" when
406+
/// GetEnumString is true, or "Uninitialized" when GetEnumString is false).
407+
const Char* GetPipelineStateStatusString(PIPELINE_STATE_STATUS PipelineStatus, bool GetEnumString = false);
408+
409+
401410
/// Helper template function that converts object description into a string
402411
template <typename TObjectDescType>
403412
String GetObjectDescString(const TObjectDescType&)

Graphics/GraphicsAccessories/src/GraphicsAccessories.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2511,6 +2511,38 @@ const Char* GetFenceTypeString(FENCE_TYPE Type)
25112511
}
25122512
}
25132513

2514+
const Char* GetShaderStatusString(SHADER_STATUS ShaderStatus, bool GetEnumString)
2515+
{
2516+
switch (ShaderStatus)
2517+
{
2518+
// clang-format off
2519+
case SHADER_STATUS_UNINITIALIZED: return GetEnumString ? "SHADER_STATUS_UNINITIALIZED" : "Uninitialized";
2520+
case SHADER_STATUS_COMPILING: return GetEnumString ? "SHADER_STATUS_COMPILING" : "Compiling";
2521+
case SHADER_STATUS_READY: return GetEnumString ? "SHADER_STATUS_READY" : "Ready";
2522+
case SHADER_STATUS_FAILED: return GetEnumString ? "SHADER_STATUS_FAILED" : "Failed";
2523+
// clang-format on
2524+
default:
2525+
UNEXPECTED("Unexpected shader status");
2526+
return "Unknown";
2527+
}
2528+
}
2529+
2530+
const Char* GetPipelineStateStatusString(PIPELINE_STATE_STATUS PipelineStatus, bool GetEnumString)
2531+
{
2532+
switch (PipelineStatus)
2533+
{
2534+
// clang-format off
2535+
case PIPELINE_STATE_STATUS_UNINITIALIZED: return GetEnumString ? "PIPELINE_STATE_STATUS_UNINITIALIZED" : "Uninitialized";
2536+
case PIPELINE_STATE_STATUS_COMPILING: return GetEnumString ? "PIPELINE_STATE_STATUS_COMPILING" : "Compiling";
2537+
case PIPELINE_STATE_STATUS_READY: return GetEnumString ? "PIPELINE_STATE_STATUS_READY" : "Ready";
2538+
case PIPELINE_STATE_STATUS_FAILED: return GetEnumString ? "PIPELINE_STATE_STATUS_FAILED" : "Failed";
2539+
// clang-format on
2540+
default:
2541+
UNEXPECTED("Unexpected pipeline state status");
2542+
return "Unknown";
2543+
}
2544+
}
2545+
25142546
TEXTURE_FORMAT UnormFormatToSRGB(TEXTURE_FORMAT Fmt)
25152547
{
25162548
switch (Fmt)

Graphics/GraphicsEngine/include/PipelineStateBase.hpp

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,8 @@ void WaitUntilShaderReadyIfRequested(RefCntAutoPtr<ShaderImplType>& pShader, boo
186186
const SHADER_STATUS ShaderStatus = pShader->GetStatus(/*WaitForCompletion = */ true);
187187
if (ShaderStatus != SHADER_STATUS_READY)
188188
{
189-
LOG_ERROR_AND_THROW("Shader '", pShader->GetDesc().Name, "' is not ready and cannot be used to create a pipeline state. Use GetStatus() to check the shader status.");
189+
LOG_ERROR_AND_THROW("Shader '", pShader->GetDesc().Name, "' is in ", GetShaderStatusString(ShaderStatus),
190+
" status and cannot be used to create a pipeline state. Use GetStatus() to check the shader status.");
190191
}
191192
}
192193
}
@@ -558,7 +559,9 @@ class PipelineStateBase : public DeviceObjectBase<typename EngineImplTraits::Pip
558559
virtual void DILIGENT_CALL_TYPE CreateShaderResourceBinding(IShaderResourceBinding** ppShaderResourceBinding,
559560
bool InitStaticResources) override final
560561
{
561-
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", this->m_Desc.Name, "' is not ready. Use GetStatus() to check the pipeline state status.");
562+
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", this->m_Desc.Name,
563+
"' is expected to be Ready, but its actual status is ", GetPipelineStateStatusString(m_Status.load()),
564+
". Use GetStatus() to check the pipeline state status.");
562565

563566
*ppShaderResourceBinding = nullptr;
564567

@@ -575,7 +578,9 @@ class PipelineStateBase : public DeviceObjectBase<typename EngineImplTraits::Pip
575578
virtual IShaderResourceVariable* DILIGENT_CALL_TYPE GetStaticVariableByName(SHADER_TYPE ShaderType,
576579
const Char* Name) override final
577580
{
578-
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", this->m_Desc.Name, "' is not ready. Use GetStatus() to check the pipeline state status.");
581+
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", this->m_Desc.Name,
582+
"' is expected to be Ready, but its actual status is ", GetPipelineStateStatusString(m_Status.load()),
583+
". Use GetStatus() to check the pipeline state status.");
579584

580585
if (!m_UsingImplicitSignature)
581586
{
@@ -597,7 +602,9 @@ class PipelineStateBase : public DeviceObjectBase<typename EngineImplTraits::Pip
597602
virtual IShaderResourceVariable* DILIGENT_CALL_TYPE GetStaticVariableByIndex(SHADER_TYPE ShaderType,
598603
Uint32 Index) override final
599604
{
600-
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", this->m_Desc.Name, "' is not ready. Use GetStatus() to check the pipeline state status.");
605+
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", this->m_Desc.Name,
606+
"' is expected to be Ready, but its actual status is ", GetPipelineStateStatusString(m_Status.load()),
607+
". Use GetStatus() to check the pipeline state status.");
601608

602609
if (!m_UsingImplicitSignature)
603610
{
@@ -618,7 +625,9 @@ class PipelineStateBase : public DeviceObjectBase<typename EngineImplTraits::Pip
618625

619626
virtual Uint32 DILIGENT_CALL_TYPE GetStaticVariableCount(SHADER_TYPE ShaderType) const override final
620627
{
621-
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", this->m_Desc.Name, "' is not ready. Use GetStatus() to check the pipeline state status.");
628+
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", this->m_Desc.Name,
629+
"' is expected to be Ready, but its actual status is ", GetPipelineStateStatusString(m_Status.load()),
630+
". Use GetStatus() to check the pipeline state status.");
622631

623632
if (!m_UsingImplicitSignature)
624633
{
@@ -641,7 +650,9 @@ class PipelineStateBase : public DeviceObjectBase<typename EngineImplTraits::Pip
641650
IResourceMapping* pResourceMapping,
642651
BIND_SHADER_RESOURCES_FLAGS Flags) override final
643652
{
644-
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", this->m_Desc.Name, "' is not ready. Use GetStatus() to check the pipeline state status.");
653+
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", this->m_Desc.Name,
654+
"' is expected to be Ready, but its actual status is ", GetPipelineStateStatusString(m_Status.load()),
655+
". Use GetStatus() to check the pipeline state status.");
645656

646657
if (!m_UsingImplicitSignature)
647658
{
@@ -655,7 +666,9 @@ class PipelineStateBase : public DeviceObjectBase<typename EngineImplTraits::Pip
655666

656667
virtual void DILIGENT_CALL_TYPE InitializeStaticSRBResources(IShaderResourceBinding* pSRB) const override final
657668
{
658-
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", this->m_Desc.Name, "' is not ready. Use GetStatus() to check the pipeline state status.");
669+
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", this->m_Desc.Name,
670+
"' is expected to be Ready, but its actual status is ", GetPipelineStateStatusString(m_Status.load()),
671+
". Use GetStatus() to check the pipeline state status.");
659672

660673
if (!m_UsingImplicitSignature)
661674
{
@@ -669,7 +682,9 @@ class PipelineStateBase : public DeviceObjectBase<typename EngineImplTraits::Pip
669682

670683
virtual void DILIGENT_CALL_TYPE CopyStaticResources(IPipelineState* pDstPipeline) const override final
671684
{
672-
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", this->m_Desc.Name, "' is not ready. Use GetStatus() to check the pipeline state status.");
685+
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", this->m_Desc.Name,
686+
"' is expected to be Ready, but its actual status is ", GetPipelineStateStatusString(m_Status.load()),
687+
". Use GetStatus() to check the pipeline state status.");
673688

674689
if (pDstPipeline == nullptr)
675690
{
@@ -697,15 +712,19 @@ class PipelineStateBase : public DeviceObjectBase<typename EngineImplTraits::Pip
697712
/// Implementation of IPipelineState::GetResourceSignatureCount().
698713
virtual Uint32 DILIGENT_CALL_TYPE GetResourceSignatureCount() const override final
699714
{
700-
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", this->m_Desc.Name, "' is not ready. Use GetStatus() to check the pipeline state status.");
715+
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", this->m_Desc.Name,
716+
"' is expected to be Ready, but its actual status is ", GetPipelineStateStatusString(m_Status.load()),
717+
". Use GetStatus() to check the pipeline state status.");
701718

702719
return m_SignatureCount;
703720
}
704721

705722
/// Implementation of IPipelineState::GetResourceSignature().
706723
virtual PipelineResourceSignatureImplType* DILIGENT_CALL_TYPE GetResourceSignature(Uint32 Index) const override final
707724
{
708-
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", this->m_Desc.Name, "' is not ready. Use GetStatus() to check the pipeline state status.");
725+
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", this->m_Desc.Name,
726+
"' is expected to be Ready, but its actual status is ", GetPipelineStateStatusString(m_Status.load()),
727+
". Use GetStatus() to check the pipeline state status.");
709728

710729
VERIFY_EXPR(Index < m_SignatureCount);
711730
return m_Signatures[Index];
@@ -714,7 +733,9 @@ class PipelineStateBase : public DeviceObjectBase<typename EngineImplTraits::Pip
714733
/// Implementation of IPipelineState::IsCompatibleWith().
715734
virtual bool DILIGENT_CALL_TYPE IsCompatibleWith(const IPipelineState* pPSO) const override // May be overridden
716735
{
717-
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", this->m_Desc.Name, "' is not ready. Use GetStatus() to check the pipeline state status.");
736+
DEV_CHECK_ERR(m_Status.load() == PIPELINE_STATE_STATUS_READY, "Pipeline state '", this->m_Desc.Name,
737+
"' is expected to be Ready, but its actual status is ", GetPipelineStateStatusString(m_Status.load()),
738+
". Use GetStatus() to check the pipeline state status.");
718739

719740
DEV_CHECK_ERR(pPSO != nullptr, "pPSO must not be null");
720741

Tests/DiligentCoreTest/src/GraphicsAccessories/GraphicsAccessoriesTest.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1246,6 +1246,31 @@ TEST(GraphicsAccessories_GraphicsAccessories, GetAdapterTypeString)
12461246
EXPECT_STREQ(GetAdapterTypeString(ADAPTER_TYPE_DISCRETE, true), "ADAPTER_TYPE_DISCRETE");
12471247
}
12481248

1249+
TEST(GraphicsAccessories_GraphicsAccessories, GetShaderStatusString)
1250+
{
1251+
EXPECT_STREQ(GetShaderStatusString(SHADER_STATUS_UNINITIALIZED), "Uninitialized");
1252+
EXPECT_STREQ(GetShaderStatusString(SHADER_STATUS_COMPILING), "Compiling");
1253+
EXPECT_STREQ(GetShaderStatusString(SHADER_STATUS_READY), "Ready");
1254+
EXPECT_STREQ(GetShaderStatusString(SHADER_STATUS_FAILED), "Failed");
1255+
1256+
EXPECT_STREQ(GetShaderStatusString(SHADER_STATUS_UNINITIALIZED, true), "SHADER_STATUS_UNINITIALIZED");
1257+
EXPECT_STREQ(GetShaderStatusString(SHADER_STATUS_COMPILING, true), "SHADER_STATUS_COMPILING");
1258+
EXPECT_STREQ(GetShaderStatusString(SHADER_STATUS_READY, true), "SHADER_STATUS_READY");
1259+
EXPECT_STREQ(GetShaderStatusString(SHADER_STATUS_FAILED, true), "SHADER_STATUS_FAILED");
1260+
}
1261+
1262+
TEST(GraphicsAccessories_GraphicsAccessories, GetPipelineStateStatusString)
1263+
{
1264+
EXPECT_STREQ(GetPipelineStateStatusString(PIPELINE_STATE_STATUS_UNINITIALIZED), "Uninitialized");
1265+
EXPECT_STREQ(GetPipelineStateStatusString(PIPELINE_STATE_STATUS_COMPILING), "Compiling");
1266+
EXPECT_STREQ(GetPipelineStateStatusString(PIPELINE_STATE_STATUS_READY), "Ready");
1267+
EXPECT_STREQ(GetPipelineStateStatusString(PIPELINE_STATE_STATUS_FAILED), "Failed");
1268+
1269+
EXPECT_STREQ(GetPipelineStateStatusString(PIPELINE_STATE_STATUS_UNINITIALIZED, true), "PIPELINE_STATE_STATUS_UNINITIALIZED");
1270+
EXPECT_STREQ(GetPipelineStateStatusString(PIPELINE_STATE_STATUS_COMPILING, true), "PIPELINE_STATE_STATUS_COMPILING");
1271+
EXPECT_STREQ(GetPipelineStateStatusString(PIPELINE_STATE_STATUS_READY, true), "PIPELINE_STATE_STATUS_READY");
1272+
EXPECT_STREQ(GetPipelineStateStatusString(PIPELINE_STATE_STATUS_FAILED, true), "PIPELINE_STATE_STATUS_FAILED");
1273+
}
12491274

12501275
TEST(GraphicsAccessories_GraphicsAccessories, ResolveInputLayoutAutoOffsetsAndStrides)
12511276
{

0 commit comments

Comments
 (0)