aboutsummaryrefslogtreecommitdiff
path: root/layers/shader_checker.cpp
diff options
context:
space:
mode:
authorChris Forbes <chrisf@ijw.co.nz>2015-06-12 11:16:41 +1200
committerChris Forbes <chrisf@ijw.co.nz>2015-06-15 08:15:51 +1200
commite059c074fedba82aa52bd8741712ac5da37be65f (patch)
tree06eeb188d6d228cff17a7426c5899cb12dae418f /layers/shader_checker.cpp
parent300a45e8fb5f1d83d726fecd2705a9c6a798ac4d (diff)
downloadusermoji-e059c074fedba82aa52bd8741712ac5da37be65f.tar.xz
shader_checker: Check for duplicate VI binding descriptions.
Signed-off-by: Chris Forbes <chrisf@ijw.co.nz> Reviewed-by: Tobin Ehlis <tobin@lunarg.com>
Diffstat (limited to 'layers/shader_checker.cpp')
-rw-r--r--layers/shader_checker.cpp31
1 files changed, 31 insertions, 0 deletions
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
@@ -644,6 +644,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<uint32_t, VkVertexInputBindingDescription const *> 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)
{
std::map<uint32_t, interface_var> inputs;
@@ -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;
}