summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngine
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2021-01-22 05:17:12 +0000
committerassiduous <assiduous@diligentgraphics.com>2021-01-22 05:17:12 +0000
commit45c6abd698ccc0feaf2d08a68fb7f93151ba15e7 (patch)
treeddef51b8f6b637adf8bb6379af18cdb9023854fc /Graphics/GraphicsEngine
parentSome code clean-up (diff)
downloadDiligentCore-45c6abd698ccc0feaf2d08a68fb7f93151ba15e7.tar.gz
DiligentCore-45c6abd698ccc0feaf2d08a68fb7f93151ba15e7.zip
Some refactoring of PipelineLayoutVk
Diffstat (limited to 'Graphics/GraphicsEngine')
-rw-r--r--Graphics/GraphicsEngine/include/PipelineResourceSignatureBase.hpp10
-rw-r--r--Graphics/GraphicsEngine/src/PipelineResourceSignatureBase.cpp3
-rw-r--r--Graphics/GraphicsEngine/src/PipelineStateBase.cpp37
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))