From 22fafb8e38439f203a70988e6455b2d2ce13bd43 Mon Sep 17 00:00:00 2001 From: assiduous Date: Fri, 29 Jan 2021 20:36:32 -0800 Subject: Pipeline resource signature impl: improved validation of PipelineResourceDesc.Flags parameter --- .../src/PipelineResourceSignatureBase.cpp | 84 ++++++++++++++++++---- 1 file changed, 70 insertions(+), 14 deletions(-) (limited to 'Graphics/GraphicsEngine') diff --git a/Graphics/GraphicsEngine/src/PipelineResourceSignatureBase.cpp b/Graphics/GraphicsEngine/src/PipelineResourceSignatureBase.cpp index ebe45d02..b6a5cfb8 100644 --- a/Graphics/GraphicsEngine/src/PipelineResourceSignatureBase.cpp +++ b/Graphics/GraphicsEngine/src/PipelineResourceSignatureBase.cpp @@ -68,20 +68,76 @@ void ValidatePipelineResourceSignatureDesc(const PipelineResourceSignatureDesc& } UsedStages |= Res.ShaderStages; - if ((Res.Flags & PIPELINE_RESOURCE_FLAG_NO_DYNAMIC_BUFFERS) && - (Res.ResourceType != SHADER_RESOURCE_TYPE_CONSTANT_BUFFER && - Res.ResourceType != SHADER_RESOURCE_TYPE_BUFFER_UAV && - Res.ResourceType != SHADER_RESOURCE_TYPE_BUFFER_SRV)) - LOG_PRS_ERROR_AND_THROW("Desc.Resources[", i, "].Flags must not contain PIPELINE_RESOURCE_FLAG_NO_DYNAMIC_BUFFERS if ResourceType is not buffer"); - - if ((Res.Flags & PIPELINE_RESOURCE_FLAG_COMBINED_SAMPLER) && - Res.ResourceType != SHADER_RESOURCE_TYPE_TEXTURE_SRV) - LOG_PRS_ERROR_AND_THROW("Desc.Resources[", i, "].Flags must not contain PIPELINE_RESOURCE_FLAG_COMBINED_SAMPLER if ResourceType is not SHADER_RESOURCE_TYPE_TEXTURE_SRV"); - - if ((Res.Flags & PIPELINE_RESOURCE_FLAG_FORMATTED_BUFFER) && - (Res.ResourceType != SHADER_RESOURCE_TYPE_BUFFER_UAV && - Res.ResourceType != SHADER_RESOURCE_TYPE_BUFFER_SRV)) - LOG_PRS_ERROR_AND_THROW("Desc.Resources[", i, "].Flags must not contain PIPELINE_RESOURCE_FLAG_FORMATTED_BUFFER if ResourceType is not buffer"); + static_assert(SHADER_RESOURCE_TYPE_LAST == 8, "Please add the new resource type to the switch below"); + switch (Res.ResourceType) + { + case SHADER_RESOURCE_TYPE_CONSTANT_BUFFER: + if ((Res.Flags & ~PIPELINE_RESOURCE_FLAG_NO_DYNAMIC_BUFFERS) != 0) + { + LOG_PRS_ERROR_AND_THROW("Incorrect Desc.Resources[", i, "].Flags (", GetPipelineResourceFlagsString(Res.Flags), + "): NO_DYNAMIC_BUFFERS is the only valid flag for a constant buffer."); + } + break; + + case SHADER_RESOURCE_TYPE_TEXTURE_SRV: + if ((Res.Flags & ~PIPELINE_RESOURCE_FLAG_COMBINED_SAMPLER) != 0) + { + LOG_PRS_ERROR_AND_THROW("Incorrect Desc.Resources[", i, "].Flags (", GetPipelineResourceFlagsString(Res.Flags), + "): COMBINED_SAMPLER is the only valid flag for a texture SRV."); + } + break; + + case SHADER_RESOURCE_TYPE_BUFFER_SRV: + if ((Res.Flags & ~(PIPELINE_RESOURCE_FLAG_NO_DYNAMIC_BUFFERS | PIPELINE_RESOURCE_FLAG_FORMATTED_BUFFER)) != 0) + { + LOG_PRS_ERROR_AND_THROW("Incorrect Desc.Resources[", i, "].Flags (", GetPipelineResourceFlagsString(Res.Flags), + "): NO_DYNAMIC_BUFFERS and FORMATTED_BUFFER are the only valid flags for a buffer SRV."); + } + break; + + case SHADER_RESOURCE_TYPE_TEXTURE_UAV: + if (Res.Flags != PIPELINE_RESOURCE_FLAG_UNKNOWN) + { + LOG_PRS_ERROR_AND_THROW("Incorrect Desc.Resources[", i, "].Flags (", GetPipelineResourceFlagsString(Res.Flags), + "): UNKNOWN is the only valid flag for a texture UAV."); + } + break; + + case SHADER_RESOURCE_TYPE_BUFFER_UAV: + if ((Res.Flags & ~(PIPELINE_RESOURCE_FLAG_NO_DYNAMIC_BUFFERS | PIPELINE_RESOURCE_FLAG_FORMATTED_BUFFER)) != 0) + { + LOG_PRS_ERROR_AND_THROW("Incorrect Desc.Resources[", i, "].Flags (", GetPipelineResourceFlagsString(Res.Flags), + "): NO_DYNAMIC_BUFFERS and FORMATTED_BUFFER are the only valid flags for a buffer UAV."); + } + break; + + case SHADER_RESOURCE_TYPE_SAMPLER: + if (Res.Flags != PIPELINE_RESOURCE_FLAG_UNKNOWN) + { + LOG_PRS_ERROR_AND_THROW("Incorrect Desc.Resources[", i, "].Flags (", GetPipelineResourceFlagsString(Res.Flags), + "): UNKNOWN is the only valid flag for a sampler."); + } + break; + + case SHADER_RESOURCE_TYPE_INPUT_ATTACHMENT: + if (Res.Flags != PIPELINE_RESOURCE_FLAG_UNKNOWN) + { + LOG_PRS_ERROR_AND_THROW("Incorrect Desc.Resources[", i, "].Flags (", GetPipelineResourceFlagsString(Res.Flags), + "): UNKNOWN is the only valid flag for an input attachment."); + } + break; + + case SHADER_RESOURCE_TYPE_ACCEL_STRUCT: + if (Res.Flags != PIPELINE_RESOURCE_FLAG_UNKNOWN) + { + LOG_PRS_ERROR_AND_THROW("Incorrect Desc.Resources[", i, "].Flags (", GetPipelineResourceFlagsString(Res.Flags), + "): UNKNOWN is the only valid flag for an acceleration structure."); + } + break; + + default: + UNEXPECTED("Unexpected resource type"); + } } if (Desc.UseCombinedTextureSamplers) -- cgit v1.2.3