spirv: Fix structure splitting with per-vertex interface arrays.
authorKenneth Graunke <kenneth@whitecape.org>
Sun, 13 Mar 2016 08:08:56 +0000 (00:08 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Sat, 7 May 2016 22:44:41 +0000 (15:44 -0700)
We want to use interface_type, not vtn_var->type.  They're normally
equivalent, but for geometry/tessellation per-vertex interface arrays,
we need to unwrap a level.

Otherwise, we tried to iterate a structure members but instead used
an array length.  If the array length was longer than the number of
fields in the structure, we'd crash.

Fixes the CreatePipelineGeometryInputBlockPositive layer validation
test.

v2: Just use glsl_without_array() on the vtn_var type
    (requested by Jason Ekstrand).

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Chris Forbes <chrisforbes@google.com>
src/compiler/spirv/vtn_variables.c

index 3b495b2332c4574ab8d172ffb88cb5dadd49156c..d2f174c90b93d9dc99580b5f125a90ea8bea39ab 100644 (file)
@@ -929,7 +929,8 @@ var_decoration_cb(struct vtn_builder *b, struct vtn_value *val, int member,
          vtn_var->var->data.explicit_location = true;
       } else {
          assert(vtn_var->members);
-         unsigned length = glsl_get_length(vtn_var->type->type);
+         unsigned length =
+            glsl_get_length(glsl_without_array(vtn_var->type->type));
          for (unsigned i = 0; i < length; i++) {
             vtn_var->members[i]->data.location = location;
             vtn_var->members[i]->data.explicit_location = true;