From 80f92a190a3d70afaba40bdbd54ad331c5602a82 Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Fri, 19 May 2017 23:00:13 -0600 Subject: [PATCH] Fix #857: Convert uniform int to local bool for struct alias assignment. This was done for one direction, but not both directions, so this commit picks up the other direction. --- SPIRV/GlslangToSpv.cpp | 22 +- Test/baseResults/hlsl.structbuffer.frag.out | 172 ++++----- Test/baseResults/spv.boolInBlock.frag.out | 12 +- Test/baseResults/spv.multiStruct.comp.out | 392 ++++++++++---------- 4 files changed, 303 insertions(+), 295 deletions(-) diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index f8722fca..31f7aabb 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -2590,20 +2590,22 @@ void TGlslangToSpvTraverser::accessChainStore(const glslang::TType& type, spv::I if (builder.isScalarType(nominalTypeId)) { // Conversion for bool spv::Id boolType = builder.makeBoolType(); - if (nominalTypeId != boolType) { - spv::Id zero = builder.makeUintConstant(0); - spv::Id one = builder.makeUintConstant(1); - rvalue = builder.createTriOp(spv::OpSelect, nominalTypeId, rvalue, one, zero); - } + if (nominalTypeId != boolType) + rvalue = builder.createTriOp(spv::OpSelect, nominalTypeId, rvalue, builder.makeUintConstant(1), + builder.makeUintConstant(0)); + else if (builder.getTypeId(rvalue) != boolType) + rvalue = builder.createBinOp(spv::OpINotEqual, boolType, rvalue, builder.makeUintConstant(0)); } else if (builder.isVectorType(nominalTypeId)) { // Conversion for bvec int vecSize = builder.getNumTypeComponents(nominalTypeId); spv::Id bvecType = builder.makeVectorType(builder.makeBoolType(), vecSize); - if (nominalTypeId != bvecType) { - spv::Id zero = makeSmearedConstant(builder.makeUintConstant(0), vecSize); - spv::Id one = makeSmearedConstant(builder.makeUintConstant(1), vecSize); - rvalue = builder.createTriOp(spv::OpSelect, nominalTypeId, rvalue, one, zero); - } + if (nominalTypeId != bvecType) + rvalue = builder.createTriOp(spv::OpSelect, nominalTypeId, rvalue, + makeSmearedConstant(builder.makeUintConstant(1), vecSize), + makeSmearedConstant(builder.makeUintConstant(0), vecSize)); + else if (builder.getTypeId(rvalue) != bvecType) + rvalue = builder.createBinOp(spv::OpINotEqual, bvecType, rvalue, + makeSmearedConstant(builder.makeUintConstant(0), vecSize)); } } diff --git a/Test/baseResults/hlsl.structbuffer.frag.out b/Test/baseResults/hlsl.structbuffer.frag.out index 634c1b81..72fba3b7 100644 --- a/Test/baseResults/hlsl.structbuffer.frag.out +++ b/Test/baseResults/hlsl.structbuffer.frag.out @@ -189,12 +189,12 @@ gl_FragCoord origin is upper left // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 94 +// Id's are bound by 96 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "main" 87 90 + EntryPoint Fragment 4 "main" 89 92 ExecutionMode 4 OriginUpperLeft Source HLSL 500 Name 4 "main" @@ -212,15 +212,15 @@ gl_FragCoord origin is upper left Name 21 "sbuf" MemberName 21(sbuf) 0 "@data" Name 23 "sbuf" - Name 40 "size" - Name 42 "stride" - Name 57 "sbuf2" - MemberName 57(sbuf2) 0 "@data" + Name 43 "size" + Name 45 "stride" Name 59 "sbuf2" - Name 85 "pos" + MemberName 59(sbuf2) 0 "@data" + Name 61 "sbuf2" Name 87 "pos" - Name 90 "@entryPointOutput" - Name 91 "param" + Name 89 "pos" + Name 92 "@entryPointOutput" + Name 93 "param" MemberDecorate 19(sb_t) 0 NonWritable MemberDecorate 19(sb_t) 0 Offset 0 MemberDecorate 19(sb_t) 1 NonWritable @@ -233,13 +233,13 @@ gl_FragCoord origin is upper left Decorate 21(sbuf) BufferBlock Decorate 23(sbuf) DescriptorSet 0 Decorate 23(sbuf) Binding 10 - Decorate 56 ArrayStride 4 - MemberDecorate 57(sbuf2) 0 NonWritable - MemberDecorate 57(sbuf2) 0 Offset 0 - Decorate 57(sbuf2) BufferBlock - Decorate 59(sbuf2) DescriptorSet 0 - Decorate 87(pos) Location 0 - Decorate 90(@entryPointOutput) Location 0 + Decorate 58 ArrayStride 4 + MemberDecorate 59(sbuf2) 0 NonWritable + MemberDecorate 59(sbuf2) 0 Offset 0 + Decorate 59(sbuf2) BufferBlock + Decorate 61(sbuf2) DescriptorSet 0 + Decorate 89(pos) Location 0 + Decorate 92(@entryPointOutput) Location 0 2: TypeVoid 3: TypeFunction 2 6: TypeInt 32 0 @@ -261,41 +261,41 @@ gl_FragCoord origin is upper left 27: TypePointer Uniform 19(sb_t) 31: TypePointer Function 14(fvec3) 34: 24(int) Constant 1 - 35: TypePointer Function 15(bool) - 38: 24(int) Constant 2 - 43: 6(int) Constant 32 - 45: TypePointer Uniform 6(int) - 48: 6(int) Constant 0 - 53: TypePointer Uniform 14(fvec3) - 56: TypeRuntimeArray 8(float) - 57(sbuf2): TypeStruct 56 - 58: TypePointer Uniform 57(sbuf2) - 59(sbuf2): 58(ptr) Variable Uniform - 61: TypePointer Uniform 8(float) - 66: 8(float) Constant 0 - 73: TypePointer Function 8(float) - 86: TypePointer Input 6(int) - 87(pos): 86(ptr) Variable Input - 89: TypePointer Output 9(fvec4) -90(@entryPointOutput): 89(ptr) Variable Output + 35: 6(int) Constant 0 + 37: TypePointer Function 15(bool) + 40: 24(int) Constant 2 + 46: 6(int) Constant 32 + 48: TypePointer Uniform 6(int) + 55: TypePointer Uniform 14(fvec3) + 58: TypeRuntimeArray 8(float) + 59(sbuf2): TypeStruct 58 + 60: TypePointer Uniform 59(sbuf2) + 61(sbuf2): 60(ptr) Variable Uniform + 63: TypePointer Uniform 8(float) + 68: 8(float) Constant 0 + 75: TypePointer Function 8(float) + 88: TypePointer Input 6(int) + 89(pos): 88(ptr) Variable Input + 91: TypePointer Output 9(fvec4) +92(@entryPointOutput): 91(ptr) Variable Output 4(main): 2 Function None 3 5: Label - 85(pos): 7(ptr) Variable Function - 91(param): 7(ptr) Variable Function - 88: 6(int) Load 87(pos) - Store 85(pos) 88 - 92: 6(int) Load 85(pos) - Store 91(param) 92 - 93: 9(fvec4) FunctionCall 12(@main(u1;) 91(param) - Store 90(@entryPointOutput) 93 + 87(pos): 7(ptr) Variable Function + 93(param): 7(ptr) Variable Function + 90: 6(int) Load 89(pos) + Store 87(pos) 90 + 94: 6(int) Load 87(pos) + Store 93(param) 94 + 95: 9(fvec4) FunctionCall 12(@main(u1;) 93(param) + Store 92(@entryPointOutput) 95 Return FunctionEnd 12(@main(u1;): 9(fvec4) Function None 10 11(pos): 7(ptr) FunctionParameter 13: Label 18(mydata): 17(ptr) Variable Function - 40(size): 7(ptr) Variable Function - 42(stride): 7(ptr) Variable Function + 43(size): 7(ptr) Variable Function + 45(stride): 7(ptr) Variable Function 26: 6(int) Load 11(pos) 28: 27(ptr) AccessChain 23(sbuf) 25 26 29: 19(sb_t) Load 28 @@ -303,46 +303,48 @@ gl_FragCoord origin is upper left 32: 31(ptr) AccessChain 18(mydata) 25 Store 32 30 33: 6(int) CompositeExtract 29 1 - 36: 35(ptr) AccessChain 18(mydata) 34 - Store 36 33 - 37: 6(int) CompositeExtract 29 2 - 39: 35(ptr) AccessChain 18(mydata) 38 - Store 39 37 - 41: 24(int) ArrayLength 23(sbuf) 0 - Store 40(size) 41 - Store 42(stride) 43 - 44: 6(int) Load 11(pos) - 46: 45(ptr) AccessChain 23(sbuf) 25 44 34 - 47: 6(int) Load 46 - 49: 15(bool) INotEqual 47 48 - SelectionMerge 51 None - BranchConditional 49 50 72 - 50: Label - 52: 6(int) Load 11(pos) - 54: 53(ptr) AccessChain 23(sbuf) 25 52 25 - 55: 14(fvec3) Load 54 - 60: 6(int) Load 11(pos) - 62: 61(ptr) AccessChain 59(sbuf2) 25 60 - 63: 8(float) Load 62 - 64: 14(fvec3) CompositeConstruct 63 63 63 - 65: 14(fvec3) FAdd 55 64 - 67: 8(float) CompositeExtract 65 0 - 68: 8(float) CompositeExtract 65 1 - 69: 8(float) CompositeExtract 65 2 - 70: 9(fvec4) CompositeConstruct 67 68 69 66 - ReturnValue 70 - 72: Label - 74: 73(ptr) AccessChain 18(mydata) 25 48 - 75: 8(float) Load 74 - 76: 6(int) Load 40(size) - 77: 8(float) ConvertUToF 76 - 78: 8(float) FAdd 75 77 - 79: 6(int) Load 42(stride) - 80: 8(float) ConvertUToF 79 - 81: 8(float) FAdd 78 80 - 82: 9(fvec4) CompositeConstruct 81 81 81 81 - ReturnValue 82 - 51: Label - 84: 9(fvec4) Undef - ReturnValue 84 + 36: 15(bool) INotEqual 33 35 + 38: 37(ptr) AccessChain 18(mydata) 34 + Store 38 36 + 39: 6(int) CompositeExtract 29 2 + 41: 15(bool) INotEqual 39 35 + 42: 37(ptr) AccessChain 18(mydata) 40 + Store 42 41 + 44: 24(int) ArrayLength 23(sbuf) 0 + Store 43(size) 44 + Store 45(stride) 46 + 47: 6(int) Load 11(pos) + 49: 48(ptr) AccessChain 23(sbuf) 25 47 34 + 50: 6(int) Load 49 + 51: 15(bool) INotEqual 50 35 + SelectionMerge 53 None + BranchConditional 51 52 74 + 52: Label + 54: 6(int) Load 11(pos) + 56: 55(ptr) AccessChain 23(sbuf) 25 54 25 + 57: 14(fvec3) Load 56 + 62: 6(int) Load 11(pos) + 64: 63(ptr) AccessChain 61(sbuf2) 25 62 + 65: 8(float) Load 64 + 66: 14(fvec3) CompositeConstruct 65 65 65 + 67: 14(fvec3) FAdd 57 66 + 69: 8(float) CompositeExtract 67 0 + 70: 8(float) CompositeExtract 67 1 + 71: 8(float) CompositeExtract 67 2 + 72: 9(fvec4) CompositeConstruct 69 70 71 68 + ReturnValue 72 + 74: Label + 76: 75(ptr) AccessChain 18(mydata) 25 35 + 77: 8(float) Load 76 + 78: 6(int) Load 43(size) + 79: 8(float) ConvertUToF 78 + 80: 8(float) FAdd 77 79 + 81: 6(int) Load 45(stride) + 82: 8(float) ConvertUToF 81 + 83: 8(float) FAdd 80 82 + 84: 9(fvec4) CompositeConstruct 83 83 83 83 + ReturnValue 84 + 53: Label + 86: 9(fvec4) Undef + ReturnValue 86 FunctionEnd diff --git a/Test/baseResults/spv.boolInBlock.frag.out b/Test/baseResults/spv.boolInBlock.frag.out index 2181f26d..4742dad3 100644 --- a/Test/baseResults/spv.boolInBlock.frag.out +++ b/Test/baseResults/spv.boolInBlock.frag.out @@ -53,9 +53,9 @@ Warning, version 450 is not yet complete; most version-specific features are pre 29: 6(bool) ConstantFalse 30: 9(bvec2) ConstantComposite 29 29 31: 22(int) Constant 0 - 32: 23(ivec2) ConstantComposite 31 31 - 33: 22(int) Constant 1 - 34: 23(ivec2) ConstantComposite 33 33 + 32: 22(int) Constant 1 + 33: 23(ivec2) ConstantComposite 31 31 + 34: 23(ivec2) ConstantComposite 32 32 36: TypePointer Uniform 23(ivec2) 38: TypeVector 22(int) 4 39(Uniform): TypeStruct 38(ivec4) @@ -73,7 +73,7 @@ Warning, version 450 is not yet complete; most version-specific features are pre 5: Label 62(param): 8(ptr) Variable Function 67(param): 10(ptr) Variable Function - 35: 23(ivec2) Select 30 34 32 + 35: 23(ivec2) Select 30 34 33 37: 36(ptr) AccessChain 26 28 Store 37 35 43: 42(ptr) AccessChain 41 28 @@ -88,7 +88,7 @@ Warning, version 450 is not yet complete; most version-specific features are pre 51: 22(int) CompositeExtract 50 0 52: 6(bool) INotEqual 51 31 53: 9(bvec2) CompositeConstruct 52 52 - 54: 23(ivec2) Select 53 34 32 + 54: 23(ivec2) Select 53 34 33 55: 36(ptr) AccessChain 26 28 Store 55 54 Branch 48 @@ -106,7 +106,7 @@ Warning, version 450 is not yet complete; most version-specific features are pre Store 62(param) 66 68: 2 FunctionCall 14(foo(vb4;vb2;) 62(param) 67(param) 69: 9(bvec2) Load 67(param) - 70: 23(ivec2) Select 69 34 32 + 70: 23(ivec2) Select 69 34 33 71: 36(ptr) AccessChain 26 28 Store 71 70 Branch 61 diff --git a/Test/baseResults/spv.multiStruct.comp.out b/Test/baseResults/spv.multiStruct.comp.out index f8c0eead..5eebe407 100755 --- a/Test/baseResults/spv.multiStruct.comp.out +++ b/Test/baseResults/spv.multiStruct.comp.out @@ -3,7 +3,7 @@ Warning, version 450 is not yet complete; most version-specific features are pre // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 157 +// Id's are bound by 161 Capability Shader 1: ExtInstImport "GLSL.std.450" @@ -22,31 +22,31 @@ Warning, version 450 is not yet complete; most version-specific features are pre Name 17 "SSBO0" MemberName 17(SSBO0) 0 "a" Name 19 "inBuf" - Name 37 "SSBO1" - MemberName 37(SSBO1) 0 "b" - Name 39 "outBuf" - Name 57 "MyStruct" - MemberName 57(MyStruct) 0 "foo" - MemberName 57(MyStruct) 1 "sb" - Name 58 "UBO" - MemberName 58(UBO) 0 "c" - Name 60 "uBuf" - Name 84 "Nested" - MemberName 84(Nested) 0 "f" - MemberName 84(Nested) 1 "S" - Name 86 "n" - Name 88 "Nested" - MemberName 88(Nested) 0 "f" - MemberName 88(Nested) 1 "S" - Name 89 "UBON" - MemberName 89(UBON) 0 "N1" - Name 91 "uBufN" - Name 122 "Nested" - MemberName 122(Nested) 0 "f" - MemberName 122(Nested) 1 "S" - Name 123 "SSBO1N" - MemberName 123(SSBO1N) 0 "N2" - Name 125 "outBufN" + Name 39 "SSBO1" + MemberName 39(SSBO1) 0 "b" + Name 41 "outBuf" + Name 58 "MyStruct" + MemberName 58(MyStruct) 0 "foo" + MemberName 58(MyStruct) 1 "sb" + Name 59 "UBO" + MemberName 59(UBO) 0 "c" + Name 61 "uBuf" + Name 86 "Nested" + MemberName 86(Nested) 0 "f" + MemberName 86(Nested) 1 "S" + Name 88 "n" + Name 90 "Nested" + MemberName 90(Nested) 0 "f" + MemberName 90(Nested) 1 "S" + Name 91 "UBON" + MemberName 91(UBON) 0 "N1" + Name 93 "uBufN" + Name 126 "Nested" + MemberName 126(Nested) 0 "f" + MemberName 126(Nested) 1 "S" + Name 127 "SSBO1N" + MemberName 127(SSBO1N) 0 "N2" + Name 129 "outBufN" Decorate 15 ArrayStride 8 MemberDecorate 16(MyStruct) 0 Offset 0 MemberDecorate 16(MyStruct) 1 Offset 16 @@ -54,31 +54,31 @@ Warning, version 450 is not yet complete; most version-specific features are pre Decorate 17(SSBO0) BufferBlock Decorate 19(inBuf) DescriptorSet 0 Decorate 19(inBuf) Binding 0 - MemberDecorate 37(SSBO1) 0 Offset 0 - Decorate 37(SSBO1) BufferBlock - Decorate 39(outBuf) DescriptorSet 0 - Decorate 39(outBuf) Binding 1 - Decorate 56 ArrayStride 16 - MemberDecorate 57(MyStruct) 0 Offset 0 - MemberDecorate 57(MyStruct) 1 Offset 32 - MemberDecorate 58(UBO) 0 Offset 0 - Decorate 58(UBO) Block - Decorate 60(uBuf) DescriptorSet 0 - Decorate 60(uBuf) Binding 2 - Decorate 87 ArrayStride 48 - MemberDecorate 88(Nested) 0 Offset 0 - MemberDecorate 88(Nested) 1 Offset 16 - MemberDecorate 89(UBON) 0 Offset 0 - Decorate 89(UBON) Block - Decorate 91(uBufN) DescriptorSet 0 - Decorate 91(uBufN) Binding 2 - Decorate 121 ArrayStride 24 - MemberDecorate 122(Nested) 0 Offset 0 - MemberDecorate 122(Nested) 1 Offset 8 - MemberDecorate 123(SSBO1N) 0 Offset 0 - Decorate 123(SSBO1N) BufferBlock - Decorate 125(outBufN) DescriptorSet 0 - Decorate 125(outBufN) Binding 1 + MemberDecorate 39(SSBO1) 0 Offset 0 + Decorate 39(SSBO1) BufferBlock + Decorate 41(outBuf) DescriptorSet 0 + Decorate 41(outBuf) Binding 1 + Decorate 57 ArrayStride 16 + MemberDecorate 58(MyStruct) 0 Offset 0 + MemberDecorate 58(MyStruct) 1 Offset 32 + MemberDecorate 59(UBO) 0 Offset 0 + Decorate 59(UBO) Block + Decorate 61(uBuf) DescriptorSet 0 + Decorate 61(uBuf) Binding 2 + Decorate 89 ArrayStride 48 + MemberDecorate 90(Nested) 0 Offset 0 + MemberDecorate 90(Nested) 1 Offset 16 + MemberDecorate 91(UBON) 0 Offset 0 + Decorate 91(UBON) Block + Decorate 93(uBufN) DescriptorSet 0 + Decorate 93(uBufN) Binding 2 + Decorate 125 ArrayStride 24 + MemberDecorate 126(Nested) 0 Offset 0 + MemberDecorate 126(Nested) 1 Offset 8 + MemberDecorate 127(SSBO1N) 0 Offset 0 + Decorate 127(SSBO1N) BufferBlock + Decorate 129(outBufN) DescriptorSet 0 + Decorate 129(outBufN) Binding 1 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 @@ -100,44 +100,44 @@ Warning, version 450 is not yet complete; most version-specific features are pre 26: TypePointer Function 10 29: TypePointer Function 7(fvec2) 32: 20(int) Constant 1 - 35: TypePointer Function 11(bool) - 37(SSBO1): TypeStruct 16(MyStruct) - 38: TypePointer Uniform 37(SSBO1) - 39(outBuf): 38(ptr) Variable Uniform - 43: TypePointer Uniform 15 - 46: TypePointer Uniform 7(fvec2) - 51: 8(int) Constant 0 - 52: 8(int) Constant 1 - 54: TypePointer Uniform 8(int) - 56: TypeArray 7(fvec2) 9 - 57(MyStruct): TypeStruct 56 8(int) - 58(UBO): TypeStruct 57(MyStruct) - 59: TypePointer Uniform 58(UBO) - 60(uBuf): 59(ptr) Variable Uniform - 61: TypePointer Uniform 57(MyStruct) - 83: TypeArray 12(MyStruct) 9 - 84(Nested): TypeStruct 6(float) 83 - 85: TypePointer Function 84(Nested) - 87: TypeArray 57(MyStruct) 9 - 88(Nested): TypeStruct 6(float) 87 - 89(UBON): TypeStruct 88(Nested) - 90: TypePointer Uniform 89(UBON) - 91(uBufN): 90(ptr) Variable Uniform - 92: TypePointer Uniform 88(Nested) - 96: TypePointer Function 6(float) - 99: TypePointer Function 83 - 121: TypeArray 16(MyStruct) 9 - 122(Nested): TypeStruct 6(float) 121 - 123(SSBO1N): TypeStruct 122(Nested) - 124: TypePointer Uniform 123(SSBO1N) - 125(outBufN): 124(ptr) Variable Uniform - 127: TypePointer Uniform 122(Nested) - 130: TypePointer Uniform 6(float) - 133: TypePointer Uniform 121 + 35: 8(int) Constant 0 + 37: TypePointer Function 11(bool) + 39(SSBO1): TypeStruct 16(MyStruct) + 40: TypePointer Uniform 39(SSBO1) + 41(outBuf): 40(ptr) Variable Uniform + 45: TypePointer Uniform 15 + 48: TypePointer Uniform 7(fvec2) + 53: 8(int) Constant 1 + 55: TypePointer Uniform 8(int) + 57: TypeArray 7(fvec2) 9 + 58(MyStruct): TypeStruct 57 8(int) + 59(UBO): TypeStruct 58(MyStruct) + 60: TypePointer Uniform 59(UBO) + 61(uBuf): 60(ptr) Variable Uniform + 62: TypePointer Uniform 58(MyStruct) + 85: TypeArray 12(MyStruct) 9 + 86(Nested): TypeStruct 6(float) 85 + 87: TypePointer Function 86(Nested) + 89: TypeArray 58(MyStruct) 9 + 90(Nested): TypeStruct 6(float) 89 + 91(UBON): TypeStruct 90(Nested) + 92: TypePointer Uniform 91(UBON) + 93(uBufN): 92(ptr) Variable Uniform + 94: TypePointer Uniform 90(Nested) + 98: TypePointer Function 6(float) + 101: TypePointer Function 85 + 125: TypeArray 16(MyStruct) 9 + 126(Nested): TypeStruct 6(float) 125 + 127(SSBO1N): TypeStruct 126(Nested) + 128: TypePointer Uniform 127(SSBO1N) + 129(outBufN): 128(ptr) Variable Uniform + 131: TypePointer Uniform 126(Nested) + 134: TypePointer Uniform 6(float) + 137: TypePointer Uniform 125 4(main): 2 Function None 3 5: Label 14(t): 13(ptr) Variable Function - 86(n): 85(ptr) Variable Function + 88(n): 87(ptr) Variable Function 23: 22(ptr) AccessChain 19(inBuf) 21 24:16(MyStruct) Load 23 25: 15 CompositeExtract 24 0 @@ -149,116 +149,120 @@ Warning, version 450 is not yet complete; most version-specific features are pre 33: 29(ptr) AccessChain 27 32 Store 33 31 34: 8(int) CompositeExtract 24 1 - 36: 35(ptr) AccessChain 14(t) 32 - Store 36 34 - 40:12(MyStruct) Load 14(t) - 41: 22(ptr) AccessChain 39(outBuf) 21 - 42: 10 CompositeExtract 40 0 - 44: 43(ptr) AccessChain 41 21 - 45: 7(fvec2) CompositeExtract 42 0 - 47: 46(ptr) AccessChain 44 21 - Store 47 45 - 48: 7(fvec2) CompositeExtract 42 1 - 49: 46(ptr) AccessChain 44 32 - Store 49 48 - 50: 11(bool) CompositeExtract 40 1 - 53: 8(int) Select 50 52 51 - 55: 54(ptr) AccessChain 41 32 - Store 55 53 - 62: 61(ptr) AccessChain 60(uBuf) 21 - 63:57(MyStruct) Load 62 - 64: 56 CompositeExtract 63 0 - 65: 26(ptr) AccessChain 14(t) 21 - 66: 7(fvec2) CompositeExtract 64 0 - 67: 29(ptr) AccessChain 65 21 - Store 67 66 - 68: 7(fvec2) CompositeExtract 64 1 - 69: 29(ptr) AccessChain 65 32 - Store 69 68 - 70: 8(int) CompositeExtract 63 1 - 71: 35(ptr) AccessChain 14(t) 32 - Store 71 70 - 72:12(MyStruct) Load 14(t) - 73: 22(ptr) AccessChain 39(outBuf) 21 - 74: 10 CompositeExtract 72 0 - 75: 43(ptr) AccessChain 73 21 - 76: 7(fvec2) CompositeExtract 74 0 - 77: 46(ptr) AccessChain 75 21 - Store 77 76 - 78: 7(fvec2) CompositeExtract 74 1 - 79: 46(ptr) AccessChain 75 32 + 36: 11(bool) INotEqual 34 35 + 38: 37(ptr) AccessChain 14(t) 32 + Store 38 36 + 42:12(MyStruct) Load 14(t) + 43: 22(ptr) AccessChain 41(outBuf) 21 + 44: 10 CompositeExtract 42 0 + 46: 45(ptr) AccessChain 43 21 + 47: 7(fvec2) CompositeExtract 44 0 + 49: 48(ptr) AccessChain 46 21 + Store 49 47 + 50: 7(fvec2) CompositeExtract 44 1 + 51: 48(ptr) AccessChain 46 32 + Store 51 50 + 52: 11(bool) CompositeExtract 42 1 + 54: 8(int) Select 52 53 35 + 56: 55(ptr) AccessChain 43 32 + Store 56 54 + 63: 62(ptr) AccessChain 61(uBuf) 21 + 64:58(MyStruct) Load 63 + 65: 57 CompositeExtract 64 0 + 66: 26(ptr) AccessChain 14(t) 21 + 67: 7(fvec2) CompositeExtract 65 0 + 68: 29(ptr) AccessChain 66 21 + Store 68 67 + 69: 7(fvec2) CompositeExtract 65 1 + 70: 29(ptr) AccessChain 66 32 + Store 70 69 + 71: 8(int) CompositeExtract 64 1 + 72: 11(bool) INotEqual 71 35 + 73: 37(ptr) AccessChain 14(t) 32 + Store 73 72 + 74:12(MyStruct) Load 14(t) + 75: 22(ptr) AccessChain 41(outBuf) 21 + 76: 10 CompositeExtract 74 0 + 77: 45(ptr) AccessChain 75 21 + 78: 7(fvec2) CompositeExtract 76 0 + 79: 48(ptr) AccessChain 77 21 Store 79 78 - 80: 11(bool) CompositeExtract 72 1 - 81: 8(int) Select 80 52 51 - 82: 54(ptr) AccessChain 73 32 - Store 82 81 - 93: 92(ptr) AccessChain 91(uBufN) 21 - 94: 88(Nested) Load 93 - 95: 6(float) CompositeExtract 94 0 - 97: 96(ptr) AccessChain 86(n) 21 - Store 97 95 - 98: 87 CompositeExtract 94 1 - 100: 99(ptr) AccessChain 86(n) 32 - 101:57(MyStruct) CompositeExtract 98 0 - 102: 13(ptr) AccessChain 100 21 - 103: 56 CompositeExtract 101 0 - 104: 26(ptr) AccessChain 102 21 - 105: 7(fvec2) CompositeExtract 103 0 - 106: 29(ptr) AccessChain 104 21 - Store 106 105 - 107: 7(fvec2) CompositeExtract 103 1 - 108: 29(ptr) AccessChain 104 32 + 80: 7(fvec2) CompositeExtract 76 1 + 81: 48(ptr) AccessChain 77 32 + Store 81 80 + 82: 11(bool) CompositeExtract 74 1 + 83: 8(int) Select 82 53 35 + 84: 55(ptr) AccessChain 75 32 + Store 84 83 + 95: 94(ptr) AccessChain 93(uBufN) 21 + 96: 90(Nested) Load 95 + 97: 6(float) CompositeExtract 96 0 + 99: 98(ptr) AccessChain 88(n) 21 + Store 99 97 + 100: 89 CompositeExtract 96 1 + 102: 101(ptr) AccessChain 88(n) 32 + 103:58(MyStruct) CompositeExtract 100 0 + 104: 13(ptr) AccessChain 102 21 + 105: 57 CompositeExtract 103 0 + 106: 26(ptr) AccessChain 104 21 + 107: 7(fvec2) CompositeExtract 105 0 + 108: 29(ptr) AccessChain 106 21 Store 108 107 - 109: 8(int) CompositeExtract 101 1 - 110: 35(ptr) AccessChain 102 32 + 109: 7(fvec2) CompositeExtract 105 1 + 110: 29(ptr) AccessChain 106 32 Store 110 109 - 111:57(MyStruct) CompositeExtract 98 1 - 112: 13(ptr) AccessChain 100 32 - 113: 56 CompositeExtract 111 0 - 114: 26(ptr) AccessChain 112 21 - 115: 7(fvec2) CompositeExtract 113 0 - 116: 29(ptr) AccessChain 114 21 - Store 116 115 - 117: 7(fvec2) CompositeExtract 113 1 - 118: 29(ptr) AccessChain 114 32 - Store 118 117 - 119: 8(int) CompositeExtract 111 1 - 120: 35(ptr) AccessChain 112 32 - Store 120 119 - 126: 84(Nested) Load 86(n) - 128: 127(ptr) AccessChain 125(outBufN) 21 - 129: 6(float) CompositeExtract 126 0 - 131: 130(ptr) AccessChain 128 21 - Store 131 129 - 132: 83 CompositeExtract 126 1 - 134: 133(ptr) AccessChain 128 32 - 135:12(MyStruct) CompositeExtract 132 0 - 136: 22(ptr) AccessChain 134 21 - 137: 10 CompositeExtract 135 0 - 138: 43(ptr) AccessChain 136 21 - 139: 7(fvec2) CompositeExtract 137 0 - 140: 46(ptr) AccessChain 138 21 - Store 140 139 - 141: 7(fvec2) CompositeExtract 137 1 - 142: 46(ptr) AccessChain 138 32 - Store 142 141 - 143: 11(bool) CompositeExtract 135 1 - 144: 8(int) Select 143 52 51 - 145: 54(ptr) AccessChain 136 32 - Store 145 144 - 146:12(MyStruct) CompositeExtract 132 1 - 147: 22(ptr) AccessChain 134 32 - 148: 10 CompositeExtract 146 0 - 149: 43(ptr) AccessChain 147 21 - 150: 7(fvec2) CompositeExtract 148 0 - 151: 46(ptr) AccessChain 149 21 - Store 151 150 - 152: 7(fvec2) CompositeExtract 148 1 - 153: 46(ptr) AccessChain 149 32 - Store 153 152 - 154: 11(bool) CompositeExtract 146 1 - 155: 8(int) Select 154 52 51 - 156: 54(ptr) AccessChain 147 32 - Store 156 155 + 111: 8(int) CompositeExtract 103 1 + 112: 11(bool) INotEqual 111 35 + 113: 37(ptr) AccessChain 104 32 + Store 113 112 + 114:58(MyStruct) CompositeExtract 100 1 + 115: 13(ptr) AccessChain 102 32 + 116: 57 CompositeExtract 114 0 + 117: 26(ptr) AccessChain 115 21 + 118: 7(fvec2) CompositeExtract 116 0 + 119: 29(ptr) AccessChain 117 21 + Store 119 118 + 120: 7(fvec2) CompositeExtract 116 1 + 121: 29(ptr) AccessChain 117 32 + Store 121 120 + 122: 8(int) CompositeExtract 114 1 + 123: 11(bool) INotEqual 122 35 + 124: 37(ptr) AccessChain 115 32 + Store 124 123 + 130: 86(Nested) Load 88(n) + 132: 131(ptr) AccessChain 129(outBufN) 21 + 133: 6(float) CompositeExtract 130 0 + 135: 134(ptr) AccessChain 132 21 + Store 135 133 + 136: 85 CompositeExtract 130 1 + 138: 137(ptr) AccessChain 132 32 + 139:12(MyStruct) CompositeExtract 136 0 + 140: 22(ptr) AccessChain 138 21 + 141: 10 CompositeExtract 139 0 + 142: 45(ptr) AccessChain 140 21 + 143: 7(fvec2) CompositeExtract 141 0 + 144: 48(ptr) AccessChain 142 21 + Store 144 143 + 145: 7(fvec2) CompositeExtract 141 1 + 146: 48(ptr) AccessChain 142 32 + Store 146 145 + 147: 11(bool) CompositeExtract 139 1 + 148: 8(int) Select 147 53 35 + 149: 55(ptr) AccessChain 140 32 + Store 149 148 + 150:12(MyStruct) CompositeExtract 136 1 + 151: 22(ptr) AccessChain 138 32 + 152: 10 CompositeExtract 150 0 + 153: 45(ptr) AccessChain 151 21 + 154: 7(fvec2) CompositeExtract 152 0 + 155: 48(ptr) AccessChain 153 21 + Store 155 154 + 156: 7(fvec2) CompositeExtract 152 1 + 157: 48(ptr) AccessChain 153 32 + Store 157 156 + 158: 11(bool) CompositeExtract 150 1 + 159: 8(int) Select 158 53 35 + 160: 55(ptr) AccessChain 151 32 + Store 160 159 Return FunctionEnd