spirv: Add a warning for ArrayStride on arrays of blocks
authorJason Ekstrand <jason@jlekstrand.net>
Wed, 10 Jul 2019 22:55:44 +0000 (17:55 -0500)
committerJason Ekstrand <jason@jlekstrand.net>
Tue, 16 Jul 2019 22:02:08 +0000 (17:02 -0500)
It's disallowed according to the SPIR-V spec or at least I think that's
what the spec says.  It's in a section explicitly about explicit layout
of things in the StorageBuffer, Uniform, and PushConstant storage
classes so it's not 100% clear that it applies with other storage
classes.  However, it seems like it should apply in general and
violating it can trigger (fairly harmless) asserts in NIR.

Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
src/compiler/spirv/spirv_to_nir.c

index 6a9ccfe0f38d37b535392ce1d6cc55d2ab9574d1..ea4aebb767c8cc1481ae91b9318ce2164c5e8dc2 100644 (file)
@@ -722,8 +722,15 @@ array_stride_decoration_cb(struct vtn_builder *b,
    struct vtn_type *type = val->type;
 
    if (dec->decoration == SpvDecorationArrayStride) {
-      vtn_fail_if(dec->operands[0] == 0, "ArrayStride must be non-zero");
-      type->stride = dec->operands[0];
+      if (vtn_type_contains_block(b, type)) {
+         vtn_warn("The ArrayStride decoration cannot be applied to an array "
+                  "type which contains a structure type decorated Block "
+                  "or BufferBlock");
+         /* Ignore the decoration */
+      } else {
+         vtn_fail_if(dec->operands[0] == 0, "ArrayStride must be non-zero");
+         type->stride = dec->operands[0];
+      }
    }
 }