diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index 71af11bc..0a0a0538 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -4131,7 +4131,8 @@ spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op spv::Op opCode = spv::OpNop; std::vector spvGroupOperands; - if (op == glslang::EOpBallot || op == glslang::EOpReadFirstInvocation) { + if (op == glslang::EOpBallot || op == glslang::EOpReadFirstInvocation || + op == glslang::EOpReadInvocation) { builder.addExtension(spv::E_SPV_KHR_shader_ballot); builder.addCapability(spv::CapabilitySubgroupBallotKHR); } else { @@ -4171,7 +4172,7 @@ spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op } case glslang::EOpReadInvocation: - opCode = spv::OpGroupBroadcast; + opCode = spv::OpSubgroupReadInvocationKHR; if (builder.isVectorType(typeId)) return CreateInvocationsVectorOperation(opCode, typeId, operands); break; @@ -4283,13 +4284,15 @@ spv::Id TGlslangToSpvTraverser::CreateInvocationsVectorOperation(spv::Op op, spv 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 || + op == spv::OpSubgroupReadInvocationKHR || 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); + op == spv::OpGroupFAdd || op == spv::OpGroupIAdd || op == spv::OpGroupBroadcast || + op == spv::OpSubgroupReadInvocationKHR); #endif // Handle group invocation operations scalar by scalar. @@ -4309,13 +4312,16 @@ spv::Id TGlslangToSpvTraverser::CreateInvocationsVectorOperation(spv::Op op, spv std::vector indexes; indexes.push_back(comp); spv::Id scalar = builder.createCompositeExtract(operands[0], scalarType, indexes); - std::vector spvGroupOperands; - spvGroupOperands.push_back(builder.makeUintConstant(spv::ScopeSubgroup)); - if (op == spv::OpGroupBroadcast) { + if (op == spv::OpSubgroupReadInvocationKHR) { + spvGroupOperands.push_back(scalar); + spvGroupOperands.push_back(operands[1]); + } else if (op == spv::OpGroupBroadcast) { + spvGroupOperands.push_back(builder.makeUintConstant(spv::ScopeSubgroup)); spvGroupOperands.push_back(scalar); spvGroupOperands.push_back(operands[1]); } else { + spvGroupOperands.push_back(builder.makeUintConstant(spv::ScopeSubgroup)); spvGroupOperands.push_back(spv::GroupOperationReduce); spvGroupOperands.push_back(scalar); } diff --git a/SPIRV/doc.cpp b/SPIRV/doc.cpp index 878dcf59..8c2ab4c4 100755 --- a/SPIRV/doc.cpp +++ b/SPIRV/doc.cpp @@ -1152,6 +1152,7 @@ const char* OpcodeString(int op) case 4421: return "OpSubgroupBallotKHR"; case 4422: return "OpSubgroupFirstInvocationKHR"; + case 4432: return "OpSubgroupReadInvocationKHR"; #ifdef AMD_EXTENSIONS case 5000: return "OpGroupIAddNonUniformAMD"; @@ -2764,6 +2765,10 @@ void Parameterize() InstructionDesc[OpSubgroupFirstInvocationKHR].operands.push(OperandId, "'Value'"); + InstructionDesc[OpSubgroupReadInvocationKHR].capabilities.push_back(CapabilityGroups); + InstructionDesc[OpSubgroupReadInvocationKHR].operands.push(OperandId, "'Value'"); + InstructionDesc[OpSubgroupReadInvocationKHR].operands.push(OperandId, "'Index'"); + #ifdef AMD_EXTENSIONS InstructionDesc[OpGroupIAddNonUniformAMD].capabilities.push_back(CapabilityGroups); InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandScope, "'Execution'"); diff --git a/SPIRV/spirv.hpp b/SPIRV/spirv.hpp index bb3c3f4c..088b1af1 100755 --- a/SPIRV/spirv.hpp +++ b/SPIRV/spirv.hpp @@ -905,6 +905,7 @@ enum Op { OpImageSparseRead = 320, OpSubgroupBallotKHR = 4421, OpSubgroupFirstInvocationKHR = 4422, + OpSubgroupReadInvocationKHR = 4432, OpMax = 0x7fffffff, }; diff --git a/Test/baseResults/spv.shaderBallot.comp.out b/Test/baseResults/spv.shaderBallot.comp.out index 4f033128..b8d5e3a0 100644 --- a/Test/baseResults/spv.shaderBallot.comp.out +++ b/Test/baseResults/spv.shaderBallot.comp.out @@ -3,11 +3,10 @@ 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 299 +// Id's are bound by 298 Capability Shader Capability Int64 - Capability Groups Capability SubgroupBallotKHR Extension "SPV_KHR_shader_ballot" 1: ExtInstImport "GLSL.std.450" @@ -45,7 +44,7 @@ Warning, version 450 is not yet complete; most version-specific features are pre Decorate 52(Buffers) BufferBlock Decorate 55(data) DescriptorSet 0 Decorate 55(data) Binding 0 - Decorate 298 BuiltIn WorkgroupSize + Decorate 297 BuiltIn WorkgroupSize 2: TypeVoid 3: TypeFunction 2 6: TypeInt 32 0 @@ -77,23 +76,22 @@ Warning, version 450 is not yet complete; most version-specific features are pre 57: 50(int) Constant 0 58: 6(int) Constant 0 59: TypePointer Uniform 48(float) - 63: 6(int) Constant 3 - 67: 50(int) Constant 1 - 68: TypeVector 48(float) 2 - 69: TypePointer Uniform 49(fvec4) - 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 + 66: 50(int) Constant 1 + 67: TypeVector 48(float) 2 + 68: TypePointer Uniform 49(fvec4) + 82: 50(int) Constant 2 + 83: TypeVector 48(float) 3 + 99: 50(int) Constant 3 + 114: TypePointer Uniform 50(int) + 121: TypeVector 50(int) 2 + 122: TypePointer Uniform 51(ivec4) + 136: TypeVector 50(int) 3 + 166: TypePointer Uniform 6(int) + 173: TypePointer Uniform 38(ivec4) + 187: TypeVector 6(int) 3 + 295: 6(int) Constant 8 + 296: 6(int) Constant 1 + 297: 187(ivec3) ConstantComposite 295 295 296 4(main): 2 Function None 3 5: Label 8(invocation): 7(ptr) Variable Function @@ -121,256 +119,256 @@ Warning, version 450 is not yet complete; most version-specific features are pre 44: 17(int) Bitcast 43 45: 36(bool) IEqual 35 44 SelectionMerge 47 None - BranchConditional 45 46 217 + BranchConditional 45 46 216 46: Label 56: 6(int) Load 8(invocation) 60: 59(ptr) AccessChain 55(data) 57 57 58 61: 48(float) Load 60 62: 6(int) Load 8(invocation) - 64: 48(float) GroupBroadcast 63 61 62 - 65: 59(ptr) AccessChain 55(data) 56 57 58 - Store 65 64 - 66: 6(int) Load 8(invocation) - 70: 69(ptr) AccessChain 55(data) 67 57 - 71: 49(fvec4) Load 70 - 72: 68(fvec2) VectorShuffle 71 71 0 1 - 73: 6(int) Load 8(invocation) - 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) - 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: 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: 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: 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: 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 + 63: 48(float) SubgroupReadInvocationKHR 61 62 + 64: 59(ptr) AccessChain 55(data) 56 57 58 + Store 64 63 + 65: 6(int) Load 8(invocation) + 69: 68(ptr) AccessChain 55(data) 66 57 + 70: 49(fvec4) Load 69 + 71: 67(fvec2) VectorShuffle 70 70 0 1 + 72: 6(int) Load 8(invocation) + 73: 48(float) CompositeExtract 71 0 + 74: 48(float) SubgroupReadInvocationKHR 73 72 + 75: 48(float) CompositeExtract 71 1 + 76: 48(float) SubgroupReadInvocationKHR 75 72 + 77: 67(fvec2) CompositeConstruct 74 76 + 78: 68(ptr) AccessChain 55(data) 65 57 + 79: 49(fvec4) Load 78 + 80: 49(fvec4) VectorShuffle 79 77 4 5 2 3 + Store 78 80 + 81: 6(int) Load 8(invocation) + 84: 68(ptr) AccessChain 55(data) 82 57 + 85: 49(fvec4) Load 84 + 86: 83(fvec3) VectorShuffle 85 85 0 1 2 + 87: 6(int) Load 8(invocation) + 88: 48(float) CompositeExtract 86 0 + 89: 48(float) SubgroupReadInvocationKHR 88 87 + 90: 48(float) CompositeExtract 86 1 + 91: 48(float) SubgroupReadInvocationKHR 90 87 + 92: 48(float) CompositeExtract 86 2 + 93: 48(float) SubgroupReadInvocationKHR 92 87 + 94: 83(fvec3) CompositeConstruct 89 91 93 + 95: 68(ptr) AccessChain 55(data) 81 57 + 96: 49(fvec4) Load 95 + 97: 49(fvec4) VectorShuffle 96 94 4 5 6 3 + Store 95 97 + 98: 6(int) Load 8(invocation) + 100: 68(ptr) AccessChain 55(data) 99 57 + 101: 49(fvec4) Load 100 + 102: 6(int) Load 8(invocation) + 103: 48(float) CompositeExtract 101 0 + 104: 48(float) SubgroupReadInvocationKHR 103 102 + 105: 48(float) CompositeExtract 101 1 + 106: 48(float) SubgroupReadInvocationKHR 105 102 + 107: 48(float) CompositeExtract 101 2 + 108: 48(float) SubgroupReadInvocationKHR 107 102 + 109: 48(float) CompositeExtract 101 3 + 110: 48(float) SubgroupReadInvocationKHR 109 102 + 111: 49(fvec4) CompositeConstruct 104 106 108 110 + 112: 68(ptr) AccessChain 55(data) 98 57 + Store 112 111 + 113: 6(int) Load 8(invocation) + 115: 114(ptr) AccessChain 55(data) 57 66 58 + 116: 50(int) Load 115 + 117: 6(int) Load 8(invocation) + 118: 50(int) SubgroupReadInvocationKHR 116 117 + 119: 114(ptr) AccessChain 55(data) 113 66 58 + Store 119 118 + 120: 6(int) Load 8(invocation) + 123: 122(ptr) AccessChain 55(data) 66 66 + 124: 51(ivec4) Load 123 + 125: 121(ivec2) VectorShuffle 124 124 0 1 + 126: 6(int) Load 8(invocation) + 127: 50(int) CompositeExtract 125 0 + 128: 50(int) SubgroupReadInvocationKHR 127 126 + 129: 50(int) CompositeExtract 125 1 + 130: 50(int) SubgroupReadInvocationKHR 129 126 + 131: 121(ivec2) CompositeConstruct 128 130 + 132: 122(ptr) AccessChain 55(data) 120 66 + 133: 51(ivec4) Load 132 + 134: 51(ivec4) VectorShuffle 133 131 4 5 2 3 + Store 132 134 + 135: 6(int) Load 8(invocation) + 137: 122(ptr) AccessChain 55(data) 82 66 + 138: 51(ivec4) Load 137 + 139: 136(ivec3) VectorShuffle 138 138 0 1 2 + 140: 6(int) Load 8(invocation) + 141: 50(int) CompositeExtract 139 0 + 142: 50(int) SubgroupReadInvocationKHR 141 140 + 143: 50(int) CompositeExtract 139 1 + 144: 50(int) SubgroupReadInvocationKHR 143 140 + 145: 50(int) CompositeExtract 139 2 + 146: 50(int) SubgroupReadInvocationKHR 145 140 + 147: 136(ivec3) CompositeConstruct 142 144 146 + 148: 122(ptr) AccessChain 55(data) 135 66 + 149: 51(ivec4) Load 148 + 150: 51(ivec4) VectorShuffle 149 147 4 5 6 3 + Store 148 150 + 151: 6(int) Load 8(invocation) + 152: 122(ptr) AccessChain 55(data) 99 66 + 153: 51(ivec4) Load 152 + 154: 6(int) Load 8(invocation) + 155: 50(int) CompositeExtract 153 0 + 156: 50(int) SubgroupReadInvocationKHR 155 154 + 157: 50(int) CompositeExtract 153 1 + 158: 50(int) SubgroupReadInvocationKHR 157 154 + 159: 50(int) CompositeExtract 153 2 + 160: 50(int) SubgroupReadInvocationKHR 159 154 + 161: 50(int) CompositeExtract 153 3 + 162: 50(int) SubgroupReadInvocationKHR 161 154 + 163: 51(ivec4) CompositeConstruct 156 158 160 162 + 164: 122(ptr) AccessChain 55(data) 151 66 + Store 164 163 + 165: 6(int) Load 8(invocation) + 167: 166(ptr) AccessChain 55(data) 57 82 58 + 168: 6(int) Load 167 + 169: 6(int) Load 8(invocation) + 170: 6(int) SubgroupReadInvocationKHR 168 169 + 171: 166(ptr) AccessChain 55(data) 165 82 58 + Store 171 170 + 172: 6(int) Load 8(invocation) + 174: 173(ptr) AccessChain 55(data) 66 82 + 175: 38(ivec4) Load 174 + 176: 42(ivec2) VectorShuffle 175 175 0 1 + 177: 6(int) Load 8(invocation) + 178: 6(int) CompositeExtract 176 0 + 179: 6(int) SubgroupReadInvocationKHR 178 177 + 180: 6(int) CompositeExtract 176 1 + 181: 6(int) SubgroupReadInvocationKHR 180 177 + 182: 42(ivec2) CompositeConstruct 179 181 + 183: 173(ptr) AccessChain 55(data) 172 82 + 184: 38(ivec4) Load 183 + 185: 38(ivec4) VectorShuffle 184 182 4 5 2 3 + Store 183 185 + 186: 6(int) Load 8(invocation) + 188: 173(ptr) AccessChain 55(data) 82 82 + 189: 38(ivec4) Load 188 + 190: 187(ivec3) VectorShuffle 189 189 0 1 2 + 191: 6(int) Load 8(invocation) + 192: 6(int) CompositeExtract 190 0 + 193: 6(int) SubgroupReadInvocationKHR 192 191 + 194: 6(int) CompositeExtract 190 1 + 195: 6(int) SubgroupReadInvocationKHR 194 191 + 196: 6(int) CompositeExtract 190 2 + 197: 6(int) SubgroupReadInvocationKHR 196 191 + 198: 187(ivec3) CompositeConstruct 193 195 197 + 199: 173(ptr) AccessChain 55(data) 186 82 + 200: 38(ivec4) Load 199 + 201: 38(ivec4) VectorShuffle 200 198 4 5 6 3 + Store 199 201 + 202: 6(int) Load 8(invocation) + 203: 173(ptr) AccessChain 55(data) 99 82 + 204: 38(ivec4) Load 203 + 205: 6(int) Load 8(invocation) + 206: 6(int) CompositeExtract 204 0 + 207: 6(int) SubgroupReadInvocationKHR 206 205 + 208: 6(int) CompositeExtract 204 1 + 209: 6(int) SubgroupReadInvocationKHR 208 205 + 210: 6(int) CompositeExtract 204 2 + 211: 6(int) SubgroupReadInvocationKHR 210 205 + 212: 6(int) CompositeExtract 204 3 + 213: 6(int) SubgroupReadInvocationKHR 212 205 + 214: 38(ivec4) CompositeConstruct 207 209 211 213 + 215: 173(ptr) AccessChain 55(data) 202 82 + Store 215 214 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 + 216: Label + 217: 6(int) Load 8(invocation) + 218: 59(ptr) AccessChain 55(data) 57 57 58 + 219: 48(float) Load 218 + 220: 48(float) SubgroupFirstInvocationKHR 219 + 221: 59(ptr) AccessChain 55(data) 217 57 58 + Store 221 220 + 222: 6(int) Load 8(invocation) + 223: 68(ptr) AccessChain 55(data) 66 57 + 224: 49(fvec4) Load 223 + 225: 67(fvec2) VectorShuffle 224 224 0 1 + 226: 67(fvec2) SubgroupFirstInvocationKHR 225 + 227: 68(ptr) AccessChain 55(data) 222 57 + 228: 49(fvec4) Load 227 + 229: 49(fvec4) VectorShuffle 228 226 4 5 2 3 + Store 227 229 + 230: 6(int) Load 8(invocation) + 231: 68(ptr) AccessChain 55(data) 82 57 + 232: 49(fvec4) Load 231 + 233: 83(fvec3) VectorShuffle 232 232 0 1 2 + 234: 83(fvec3) SubgroupFirstInvocationKHR 233 + 235: 68(ptr) AccessChain 55(data) 230 57 + 236: 49(fvec4) Load 235 + 237: 49(fvec4) VectorShuffle 236 234 4 5 6 3 + Store 235 237 + 238: 6(int) Load 8(invocation) + 239: 68(ptr) AccessChain 55(data) 99 57 + 240: 49(fvec4) Load 239 + 241: 49(fvec4) SubgroupFirstInvocationKHR 240 + 242: 68(ptr) AccessChain 55(data) 238 57 + Store 242 241 + 243: 6(int) Load 8(invocation) + 244: 114(ptr) AccessChain 55(data) 57 66 58 + 245: 50(int) Load 244 + 246: 50(int) SubgroupFirstInvocationKHR 245 + 247: 114(ptr) AccessChain 55(data) 243 66 58 + Store 247 246 + 248: 6(int) Load 8(invocation) + 249: 122(ptr) AccessChain 55(data) 66 66 + 250: 51(ivec4) Load 249 + 251: 121(ivec2) VectorShuffle 250 250 0 1 + 252: 121(ivec2) SubgroupFirstInvocationKHR 251 + 253: 122(ptr) AccessChain 55(data) 248 66 + 254: 51(ivec4) Load 253 + 255: 51(ivec4) VectorShuffle 254 252 4 5 2 3 + Store 253 255 + 256: 6(int) Load 8(invocation) + 257: 122(ptr) AccessChain 55(data) 82 66 + 258: 51(ivec4) Load 257 + 259: 136(ivec3) VectorShuffle 258 258 0 1 2 + 260: 136(ivec3) SubgroupFirstInvocationKHR 259 + 261: 122(ptr) AccessChain 55(data) 256 66 + 262: 51(ivec4) Load 261 + 263: 51(ivec4) VectorShuffle 262 260 4 5 6 3 + Store 261 263 + 264: 6(int) Load 8(invocation) + 265: 122(ptr) AccessChain 55(data) 99 66 + 266: 51(ivec4) Load 265 + 267: 51(ivec4) SubgroupFirstInvocationKHR 266 + 268: 122(ptr) AccessChain 55(data) 264 66 + Store 268 267 + 269: 6(int) Load 8(invocation) + 270: 166(ptr) AccessChain 55(data) 57 82 58 + 271: 6(int) Load 270 + 272: 6(int) SubgroupFirstInvocationKHR 271 + 273: 166(ptr) AccessChain 55(data) 269 82 58 + Store 273 272 + 274: 6(int) Load 8(invocation) + 275: 173(ptr) AccessChain 55(data) 66 82 + 276: 38(ivec4) Load 275 + 277: 42(ivec2) VectorShuffle 276 276 0 1 + 278: 42(ivec2) SubgroupFirstInvocationKHR 277 + 279: 173(ptr) AccessChain 55(data) 274 82 + 280: 38(ivec4) Load 279 + 281: 38(ivec4) VectorShuffle 280 278 4 5 2 3 + Store 279 281 + 282: 6(int) Load 8(invocation) + 283: 173(ptr) AccessChain 55(data) 82 82 + 284: 38(ivec4) Load 283 + 285: 187(ivec3) VectorShuffle 284 284 0 1 2 + 286: 187(ivec3) SubgroupFirstInvocationKHR 285 + 287: 173(ptr) AccessChain 55(data) 282 82 + 288: 38(ivec4) Load 287 + 289: 38(ivec4) VectorShuffle 288 286 4 5 6 3 + Store 287 289 + 290: 6(int) Load 8(invocation) + 291: 173(ptr) AccessChain 55(data) 99 82 + 292: 38(ivec4) Load 291 + 293: 38(ivec4) SubgroupFirstInvocationKHR 292 + 294: 173(ptr) AccessChain 55(data) 290 82 + Store 294 293 Branch 47 47: Label Return