Modify shader ballot extension by adding OpSubgroupReadInvocationKHR
authorchaoc <chaoc@nvidia.com>
Tue, 20 Dec 2016 20:44:35 +0000 (12:44 -0800)
committerchaoc <chaoc@nvidia.com>
Wed, 21 Dec 2016 20:08:09 +0000 (12:08 -0800)
SPIRV/GlslangToSpv.cpp
SPIRV/doc.cpp
SPIRV/spirv.hpp
Test/baseResults/spv.shaderBallot.comp.out

index 71af11b..0a0a053 100755 (executable)
@@ -4131,7 +4131,8 @@ spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op
     spv::Op opCode = spv::OpNop;
 
     std::vector<spv::Id> 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<unsigned int> indexes;
         indexes.push_back(comp);
         spv::Id scalar = builder.createCompositeExtract(operands[0], scalarType, indexes);
-
         std::vector<spv::Id> 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);
         }
index 878dcf5..8c2ab4c 100755 (executable)
@@ -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'");
index bb3c3f4..088b1af 100755 (executable)
@@ -905,6 +905,7 @@ enum Op {
     OpImageSparseRead = 320,
     OpSubgroupBallotKHR = 4421,
     OpSubgroupFirstInvocationKHR = 4422,
+    OpSubgroupReadInvocationKHR = 4432,
     OpMax = 0x7fffffff,
 };
 
index 4f03312..b8d5e3a 100644 (file)
@@ -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