SPV: OpGroupBroadcast is unable to handle vector operand.

This commit is contained in:
Rex Xu 2016-09-26 15:53:40 +08:00
parent 10f7fc739c
commit b707205b0d
2 changed files with 272 additions and 209 deletions

View File

@ -156,9 +156,7 @@ protected:
spv::Id makeSmearedConstant(spv::Id constant, int vectorSize); spv::Id makeSmearedConstant(spv::Id constant, int vectorSize);
spv::Id createAtomicOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy); spv::Id createAtomicOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy);
spv::Id createInvocationsOperation(glslang::TOperator op, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy); spv::Id createInvocationsOperation(glslang::TOperator op, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy);
#ifdef AMD_EXTENSIONS spv::Id CreateInvocationsVectorOperation(spv::Op op, spv::Id typeId, std::vector<spv::Id>& operands);
spv::Id CreateInvocationsVectorOperation(spv::Op op, spv::Id typeId, spv::Id operand);
#endif
spv::Id createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy); spv::Id createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy);
spv::Id createNoArgOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId); spv::Id createNoArgOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId);
spv::Id getSymbolId(const glslang::TIntermSymbol* node); spv::Id getSymbolId(const glslang::TIntermSymbol* node);
@ -4029,6 +4027,8 @@ spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op
case glslang::EOpReadInvocation: case glslang::EOpReadInvocation:
opCode = spv::OpGroupBroadcast; opCode = spv::OpGroupBroadcast;
if (builder.isVectorType(typeId))
return CreateInvocationsVectorOperation(opCode, typeId, operands);
break; break;
case glslang::EOpReadFirstInvocation: case glslang::EOpReadFirstInvocation:
opCode = spv::OpSubgroupFirstInvocationKHR; opCode = spv::OpSubgroupFirstInvocationKHR;
@ -4084,7 +4084,7 @@ spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op
} }
if (builder.isVectorType(typeId)) if (builder.isVectorType(typeId))
return CreateInvocationsVectorOperation(opCode, typeId, operands[0]); return CreateInvocationsVectorOperation(opCode, typeId, operands);
break; break;
case glslang::EOpMinInvocationsNonUniform: case glslang::EOpMinInvocationsNonUniform:
@ -4118,7 +4118,7 @@ spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op
} }
if (builder.isVectorType(typeId)) if (builder.isVectorType(typeId))
return CreateInvocationsVectorOperation(opCode, typeId, operands[0]); return CreateInvocationsVectorOperation(opCode, typeId, operands);
break; break;
#endif #endif
@ -4131,16 +4131,21 @@ spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op
return builder.createOp(opCode, typeId, spvGroupOperands); return builder.createOp(opCode, typeId, spvGroupOperands);
} }
#ifdef AMD_EXTENSIONS
// Create group invocation operations on a vector // 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<spv::Id>& operands)
{ {
#ifdef AMD_EXTENSIONS
assert(op == spv::OpGroupFMin || op == spv::OpGroupUMin || op == spv::OpGroupSMin || assert(op == spv::OpGroupFMin || op == spv::OpGroupUMin || op == spv::OpGroupSMin ||
op == spv::OpGroupFMax || op == spv::OpGroupUMax || op == spv::OpGroupSMax || 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::OpGroupFMinNonUniformAMD || op == spv::OpGroupUMinNonUniformAMD || op == spv::OpGroupSMinNonUniformAMD ||
op == spv::OpGroupFMaxNonUniformAMD || op == spv::OpGroupUMaxNonUniformAMD || op == spv::OpGroupSMaxNonUniformAMD || op == spv::OpGroupFMaxNonUniformAMD || op == spv::OpGroupUMaxNonUniformAMD || op == spv::OpGroupSMaxNonUniformAMD ||
op == spv::OpGroupFAddNonUniformAMD || op == spv::OpGroupIAddNonUniformAMD); 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. // Handle group invocation operations scalar by scalar.
// The result type is the same type as the original type. // 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 // - make a vector out the scalar results
// get the types sorted out // get the types sorted out
int numComponents = builder.getNumComponents(operand); int numComponents = builder.getNumComponents(operands[0]);
spv::Id scalarType = builder.getScalarTypeId(builder.getTypeId(operand)); spv::Id scalarType = builder.getScalarTypeId(builder.getTypeId(operands[0]));
std::vector<spv::Id> results; std::vector<spv::Id> results;
// do each scalar op // do each scalar op
for (int comp = 0; comp < numComponents; ++comp) { for (int comp = 0; comp < numComponents; ++comp) {
std::vector<unsigned int> indexes; std::vector<unsigned int> indexes;
indexes.push_back(comp); indexes.push_back(comp);
spv::Id scalar = builder.createCompositeExtract(operand, scalarType, indexes); spv::Id scalar = builder.createCompositeExtract(operands[0], scalarType, indexes);
std::vector<spv::Id> operands; std::vector<spv::Id> spvGroupOperands;
operands.push_back(builder.makeUintConstant(spv::ScopeSubgroup)); spvGroupOperands.push_back(builder.makeUintConstant(spv::ScopeSubgroup));
operands.push_back(spv::GroupOperationReduce); if (op == spv::OpGroupBroadcast) {
operands.push_back(scalar); 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 // put the pieces together
return builder.createCompositeConstruct(typeId, results); return builder.createCompositeConstruct(typeId, results);
} }
#endif
spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy) spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy)
{ {

View File

@ -7,7 +7,7 @@ Linked compute stage:
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80001 // Generated by (magic number): 80001
// Id's are bound by 245 // Id's are bound by 299
Capability Shader Capability Shader
Capability Int64 Capability Int64
@ -49,7 +49,7 @@ Linked compute stage:
Decorate 52(Buffers) BufferBlock Decorate 52(Buffers) BufferBlock
Decorate 55(data) DescriptorSet 0 Decorate 55(data) DescriptorSet 0
Decorate 55(data) Binding 0 Decorate 55(data) Binding 0
Decorate 244 BuiltIn WorkgroupSize Decorate 298 BuiltIn WorkgroupSize
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
6: TypeInt 32 0 6: TypeInt 32 0
@ -85,19 +85,19 @@ Linked compute stage:
67: 50(int) Constant 1 67: 50(int) Constant 1
68: TypeVector 48(float) 2 68: TypeVector 48(float) 2
69: TypePointer Uniform 49(fvec4) 69: TypePointer Uniform 49(fvec4)
79: 50(int) Constant 2 83: 50(int) Constant 2
80: TypeVector 48(float) 3 84: TypeVector 48(float) 3
90: 50(int) Constant 3 100: 50(int) Constant 3
97: TypePointer Uniform 50(int) 115: TypePointer Uniform 50(int)
104: TypeVector 50(int) 2 122: TypeVector 50(int) 2
105: TypePointer Uniform 51(ivec4) 123: TypePointer Uniform 51(ivec4)
115: TypeVector 50(int) 3 137: TypeVector 50(int) 3
131: TypePointer Uniform 6(int) 167: TypePointer Uniform 6(int)
138: TypePointer Uniform 38(ivec4) 174: TypePointer Uniform 38(ivec4)
148: TypeVector 6(int) 3 188: TypeVector 6(int) 3
242: 6(int) Constant 8 296: 6(int) Constant 8
243: 6(int) Constant 1 297: 6(int) Constant 1
244: 148(ivec3) ConstantComposite 242 242 243 298: 188(ivec3) ConstantComposite 296 296 297
4(main): 2 Function None 3 4(main): 2 Function None 3
5: Label 5: Label
8(invocation): 7(ptr) Variable Function 8(invocation): 7(ptr) Variable Function
@ -125,7 +125,7 @@ Linked compute stage:
44: 17(int) Bitcast 43 44: 17(int) Bitcast 43
45: 36(bool) IEqual 35 44 45: 36(bool) IEqual 35 44
SelectionMerge 47 None SelectionMerge 47 None
BranchConditional 45 46 163 BranchConditional 45 46 217
46: Label 46: Label
56: 6(int) Load 8(invocation) 56: 6(int) Load 8(invocation)
60: 59(ptr) AccessChain 55(data) 57 57 58 60: 59(ptr) AccessChain 55(data) 57 57 58
@ -139,188 +139,242 @@ Linked compute stage:
71: 49(fvec4) Load 70 71: 49(fvec4) Load 70
72: 68(fvec2) VectorShuffle 71 71 0 1 72: 68(fvec2) VectorShuffle 71 71 0 1
73: 6(int) Load 8(invocation) 73: 6(int) Load 8(invocation)
74: 68(fvec2) GroupBroadcast 63 72 73 74: 48(float) CompositeExtract 72 0
75: 69(ptr) AccessChain 55(data) 66 57 75: 48(float) GroupBroadcast 63 74 73
76: 49(fvec4) Load 75 76: 48(float) CompositeExtract 72 1
77: 49(fvec4) VectorShuffle 76 74 4 5 2 3 77: 48(float) GroupBroadcast 63 76 73
Store 75 77 78: 68(fvec2) CompositeConstruct 75 77
78: 6(int) Load 8(invocation) 79: 69(ptr) AccessChain 55(data) 66 57
81: 69(ptr) AccessChain 55(data) 79 57 80: 49(fvec4) Load 79
82: 49(fvec4) Load 81 81: 49(fvec4) VectorShuffle 80 78 4 5 2 3
83: 80(fvec3) VectorShuffle 82 82 0 1 2 Store 79 81
84: 6(int) Load 8(invocation) 82: 6(int) Load 8(invocation)
85: 80(fvec3) GroupBroadcast 63 83 84 85: 69(ptr) AccessChain 55(data) 83 57
86: 69(ptr) AccessChain 55(data) 78 57 86: 49(fvec4) Load 85
87: 49(fvec4) Load 86 87: 84(fvec3) VectorShuffle 86 86 0 1 2
88: 49(fvec4) VectorShuffle 87 85 4 5 6 3 88: 6(int) Load 8(invocation)
Store 86 88 89: 48(float) CompositeExtract 87 0
89: 6(int) Load 8(invocation) 90: 48(float) GroupBroadcast 63 89 88
91: 69(ptr) AccessChain 55(data) 90 57 91: 48(float) CompositeExtract 87 1
92: 49(fvec4) Load 91 92: 48(float) GroupBroadcast 63 91 88
93: 6(int) Load 8(invocation) 93: 48(float) CompositeExtract 87 2
94: 49(fvec4) GroupBroadcast 63 92 93 94: 48(float) GroupBroadcast 63 93 88
95: 69(ptr) AccessChain 55(data) 89 57 95: 84(fvec3) CompositeConstruct 90 92 94
Store 95 94 96: 69(ptr) AccessChain 55(data) 82 57
96: 6(int) Load 8(invocation) 97: 49(fvec4) Load 96
98: 97(ptr) AccessChain 55(data) 57 67 58 98: 49(fvec4) VectorShuffle 97 95 4 5 6 3
99: 50(int) Load 98 Store 96 98
100: 6(int) Load 8(invocation) 99: 6(int) Load 8(invocation)
101: 50(int) GroupBroadcast 63 99 100 101: 69(ptr) AccessChain 55(data) 100 57
102: 97(ptr) AccessChain 55(data) 96 67 58 102: 49(fvec4) Load 101
Store 102 101
103: 6(int) Load 8(invocation) 103: 6(int) Load 8(invocation)
106: 105(ptr) AccessChain 55(data) 67 67 104: 48(float) CompositeExtract 102 0
107: 51(ivec4) Load 106 105: 48(float) GroupBroadcast 63 104 103
108: 104(ivec2) VectorShuffle 107 107 0 1 106: 48(float) CompositeExtract 102 1
109: 6(int) Load 8(invocation) 107: 48(float) GroupBroadcast 63 106 103
110: 104(ivec2) GroupBroadcast 63 108 109 108: 48(float) CompositeExtract 102 2
111: 105(ptr) AccessChain 55(data) 103 67 109: 48(float) GroupBroadcast 63 108 103
112: 51(ivec4) Load 111 110: 48(float) CompositeExtract 102 3
113: 51(ivec4) VectorShuffle 112 110 4 5 2 3 111: 48(float) GroupBroadcast 63 110 103
Store 111 113 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) 114: 6(int) Load 8(invocation)
116: 105(ptr) AccessChain 55(data) 79 67 116: 115(ptr) AccessChain 55(data) 57 67 58
117: 51(ivec4) Load 116 117: 50(int) Load 116
118: 115(ivec3) VectorShuffle 117 117 0 1 2 118: 6(int) Load 8(invocation)
119: 6(int) Load 8(invocation) 119: 50(int) GroupBroadcast 63 117 118
120: 115(ivec3) GroupBroadcast 63 118 119 120: 115(ptr) AccessChain 55(data) 114 67 58
121: 105(ptr) AccessChain 55(data) 114 67 Store 120 119
122: 51(ivec4) Load 121 121: 6(int) Load 8(invocation)
123: 51(ivec4) VectorShuffle 122 120 4 5 6 3 124: 123(ptr) AccessChain 55(data) 67 67
Store 121 123 125: 51(ivec4) Load 124
124: 6(int) Load 8(invocation) 126: 122(ivec2) VectorShuffle 125 125 0 1
125: 105(ptr) AccessChain 55(data) 90 67
126: 51(ivec4) Load 125
127: 6(int) Load 8(invocation) 127: 6(int) Load 8(invocation)
128: 51(ivec4) GroupBroadcast 63 126 127 128: 50(int) CompositeExtract 126 0
129: 105(ptr) AccessChain 55(data) 124 67 129: 50(int) GroupBroadcast 63 128 127
Store 129 128 130: 50(int) CompositeExtract 126 1
130: 6(int) Load 8(invocation) 131: 50(int) GroupBroadcast 63 130 127
132: 131(ptr) AccessChain 55(data) 57 79 58 132: 122(ivec2) CompositeConstruct 129 131
133: 6(int) Load 132 133: 123(ptr) AccessChain 55(data) 121 67
134: 6(int) Load 8(invocation) 134: 51(ivec4) Load 133
135: 6(int) GroupBroadcast 63 133 134 135: 51(ivec4) VectorShuffle 134 132 4 5 2 3
136: 131(ptr) AccessChain 55(data) 130 79 58 Store 133 135
Store 136 135 136: 6(int) Load 8(invocation)
137: 6(int) Load 8(invocation) 138: 123(ptr) AccessChain 55(data) 83 67
139: 138(ptr) AccessChain 55(data) 67 79 139: 51(ivec4) Load 138
140: 38(ivec4) Load 139 140: 137(ivec3) VectorShuffle 139 139 0 1 2
141: 42(ivec2) VectorShuffle 140 140 0 1 141: 6(int) Load 8(invocation)
142: 6(int) Load 8(invocation) 142: 50(int) CompositeExtract 140 0
143: 42(ivec2) GroupBroadcast 63 141 142 143: 50(int) GroupBroadcast 63 142 141
144: 138(ptr) AccessChain 55(data) 137 79 144: 50(int) CompositeExtract 140 1
145: 38(ivec4) Load 144 145: 50(int) GroupBroadcast 63 144 141
146: 38(ivec4) VectorShuffle 145 143 4 5 2 3 146: 50(int) CompositeExtract 140 2
Store 144 146 147: 50(int) GroupBroadcast 63 146 141
147: 6(int) Load 8(invocation) 148: 137(ivec3) CompositeConstruct 143 145 147
149: 138(ptr) AccessChain 55(data) 79 79 149: 123(ptr) AccessChain 55(data) 136 67
150: 38(ivec4) Load 149 150: 51(ivec4) Load 149
151: 148(ivec3) VectorShuffle 150 150 0 1 2 151: 51(ivec4) VectorShuffle 150 148 4 5 6 3
Store 149 151
152: 6(int) Load 8(invocation) 152: 6(int) Load 8(invocation)
153: 148(ivec3) GroupBroadcast 63 151 152 153: 123(ptr) AccessChain 55(data) 100 67
154: 138(ptr) AccessChain 55(data) 147 79 154: 51(ivec4) Load 153
155: 38(ivec4) Load 154 155: 6(int) Load 8(invocation)
156: 38(ivec4) VectorShuffle 155 153 4 5 6 3 156: 50(int) CompositeExtract 154 0
Store 154 156 157: 50(int) GroupBroadcast 63 156 155
157: 6(int) Load 8(invocation) 158: 50(int) CompositeExtract 154 1
158: 138(ptr) AccessChain 55(data) 90 79 159: 50(int) GroupBroadcast 63 158 155
159: 38(ivec4) Load 158 160: 50(int) CompositeExtract 154 2
160: 6(int) Load 8(invocation) 161: 50(int) GroupBroadcast 63 160 155
161: 38(ivec4) GroupBroadcast 63 159 160 162: 50(int) CompositeExtract 154 3
162: 138(ptr) AccessChain 55(data) 157 79 163: 50(int) GroupBroadcast 63 162 155
Store 162 161 164: 51(ivec4) CompositeConstruct 157 159 161 163
Branch 47 165: 123(ptr) AccessChain 55(data) 152 67
163: Label Store 165 164
164: 6(int) Load 8(invocation) 166: 6(int) Load 8(invocation)
165: 59(ptr) AccessChain 55(data) 57 57 58 168: 167(ptr) AccessChain 55(data) 57 83 58
166: 48(float) Load 165 169: 6(int) Load 168
167: 48(float) SubgroupFirstInvocationKHR 166 170: 6(int) Load 8(invocation)
168: 59(ptr) AccessChain 55(data) 164 57 58 171: 6(int) GroupBroadcast 63 169 170
Store 168 167 172: 167(ptr) AccessChain 55(data) 166 83 58
169: 6(int) Load 8(invocation) Store 172 171
170: 69(ptr) AccessChain 55(data) 67 57 173: 6(int) Load 8(invocation)
171: 49(fvec4) Load 170 175: 174(ptr) AccessChain 55(data) 67 83
172: 68(fvec2) VectorShuffle 171 171 0 1 176: 38(ivec4) Load 175
173: 68(fvec2) SubgroupFirstInvocationKHR 172 177: 42(ivec2) VectorShuffle 176 176 0 1
174: 69(ptr) AccessChain 55(data) 169 57 178: 6(int) Load 8(invocation)
175: 49(fvec4) Load 174 179: 6(int) CompositeExtract 177 0
176: 49(fvec4) VectorShuffle 175 173 4 5 2 3 180: 6(int) GroupBroadcast 63 179 178
Store 174 176 181: 6(int) CompositeExtract 177 1
177: 6(int) Load 8(invocation) 182: 6(int) GroupBroadcast 63 181 178
178: 69(ptr) AccessChain 55(data) 79 57 183: 42(ivec2) CompositeConstruct 180 182
179: 49(fvec4) Load 178 184: 174(ptr) AccessChain 55(data) 173 83
180: 80(fvec3) VectorShuffle 179 179 0 1 2 185: 38(ivec4) Load 184
181: 80(fvec3) SubgroupFirstInvocationKHR 180 186: 38(ivec4) VectorShuffle 185 183 4 5 2 3
182: 69(ptr) AccessChain 55(data) 177 57 Store 184 186
183: 49(fvec4) Load 182 187: 6(int) Load 8(invocation)
184: 49(fvec4) VectorShuffle 183 181 4 5 6 3 189: 174(ptr) AccessChain 55(data) 83 83
Store 182 184 190: 38(ivec4) Load 189
185: 6(int) Load 8(invocation) 191: 188(ivec3) VectorShuffle 190 190 0 1 2
186: 69(ptr) AccessChain 55(data) 90 57 192: 6(int) Load 8(invocation)
187: 49(fvec4) Load 186 193: 6(int) CompositeExtract 191 0
188: 49(fvec4) SubgroupFirstInvocationKHR 187 194: 6(int) GroupBroadcast 63 193 192
189: 69(ptr) AccessChain 55(data) 185 57 195: 6(int) CompositeExtract 191 1
Store 189 188 196: 6(int) GroupBroadcast 63 195 192
190: 6(int) Load 8(invocation) 197: 6(int) CompositeExtract 191 2
191: 97(ptr) AccessChain 55(data) 57 67 58 198: 6(int) GroupBroadcast 63 197 192
192: 50(int) Load 191 199: 188(ivec3) CompositeConstruct 194 196 198
193: 50(int) SubgroupFirstInvocationKHR 192 200: 174(ptr) AccessChain 55(data) 187 83
194: 97(ptr) AccessChain 55(data) 190 67 58 201: 38(ivec4) Load 200
Store 194 193 202: 38(ivec4) VectorShuffle 201 199 4 5 6 3
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
Store 200 202 Store 200 202
203: 6(int) Load 8(invocation) 203: 6(int) Load 8(invocation)
204: 105(ptr) AccessChain 55(data) 79 67 204: 174(ptr) AccessChain 55(data) 100 83
205: 51(ivec4) Load 204 205: 38(ivec4) Load 204
206: 115(ivec3) VectorShuffle 205 205 0 1 2 206: 6(int) Load 8(invocation)
207: 115(ivec3) SubgroupFirstInvocationKHR 206 207: 6(int) CompositeExtract 205 0
208: 105(ptr) AccessChain 55(data) 203 67 208: 6(int) GroupBroadcast 63 207 206
209: 51(ivec4) Load 208 209: 6(int) CompositeExtract 205 1
210: 51(ivec4) VectorShuffle 209 207 4 5 6 3 210: 6(int) GroupBroadcast 63 209 206
Store 208 210 211: 6(int) CompositeExtract 205 2
211: 6(int) Load 8(invocation) 212: 6(int) GroupBroadcast 63 211 206
212: 105(ptr) AccessChain 55(data) 90 67 213: 6(int) CompositeExtract 205 3
213: 51(ivec4) Load 212 214: 6(int) GroupBroadcast 63 213 206
214: 51(ivec4) SubgroupFirstInvocationKHR 213 215: 38(ivec4) CompositeConstruct 208 210 212 214
215: 105(ptr) AccessChain 55(data) 211 67 216: 174(ptr) AccessChain 55(data) 203 83
Store 215 214 Store 216 215
216: 6(int) Load 8(invocation) Branch 47
217: 131(ptr) AccessChain 55(data) 57 79 58 217: Label
218: 6(int) Load 217 218: 6(int) Load 8(invocation)
219: 6(int) SubgroupFirstInvocationKHR 218 219: 59(ptr) AccessChain 55(data) 57 57 58
220: 131(ptr) AccessChain 55(data) 216 79 58 220: 48(float) Load 219
Store 220 219 221: 48(float) SubgroupFirstInvocationKHR 220
221: 6(int) Load 8(invocation) 222: 59(ptr) AccessChain 55(data) 218 57 58
222: 138(ptr) AccessChain 55(data) 67 79 Store 222 221
223: 38(ivec4) Load 222 223: 6(int) Load 8(invocation)
224: 42(ivec2) VectorShuffle 223 223 0 1 224: 69(ptr) AccessChain 55(data) 67 57
225: 42(ivec2) SubgroupFirstInvocationKHR 224 225: 49(fvec4) Load 224
226: 138(ptr) AccessChain 55(data) 221 79 226: 68(fvec2) VectorShuffle 225 225 0 1
227: 38(ivec4) Load 226 227: 68(fvec2) SubgroupFirstInvocationKHR 226
228: 38(ivec4) VectorShuffle 227 225 4 5 2 3 228: 69(ptr) AccessChain 55(data) 223 57
Store 226 228 229: 49(fvec4) Load 228
229: 6(int) Load 8(invocation) 230: 49(fvec4) VectorShuffle 229 227 4 5 2 3
230: 138(ptr) AccessChain 55(data) 79 79 Store 228 230
231: 38(ivec4) Load 230 231: 6(int) Load 8(invocation)
232: 148(ivec3) VectorShuffle 231 231 0 1 2 232: 69(ptr) AccessChain 55(data) 83 57
233: 148(ivec3) SubgroupFirstInvocationKHR 232 233: 49(fvec4) Load 232
234: 138(ptr) AccessChain 55(data) 229 79 234: 84(fvec3) VectorShuffle 233 233 0 1 2
235: 38(ivec4) Load 234 235: 84(fvec3) SubgroupFirstInvocationKHR 234
236: 38(ivec4) VectorShuffle 235 233 4 5 6 3 236: 69(ptr) AccessChain 55(data) 231 57
Store 234 236 237: 49(fvec4) Load 236
237: 6(int) Load 8(invocation) 238: 49(fvec4) VectorShuffle 237 235 4 5 6 3
238: 138(ptr) AccessChain 55(data) 90 79 Store 236 238
239: 38(ivec4) Load 238 239: 6(int) Load 8(invocation)
240: 38(ivec4) SubgroupFirstInvocationKHR 239 240: 69(ptr) AccessChain 55(data) 100 57
241: 138(ptr) AccessChain 55(data) 237 79 241: 49(fvec4) Load 240
Store 241 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 Branch 47
47: Label 47: Label
Return Return