From c9e0a42b92f4107051dfa9e5e619473d87ef2397 Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Tue, 29 Dec 2015 21:27:24 -0700 Subject: [PATCH] SPV: Handle stride decorations for arrays of arrays, and using multiple type instances when strides are used. --- SPIRV/GlslangToSpv.cpp | 47 ++- SPIRV/SpvBuilder.cpp | 19 +- SPIRV/SpvBuilder.h | 2 +- Test/baseResults/spv.140.frag.out | 81 ++--- Test/baseResults/spv.layoutNested.vert.out | 377 +++++++++++---------- 5 files changed, 277 insertions(+), 249 deletions(-) diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index c17a73e9..e468705c 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -1651,10 +1651,37 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty } 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 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty 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 f1bb31f1..98e8c394 100755 --- a/SPIRV/SpvBuilder.cpp +++ b/SPIRV/SpvBuilder.cpp @@ -281,18 +281,23 @@ Id Builder::makeMatrixType(Id component, int cols, int rows) 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 71126eb7..7bf43962 100755 --- a/SPIRV/SpvBuilder.h +++ b/SPIRV/SpvBuilder.h @@ -102,7 +102,7 @@ public: 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& 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 8b165371..e54dda6c 100755 --- a/Test/baseResults/spv.140.frag.out +++ b/Test/baseResults/spv.140.frag.out @@ -5,7 +5,7 @@ Linked fragment stage: // 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 @@ Linked fragment stage: 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 @@ Linked fragment stage: 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 ac51aab5..399e283b 100644 --- a/Test/baseResults/spv.layoutNested.vert.out +++ b/Test/baseResults/spv.layoutNested.vert.out @@ -7,12 +7,12 @@ Linked vertex stage: // 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 @@ Linked vertex stage: 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 @@ Linked vertex stage: 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 @@ Linked vertex stage: 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