spirv: Fix stride calculation when lowering Workgroup to offsets
authorCaio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Wed, 3 Jul 2019 19:47:53 +0000 (12:47 -0700)
committerCaio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Mon, 15 Jul 2019 23:18:46 +0000 (16:18 -0700)
Use alignment to calculate the stride associated with the pointer
types.  That stride is used when the pointers are casted to arrays.

Note that size alone is not sufficient, e.g. struct { vec2 a; vec1 b;
} will have element an element size of 12 bytes, but the stride needs
to be 16 bytes to respect the 8 byte alignment.

Fixes: 050eb6389a8 "spirv: Ignore ArrayStride in OpPtrAccessChain for Workgroup"
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/spirv/spirv_to_nir.c

index 3e88e54ab84273d4af6643d336c62b7accd848f7..ebefd4d7bf5251aa67ecb81e1ee02c56a22ec613 100644 (file)
@@ -1406,7 +1406,7 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
             val->type->align = align;
 
             /* Override any ArrayStride previously set. */
-            val->type->stride = size;
+            val->type->stride = vtn_align_u32(size, align);
          }
       }
       break;