diff options
| author | assiduous <assiduous@diligentgraphics.com> | 2021-01-30 04:36:32 +0000 |
|---|---|---|
| committer | assiduous <assiduous@diligentgraphics.com> | 2021-01-30 04:36:32 +0000 |
| commit | 22fafb8e38439f203a70988e6455b2d2ce13bd43 (patch) | |
| tree | ea3c75db3ce78a1ed327e78cfa014d4393c058c8 /Graphics/GraphicsEngineVulkan | |
| parent | Graphics accessories: added GetPipelineResourceFlagsString function (diff) | |
| download | DiligentCore-22fafb8e38439f203a70988e6455b2d2ce13bd43.tar.gz DiligentCore-22fafb8e38439f203a70988e6455b2d2ce13bd43.zip | |
Pipeline resource signature impl: improved validation of PipelineResourceDesc.Flags parameter
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
| -rw-r--r-- | Graphics/GraphicsEngineVulkan/src/PipelineResourceSignatureVkImpl.cpp | 48 | ||||
| -rw-r--r-- | Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp | 3 |
2 files changed, 36 insertions, 15 deletions
diff --git a/Graphics/GraphicsEngineVulkan/src/PipelineResourceSignatureVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/PipelineResourceSignatureVkImpl.cpp index 8d9714df..775f9df5 100644 --- a/Graphics/GraphicsEngineVulkan/src/PipelineResourceSignatureVkImpl.cpp +++ b/Graphics/GraphicsEngineVulkan/src/PipelineResourceSignatureVkImpl.cpp @@ -106,37 +106,53 @@ DescriptorType GetDescriptorType(const PipelineResourceDesc& Res) switch (Res.ResourceType) { case SHADER_RESOURCE_TYPE_CONSTANT_BUFFER: - VERIFY_EXPR((Res.Flags & ~PIPELINE_RESOURCE_FLAG_NO_DYNAMIC_BUFFERS) == 0); + VERIFY((Res.Flags & ~PIPELINE_RESOURCE_FLAG_NO_DYNAMIC_BUFFERS) == 0, + "NO_DYNAMIC_BUFFERS is the only valid flag allowed for constant buffers. " + "This error should've been caught by ValidatePipelineResourceSignatureDesc."); return WithDynamicOffset ? DescriptorType::UniformBufferDynamic : DescriptorType::UniformBuffer; - case SHADER_RESOURCE_TYPE_BUFFER_UAV: - VERIFY_EXPR((Res.Flags & ~(PIPELINE_RESOURCE_FLAG_NO_DYNAMIC_BUFFERS | PIPELINE_RESOURCE_FLAG_FORMATTED_BUFFER)) == 0); - return UseTexelBuffer ? DescriptorType::StorageTexelBuffer : - (WithDynamicOffset ? DescriptorType::StorageBufferDynamic : DescriptorType::StorageBuffer); - case SHADER_RESOURCE_TYPE_TEXTURE_SRV: - VERIFY_EXPR((Res.Flags & ~PIPELINE_RESOURCE_FLAG_COMBINED_SAMPLER) == 0); + VERIFY((Res.Flags & ~PIPELINE_RESOURCE_FLAG_COMBINED_SAMPLER) == 0, + "COMBINED_SAMPLER is the only valid flag for a texture SRV. " + "This error should've been caught by ValidatePipelineResourceSignatureDesc."); return CombinedSampler ? DescriptorType::CombinedImageSampler : DescriptorType::SeparateImage; case SHADER_RESOURCE_TYPE_BUFFER_SRV: - VERIFY_EXPR((Res.Flags & ~(PIPELINE_RESOURCE_FLAG_NO_DYNAMIC_BUFFERS | PIPELINE_RESOURCE_FLAG_FORMATTED_BUFFER)) == 0); + VERIFY((Res.Flags & ~(PIPELINE_RESOURCE_FLAG_NO_DYNAMIC_BUFFERS | PIPELINE_RESOURCE_FLAG_FORMATTED_BUFFER)) == 0, + "NO_DYNAMIC_BUFFERS and FORMATTED_BUFFER are the only valid flags for a buffer SRV. " + "This error should've been caught by ValidatePipelineResourceSignatureDesc."); return UseTexelBuffer ? DescriptorType::UniformTexelBuffer : (WithDynamicOffset ? DescriptorType::StorageBufferDynamic_ReadOnly : DescriptorType::StorageBuffer_ReadOnly); case SHADER_RESOURCE_TYPE_TEXTURE_UAV: - VERIFY_EXPR(Res.Flags == PIPELINE_RESOURCE_FLAG_UNKNOWN); + VERIFY(Res.Flags == PIPELINE_RESOURCE_FLAG_UNKNOWN, + "UNKNOWN is the only valid flag for a texture UAV. " + "This error should've been caught by ValidatePipelineResourceSignatureDesc."); return DescriptorType::StorageImage; + case SHADER_RESOURCE_TYPE_BUFFER_UAV: + VERIFY((Res.Flags & ~(PIPELINE_RESOURCE_FLAG_NO_DYNAMIC_BUFFERS | PIPELINE_RESOURCE_FLAG_FORMATTED_BUFFER)) == 0, + "NO_DYNAMIC_BUFFERS and FORMATTED_BUFFER are the only valid flags for a buffer UAV. " + "This should've been caught by ValidatePipelineResourceSignatureDesc."); + return UseTexelBuffer ? DescriptorType::StorageTexelBuffer : + (WithDynamicOffset ? DescriptorType::StorageBufferDynamic : DescriptorType::StorageBuffer); + case SHADER_RESOURCE_TYPE_SAMPLER: - VERIFY_EXPR(Res.Flags == PIPELINE_RESOURCE_FLAG_UNKNOWN); + VERIFY(Res.Flags == PIPELINE_RESOURCE_FLAG_UNKNOWN, + "UNKNOWN is the only valid flag for a sampler. " + "This error should've been caught by ValidatePipelineResourceSignatureDesc."); return DescriptorType::Sampler; case SHADER_RESOURCE_TYPE_INPUT_ATTACHMENT: - VERIFY_EXPR(Res.Flags == PIPELINE_RESOURCE_FLAG_UNKNOWN); + VERIFY(Res.Flags == PIPELINE_RESOURCE_FLAG_UNKNOWN, + "UNKNOWN is the only valid flag for an input attachment. " + "This error should've been caught by ValidatePipelineResourceSignatureDesc."); return DescriptorType::InputAttachment; case SHADER_RESOURCE_TYPE_ACCEL_STRUCT: - VERIFY_EXPR(Res.Flags == PIPELINE_RESOURCE_FLAG_UNKNOWN); + VERIFY(Res.Flags == PIPELINE_RESOURCE_FLAG_UNKNOWN, + "UNKNOWN is the only valid flag for an acceleration structure. " + "This error should've been caught by ValidatePipelineResourceSignatureDesc."); return DescriptorType::AccelerationStructure; default: @@ -1681,13 +1697,15 @@ bool PipelineResourceSignatureVkImpl::DvpValidateCommittedResource(const SPIRVSh const auto CacheType = ResourceCache.GetContentType(); const auto CacheOffset = ResAttribs.CacheOffset(CacheType); + VERIFY_EXPR(SPIRVAttribs.ArraySize <= ResAttribs.ArraySize); + switch (ResAttribs.GetDescriptorType()) { case DescriptorType::UniformBuffer: case DescriptorType::UniformBufferDynamic: { VERIFY_EXPR(ResInfo.ResourceType == SHADER_RESOURCE_TYPE_CONSTANT_BUFFER); - for (Uint32 i = 0; i < ResAttribs.ArraySize; ++i) + for (Uint32 i = 0; i < SPIRVAttribs.ArraySize; ++i) { const auto& Res = DescrSetResources.GetResource(CacheOffset + i); @@ -1719,7 +1737,7 @@ bool PipelineResourceSignatureVkImpl::DvpValidateCommittedResource(const SPIRVSh case DescriptorType::StorageBufferDynamic_ReadOnly: { VERIFY_EXPR(ResInfo.ResourceType == SHADER_RESOURCE_TYPE_BUFFER_UAV || ResInfo.ResourceType == SHADER_RESOURCE_TYPE_BUFFER_SRV); - for (Uint32 i = 0; i < ResAttribs.ArraySize; ++i) + for (Uint32 i = 0; i < SPIRVAttribs.ArraySize; ++i) { const auto& Res = DescrSetResources.GetResource(CacheOffset + i); @@ -1766,7 +1784,7 @@ bool PipelineResourceSignatureVkImpl::DvpValidateCommittedResource(const SPIRVSh case DescriptorType::CombinedImageSampler: { VERIFY_EXPR(ResInfo.ResourceType == SHADER_RESOURCE_TYPE_TEXTURE_SRV || ResInfo.ResourceType == SHADER_RESOURCE_TYPE_TEXTURE_UAV); - for (Uint32 i = 0; i < ResAttribs.ArraySize; ++i) + for (Uint32 i = 0; i < SPIRVAttribs.ArraySize; ++i) { const auto& Res = DescrSetResources.GetResource(CacheOffset + i); // When can use raw cast here because the dynamic type is verified when the resource diff --git a/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp index c7e81769..f1bbfdaa 100644 --- a/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp +++ b/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp @@ -813,7 +813,10 @@ void PipelineStateVkImpl::InitPipelineLayout(const PipelineStateCreateInfo& Crea if (Resources.size()) { + String SignName = String{"Implicit signature for PSO '"} + m_Desc.Name + '\''; + PipelineResourceSignatureDesc ResSignDesc; + ResSignDesc.Name = SignName.c_str(); ResSignDesc.Resources = Resources.data(); ResSignDesc.NumResources = static_cast<Uint32>(Resources.size()); ResSignDesc.ImmutableSamplers = LayoutDesc.ImmutableSamplers; |
