From e059c074fedba82aa52bd8741712ac5da37be65f Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Fri, 12 Jun 2015 11:16:41 +1200 Subject: shader_checker: Check for duplicate VI binding descriptions. Signed-off-by: Chris Forbes Reviewed-by: Tobin Ehlis --- layers/shader_checker.cpp | 31 +++++++++++++++++++++++++++++++ layers/shader_checker.h | 1 + 2 files changed, 32 insertions(+) diff --git a/layers/shader_checker.cpp b/layers/shader_checker.cpp index fef4512f..a576314a 100644 --- a/layers/shader_checker.cpp +++ b/layers/shader_checker.cpp @@ -643,6 +643,33 @@ get_fundamental_type(shader_source const *src, unsigned type) } +static bool +validate_vi_consistency(VkPipelineVertexInputCreateInfo const *vi) +{ + /* walk the binding descriptions, which describe the step rate and stride of each vertex buffer. + * each binding should be specified only once. + */ + std::unordered_map bindings; + char str[1024]; + bool pass = true; + + for (unsigned i = 0; i < vi->bindingCount; i++) { + auto desc = &vi->pVertexBindingDescriptions[i]; + auto & binding = bindings[desc->binding]; + if (binding) { + sprintf(str, "Duplicate vertex input binding descriptions for binding %d", desc->binding); + layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, SHADER_CHECKER_INCONSISTENT_VI, "SC", str); + pass = false; + } + else { + binding = desc; + } + } + + return pass; +} + + static bool validate_vi_against_vs_inputs(VkPipelineVertexInputCreateInfo const *vi, shader_source const *vs) { @@ -834,6 +861,10 @@ validate_graphics_pipeline(VkGraphicsPipelineCreateInfo const *pCreateInfo) } } + if (vi) { + pass = validate_vi_consistency(vi) && pass; + } + if (shaders[VK_SHADER_STAGE_VERTEX] && shaders[VK_SHADER_STAGE_VERTEX]->is_spirv) { pass = validate_vi_against_vs_inputs(vi, shaders[VK_SHADER_STAGE_VERTEX]) && pass; } diff --git a/layers/shader_checker.h b/layers/shader_checker.h index 17692fb8..4ec8dea2 100644 --- a/layers/shader_checker.h +++ b/layers/shader_checker.h @@ -35,4 +35,5 @@ typedef enum _SHADER_CHECKER_ERROR SHADER_CHECKER_NON_SPIRV_SHADER, /* Shader image is not SPIR-V */ SHADER_CHECKER_INCONSISTENT_SPIRV, /* General inconsistency within a SPIR-V module */ SHADER_CHECKER_UNKNOWN_STAGE, /* Stage is not supported by analysis */ + SHADER_CHECKER_INCONSISTENT_VI, /* VI state contains conflicting binding or attrib descriptions */ } SHADER_CHECKER_ERROR; -- cgit v1.2.3