From 45c6abd698ccc0feaf2d08a68fb7f93151ba15e7 Mon Sep 17 00:00:00 2001 From: assiduous Date: Thu, 21 Jan 2021 21:17:12 -0800 Subject: Some refactoring of PipelineLayoutVk --- .../include/PipelineResourceSignatureBase.hpp | 10 +----- .../src/PipelineResourceSignatureBase.cpp | 3 ++ Graphics/GraphicsEngine/src/PipelineStateBase.cpp | 37 ++++++++++++++++++++++ 3 files changed, 41 insertions(+), 9 deletions(-) (limited to 'Graphics/GraphicsEngine') diff --git a/Graphics/GraphicsEngine/include/PipelineResourceSignatureBase.hpp b/Graphics/GraphicsEngine/include/PipelineResourceSignatureBase.hpp index a5cbf71b..63034655 100644 --- a/Graphics/GraphicsEngine/include/PipelineResourceSignatureBase.hpp +++ b/Graphics/GraphicsEngine/include/PipelineResourceSignatureBase.hpp @@ -69,15 +69,7 @@ public: this->m_Desc.ImmutableSamplers = nullptr; this->m_Desc.CombinedSamplerSuffix = nullptr; - try - { - ValidatePipelineResourceSignatureDesc(Desc); - } - catch (...) - { - Destruct(); - throw; - } + ValidatePipelineResourceSignatureDesc(Desc); } ~PipelineResourceSignatureBase() diff --git a/Graphics/GraphicsEngine/src/PipelineResourceSignatureBase.cpp b/Graphics/GraphicsEngine/src/PipelineResourceSignatureBase.cpp index 4a880300..ee597307 100644 --- a/Graphics/GraphicsEngine/src/PipelineResourceSignatureBase.cpp +++ b/Graphics/GraphicsEngine/src/PipelineResourceSignatureBase.cpp @@ -34,6 +34,9 @@ namespace Diligent void ValidatePipelineResourceSignatureDesc(const PipelineResourceSignatureDesc& Desc) noexcept(false) { + if (Desc.BindingIndex >= MAX_RESOURCE_SIGNATURES) + LOG_PRS_ERROR_AND_THROW("Desc.BindingIndex (", Desc.BindingIndex, ") exceeds the maximum allowed value (", MAX_RESOURCE_SIGNATURES - 1, ")."); + for (Uint32 i = 0; i < Desc.NumResources; ++i) { const auto& Res = Desc.Resources[i]; diff --git a/Graphics/GraphicsEngine/src/PipelineStateBase.cpp b/Graphics/GraphicsEngine/src/PipelineStateBase.cpp index 3d111087..e08a5a11 100644 --- a/Graphics/GraphicsEngine/src/PipelineStateBase.cpp +++ b/Graphics/GraphicsEngine/src/PipelineStateBase.cpp @@ -28,6 +28,8 @@ #include "PipelineStateBase.hpp" #include +#include +#include #include "HashUtils.hpp" @@ -155,6 +157,35 @@ void CorrectBlendStateDesc(GraphicsPipelineDesc& GraphicsPipeline) noexcept } } + +void ValidatePipelineResourceSignatures(const PipelineStateCreateInfo& CreateInfo) noexcept(false) +{ + if (CreateInfo.ppResourceSignatures == nullptr) + return; + + const auto& PSODesc = CreateInfo.PSODesc; + + std::array ppSignatures = {}; + for (Uint32 i = 0; i < CreateInfo.ResourceSignaturesCount; ++i) + { + auto* pSignature = CreateInfo.ppResourceSignatures[i]; + if (pSignature == nullptr) + LOG_PSO_ERROR_AND_THROW("Pipeline resource signature at index ", i, " is null"); + + const auto& SigDesc = pSignature->GetDesc(); + VERIFY(SigDesc.BindingIndex < MAX_RESOURCE_SIGNATURES, + "Resource signature binding index exceeds the limit. This error should've been caught by ValidatePipelineResourceSignatureDesc."); + + if (ppSignatures[SigDesc.BindingIndex] != nullptr) + { + LOG_PSO_ERROR_AND_THROW("Pipeline resource signature '", pSignature->GetDesc().Name, "' at binding index ", Uint32{SigDesc.BindingIndex}, + " conflicts with another resource signature '", ppSignatures[SigDesc.BindingIndex]->GetDesc().Name, + "' that uses the same index."); + } + } +} + + } // namespace #define VALIDATE_SHADER_TYPE(Shader, ExpectedType, ShaderName) \ @@ -169,6 +200,8 @@ void ValidateGraphicsPipelineCreateInfo(const GraphicsPipelineStateCreateInfo& C if (PSODesc.PipelineType != PIPELINE_TYPE_GRAPHICS && PSODesc.PipelineType != PIPELINE_TYPE_MESH) LOG_PSO_ERROR_AND_THROW("Pipeline type must be GRAPHICS or MESH."); + ValidatePipelineResourceSignatures(CreateInfo); + const auto& GraphicsPipeline = CreateInfo.GraphicsPipeline; ValidateBlendStateDesc(PSODesc, GraphicsPipeline); @@ -246,6 +279,8 @@ void ValidateComputePipelineCreateInfo(const ComputePipelineStateCreateInfo& Cre if (PSODesc.PipelineType != PIPELINE_TYPE_COMPUTE) LOG_PSO_ERROR_AND_THROW("Pipeline type must be COMPUTE."); + ValidatePipelineResourceSignatures(CreateInfo); + if (CreateInfo.pCS == nullptr) LOG_PSO_ERROR_AND_THROW("Compute shader must not be null."); @@ -258,6 +293,8 @@ void ValidateRayTracingPipelineCreateInfo(IRenderDevice* pDevice, Uint32 MaxRecu if (PSODesc.PipelineType != PIPELINE_TYPE_RAY_TRACING) LOG_PSO_ERROR_AND_THROW("Pipeline type must be RAY_TRACING."); + ValidatePipelineResourceSignatures(CreateInfo); + if (pDevice->GetDeviceCaps().DevType == RENDER_DEVICE_TYPE_D3D12) { if ((CreateInfo.pShaderRecordName != nullptr) != (CreateInfo.RayTracingPipeline.ShaderRecordSize > 0)) -- cgit v1.2.3