diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index a6c777c6..c79b6c21 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -156,9 +156,7 @@ protected: spv::Id makeSmearedConstant(spv::Id constant, int vectorSize); spv::Id createAtomicOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector& operands, glslang::TBasicType typeProxy); spv::Id createInvocationsOperation(glslang::TOperator op, spv::Id typeId, std::vector& operands, glslang::TBasicType typeProxy); -#ifdef AMD_EXTENSIONS - spv::Id CreateInvocationsVectorOperation(spv::Op op, spv::Id typeId, spv::Id operand); -#endif + spv::Id CreateInvocationsVectorOperation(spv::Op op, spv::Id typeId, std::vector& operands); spv::Id createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector& operands, glslang::TBasicType typeProxy); spv::Id createNoArgOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId); spv::Id getSymbolId(const glslang::TIntermSymbol* node); @@ -4029,6 +4027,8 @@ spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op case glslang::EOpReadInvocation: opCode = spv::OpGroupBroadcast; + if (builder.isVectorType(typeId)) + return CreateInvocationsVectorOperation(opCode, typeId, operands); break; case glslang::EOpReadFirstInvocation: opCode = spv::OpSubgroupFirstInvocationKHR; @@ -4084,7 +4084,7 @@ spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op } if (builder.isVectorType(typeId)) - return CreateInvocationsVectorOperation(opCode, typeId, operands[0]); + return CreateInvocationsVectorOperation(opCode, typeId, operands); break; case glslang::EOpMinInvocationsNonUniform: @@ -4118,7 +4118,7 @@ spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op } if (builder.isVectorType(typeId)) - return CreateInvocationsVectorOperation(opCode, typeId, operands[0]); + return CreateInvocationsVectorOperation(opCode, typeId, operands); break; #endif @@ -4131,16 +4131,21 @@ spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op return builder.createOp(opCode, typeId, spvGroupOperands); } -#ifdef AMD_EXTENSIONS // Create group invocation operations on a vector -spv::Id TGlslangToSpvTraverser::CreateInvocationsVectorOperation(spv::Op op, spv::Id typeId, spv::Id operand) +spv::Id TGlslangToSpvTraverser::CreateInvocationsVectorOperation(spv::Op op, spv::Id typeId, std::vector& operands) { +#ifdef AMD_EXTENSIONS assert(op == spv::OpGroupFMin || op == spv::OpGroupUMin || op == spv::OpGroupSMin || op == spv::OpGroupFMax || op == spv::OpGroupUMax || op == spv::OpGroupSMax || - op == spv::OpGroupFAdd || op == spv::OpGroupIAdd || + op == spv::OpGroupFAdd || op == spv::OpGroupIAdd || op == spv::OpGroupBroadcast || op == spv::OpGroupFMinNonUniformAMD || op == spv::OpGroupUMinNonUniformAMD || op == spv::OpGroupSMinNonUniformAMD || op == spv::OpGroupFMaxNonUniformAMD || op == spv::OpGroupUMaxNonUniformAMD || op == spv::OpGroupSMaxNonUniformAMD || op == spv::OpGroupFAddNonUniformAMD || op == spv::OpGroupIAddNonUniformAMD); +#else + assert(op == spv::OpGroupFMin || op == spv::OpGroupUMin || op == spv::OpGroupSMin || + op == spv::OpGroupFMax || op == spv::OpGroupUMax || op == spv::OpGroupSMax || + op == spv::OpGroupFAdd || op == spv::OpGroupIAdd || op == spv::OpGroupBroadcast); +#endif // Handle group invocation operations scalar by scalar. // The result type is the same type as the original type. @@ -4150,28 +4155,32 @@ spv::Id TGlslangToSpvTraverser::CreateInvocationsVectorOperation(spv::Op op, spv // - make a vector out the scalar results // get the types sorted out - int numComponents = builder.getNumComponents(operand); - spv::Id scalarType = builder.getScalarTypeId(builder.getTypeId(operand)); + int numComponents = builder.getNumComponents(operands[0]); + spv::Id scalarType = builder.getScalarTypeId(builder.getTypeId(operands[0])); std::vector results; // do each scalar op for (int comp = 0; comp < numComponents; ++comp) { std::vector indexes; indexes.push_back(comp); - spv::Id scalar = builder.createCompositeExtract(operand, scalarType, indexes); + spv::Id scalar = builder.createCompositeExtract(operands[0], scalarType, indexes); - std::vector operands; - operands.push_back(builder.makeUintConstant(spv::ScopeSubgroup)); - operands.push_back(spv::GroupOperationReduce); - operands.push_back(scalar); + std::vector spvGroupOperands; + spvGroupOperands.push_back(builder.makeUintConstant(spv::ScopeSubgroup)); + if (op == spv::OpGroupBroadcast) { + spvGroupOperands.push_back(scalar); + spvGroupOperands.push_back(operands[1]); + } else { + spvGroupOperands.push_back(spv::GroupOperationReduce); + spvGroupOperands.push_back(scalar); + } - results.push_back(builder.createOp(op, scalarType, operands)); + results.push_back(builder.createOp(op, scalarType, spvGroupOperands)); } // put the pieces together return builder.createCompositeConstruct(typeId, results); } -#endif spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector& operands, glslang::TBasicType typeProxy) { diff --git a/Test/baseResults/spv.shaderBallot.comp.out b/Test/baseResults/spv.shaderBallot.comp.out index c60db162..b837b8bc 100644 --- a/Test/baseResults/spv.shaderBallot.comp.out +++ b/Test/baseResults/spv.shaderBallot.comp.out @@ -7,7 +7,7 @@ Linked compute stage: // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 245 +// Id's are bound by 299 Capability Shader Capability Int64 @@ -49,7 +49,7 @@ Linked compute stage: Decorate 52(Buffers) BufferBlock Decorate 55(data) DescriptorSet 0 Decorate 55(data) Binding 0 - Decorate 244 BuiltIn WorkgroupSize + Decorate 298 BuiltIn WorkgroupSize 2: TypeVoid 3: TypeFunction 2 6: TypeInt 32 0 @@ -85,19 +85,19 @@ Linked compute stage: 67: 50(int) Constant 1 68: TypeVector 48(float) 2 69: TypePointer Uniform 49(fvec4) - 79: 50(int) Constant 2 - 80: TypeVector 48(float) 3 - 90: 50(int) Constant 3 - 97: TypePointer Uniform 50(int) - 104: TypeVector 50(int) 2 - 105: TypePointer Uniform 51(ivec4) - 115: TypeVector 50(int) 3 - 131: TypePointer Uniform 6(int) - 138: TypePointer Uniform 38(ivec4) - 148: TypeVector 6(int) 3 - 242: 6(int) Constant 8 - 243: 6(int) Constant 1 - 244: 148(ivec3) ConstantComposite 242 242 243 + 83: 50(int) Constant 2 + 84: TypeVector 48(float) 3 + 100: 50(int) Constant 3 + 115: TypePointer Uniform 50(int) + 122: TypeVector 50(int) 2 + 123: TypePointer Uniform 51(ivec4) + 137: TypeVector 50(int) 3 + 167: TypePointer Uniform 6(int) + 174: TypePointer Uniform 38(ivec4) + 188: TypeVector 6(int) 3 + 296: 6(int) Constant 8 + 297: 6(int) Constant 1 + 298: 188(ivec3) ConstantComposite 296 296 297 4(main): 2 Function None 3 5: Label 8(invocation): 7(ptr) Variable Function @@ -125,7 +125,7 @@ Linked compute stage: 44: 17(int) Bitcast 43 45: 36(bool) IEqual 35 44 SelectionMerge 47 None - BranchConditional 45 46 163 + BranchConditional 45 46 217 46: Label 56: 6(int) Load 8(invocation) 60: 59(ptr) AccessChain 55(data) 57 57 58 @@ -139,188 +139,242 @@ Linked compute stage: 71: 49(fvec4) Load 70 72: 68(fvec2) VectorShuffle 71 71 0 1 73: 6(int) Load 8(invocation) - 74: 68(fvec2) GroupBroadcast 63 72 73 - 75: 69(ptr) AccessChain 55(data) 66 57 - 76: 49(fvec4) Load 75 - 77: 49(fvec4) VectorShuffle 76 74 4 5 2 3 - Store 75 77 - 78: 6(int) Load 8(invocation) - 81: 69(ptr) AccessChain 55(data) 79 57 - 82: 49(fvec4) Load 81 - 83: 80(fvec3) VectorShuffle 82 82 0 1 2 - 84: 6(int) Load 8(invocation) - 85: 80(fvec3) GroupBroadcast 63 83 84 - 86: 69(ptr) AccessChain 55(data) 78 57 - 87: 49(fvec4) Load 86 - 88: 49(fvec4) VectorShuffle 87 85 4 5 6 3 - Store 86 88 - 89: 6(int) Load 8(invocation) - 91: 69(ptr) AccessChain 55(data) 90 57 - 92: 49(fvec4) Load 91 - 93: 6(int) Load 8(invocation) - 94: 49(fvec4) GroupBroadcast 63 92 93 - 95: 69(ptr) AccessChain 55(data) 89 57 - Store 95 94 - 96: 6(int) Load 8(invocation) - 98: 97(ptr) AccessChain 55(data) 57 67 58 - 99: 50(int) Load 98 - 100: 6(int) Load 8(invocation) - 101: 50(int) GroupBroadcast 63 99 100 - 102: 97(ptr) AccessChain 55(data) 96 67 58 - Store 102 101 + 74: 48(float) CompositeExtract 72 0 + 75: 48(float) GroupBroadcast 63 74 73 + 76: 48(float) CompositeExtract 72 1 + 77: 48(float) GroupBroadcast 63 76 73 + 78: 68(fvec2) CompositeConstruct 75 77 + 79: 69(ptr) AccessChain 55(data) 66 57 + 80: 49(fvec4) Load 79 + 81: 49(fvec4) VectorShuffle 80 78 4 5 2 3 + Store 79 81 + 82: 6(int) Load 8(invocation) + 85: 69(ptr) AccessChain 55(data) 83 57 + 86: 49(fvec4) Load 85 + 87: 84(fvec3) VectorShuffle 86 86 0 1 2 + 88: 6(int) Load 8(invocation) + 89: 48(float) CompositeExtract 87 0 + 90: 48(float) GroupBroadcast 63 89 88 + 91: 48(float) CompositeExtract 87 1 + 92: 48(float) GroupBroadcast 63 91 88 + 93: 48(float) CompositeExtract 87 2 + 94: 48(float) GroupBroadcast 63 93 88 + 95: 84(fvec3) CompositeConstruct 90 92 94 + 96: 69(ptr) AccessChain 55(data) 82 57 + 97: 49(fvec4) Load 96 + 98: 49(fvec4) VectorShuffle 97 95 4 5 6 3 + Store 96 98 + 99: 6(int) Load 8(invocation) + 101: 69(ptr) AccessChain 55(data) 100 57 + 102: 49(fvec4) Load 101 103: 6(int) Load 8(invocation) - 106: 105(ptr) AccessChain 55(data) 67 67 - 107: 51(ivec4) Load 106 - 108: 104(ivec2) VectorShuffle 107 107 0 1 - 109: 6(int) Load 8(invocation) - 110: 104(ivec2) GroupBroadcast 63 108 109 - 111: 105(ptr) AccessChain 55(data) 103 67 - 112: 51(ivec4) Load 111 - 113: 51(ivec4) VectorShuffle 112 110 4 5 2 3 - Store 111 113 + 104: 48(float) CompositeExtract 102 0 + 105: 48(float) GroupBroadcast 63 104 103 + 106: 48(float) CompositeExtract 102 1 + 107: 48(float) GroupBroadcast 63 106 103 + 108: 48(float) CompositeExtract 102 2 + 109: 48(float) GroupBroadcast 63 108 103 + 110: 48(float) CompositeExtract 102 3 + 111: 48(float) GroupBroadcast 63 110 103 + 112: 49(fvec4) CompositeConstruct 105 107 109 111 + 113: 69(ptr) AccessChain 55(data) 99 57 + Store 113 112 114: 6(int) Load 8(invocation) - 116: 105(ptr) AccessChain 55(data) 79 67 - 117: 51(ivec4) Load 116 - 118: 115(ivec3) VectorShuffle 117 117 0 1 2 - 119: 6(int) Load 8(invocation) - 120: 115(ivec3) GroupBroadcast 63 118 119 - 121: 105(ptr) AccessChain 55(data) 114 67 - 122: 51(ivec4) Load 121 - 123: 51(ivec4) VectorShuffle 122 120 4 5 6 3 - Store 121 123 - 124: 6(int) Load 8(invocation) - 125: 105(ptr) AccessChain 55(data) 90 67 - 126: 51(ivec4) Load 125 + 116: 115(ptr) AccessChain 55(data) 57 67 58 + 117: 50(int) Load 116 + 118: 6(int) Load 8(invocation) + 119: 50(int) GroupBroadcast 63 117 118 + 120: 115(ptr) AccessChain 55(data) 114 67 58 + Store 120 119 + 121: 6(int) Load 8(invocation) + 124: 123(ptr) AccessChain 55(data) 67 67 + 125: 51(ivec4) Load 124 + 126: 122(ivec2) VectorShuffle 125 125 0 1 127: 6(int) Load 8(invocation) - 128: 51(ivec4) GroupBroadcast 63 126 127 - 129: 105(ptr) AccessChain 55(data) 124 67 - Store 129 128 - 130: 6(int) Load 8(invocation) - 132: 131(ptr) AccessChain 55(data) 57 79 58 - 133: 6(int) Load 132 - 134: 6(int) Load 8(invocation) - 135: 6(int) GroupBroadcast 63 133 134 - 136: 131(ptr) AccessChain 55(data) 130 79 58 - Store 136 135 - 137: 6(int) Load 8(invocation) - 139: 138(ptr) AccessChain 55(data) 67 79 - 140: 38(ivec4) Load 139 - 141: 42(ivec2) VectorShuffle 140 140 0 1 - 142: 6(int) Load 8(invocation) - 143: 42(ivec2) GroupBroadcast 63 141 142 - 144: 138(ptr) AccessChain 55(data) 137 79 - 145: 38(ivec4) Load 144 - 146: 38(ivec4) VectorShuffle 145 143 4 5 2 3 - Store 144 146 - 147: 6(int) Load 8(invocation) - 149: 138(ptr) AccessChain 55(data) 79 79 - 150: 38(ivec4) Load 149 - 151: 148(ivec3) VectorShuffle 150 150 0 1 2 + 128: 50(int) CompositeExtract 126 0 + 129: 50(int) GroupBroadcast 63 128 127 + 130: 50(int) CompositeExtract 126 1 + 131: 50(int) GroupBroadcast 63 130 127 + 132: 122(ivec2) CompositeConstruct 129 131 + 133: 123(ptr) AccessChain 55(data) 121 67 + 134: 51(ivec4) Load 133 + 135: 51(ivec4) VectorShuffle 134 132 4 5 2 3 + Store 133 135 + 136: 6(int) Load 8(invocation) + 138: 123(ptr) AccessChain 55(data) 83 67 + 139: 51(ivec4) Load 138 + 140: 137(ivec3) VectorShuffle 139 139 0 1 2 + 141: 6(int) Load 8(invocation) + 142: 50(int) CompositeExtract 140 0 + 143: 50(int) GroupBroadcast 63 142 141 + 144: 50(int) CompositeExtract 140 1 + 145: 50(int) GroupBroadcast 63 144 141 + 146: 50(int) CompositeExtract 140 2 + 147: 50(int) GroupBroadcast 63 146 141 + 148: 137(ivec3) CompositeConstruct 143 145 147 + 149: 123(ptr) AccessChain 55(data) 136 67 + 150: 51(ivec4) Load 149 + 151: 51(ivec4) VectorShuffle 150 148 4 5 6 3 + Store 149 151 152: 6(int) Load 8(invocation) - 153: 148(ivec3) GroupBroadcast 63 151 152 - 154: 138(ptr) AccessChain 55(data) 147 79 - 155: 38(ivec4) Load 154 - 156: 38(ivec4) VectorShuffle 155 153 4 5 6 3 - Store 154 156 - 157: 6(int) Load 8(invocation) - 158: 138(ptr) AccessChain 55(data) 90 79 - 159: 38(ivec4) Load 158 - 160: 6(int) Load 8(invocation) - 161: 38(ivec4) GroupBroadcast 63 159 160 - 162: 138(ptr) AccessChain 55(data) 157 79 - Store 162 161 - Branch 47 - 163: Label - 164: 6(int) Load 8(invocation) - 165: 59(ptr) AccessChain 55(data) 57 57 58 - 166: 48(float) Load 165 - 167: 48(float) SubgroupFirstInvocationKHR 166 - 168: 59(ptr) AccessChain 55(data) 164 57 58 - Store 168 167 - 169: 6(int) Load 8(invocation) - 170: 69(ptr) AccessChain 55(data) 67 57 - 171: 49(fvec4) Load 170 - 172: 68(fvec2) VectorShuffle 171 171 0 1 - 173: 68(fvec2) SubgroupFirstInvocationKHR 172 - 174: 69(ptr) AccessChain 55(data) 169 57 - 175: 49(fvec4) Load 174 - 176: 49(fvec4) VectorShuffle 175 173 4 5 2 3 - Store 174 176 - 177: 6(int) Load 8(invocation) - 178: 69(ptr) AccessChain 55(data) 79 57 - 179: 49(fvec4) Load 178 - 180: 80(fvec3) VectorShuffle 179 179 0 1 2 - 181: 80(fvec3) SubgroupFirstInvocationKHR 180 - 182: 69(ptr) AccessChain 55(data) 177 57 - 183: 49(fvec4) Load 182 - 184: 49(fvec4) VectorShuffle 183 181 4 5 6 3 - Store 182 184 - 185: 6(int) Load 8(invocation) - 186: 69(ptr) AccessChain 55(data) 90 57 - 187: 49(fvec4) Load 186 - 188: 49(fvec4) SubgroupFirstInvocationKHR 187 - 189: 69(ptr) AccessChain 55(data) 185 57 - Store 189 188 - 190: 6(int) Load 8(invocation) - 191: 97(ptr) AccessChain 55(data) 57 67 58 - 192: 50(int) Load 191 - 193: 50(int) SubgroupFirstInvocationKHR 192 - 194: 97(ptr) AccessChain 55(data) 190 67 58 - Store 194 193 - 195: 6(int) Load 8(invocation) - 196: 105(ptr) AccessChain 55(data) 67 67 - 197: 51(ivec4) Load 196 - 198: 104(ivec2) VectorShuffle 197 197 0 1 - 199: 104(ivec2) SubgroupFirstInvocationKHR 198 - 200: 105(ptr) AccessChain 55(data) 195 67 - 201: 51(ivec4) Load 200 - 202: 51(ivec4) VectorShuffle 201 199 4 5 2 3 + 153: 123(ptr) AccessChain 55(data) 100 67 + 154: 51(ivec4) Load 153 + 155: 6(int) Load 8(invocation) + 156: 50(int) CompositeExtract 154 0 + 157: 50(int) GroupBroadcast 63 156 155 + 158: 50(int) CompositeExtract 154 1 + 159: 50(int) GroupBroadcast 63 158 155 + 160: 50(int) CompositeExtract 154 2 + 161: 50(int) GroupBroadcast 63 160 155 + 162: 50(int) CompositeExtract 154 3 + 163: 50(int) GroupBroadcast 63 162 155 + 164: 51(ivec4) CompositeConstruct 157 159 161 163 + 165: 123(ptr) AccessChain 55(data) 152 67 + Store 165 164 + 166: 6(int) Load 8(invocation) + 168: 167(ptr) AccessChain 55(data) 57 83 58 + 169: 6(int) Load 168 + 170: 6(int) Load 8(invocation) + 171: 6(int) GroupBroadcast 63 169 170 + 172: 167(ptr) AccessChain 55(data) 166 83 58 + Store 172 171 + 173: 6(int) Load 8(invocation) + 175: 174(ptr) AccessChain 55(data) 67 83 + 176: 38(ivec4) Load 175 + 177: 42(ivec2) VectorShuffle 176 176 0 1 + 178: 6(int) Load 8(invocation) + 179: 6(int) CompositeExtract 177 0 + 180: 6(int) GroupBroadcast 63 179 178 + 181: 6(int) CompositeExtract 177 1 + 182: 6(int) GroupBroadcast 63 181 178 + 183: 42(ivec2) CompositeConstruct 180 182 + 184: 174(ptr) AccessChain 55(data) 173 83 + 185: 38(ivec4) Load 184 + 186: 38(ivec4) VectorShuffle 185 183 4 5 2 3 + Store 184 186 + 187: 6(int) Load 8(invocation) + 189: 174(ptr) AccessChain 55(data) 83 83 + 190: 38(ivec4) Load 189 + 191: 188(ivec3) VectorShuffle 190 190 0 1 2 + 192: 6(int) Load 8(invocation) + 193: 6(int) CompositeExtract 191 0 + 194: 6(int) GroupBroadcast 63 193 192 + 195: 6(int) CompositeExtract 191 1 + 196: 6(int) GroupBroadcast 63 195 192 + 197: 6(int) CompositeExtract 191 2 + 198: 6(int) GroupBroadcast 63 197 192 + 199: 188(ivec3) CompositeConstruct 194 196 198 + 200: 174(ptr) AccessChain 55(data) 187 83 + 201: 38(ivec4) Load 200 + 202: 38(ivec4) VectorShuffle 201 199 4 5 6 3 Store 200 202 203: 6(int) Load 8(invocation) - 204: 105(ptr) AccessChain 55(data) 79 67 - 205: 51(ivec4) Load 204 - 206: 115(ivec3) VectorShuffle 205 205 0 1 2 - 207: 115(ivec3) SubgroupFirstInvocationKHR 206 - 208: 105(ptr) AccessChain 55(data) 203 67 - 209: 51(ivec4) Load 208 - 210: 51(ivec4) VectorShuffle 209 207 4 5 6 3 - Store 208 210 - 211: 6(int) Load 8(invocation) - 212: 105(ptr) AccessChain 55(data) 90 67 - 213: 51(ivec4) Load 212 - 214: 51(ivec4) SubgroupFirstInvocationKHR 213 - 215: 105(ptr) AccessChain 55(data) 211 67 - Store 215 214 - 216: 6(int) Load 8(invocation) - 217: 131(ptr) AccessChain 55(data) 57 79 58 - 218: 6(int) Load 217 - 219: 6(int) SubgroupFirstInvocationKHR 218 - 220: 131(ptr) AccessChain 55(data) 216 79 58 - Store 220 219 - 221: 6(int) Load 8(invocation) - 222: 138(ptr) AccessChain 55(data) 67 79 - 223: 38(ivec4) Load 222 - 224: 42(ivec2) VectorShuffle 223 223 0 1 - 225: 42(ivec2) SubgroupFirstInvocationKHR 224 - 226: 138(ptr) AccessChain 55(data) 221 79 - 227: 38(ivec4) Load 226 - 228: 38(ivec4) VectorShuffle 227 225 4 5 2 3 - Store 226 228 - 229: 6(int) Load 8(invocation) - 230: 138(ptr) AccessChain 55(data) 79 79 - 231: 38(ivec4) Load 230 - 232: 148(ivec3) VectorShuffle 231 231 0 1 2 - 233: 148(ivec3) SubgroupFirstInvocationKHR 232 - 234: 138(ptr) AccessChain 55(data) 229 79 - 235: 38(ivec4) Load 234 - 236: 38(ivec4) VectorShuffle 235 233 4 5 6 3 - Store 234 236 - 237: 6(int) Load 8(invocation) - 238: 138(ptr) AccessChain 55(data) 90 79 - 239: 38(ivec4) Load 238 - 240: 38(ivec4) SubgroupFirstInvocationKHR 239 - 241: 138(ptr) AccessChain 55(data) 237 79 - Store 241 240 + 204: 174(ptr) AccessChain 55(data) 100 83 + 205: 38(ivec4) Load 204 + 206: 6(int) Load 8(invocation) + 207: 6(int) CompositeExtract 205 0 + 208: 6(int) GroupBroadcast 63 207 206 + 209: 6(int) CompositeExtract 205 1 + 210: 6(int) GroupBroadcast 63 209 206 + 211: 6(int) CompositeExtract 205 2 + 212: 6(int) GroupBroadcast 63 211 206 + 213: 6(int) CompositeExtract 205 3 + 214: 6(int) GroupBroadcast 63 213 206 + 215: 38(ivec4) CompositeConstruct 208 210 212 214 + 216: 174(ptr) AccessChain 55(data) 203 83 + Store 216 215 + Branch 47 + 217: Label + 218: 6(int) Load 8(invocation) + 219: 59(ptr) AccessChain 55(data) 57 57 58 + 220: 48(float) Load 219 + 221: 48(float) SubgroupFirstInvocationKHR 220 + 222: 59(ptr) AccessChain 55(data) 218 57 58 + Store 222 221 + 223: 6(int) Load 8(invocation) + 224: 69(ptr) AccessChain 55(data) 67 57 + 225: 49(fvec4) Load 224 + 226: 68(fvec2) VectorShuffle 225 225 0 1 + 227: 68(fvec2) SubgroupFirstInvocationKHR 226 + 228: 69(ptr) AccessChain 55(data) 223 57 + 229: 49(fvec4) Load 228 + 230: 49(fvec4) VectorShuffle 229 227 4 5 2 3 + Store 228 230 + 231: 6(int) Load 8(invocation) + 232: 69(ptr) AccessChain 55(data) 83 57 + 233: 49(fvec4) Load 232 + 234: 84(fvec3) VectorShuffle 233 233 0 1 2 + 235: 84(fvec3) SubgroupFirstInvocationKHR 234 + 236: 69(ptr) AccessChain 55(data) 231 57 + 237: 49(fvec4) Load 236 + 238: 49(fvec4) VectorShuffle 237 235 4 5 6 3 + Store 236 238 + 239: 6(int) Load 8(invocation) + 240: 69(ptr) AccessChain 55(data) 100 57 + 241: 49(fvec4) Load 240 + 242: 49(fvec4) SubgroupFirstInvocationKHR 241 + 243: 69(ptr) AccessChain 55(data) 239 57 + Store 243 242 + 244: 6(int) Load 8(invocation) + 245: 115(ptr) AccessChain 55(data) 57 67 58 + 246: 50(int) Load 245 + 247: 50(int) SubgroupFirstInvocationKHR 246 + 248: 115(ptr) AccessChain 55(data) 244 67 58 + Store 248 247 + 249: 6(int) Load 8(invocation) + 250: 123(ptr) AccessChain 55(data) 67 67 + 251: 51(ivec4) Load 250 + 252: 122(ivec2) VectorShuffle 251 251 0 1 + 253: 122(ivec2) SubgroupFirstInvocationKHR 252 + 254: 123(ptr) AccessChain 55(data) 249 67 + 255: 51(ivec4) Load 254 + 256: 51(ivec4) VectorShuffle 255 253 4 5 2 3 + Store 254 256 + 257: 6(int) Load 8(invocation) + 258: 123(ptr) AccessChain 55(data) 83 67 + 259: 51(ivec4) Load 258 + 260: 137(ivec3) VectorShuffle 259 259 0 1 2 + 261: 137(ivec3) SubgroupFirstInvocationKHR 260 + 262: 123(ptr) AccessChain 55(data) 257 67 + 263: 51(ivec4) Load 262 + 264: 51(ivec4) VectorShuffle 263 261 4 5 6 3 + Store 262 264 + 265: 6(int) Load 8(invocation) + 266: 123(ptr) AccessChain 55(data) 100 67 + 267: 51(ivec4) Load 266 + 268: 51(ivec4) SubgroupFirstInvocationKHR 267 + 269: 123(ptr) AccessChain 55(data) 265 67 + Store 269 268 + 270: 6(int) Load 8(invocation) + 271: 167(ptr) AccessChain 55(data) 57 83 58 + 272: 6(int) Load 271 + 273: 6(int) SubgroupFirstInvocationKHR 272 + 274: 167(ptr) AccessChain 55(data) 270 83 58 + Store 274 273 + 275: 6(int) Load 8(invocation) + 276: 174(ptr) AccessChain 55(data) 67 83 + 277: 38(ivec4) Load 276 + 278: 42(ivec2) VectorShuffle 277 277 0 1 + 279: 42(ivec2) SubgroupFirstInvocationKHR 278 + 280: 174(ptr) AccessChain 55(data) 275 83 + 281: 38(ivec4) Load 280 + 282: 38(ivec4) VectorShuffle 281 279 4 5 2 3 + Store 280 282 + 283: 6(int) Load 8(invocation) + 284: 174(ptr) AccessChain 55(data) 83 83 + 285: 38(ivec4) Load 284 + 286: 188(ivec3) VectorShuffle 285 285 0 1 2 + 287: 188(ivec3) SubgroupFirstInvocationKHR 286 + 288: 174(ptr) AccessChain 55(data) 283 83 + 289: 38(ivec4) Load 288 + 290: 38(ivec4) VectorShuffle 289 287 4 5 6 3 + Store 288 290 + 291: 6(int) Load 8(invocation) + 292: 174(ptr) AccessChain 55(data) 100 83 + 293: 38(ivec4) Load 292 + 294: 38(ivec4) SubgroupFirstInvocationKHR 293 + 295: 174(ptr) AccessChain 55(data) 291 83 + Store 295 294 Branch 47 47: Label Return