diff options
| author | assiduous <assiduous@diligentgraphics.com> | 2021-01-22 05:17:12 +0000 |
|---|---|---|
| committer | assiduous <assiduous@diligentgraphics.com> | 2021-01-22 05:17:12 +0000 |
| commit | 45c6abd698ccc0feaf2d08a68fb7f93151ba15e7 (patch) | |
| tree | ddef51b8f6b637adf8bb6379af18cdb9023854fc /Graphics/GraphicsEngine | |
| parent | Some code clean-up (diff) | |
| download | DiligentCore-45c6abd698ccc0feaf2d08a68fb7f93151ba15e7.tar.gz DiligentCore-45c6abd698ccc0feaf2d08a68fb7f93151ba15e7.zip | |
Some refactoring of PipelineLayoutVk
Diffstat (limited to 'Graphics/GraphicsEngine')
3 files changed, 41 insertions, 9 deletions
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 <unordered_set> +#include <unordered_map> +#include <array> #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<const IPipelineResourceSignature*, MAX_RESOURCE_SIGNATURES> 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)) |
