SPV: Handle stride decorations for arrays of arrays, and using multiple type instances when strides are used.
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index c17a73e..e468705 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -1651,10 +1651,37 @@
     }
 
     if (type.isArray()) {
+        int stride = 0;  // keep this 0 unless doing an explicit layout; 0 will mean no decoration, no stride
+
         // Do all but the outer dimension
-        for (int dim = type.getArraySizes()->getNumDims() - 1; dim > 0; --dim) {
-            assert(type.getArraySizes()->getDimSize(dim) > 0);
-            spvType = builder.makeArrayType(spvType, type.getArraySizes()->getDimSize(dim));
+        if (type.getArraySizes()->getNumDims() > 1) {
+            if (explicitLayout != glslang::ElpNone) {
+                // Use a dummy glslang type for querying internal strides of
+                // arrays of arrays, but using just a one-dimensional array.
+                glslang::TType simpleArrayType(type, 0); // deference type of the array
+                while (simpleArrayType.getArraySizes().getNumDims() > 1)
+                    simpleArrayType.getArraySizes().dereference();
+
+                // Will compute the higher-order strides here, rather than making a whole
+                // pile of types and doing repetitive recursion on their contents.
+                stride = getArrayStride(simpleArrayType, explicitLayout, qualifier.layoutMatrix);
+            }
+            for (int dim = type.getArraySizes()->getNumDims() - 1; dim > 0; --dim) {
+                int size = type.getArraySizes()->getDimSize(dim);
+                assert(size > 0);
+                spvType = builder.makeArrayType(spvType, size, stride);
+                if (stride > 0)
+                    builder.addDecoration(spvType, spv::DecorationArrayStride, stride);
+                stride *= size;
+            }
+        } else {
+            // single-dimensional array, and don't yet have stride
+
+            // We need to decorate array strides for types needing explicit layout,
+            // except for the very top if it is an array of blocks; that array is
+            // not laid out in memory in a way needing a stride.
+            if (explicitLayout != glslang::ElpNone && type.getBasicType() != glslang::EbtBlock)
+                stride = getArrayStride(type, explicitLayout, qualifier.layoutMatrix);
         }
 
         // Do the outer dimension, which might not be known for a runtime-sized array
@@ -1662,18 +1689,10 @@
             spvType = builder.makeRuntimeArray(spvType);
         } else {
             assert(type.getOuterArraySize() > 0);
-            spvType = builder.makeArrayType(spvType, type.getOuterArraySize());
+            spvType = builder.makeArrayType(spvType, type.getOuterArraySize(), stride);
         }
-
-        // TODO: explicit layout still needs to be done hierarchically for arrays of arrays, which 
-        // may still require additional "link time" support from the front-end 
-        // for arrays of arrays
-
-        // We need to decorate array strides for types needing explicit layout,
-        // except for the very top if it is an array of blocks; that array is
-        // not laid out in memory in a way needing a stride.
-        if (explicitLayout && type.getBasicType() != glslang::EbtBlock)
-            builder.addDecoration(spvType, spv::DecorationArrayStride, getArrayStride(type, explicitLayout, qualifier.layoutMatrix));
+        if (stride > 0)
+            builder.addDecoration(spvType, spv::DecorationArrayStride, stride);
     }
 
     return spvType;
diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp
index f1bb31f..98e8c39 100755
--- a/SPIRV/SpvBuilder.cpp
+++ b/SPIRV/SpvBuilder.cpp
@@ -281,18 +281,23 @@
     return type->getResultId();
 }
 
-Id Builder::makeArrayType(Id element, unsigned size)
+// TODO: performance: track arrays per stride
+// If a stride is supplied (non-zero) make an array.
+// If no stride (0), reuse previous array types.
+Id Builder::makeArrayType(Id element, unsigned size, int stride)
 {
     // First, we need a constant instruction for the size
     Id sizeId = makeUintConstant(size);
 
-    // try to find existing type
     Instruction* type;
-    for (int t = 0; t < (int)groupedTypes[OpTypeArray].size(); ++t) {
-        type = groupedTypes[OpTypeArray][t];
-        if (type->getIdOperand(0) == element &&
-            type->getIdOperand(1) == sizeId)
-            return type->getResultId();
+    if (stride == 0) {
+        // try to find existing type
+        for (int t = 0; t < (int)groupedTypes[OpTypeArray].size(); ++t) {
+            type = groupedTypes[OpTypeArray][t];
+            if (type->getIdOperand(0) == element &&
+                type->getIdOperand(1) == sizeId)
+                return type->getResultId();
+        }
     }
 
     // not found, make it
diff --git a/SPIRV/SpvBuilder.h b/SPIRV/SpvBuilder.h
index 71126eb..7bf4396 100755
--- a/SPIRV/SpvBuilder.h
+++ b/SPIRV/SpvBuilder.h
@@ -102,7 +102,7 @@
     Id makeStructResultType(Id type0, Id type1);
     Id makeVectorType(Id component, int size);
     Id makeMatrixType(Id component, int cols, int rows);
-    Id makeArrayType(Id element, unsigned size);
+    Id makeArrayType(Id element, unsigned size, int stride);  // 0 means no stride decoration
     Id makeRuntimeArray(Id element);
     Id makeFunctionType(Id returnType, std::vector<Id>& paramTypes);
     Id makeImageType(Id sampledType, Dim, bool depth, bool arrayed, bool ms, unsigned sampled, ImageFormat format);
diff --git a/Test/baseResults/spv.140.frag.out b/Test/baseResults/spv.140.frag.out
index 8b16537..e54dda6 100755
--- a/Test/baseResults/spv.140.frag.out
+++ b/Test/baseResults/spv.140.frag.out
@@ -5,7 +5,7 @@
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 99
+// Id's are bound by 100
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
@@ -24,39 +24,39 @@
                               Name 55  "sampR"
                               Name 63  "sampB"
                               Name 86  "samp2Da"
-                              Name 90  "bn"
-                              MemberName 90(bn) 0  "matra"
-                              MemberName 90(bn) 1  "matca"
-                              MemberName 90(bn) 2  "matr"
-                              MemberName 90(bn) 3  "matc"
-                              MemberName 90(bn) 4  "matrdef"
-                              Name 92  ""
-                              Name 95  "bi"
-                              MemberName 95(bi) 0  "v"
-                              Name 98  "bname"
+                              Name 91  "bn"
+                              MemberName 91(bn) 0  "matra"
+                              MemberName 91(bn) 1  "matca"
+                              MemberName 91(bn) 2  "matr"
+                              MemberName 91(bn) 3  "matc"
+                              MemberName 91(bn) 4  "matrdef"
+                              Name 93  ""
+                              Name 96  "bi"
+                              MemberName 96(bi) 0  "v"
+                              Name 99  "bname"
                               Decorate 16(gl_FrontFacing) BuiltIn FrontFacing
                               Decorate 33(gl_ClipDistance) BuiltIn ClipDistance
                               Decorate 89 ArrayStride 64
-                              Decorate 89 ArrayStride 64
-                              MemberDecorate 90(bn) 0 RowMajor
-                              MemberDecorate 90(bn) 0 Offset 0
-                              MemberDecorate 90(bn) 0 MatrixStride 16
-                              MemberDecorate 90(bn) 1 ColMajor
-                              MemberDecorate 90(bn) 1 Offset 256
-                              MemberDecorate 90(bn) 1 MatrixStride 16
-                              MemberDecorate 90(bn) 2 RowMajor
-                              MemberDecorate 90(bn) 2 Offset 512
-                              MemberDecorate 90(bn) 2 MatrixStride 16
-                              MemberDecorate 90(bn) 3 ColMajor
-                              MemberDecorate 90(bn) 3 Offset 576
-                              MemberDecorate 90(bn) 3 MatrixStride 16
-                              MemberDecorate 90(bn) 4 RowMajor
-                              MemberDecorate 90(bn) 4 Offset 640
-                              MemberDecorate 90(bn) 4 MatrixStride 16
-                              Decorate 90(bn) Block
-                              Decorate 94 ArrayStride 16
-                              MemberDecorate 95(bi) 0 Offset 0
-                              Decorate 95(bi) Block
+                              Decorate 90 ArrayStride 64
+                              MemberDecorate 91(bn) 0 RowMajor
+                              MemberDecorate 91(bn) 0 Offset 0
+                              MemberDecorate 91(bn) 0 MatrixStride 16
+                              MemberDecorate 91(bn) 1 ColMajor
+                              MemberDecorate 91(bn) 1 Offset 256
+                              MemberDecorate 91(bn) 1 MatrixStride 16
+                              MemberDecorate 91(bn) 2 RowMajor
+                              MemberDecorate 91(bn) 2 Offset 512
+                              MemberDecorate 91(bn) 2 MatrixStride 16
+                              MemberDecorate 91(bn) 3 ColMajor
+                              MemberDecorate 91(bn) 3 Offset 576
+                              MemberDecorate 91(bn) 3 MatrixStride 16
+                              MemberDecorate 91(bn) 4 RowMajor
+                              MemberDecorate 91(bn) 4 Offset 640
+                              MemberDecorate 91(bn) 4 MatrixStride 16
+                              Decorate 91(bn) Block
+                              Decorate 95 ArrayStride 16
+                              MemberDecorate 96(bi) 0 Offset 0
+                              Decorate 96(bi) Block
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -108,15 +108,16 @@
               87:             TypeMatrix 26(fvec4) 4
               88:     29(int) Constant 4
               89:             TypeArray 87 88
-          90(bn):             TypeStruct 89 89 87 87 87
-              91:             TypePointer Uniform 90(bn)
-              92:     91(ptr) Variable Uniform
-              93:             TypeVector 6(float) 3
-              94:             TypeArray 93(fvec3) 50
-          95(bi):             TypeStruct 94
-              96:             TypeArray 95(bi) 88
-              97:             TypePointer Uniform 96
-       98(bname):     97(ptr) Variable Uniform
+              90:             TypeArray 87 88
+          91(bn):             TypeStruct 89 90 87 87 87
+              92:             TypePointer Uniform 91(bn)
+              93:     92(ptr) Variable Uniform
+              94:             TypeVector 6(float) 3
+              95:             TypeArray 94(fvec3) 50
+          96(bi):             TypeStruct 95
+              97:             TypeArray 96(bi) 88
+              98:             TypePointer Uniform 97
+       99(bname):     98(ptr) Variable Uniform
          4(main):           2 Function None 3
                5:             Label
               13:     12(ptr) Variable Function
diff --git a/Test/baseResults/spv.layoutNested.vert.out b/Test/baseResults/spv.layoutNested.vert.out
index ac51aab..399e283 100644
--- a/Test/baseResults/spv.layoutNested.vert.out
+++ b/Test/baseResults/spv.layoutNested.vert.out
@@ -7,12 +7,12 @@
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 69
+// Id's are bound by 70
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 62 65 67 68
+                              EntryPoint Vertex 4  "main" 63 66 68 69
                               Source GLSL 450
                               Name 4  "main"
                               Name 14  "S"
@@ -24,82 +24,83 @@
                               MemberName 19(Block140) 1  "s"
                               MemberName 19(Block140) 2  "v"
                               Name 21  "inst140"
-                              Name 22  "S"
-                              MemberName 22(S) 0  "a"
-                              MemberName 22(S) 1  "b"
-                              MemberName 22(S) 2  "c"
-                              Name 25  "Block430"
-                              MemberName 25(Block430) 0  "u"
-                              MemberName 25(Block430) 1  "s"
-                              MemberName 25(Block430) 2  "v"
-                              Name 27  "inst430"
-                              Name 28  "S"
-                              MemberName 28(S) 0  "a"
-                              MemberName 28(S) 1  "b"
-                              MemberName 28(S) 2  "c"
-                              Name 30  "s"
-                              Name 31  "T"
-                              MemberName 31(T) 0  "m"
-                              MemberName 31(T) 1  "a"
-                              Name 33  "t"
-                              Name 34  "T"
-                              MemberName 34(T) 0  "m"
-                              MemberName 34(T) 1  "a"
-                              Name 35  "Nestor"
-                              MemberName 35(Nestor) 0  "nestorT"
-                              Name 36  "Bt1"
-                              MemberName 36(Bt1) 0  "nt"
-                              Name 38  "Btn1"
-                              Name 39  "T"
-                              MemberName 39(T) 0  "m"
-                              MemberName 39(T) 1  "a"
-                              Name 40  "Nestor"
-                              MemberName 40(Nestor) 0  "nestorT"
-                              Name 41  "Bt2"
-                              MemberName 41(Bt2) 0  "nt"
-                              Name 43  "Btn2"
-                              Name 44  "Bt3"
-                              MemberName 44(Bt3) 0  "ntcol"
-                              MemberName 44(Bt3) 1  "ntrow"
-                              Name 46  "Btn3"
-                              Name 47  "T"
-                              MemberName 47(T) 0  "m"
-                              MemberName 47(T) 1  "a"
-                              Name 48  "Nestor"
-                              MemberName 48(Nestor) 0  "nestorT"
-                              Name 49  "bBt1"
-                              MemberName 49(bBt1) 0  "nt"
-                              Name 51  "bBtn1"
-                              Name 52  "T"
-                              MemberName 52(T) 0  "m"
-                              MemberName 52(T) 1  "a"
-                              Name 53  "Nestor"
-                              MemberName 53(Nestor) 0  "nestorT"
-                              Name 54  "bBt2"
-                              MemberName 54(bBt2) 0  "nt"
-                              Name 56  "bBtn2"
-                              Name 57  "bBt3"
-                              MemberName 57(bBt3) 0  "ntcol"
-                              MemberName 57(bBt3) 1  "ntrow"
-                              Name 59  "bBtn3"
-                              Name 60  "S"
-                              MemberName 60(S) 0  "a"
-                              MemberName 60(S) 1  "b"
-                              MemberName 60(S) 2  "c"
-                              Name 62  "sout"
-                              Name 63  "S"
-                              MemberName 63(S) 0  "a"
-                              MemberName 63(S) 1  "b"
-                              MemberName 63(S) 2  "c"
-                              Name 65  "soutinv"
-                              Name 67  "gl_VertexID"
-                              Name 68  "gl_InstanceID"
+                              Name 23  "S"
+                              MemberName 23(S) 0  "a"
+                              MemberName 23(S) 1  "b"
+                              MemberName 23(S) 2  "c"
+                              Name 26  "Block430"
+                              MemberName 26(Block430) 0  "u"
+                              MemberName 26(Block430) 1  "s"
+                              MemberName 26(Block430) 2  "v"
+                              Name 28  "inst430"
+                              Name 29  "S"
+                              MemberName 29(S) 0  "a"
+                              MemberName 29(S) 1  "b"
+                              MemberName 29(S) 2  "c"
+                              Name 31  "s"
+                              Name 32  "T"
+                              MemberName 32(T) 0  "m"
+                              MemberName 32(T) 1  "a"
+                              Name 34  "t"
+                              Name 35  "T"
+                              MemberName 35(T) 0  "m"
+                              MemberName 35(T) 1  "a"
+                              Name 36  "Nestor"
+                              MemberName 36(Nestor) 0  "nestorT"
+                              Name 37  "Bt1"
+                              MemberName 37(Bt1) 0  "nt"
+                              Name 39  "Btn1"
+                              Name 40  "T"
+                              MemberName 40(T) 0  "m"
+                              MemberName 40(T) 1  "a"
+                              Name 41  "Nestor"
+                              MemberName 41(Nestor) 0  "nestorT"
+                              Name 42  "Bt2"
+                              MemberName 42(Bt2) 0  "nt"
+                              Name 44  "Btn2"
+                              Name 45  "Bt3"
+                              MemberName 45(Bt3) 0  "ntcol"
+                              MemberName 45(Bt3) 1  "ntrow"
+                              Name 47  "Btn3"
+                              Name 48  "T"
+                              MemberName 48(T) 0  "m"
+                              MemberName 48(T) 1  "a"
+                              Name 49  "Nestor"
+                              MemberName 49(Nestor) 0  "nestorT"
+                              Name 50  "bBt1"
+                              MemberName 50(bBt1) 0  "nt"
+                              Name 52  "bBtn1"
+                              Name 53  "T"
+                              MemberName 53(T) 0  "m"
+                              MemberName 53(T) 1  "a"
+                              Name 54  "Nestor"
+                              MemberName 54(Nestor) 0  "nestorT"
+                              Name 55  "bBt2"
+                              MemberName 55(bBt2) 0  "nt"
+                              Name 57  "bBtn2"
+                              Name 58  "bBt3"
+                              MemberName 58(bBt3) 0  "ntcol"
+                              MemberName 58(bBt3) 1  "ntrow"
+                              Name 60  "bBtn3"
+                              Name 61  "S"
+                              MemberName 61(S) 0  "a"
+                              MemberName 61(S) 1  "b"
+                              MemberName 61(S) 2  "c"
+                              Name 63  "sout"
+                              Name 64  "S"
+                              MemberName 64(S) 0  "a"
+                              MemberName 64(S) 1  "b"
+                              MemberName 64(S) 2  "c"
+                              Name 66  "soutinv"
+                              Name 68  "gl_VertexID"
+                              Name 69  "gl_InstanceID"
                               Decorate 13 ArrayStride 32
                               MemberDecorate 14(S) 0 Offset 0
                               MemberDecorate 14(S) 1 ColMajor
                               MemberDecorate 14(S) 1 Offset 16
                               MemberDecorate 14(S) 1 MatrixStride 16
                               MemberDecorate 14(S) 2 Offset 144
+                              Decorate 16 ArrayStride 160
                               Decorate 18 ArrayStride 480
                               MemberDecorate 19(Block140) 0 Offset 0
                               MemberDecorate 19(Block140) 1 Offset 16
@@ -107,74 +108,75 @@
                               Decorate 19(Block140) Block
                               Decorate 21(inst140) DescriptorSet 0
                               Decorate 21(inst140) Binding 0
-                              Decorate 13 ArrayStride 16
-                              MemberDecorate 22(S) 0 Offset 0
-                              MemberDecorate 22(S) 1 ColMajor
-                              MemberDecorate 22(S) 1 Offset 16
-                              MemberDecorate 22(S) 1 MatrixStride 8
-                              MemberDecorate 22(S) 2 Offset 80
-                              Decorate 24 ArrayStride 288
-                              MemberDecorate 25(Block430) 0 Offset 0
-                              MemberDecorate 25(Block430) 1 Offset 16
-                              MemberDecorate 25(Block430) 2 Offset 592
-                              Decorate 25(Block430) BufferBlock
-                              Decorate 27(inst430) DescriptorSet 0
-                              Decorate 27(inst430) Binding 1
-                              MemberDecorate 34(T) 0 RowMajor
-                              MemberDecorate 34(T) 0 Offset 0
-                              MemberDecorate 34(T) 0 MatrixStride 16
-                              MemberDecorate 34(T) 1 Offset 32
-                              MemberDecorate 35(Nestor) 0 Offset 0
-                              MemberDecorate 36(Bt1) 0 Offset 0
-                              Decorate 36(Bt1) Block
-                              Decorate 38(Btn1) DescriptorSet 1
-                              Decorate 38(Btn1) Binding 0
-                              MemberDecorate 39(T) 0 ColMajor
-                              MemberDecorate 39(T) 0 Offset 0
-                              MemberDecorate 39(T) 0 MatrixStride 16
-                              MemberDecorate 39(T) 1 Offset 32
-                              MemberDecorate 40(Nestor) 0 Offset 0
-                              MemberDecorate 41(Bt2) 0 Offset 0
-                              Decorate 41(Bt2) Block
-                              Decorate 43(Btn2) DescriptorSet 1
-                              Decorate 43(Btn2) Binding 0
-                              MemberDecorate 44(Bt3) 0 Offset 0
-                              MemberDecorate 44(Bt3) 1 Offset 48
-                              Decorate 44(Bt3) Block
-                              Decorate 46(Btn3) DescriptorSet 1
-                              Decorate 46(Btn3) Binding 0
-                              MemberDecorate 47(T) 0 RowMajor
-                              MemberDecorate 47(T) 0 Offset 0
-                              MemberDecorate 47(T) 0 MatrixStride 8
-                              MemberDecorate 47(T) 1 Offset 16
-                              MemberDecorate 48(Nestor) 0 Offset 0
-                              MemberDecorate 49(bBt1) 0 Offset 0
-                              Decorate 49(bBt1) BufferBlock
-                              Decorate 51(bBtn1) DescriptorSet 1
-                              Decorate 51(bBtn1) Binding 0
-                              MemberDecorate 52(T) 0 ColMajor
-                              MemberDecorate 52(T) 0 Offset 0
-                              MemberDecorate 52(T) 0 MatrixStride 8
-                              MemberDecorate 52(T) 1 Offset 16
-                              MemberDecorate 53(Nestor) 0 Offset 0
-                              MemberDecorate 54(bBt2) 0 Offset 0
-                              Decorate 54(bBt2) BufferBlock
-                              Decorate 56(bBtn2) DescriptorSet 1
-                              Decorate 56(bBtn2) Binding 0
-                              MemberDecorate 57(bBt3) 0 Offset 0
-                              MemberDecorate 57(bBt3) 1 Offset 24
-                              Decorate 57(bBt3) BufferBlock
-                              Decorate 59(bBtn3) DescriptorSet 1
-                              Decorate 59(bBtn3) Binding 0
-                              MemberDecorate 60(S) 0 Flat
-                              MemberDecorate 60(S) 1 Flat
-                              MemberDecorate 60(S) 2 Flat
-                              MemberDecorate 63(S) 0 Invariant
-                              MemberDecorate 63(S) 1 Invariant
-                              MemberDecorate 63(S) 2 Invariant
-                              Decorate 65(soutinv) Invariant
-                              Decorate 67(gl_VertexID) BuiltIn VertexId
-                              Decorate 68(gl_InstanceID) BuiltIn InstanceId
+                              Decorate 22 ArrayStride 16
+                              MemberDecorate 23(S) 0 Offset 0
+                              MemberDecorate 23(S) 1 ColMajor
+                              MemberDecorate 23(S) 1 Offset 16
+                              MemberDecorate 23(S) 1 MatrixStride 8
+                              MemberDecorate 23(S) 2 Offset 80
+                              Decorate 24 ArrayStride 96
+                              Decorate 25 ArrayStride 288
+                              MemberDecorate 26(Block430) 0 Offset 0
+                              MemberDecorate 26(Block430) 1 Offset 16
+                              MemberDecorate 26(Block430) 2 Offset 592
+                              Decorate 26(Block430) BufferBlock
+                              Decorate 28(inst430) DescriptorSet 0
+                              Decorate 28(inst430) Binding 1
+                              MemberDecorate 35(T) 0 RowMajor
+                              MemberDecorate 35(T) 0 Offset 0
+                              MemberDecorate 35(T) 0 MatrixStride 16
+                              MemberDecorate 35(T) 1 Offset 32
+                              MemberDecorate 36(Nestor) 0 Offset 0
+                              MemberDecorate 37(Bt1) 0 Offset 0
+                              Decorate 37(Bt1) Block
+                              Decorate 39(Btn1) DescriptorSet 1
+                              Decorate 39(Btn1) Binding 0
+                              MemberDecorate 40(T) 0 ColMajor
+                              MemberDecorate 40(T) 0 Offset 0
+                              MemberDecorate 40(T) 0 MatrixStride 16
+                              MemberDecorate 40(T) 1 Offset 32
+                              MemberDecorate 41(Nestor) 0 Offset 0
+                              MemberDecorate 42(Bt2) 0 Offset 0
+                              Decorate 42(Bt2) Block
+                              Decorate 44(Btn2) DescriptorSet 1
+                              Decorate 44(Btn2) Binding 0
+                              MemberDecorate 45(Bt3) 0 Offset 0
+                              MemberDecorate 45(Bt3) 1 Offset 48
+                              Decorate 45(Bt3) Block
+                              Decorate 47(Btn3) DescriptorSet 1
+                              Decorate 47(Btn3) Binding 0
+                              MemberDecorate 48(T) 0 RowMajor
+                              MemberDecorate 48(T) 0 Offset 0
+                              MemberDecorate 48(T) 0 MatrixStride 8
+                              MemberDecorate 48(T) 1 Offset 16
+                              MemberDecorate 49(Nestor) 0 Offset 0
+                              MemberDecorate 50(bBt1) 0 Offset 0
+                              Decorate 50(bBt1) BufferBlock
+                              Decorate 52(bBtn1) DescriptorSet 1
+                              Decorate 52(bBtn1) Binding 0
+                              MemberDecorate 53(T) 0 ColMajor
+                              MemberDecorate 53(T) 0 Offset 0
+                              MemberDecorate 53(T) 0 MatrixStride 8
+                              MemberDecorate 53(T) 1 Offset 16
+                              MemberDecorate 54(Nestor) 0 Offset 0
+                              MemberDecorate 55(bBt2) 0 Offset 0
+                              Decorate 55(bBt2) BufferBlock
+                              Decorate 57(bBtn2) DescriptorSet 1
+                              Decorate 57(bBtn2) Binding 0
+                              MemberDecorate 58(bBt3) 0 Offset 0
+                              MemberDecorate 58(bBt3) 1 Offset 24
+                              Decorate 58(bBt3) BufferBlock
+                              Decorate 60(bBtn3) DescriptorSet 1
+                              Decorate 60(bBtn3) Binding 0
+                              MemberDecorate 61(S) 0 Flat
+                              MemberDecorate 61(S) 1 Flat
+                              MemberDecorate 61(S) 2 Flat
+                              MemberDecorate 64(S) 0 Invariant
+                              MemberDecorate 64(S) 1 Invariant
+                              MemberDecorate 64(S) 2 Invariant
+                              Decorate 66(soutinv) Invariant
+                              Decorate 68(gl_VertexID) BuiltIn VertexId
+                              Decorate 69(gl_InstanceID) BuiltIn InstanceId
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -193,53 +195,54 @@
     19(Block140):             TypeStruct 6(int) 18 10(fvec2)
               20:             TypePointer Uniform 19(Block140)
      21(inst140):     20(ptr) Variable Uniform
-           22(S):             TypeStruct 8(ivec3) 13 7(int)
-              23:             TypeArray 22(S) 15
-              24:             TypeArray 23 17
-    25(Block430):             TypeStruct 6(int) 24 10(fvec2)
-              26:             TypePointer Uniform 25(Block430)
-     27(inst430):     26(ptr) Variable Uniform
-           28(S):             TypeStruct 8(ivec3) 13 7(int)
-              29:             TypePointer Private 28(S)
-           30(s):     29(ptr) Variable Private
-           31(T):             TypeStruct 11 6(int)
-              32:             TypePointer Private 31(T)
-           33(t):     32(ptr) Variable Private
-           34(T):             TypeStruct 11 6(int)
-      35(Nestor):             TypeStruct 34(T)
-         36(Bt1):             TypeStruct 35(Nestor)
-              37:             TypePointer Uniform 36(Bt1)
-        38(Btn1):     37(ptr) Variable Uniform
-           39(T):             TypeStruct 11 6(int)
-      40(Nestor):             TypeStruct 39(T)
-         41(Bt2):             TypeStruct 40(Nestor)
-              42:             TypePointer Uniform 41(Bt2)
-        43(Btn2):     42(ptr) Variable Uniform
-         44(Bt3):             TypeStruct 40(Nestor) 35(Nestor)
-              45:             TypePointer Uniform 44(Bt3)
-        46(Btn3):     45(ptr) Variable Uniform
-           47(T):             TypeStruct 11 6(int)
-      48(Nestor):             TypeStruct 47(T)
-        49(bBt1):             TypeStruct 48(Nestor)
-              50:             TypePointer Uniform 49(bBt1)
-       51(bBtn1):     50(ptr) Variable Uniform
-           52(T):             TypeStruct 11 6(int)
-      53(Nestor):             TypeStruct 52(T)
-        54(bBt2):             TypeStruct 53(Nestor)
-              55:             TypePointer Uniform 54(bBt2)
-       56(bBtn2):     55(ptr) Variable Uniform
-        57(bBt3):             TypeStruct 48(Nestor) 53(Nestor)
-              58:             TypePointer Uniform 57(bBt3)
-       59(bBtn3):     58(ptr) Variable Uniform
-           60(S):             TypeStruct 8(ivec3) 13 7(int)
-              61:             TypePointer Output 60(S)
-        62(sout):     61(ptr) Variable Output
-           63(S):             TypeStruct 8(ivec3) 13 7(int)
-              64:             TypePointer Output 63(S)
-     65(soutinv):     64(ptr) Variable Output
-              66:             TypePointer Input 6(int)
- 67(gl_VertexID):     66(ptr) Variable Input
-68(gl_InstanceID):     66(ptr) Variable Input
+              22:             TypeArray 11 12
+           23(S):             TypeStruct 8(ivec3) 22 7(int)
+              24:             TypeArray 23(S) 15
+              25:             TypeArray 24 17
+    26(Block430):             TypeStruct 6(int) 25 10(fvec2)
+              27:             TypePointer Uniform 26(Block430)
+     28(inst430):     27(ptr) Variable Uniform
+           29(S):             TypeStruct 8(ivec3) 13 7(int)
+              30:             TypePointer Private 29(S)
+           31(s):     30(ptr) Variable Private
+           32(T):             TypeStruct 11 6(int)
+              33:             TypePointer Private 32(T)
+           34(t):     33(ptr) Variable Private
+           35(T):             TypeStruct 11 6(int)
+      36(Nestor):             TypeStruct 35(T)
+         37(Bt1):             TypeStruct 36(Nestor)
+              38:             TypePointer Uniform 37(Bt1)
+        39(Btn1):     38(ptr) Variable Uniform
+           40(T):             TypeStruct 11 6(int)
+      41(Nestor):             TypeStruct 40(T)
+         42(Bt2):             TypeStruct 41(Nestor)
+              43:             TypePointer Uniform 42(Bt2)
+        44(Btn2):     43(ptr) Variable Uniform
+         45(Bt3):             TypeStruct 41(Nestor) 36(Nestor)
+              46:             TypePointer Uniform 45(Bt3)
+        47(Btn3):     46(ptr) Variable Uniform
+           48(T):             TypeStruct 11 6(int)
+      49(Nestor):             TypeStruct 48(T)
+        50(bBt1):             TypeStruct 49(Nestor)
+              51:             TypePointer Uniform 50(bBt1)
+       52(bBtn1):     51(ptr) Variable Uniform
+           53(T):             TypeStruct 11 6(int)
+      54(Nestor):             TypeStruct 53(T)
+        55(bBt2):             TypeStruct 54(Nestor)
+              56:             TypePointer Uniform 55(bBt2)
+       57(bBtn2):     56(ptr) Variable Uniform
+        58(bBt3):             TypeStruct 49(Nestor) 54(Nestor)
+              59:             TypePointer Uniform 58(bBt3)
+       60(bBtn3):     59(ptr) Variable Uniform
+           61(S):             TypeStruct 8(ivec3) 13 7(int)
+              62:             TypePointer Output 61(S)
+        63(sout):     62(ptr) Variable Output
+           64(S):             TypeStruct 8(ivec3) 13 7(int)
+              65:             TypePointer Output 64(S)
+     66(soutinv):     65(ptr) Variable Output
+              67:             TypePointer Input 6(int)
+ 68(gl_VertexID):     67(ptr) Variable Input
+69(gl_InstanceID):     67(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
                               Return