Fix #1843: Handle built-in function output parameters to a swizzled arg

In GLSL/HLSL/AST,  v.zyx is an l-value, but not in SPIR-V, which cannot represent it.
So, a temporary is used instead.
This commit is contained in:
John Kessenich 2020-03-03 07:21:37 -07:00
parent 56364b6b60
commit bbbd9a2a1f
4 changed files with 481 additions and 442 deletions

View File

@ -2277,7 +2277,10 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
spec_constant_op_mode_setter.turnOnSpecConstantOpMode();
spv::Id result = spv::NoResult;
spv::Id invertedType = spv::NoType; // to use to override the natural type of the node
spv::Id invertedType = spv::NoType; // to use to override the natural type of the node
spv::Builder::AccessChain complexLvalue; // for holding swizzling l-values too complex for SPIR-V, for at out parameter
spv::Id temporaryLvalue = spv::NoResult; // temporary to pass, as proxy for complexLValue
auto resultType = [&invertedType, &node, this](){ return invertedType != spv::NoType ? invertedType : convertGlslangToSpvType(node->getType()); };
// try texturing
@ -2727,6 +2730,10 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
// Does it need a swizzle inversion? If so, evaluation is inverted;
// operate first on the swizzle base, then apply the swizzle.
// That is, we transform
//
// interpolate(v.zy) -> interpolate(v).zy
//
if (glslangOperands[0]->getAsOperator() &&
glslangOperands[0]->getAsOperator()->getOp() == glslang::EOpVectorSwizzle)
invertedType = convertGlslangToSpvType(glslangOperands[0]->getAsBinaryNode()->getLeft()->getType());
@ -2819,8 +2826,19 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
}
#endif
// for l-values, pass the address, for r-values, pass the value
if (lvalue) {
operands.push_back(builder.accessChainGetLValue());
if (invertedType == spv::NoType && !builder.isSpvLvalue()) {
// SPIR-V cannot represent an l-value containing a swizzle that doesn't
// reduce to a simple access chain. So, we need a temporary vector to
// receive the result, and must later swizzle that into the original
// l-value.
complexLvalue = builder.getAccessChain();
temporaryLvalue = builder.createVariable(spv::StorageClassFunction, builder.accessChainGetInferredType(), "swizzleTemp");
operands.push_back(temporaryLvalue);
} else {
operands.push_back(builder.accessChainGetLValue());
}
lvalueCoherentFlags = builder.getAccessChain().coherentFlags;
lvalueCoherentFlags |= TranslateCoherent(glslangOperands[arg]->getAsTyped()->getType());
} else {
@ -2883,8 +2901,12 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
result = createMiscOperation(node->getOp(), precision, resultType(), operands, node->getBasicType());
break;
}
if (invertedType)
if (invertedType != spv::NoResult)
result = createInvertedSwizzle(precision, *glslangOperands[0]->getAsBinaryNode(), result);
else if (temporaryLvalue != spv::NoResult) {
builder.setAccessChain(complexLvalue);
builder.accessChainStore(builder.createLoad(temporaryLvalue));
}
}
if (noReturnValue)

View File

@ -676,6 +676,11 @@ public:
// use accessChain and swizzle to load an r-value
Id accessChainLoad(Decoration precision, Decoration nonUniform, Id ResultType, spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMaskNone, spv::Scope scope = spv::ScopeMax, unsigned int alignment = 0);
// Return whether or not the access chain can be represented in SPIR-V
// as an l-value.
// E.g., a[3].yx cannot be, while a[3].y and a[3].y[x] can be.
bool isSpvLvalue() const { return accessChain.swizzle.size() <= 1; }
// get the direct pointer for an l-value
Id accessChainGetLValue();

View File

@ -1,12 +1,12 @@
spv.Operations.frag
// Module Version 10000
// Generated by (magic number): 80008
// Id's are bound by 532
// Id's are bound by 540
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main" 11 22 212 288 485 526 531
EntryPoint Fragment 4 "main" 11 22 220 296 493 534 539
ExecutionMode 4 OriginUpperLeft
Source GLSL 450
Name 4 "main"
@ -14,23 +14,24 @@ spv.Operations.frag
Name 11 "uv4"
Name 20 "i"
Name 22 "ui"
Name 181 "ub41"
Name 188 "f"
Name 212 "uf"
Name 285 "u"
Name 288 "uui"
Name 305 "b"
Name 342 "ub42"
Name 485 "FragColor"
Name 503 "m1"
Name 510 "m2"
Name 526 "uiv4"
Name 528 "ub"
Name 531 "uuv4"
Name 155 "swizzleTemp"
Name 189 "ub41"
Name 196 "f"
Name 220 "uf"
Name 293 "u"
Name 296 "uui"
Name 313 "b"
Name 350 "ub42"
Name 493 "FragColor"
Name 511 "m1"
Name 518 "m2"
Name 534 "uiv4"
Name 536 "ub"
Name 539 "uuv4"
Decorate 22(ui) Flat
Decorate 288(uui) Flat
Decorate 526(uiv4) Flat
Decorate 531(uuv4) Flat
Decorate 296(uui) Flat
Decorate 534(uiv4) Flat
Decorate 539(uuv4) Flat
2: TypeVoid
3: TypeFunction 2
6: TypeFloat 32
@ -45,55 +46,56 @@ spv.Operations.frag
141: TypeInt 32 0
142: 141(int) Constant 0
143: TypePointer Function 6(float)
178: TypeBool
179: TypeVector 178(bool) 4
180: TypePointer Private 179(bvec4)
181(ub41): 180(ptr) Variable Private
211: TypePointer Input 6(float)
212(uf): 211(ptr) Variable Input
284: TypePointer Function 141(int)
287: TypePointer Input 141(int)
288(uui): 287(ptr) Variable Input
304: TypePointer Function 178(bool)
342(ub42): 180(ptr) Variable Private
398: 18(int) Constant 2
405: 18(int) Constant 1
435: TypeVector 6(float) 3
454: 6(float) Constant 1073741824
461: 6(float) Constant 1065353216
466: 18(int) Constant 66
472: 18(int) Constant 17
484: TypePointer Output 7(fvec4)
485(FragColor): 484(ptr) Variable Output
501: TypeMatrix 7(fvec4) 4
502: TypePointer Function 501
504: 6(float) Constant 0
505: 7(fvec4) ConstantComposite 461 504 504 504
506: 7(fvec4) ConstantComposite 504 461 504 504
507: 7(fvec4) ConstantComposite 504 504 461 504
508: 7(fvec4) ConstantComposite 504 504 504 461
509: 501 ConstantComposite 505 506 507 508
511: 7(fvec4) ConstantComposite 504 504 504 504
512: 501 ConstantComposite 511 511 511 511
524: TypeVector 18(int) 4
525: TypePointer Input 524(ivec4)
526(uiv4): 525(ptr) Variable Input
527: TypePointer Private 178(bool)
528(ub): 527(ptr) Variable Private
529: TypeVector 141(int) 4
530: TypePointer Input 529(ivec4)
531(uuv4): 530(ptr) Variable Input
186: TypeBool
187: TypeVector 186(bool) 4
188: TypePointer Private 187(bvec4)
189(ub41): 188(ptr) Variable Private
219: TypePointer Input 6(float)
220(uf): 219(ptr) Variable Input
292: TypePointer Function 141(int)
295: TypePointer Input 141(int)
296(uui): 295(ptr) Variable Input
312: TypePointer Function 186(bool)
350(ub42): 188(ptr) Variable Private
406: 18(int) Constant 2
413: 18(int) Constant 1
443: TypeVector 6(float) 3
462: 6(float) Constant 1073741824
469: 6(float) Constant 1065353216
474: 18(int) Constant 66
480: 18(int) Constant 17
492: TypePointer Output 7(fvec4)
493(FragColor): 492(ptr) Variable Output
509: TypeMatrix 7(fvec4) 4
510: TypePointer Function 509
512: 6(float) Constant 0
513: 7(fvec4) ConstantComposite 469 512 512 512
514: 7(fvec4) ConstantComposite 512 469 512 512
515: 7(fvec4) ConstantComposite 512 512 469 512
516: 7(fvec4) ConstantComposite 512 512 512 469
517: 509 ConstantComposite 513 514 515 516
519: 7(fvec4) ConstantComposite 512 512 512 512
520: 509 ConstantComposite 519 519 519 519
532: TypeVector 18(int) 4
533: TypePointer Input 532(ivec4)
534(uiv4): 533(ptr) Variable Input
535: TypePointer Private 186(bool)
536(ub): 535(ptr) Variable Private
537: TypeVector 141(int) 4
538: TypePointer Input 537(ivec4)
539(uuv4): 538(ptr) Variable Input
4(main): 2 Function None 3
5: Label
9(v): 8(ptr) Variable Function
20(i): 19(ptr) Variable Function
188(f): 143(ptr) Variable Function
285(u): 284(ptr) Variable Function
305(b): 304(ptr) Variable Function
487: 8(ptr) Variable Function
503(m1): 502(ptr) Variable Function
510(m2): 502(ptr) Variable Function
514: 502(ptr) Variable Function
155(swizzleTemp): 8(ptr) Variable Function
196(f): 143(ptr) Variable Function
293(u): 292(ptr) Variable Function
313(b): 312(ptr) Variable Function
495: 8(ptr) Variable Function
511(m1): 510(ptr) Variable Function
518(m2): 510(ptr) Variable Function
522: 510(ptr) Variable Function
12: 7(fvec4) Load 11(uv4)
13: 7(fvec4) ExtInst 1(GLSL.std.450) 11(Radians) 12
Store 9(v) 13
@ -262,441 +264,450 @@ spv.Operations.frag
153: 7(fvec4) FAdd 152 151
Store 9(v) 153
154: 7(fvec4) Load 9(v)
155: 7(fvec4) Load 11(uv4)
156: 7(fvec4) ExtInst 1(GLSL.std.450) 37(FMin) 154 155
157: 7(fvec4) Load 9(v)
158: 7(fvec4) FAdd 157 156
Store 9(v) 158
159: 7(fvec4) Load 9(v)
160: 7(fvec4) Load 11(uv4)
161: 7(fvec4) ExtInst 1(GLSL.std.450) 40(FMax) 159 160
156: 7(fvec4) ExtInst 1(GLSL.std.450) 35(Modf) 154 155(swizzleTemp)
157: 7(fvec4) Load 155(swizzleTemp)
158: 7(fvec4) Load 9(v)
159: 7(fvec4) VectorShuffle 158 157 6 4 5 7
Store 9(v) 159
160: 7(fvec4) Load 9(v)
161: 7(fvec4) FAdd 160 156
Store 9(v) 161
162: 7(fvec4) Load 9(v)
163: 7(fvec4) FAdd 162 161
Store 9(v) 163
164: 7(fvec4) Load 9(v)
165: 7(fvec4) Load 11(uv4)
166: 7(fvec4) Load 11(uv4)
167: 7(fvec4) ExtInst 1(GLSL.std.450) 43(FClamp) 164 165 166
168: 7(fvec4) Load 9(v)
169: 7(fvec4) FAdd 168 167
Store 9(v) 169
163: 7(fvec4) Load 11(uv4)
164: 7(fvec4) ExtInst 1(GLSL.std.450) 37(FMin) 162 163
165: 7(fvec4) Load 9(v)
166: 7(fvec4) FAdd 165 164
Store 9(v) 166
167: 7(fvec4) Load 9(v)
168: 7(fvec4) Load 11(uv4)
169: 7(fvec4) ExtInst 1(GLSL.std.450) 40(FMax) 167 168
170: 7(fvec4) Load 9(v)
171: 7(fvec4) Load 9(v)
171: 7(fvec4) FAdd 170 169
Store 9(v) 171
172: 7(fvec4) Load 9(v)
173: 7(fvec4) ExtInst 1(GLSL.std.450) 46(FMix) 170 171 172
174: 7(fvec4) Load 9(v)
175: 7(fvec4) FAdd 174 173
Store 9(v) 175
173: 7(fvec4) Load 11(uv4)
174: 7(fvec4) Load 11(uv4)
175: 7(fvec4) ExtInst 1(GLSL.std.450) 43(FClamp) 172 173 174
176: 7(fvec4) Load 9(v)
177: 7(fvec4) Load 9(v)
182: 179(bvec4) Load 181(ub41)
183: 7(fvec4) Select 182 177 176
177: 7(fvec4) FAdd 176 175
Store 9(v) 177
178: 7(fvec4) Load 9(v)
179: 7(fvec4) Load 9(v)
180: 7(fvec4) Load 9(v)
181: 7(fvec4) ExtInst 1(GLSL.std.450) 46(FMix) 178 179 180
182: 7(fvec4) Load 9(v)
183: 7(fvec4) FAdd 182 181
Store 9(v) 183
184: 7(fvec4) Load 9(v)
185: 7(fvec4) FAdd 184 183
Store 9(v) 185
186: 7(fvec4) Load 9(v)
187: 7(fvec4) Load 9(v)
189: 6(float) Load 188(f)
190: 7(fvec4) CompositeConstruct 189 189 189 189
191: 7(fvec4) ExtInst 1(GLSL.std.450) 46(FMix) 186 187 190
185: 7(fvec4) Load 9(v)
190: 187(bvec4) Load 189(ub41)
191: 7(fvec4) Select 190 185 184
192: 7(fvec4) Load 9(v)
193: 7(fvec4) FAdd 192 191
Store 9(v) 193
194: 7(fvec4) Load 9(v)
195: 7(fvec4) Load 11(uv4)
196: 7(fvec4) Load 9(v)
197: 7(fvec4) ExtInst 1(GLSL.std.450) 50(Fma) 194 195 196
198: 7(fvec4) Load 9(v)
199: 7(fvec4) FAdd 198 197
Store 9(v) 199
195: 7(fvec4) Load 9(v)
197: 6(float) Load 196(f)
198: 7(fvec4) CompositeConstruct 197 197 197 197
199: 7(fvec4) ExtInst 1(GLSL.std.450) 46(FMix) 194 195 198
200: 7(fvec4) Load 9(v)
201: 7(fvec4) Load 9(v)
202: 7(fvec4) ExtInst 1(GLSL.std.450) 48(Step) 200 201
203: 7(fvec4) Load 9(v)
204: 7(fvec4) FAdd 203 202
Store 9(v) 204
205: 7(fvec4) Load 9(v)
201: 7(fvec4) FAdd 200 199
Store 9(v) 201
202: 7(fvec4) Load 9(v)
203: 7(fvec4) Load 11(uv4)
204: 7(fvec4) Load 9(v)
205: 7(fvec4) ExtInst 1(GLSL.std.450) 50(Fma) 202 203 204
206: 7(fvec4) Load 9(v)
207: 7(fvec4) Load 9(v)
208: 7(fvec4) ExtInst 1(GLSL.std.450) 49(SmoothStep) 205 206 207
207: 7(fvec4) FAdd 206 205
Store 9(v) 207
208: 7(fvec4) Load 9(v)
209: 7(fvec4) Load 9(v)
210: 7(fvec4) FAdd 209 208
Store 9(v) 210
213: 6(float) Load 212(uf)
210: 7(fvec4) ExtInst 1(GLSL.std.450) 48(Step) 208 209
211: 7(fvec4) Load 9(v)
212: 7(fvec4) FAdd 211 210
Store 9(v) 212
213: 7(fvec4) Load 9(v)
214: 7(fvec4) Load 9(v)
215: 7(fvec4) CompositeConstruct 213 213 213 213
216: 7(fvec4) ExtInst 1(GLSL.std.450) 48(Step) 215 214
215: 7(fvec4) Load 9(v)
216: 7(fvec4) ExtInst 1(GLSL.std.450) 49(SmoothStep) 213 214 215
217: 7(fvec4) Load 9(v)
218: 7(fvec4) FAdd 217 216
Store 9(v) 218
219: 6(float) Load 212(uf)
220: 6(float) Load 212(uf)
221: 7(fvec4) Load 9(v)
222: 7(fvec4) CompositeConstruct 219 219 219 219
223: 7(fvec4) CompositeConstruct 220 220 220 220
224: 7(fvec4) ExtInst 1(GLSL.std.450) 49(SmoothStep) 222 223 221
221: 6(float) Load 220(uf)
222: 7(fvec4) Load 9(v)
223: 7(fvec4) CompositeConstruct 221 221 221 221
224: 7(fvec4) ExtInst 1(GLSL.std.450) 48(Step) 223 222
225: 7(fvec4) Load 9(v)
226: 7(fvec4) FAdd 225 224
Store 9(v) 226
227: 7(fvec4) Load 9(v)
228: 7(fvec4) ExtInst 1(GLSL.std.450) 69(Normalize) 227
227: 6(float) Load 220(uf)
228: 6(float) Load 220(uf)
229: 7(fvec4) Load 9(v)
230: 7(fvec4) FAdd 229 228
Store 9(v) 230
231: 7(fvec4) Load 9(v)
232: 7(fvec4) Load 9(v)
230: 7(fvec4) CompositeConstruct 227 227 227 227
231: 7(fvec4) CompositeConstruct 228 228 228 228
232: 7(fvec4) ExtInst 1(GLSL.std.450) 49(SmoothStep) 230 231 229
233: 7(fvec4) Load 9(v)
234: 7(fvec4) ExtInst 1(GLSL.std.450) 70(FaceForward) 231 232 233
234: 7(fvec4) FAdd 233 232
Store 9(v) 234
235: 7(fvec4) Load 9(v)
236: 7(fvec4) FAdd 235 234
Store 9(v) 236
236: 7(fvec4) ExtInst 1(GLSL.std.450) 69(Normalize) 235
237: 7(fvec4) Load 9(v)
238: 7(fvec4) Load 9(v)
239: 7(fvec4) ExtInst 1(GLSL.std.450) 71(Reflect) 237 238
238: 7(fvec4) FAdd 237 236
Store 9(v) 238
239: 7(fvec4) Load 9(v)
240: 7(fvec4) Load 9(v)
241: 7(fvec4) FAdd 240 239
Store 9(v) 241
242: 7(fvec4) Load 9(v)
241: 7(fvec4) Load 9(v)
242: 7(fvec4) ExtInst 1(GLSL.std.450) 70(FaceForward) 239 240 241
243: 7(fvec4) Load 9(v)
244: 6(float) Load 212(uf)
245: 7(fvec4) ExtInst 1(GLSL.std.450) 72(Refract) 242 243 244
244: 7(fvec4) FAdd 243 242
Store 9(v) 244
245: 7(fvec4) Load 9(v)
246: 7(fvec4) Load 9(v)
247: 7(fvec4) FAdd 246 245
Store 9(v) 247
247: 7(fvec4) ExtInst 1(GLSL.std.450) 71(Reflect) 245 246
248: 7(fvec4) Load 9(v)
249: 7(fvec4) DPdx 248
249: 7(fvec4) FAdd 248 247
Store 9(v) 249
250: 7(fvec4) Load 9(v)
251: 7(fvec4) FAdd 250 249
Store 9(v) 251
252: 7(fvec4) Load 9(v)
253: 7(fvec4) DPdy 252
251: 7(fvec4) Load 9(v)
252: 6(float) Load 220(uf)
253: 7(fvec4) ExtInst 1(GLSL.std.450) 72(Refract) 250 251 252
254: 7(fvec4) Load 9(v)
255: 7(fvec4) FAdd 254 253
Store 9(v) 255
256: 7(fvec4) Load 9(v)
257: 7(fvec4) Fwidth 256
257: 7(fvec4) DPdx 256
258: 7(fvec4) Load 9(v)
259: 7(fvec4) FAdd 258 257
Store 9(v) 259
260: 18(int) Load 22(ui)
261: 18(int) ExtInst 1(GLSL.std.450) 5(SAbs) 260
262: 18(int) Load 20(i)
263: 18(int) IAdd 262 261
Store 20(i) 263
264: 18(int) Load 20(i)
265: 18(int) ExtInst 1(GLSL.std.450) 7(SSign) 264
266: 18(int) Load 20(i)
267: 18(int) IAdd 266 265
Store 20(i) 267
268: 18(int) Load 20(i)
269: 18(int) Load 22(ui)
270: 18(int) ExtInst 1(GLSL.std.450) 39(SMin) 268 269
271: 18(int) Load 20(i)
272: 18(int) IAdd 271 270
Store 20(i) 272
273: 18(int) Load 20(i)
274: 18(int) Load 22(ui)
275: 18(int) ExtInst 1(GLSL.std.450) 42(SMax) 273 274
260: 7(fvec4) Load 9(v)
261: 7(fvec4) DPdy 260
262: 7(fvec4) Load 9(v)
263: 7(fvec4) FAdd 262 261
Store 9(v) 263
264: 7(fvec4) Load 9(v)
265: 7(fvec4) Fwidth 264
266: 7(fvec4) Load 9(v)
267: 7(fvec4) FAdd 266 265
Store 9(v) 267
268: 18(int) Load 22(ui)
269: 18(int) ExtInst 1(GLSL.std.450) 5(SAbs) 268
270: 18(int) Load 20(i)
271: 18(int) IAdd 270 269
Store 20(i) 271
272: 18(int) Load 20(i)
273: 18(int) ExtInst 1(GLSL.std.450) 7(SSign) 272
274: 18(int) Load 20(i)
275: 18(int) IAdd 274 273
Store 20(i) 275
276: 18(int) Load 20(i)
277: 18(int) IAdd 276 275
Store 20(i) 277
278: 18(int) Load 20(i)
279: 18(int) Load 22(ui)
280: 18(int) Load 22(ui)
281: 18(int) ExtInst 1(GLSL.std.450) 45(SClamp) 278 279 280
282: 18(int) Load 20(i)
283: 18(int) IAdd 282 281
Store 20(i) 283
286: 141(int) Load 285(u)
289: 141(int) Load 288(uui)
290: 141(int) ExtInst 1(GLSL.std.450) 38(UMin) 286 289
291: 141(int) Load 285(u)
292: 141(int) IAdd 291 290
Store 285(u) 292
293: 141(int) Load 285(u)
294: 141(int) Load 288(uui)
295: 141(int) ExtInst 1(GLSL.std.450) 41(UMax) 293 294
296: 141(int) Load 285(u)
297: 141(int) IAdd 296 295
Store 285(u) 297
298: 141(int) Load 285(u)
299: 141(int) Load 288(uui)
300: 141(int) Load 288(uui)
301: 141(int) ExtInst 1(GLSL.std.450) 44(UClamp) 298 299 300
302: 141(int) Load 285(u)
303: 141(int) IAdd 302 301
Store 285(u) 303
306: 6(float) Load 212(uf)
307: 178(bool) IsNan 306
Store 305(b) 307
308: 6(float) Load 188(f)
309: 178(bool) IsInf 308
Store 305(b) 309
310: 7(fvec4) Load 9(v)
311: 7(fvec4) Load 11(uv4)
312: 179(bvec4) FOrdLessThan 310 311
313: 178(bool) Any 312
Store 305(b) 313
314: 178(bool) Load 305(b)
SelectionMerge 316 None
BranchConditional 314 315 316
315: Label
317: 7(fvec4) Load 9(v)
318: 7(fvec4) Load 11(uv4)
319: 179(bvec4) FOrdLessThanEqual 317 318
320: 178(bool) Any 319
Branch 316
316: Label
321: 178(bool) Phi 314 5 320 315
Store 305(b) 321
322: 178(bool) Load 305(b)
277: 18(int) Load 22(ui)
278: 18(int) ExtInst 1(GLSL.std.450) 39(SMin) 276 277
279: 18(int) Load 20(i)
280: 18(int) IAdd 279 278
Store 20(i) 280
281: 18(int) Load 20(i)
282: 18(int) Load 22(ui)
283: 18(int) ExtInst 1(GLSL.std.450) 42(SMax) 281 282
284: 18(int) Load 20(i)
285: 18(int) IAdd 284 283
Store 20(i) 285
286: 18(int) Load 20(i)
287: 18(int) Load 22(ui)
288: 18(int) Load 22(ui)
289: 18(int) ExtInst 1(GLSL.std.450) 45(SClamp) 286 287 288
290: 18(int) Load 20(i)
291: 18(int) IAdd 290 289
Store 20(i) 291
294: 141(int) Load 293(u)
297: 141(int) Load 296(uui)
298: 141(int) ExtInst 1(GLSL.std.450) 38(UMin) 294 297
299: 141(int) Load 293(u)
300: 141(int) IAdd 299 298
Store 293(u) 300
301: 141(int) Load 293(u)
302: 141(int) Load 296(uui)
303: 141(int) ExtInst 1(GLSL.std.450) 41(UMax) 301 302
304: 141(int) Load 293(u)
305: 141(int) IAdd 304 303
Store 293(u) 305
306: 141(int) Load 293(u)
307: 141(int) Load 296(uui)
308: 141(int) Load 296(uui)
309: 141(int) ExtInst 1(GLSL.std.450) 44(UClamp) 306 307 308
310: 141(int) Load 293(u)
311: 141(int) IAdd 310 309
Store 293(u) 311
314: 6(float) Load 220(uf)
315: 186(bool) IsNan 314
Store 313(b) 315
316: 6(float) Load 196(f)
317: 186(bool) IsInf 316
Store 313(b) 317
318: 7(fvec4) Load 9(v)
319: 7(fvec4) Load 11(uv4)
320: 187(bvec4) FOrdLessThan 318 319
321: 186(bool) Any 320
Store 313(b) 321
322: 186(bool) Load 313(b)
SelectionMerge 324 None
BranchConditional 322 323 324
323: Label
325: 7(fvec4) Load 9(v)
326: 7(fvec4) Load 11(uv4)
327: 179(bvec4) FOrdGreaterThan 325 326
328: 178(bool) Any 327
327: 187(bvec4) FOrdLessThanEqual 325 326
328: 186(bool) Any 327
Branch 324
324: Label
329: 178(bool) Phi 322 316 328 323
Store 305(b) 329
330: 178(bool) Load 305(b)
329: 186(bool) Phi 322 5 328 323
Store 313(b) 329
330: 186(bool) Load 313(b)
SelectionMerge 332 None
BranchConditional 330 331 332
331: Label
333: 7(fvec4) Load 9(v)
334: 7(fvec4) Load 11(uv4)
335: 179(bvec4) FOrdGreaterThanEqual 333 334
336: 178(bool) Any 335
335: 187(bvec4) FOrdGreaterThan 333 334
336: 186(bool) Any 335
Branch 332
332: Label
337: 178(bool) Phi 330 324 336 331
Store 305(b) 337
338: 178(bool) Load 305(b)
337: 186(bool) Phi 330 324 336 331
Store 313(b) 337
338: 186(bool) Load 313(b)
SelectionMerge 340 None
BranchConditional 338 339 340
339: Label
341: 179(bvec4) Load 181(ub41)
343: 179(bvec4) Load 342(ub42)
344: 179(bvec4) LogicalEqual 341 343
345: 178(bool) Any 344
341: 7(fvec4) Load 9(v)
342: 7(fvec4) Load 11(uv4)
343: 187(bvec4) FOrdGreaterThanEqual 341 342
344: 186(bool) Any 343
Branch 340
340: Label
346: 178(bool) Phi 338 332 345 339
Store 305(b) 346
347: 178(bool) Load 305(b)
SelectionMerge 349 None
BranchConditional 347 348 349
348: Label
350: 179(bvec4) Load 181(ub41)
351: 179(bvec4) Load 342(ub42)
352: 179(bvec4) LogicalNotEqual 350 351
353: 178(bool) Any 352
Branch 349
349: Label
354: 178(bool) Phi 347 340 353 348
Store 305(b) 354
355: 178(bool) Load 305(b)
356: 179(bvec4) Load 181(ub41)
357: 178(bool) Any 356
358: 178(bool) LogicalAnd 355 357
Store 305(b) 358
359: 178(bool) Load 305(b)
360: 179(bvec4) Load 181(ub41)
361: 178(bool) All 360
362: 178(bool) LogicalAnd 359 361
Store 305(b) 362
363: 178(bool) Load 305(b)
SelectionMerge 365 None
BranchConditional 363 364 365
364: Label
366: 179(bvec4) Load 181(ub41)
367: 179(bvec4) LogicalNot 366
368: 178(bool) Any 367
Branch 365
365: Label
369: 178(bool) Phi 363 349 368 364
Store 305(b) 369
370: 18(int) Load 20(i)
371: 18(int) Load 22(ui)
372: 18(int) IAdd 370 371
373: 18(int) Load 20(i)
374: 18(int) IMul 372 373
375: 18(int) Load 22(ui)
376: 18(int) ISub 374 375
377: 18(int) Load 20(i)
378: 18(int) SDiv 376 377
Store 20(i) 378
379: 18(int) Load 20(i)
380: 18(int) Load 22(ui)
381: 18(int) SMod 379 380
Store 20(i) 381
382: 18(int) Load 20(i)
345: 186(bool) Phi 338 332 344 339
Store 313(b) 345
346: 186(bool) Load 313(b)
SelectionMerge 348 None
BranchConditional 346 347 348
347: Label
349: 187(bvec4) Load 189(ub41)
351: 187(bvec4) Load 350(ub42)
352: 187(bvec4) LogicalEqual 349 351
353: 186(bool) Any 352
Branch 348
348: Label
354: 186(bool) Phi 346 340 353 347
Store 313(b) 354
355: 186(bool) Load 313(b)
SelectionMerge 357 None
BranchConditional 355 356 357
356: Label
358: 187(bvec4) Load 189(ub41)
359: 187(bvec4) Load 350(ub42)
360: 187(bvec4) LogicalNotEqual 358 359
361: 186(bool) Any 360
Branch 357
357: Label
362: 186(bool) Phi 355 348 361 356
Store 313(b) 362
363: 186(bool) Load 313(b)
364: 187(bvec4) Load 189(ub41)
365: 186(bool) Any 364
366: 186(bool) LogicalAnd 363 365
Store 313(b) 366
367: 186(bool) Load 313(b)
368: 187(bvec4) Load 189(ub41)
369: 186(bool) All 368
370: 186(bool) LogicalAnd 367 369
Store 313(b) 370
371: 186(bool) Load 313(b)
SelectionMerge 373 None
BranchConditional 371 372 373
372: Label
374: 187(bvec4) Load 189(ub41)
375: 187(bvec4) LogicalNot 374
376: 186(bool) Any 375
Branch 373
373: Label
377: 186(bool) Phi 371 357 376 372
Store 313(b) 377
378: 18(int) Load 20(i)
379: 18(int) Load 22(ui)
380: 18(int) IAdd 378 379
381: 18(int) Load 20(i)
382: 18(int) IMul 380 381
383: 18(int) Load 22(ui)
384: 178(bool) IEqual 382 383
385: 178(bool) LogicalNot 384
SelectionMerge 387 None
BranchConditional 385 386 387
386: Label
388: 18(int) Load 20(i)
389: 18(int) Load 22(ui)
390: 178(bool) INotEqual 388 389
SelectionMerge 392 None
BranchConditional 390 391 392
391: Label
393: 18(int) Load 20(i)
394: 18(int) Load 22(ui)
395: 178(bool) IEqual 393 394
Branch 392
392: Label
396: 178(bool) Phi 390 386 395 391
397: 18(int) Load 20(i)
399: 178(bool) INotEqual 397 398
400: 178(bool) LogicalNotEqual 396 399
Branch 387
387: Label
401: 178(bool) Phi 384 365 400 392
SelectionMerge 403 None
BranchConditional 401 402 403
402: Label
404: 18(int) Load 20(i)
406: 18(int) IAdd 404 405
Store 20(i) 406
Branch 403
403: Label
407: 6(float) Load 212(uf)
408: 6(float) Load 212(uf)
409: 6(float) FAdd 407 408
410: 6(float) Load 212(uf)
411: 6(float) FMul 409 410
412: 6(float) Load 212(uf)
413: 6(float) FSub 411 412
414: 6(float) Load 212(uf)
415: 6(float) FDiv 413 414
Store 188(f) 415
416: 7(fvec4) Load 9(v)
417: 6(float) ExtInst 1(GLSL.std.450) 66(Length) 416
418: 6(float) Load 188(f)
419: 6(float) FAdd 418 417
Store 188(f) 419
420: 7(fvec4) Load 9(v)
421: 7(fvec4) Load 9(v)
422: 6(float) ExtInst 1(GLSL.std.450) 67(Distance) 420 421
423: 6(float) Load 188(f)
424: 6(float) FAdd 423 422
Store 188(f) 424
425: 7(fvec4) Load 9(v)
426: 7(fvec4) Load 9(v)
427: 6(float) Dot 425 426
428: 6(float) Load 188(f)
429: 6(float) FAdd 428 427
Store 188(f) 429
430: 6(float) Load 188(f)
431: 6(float) Load 212(uf)
432: 6(float) FMul 430 431
433: 6(float) Load 188(f)
434: 6(float) FAdd 433 432
Store 188(f) 434
436: 7(fvec4) Load 9(v)
437: 435(fvec3) VectorShuffle 436 436 0 1 2
438: 7(fvec4) Load 9(v)
439: 435(fvec3) VectorShuffle 438 438 0 1 2
440: 435(fvec3) ExtInst 1(GLSL.std.450) 68(Cross) 437 439
441: 6(float) CompositeExtract 440 0
442: 6(float) Load 188(f)
443: 6(float) FAdd 442 441
Store 188(f) 443
444: 6(float) Load 188(f)
445: 6(float) Load 212(uf)
446: 178(bool) FOrdEqual 444 445
447: 178(bool) LogicalNot 446
SelectionMerge 449 None
BranchConditional 447 448 449
448: Label
450: 6(float) Load 188(f)
451: 6(float) Load 212(uf)
452: 178(bool) FOrdNotEqual 450 451
453: 6(float) Load 188(f)
455: 178(bool) FOrdNotEqual 453 454
456: 178(bool) LogicalAnd 452 455
Branch 449
449: Label
457: 178(bool) Phi 446 403 456 448
SelectionMerge 459 None
BranchConditional 457 458 459
458: Label
460: 6(float) Load 188(f)
462: 6(float) FAdd 460 461
Store 188(f) 462
Branch 459
459: Label
463: 18(int) Load 22(ui)
464: 18(int) Load 20(i)
465: 18(int) BitwiseAnd 464 463
Store 20(i) 465
467: 18(int) Load 20(i)
468: 18(int) BitwiseOr 467 466
Store 20(i) 468
469: 18(int) Load 22(ui)
470: 18(int) Load 20(i)
471: 18(int) BitwiseXor 470 469
Store 20(i) 471
473: 18(int) Load 20(i)
474: 18(int) SMod 473 472
Store 20(i) 474
384: 18(int) ISub 382 383
385: 18(int) Load 20(i)
386: 18(int) SDiv 384 385
Store 20(i) 386
387: 18(int) Load 20(i)
388: 18(int) Load 22(ui)
389: 18(int) SMod 387 388
Store 20(i) 389
390: 18(int) Load 20(i)
391: 18(int) Load 22(ui)
392: 186(bool) IEqual 390 391
393: 186(bool) LogicalNot 392
SelectionMerge 395 None
BranchConditional 393 394 395
394: Label
396: 18(int) Load 20(i)
397: 18(int) Load 22(ui)
398: 186(bool) INotEqual 396 397
SelectionMerge 400 None
BranchConditional 398 399 400
399: Label
401: 18(int) Load 20(i)
402: 18(int) Load 22(ui)
403: 186(bool) IEqual 401 402
Branch 400
400: Label
404: 186(bool) Phi 398 394 403 399
405: 18(int) Load 20(i)
407: 186(bool) INotEqual 405 406
408: 186(bool) LogicalNotEqual 404 407
Branch 395
395: Label
409: 186(bool) Phi 392 373 408 400
SelectionMerge 411 None
BranchConditional 409 410 411
410: Label
412: 18(int) Load 20(i)
414: 18(int) IAdd 412 413
Store 20(i) 414
Branch 411
411: Label
415: 6(float) Load 220(uf)
416: 6(float) Load 220(uf)
417: 6(float) FAdd 415 416
418: 6(float) Load 220(uf)
419: 6(float) FMul 417 418
420: 6(float) Load 220(uf)
421: 6(float) FSub 419 420
422: 6(float) Load 220(uf)
423: 6(float) FDiv 421 422
Store 196(f) 423
424: 7(fvec4) Load 9(v)
425: 6(float) ExtInst 1(GLSL.std.450) 66(Length) 424
426: 6(float) Load 196(f)
427: 6(float) FAdd 426 425
Store 196(f) 427
428: 7(fvec4) Load 9(v)
429: 7(fvec4) Load 9(v)
430: 6(float) ExtInst 1(GLSL.std.450) 67(Distance) 428 429
431: 6(float) Load 196(f)
432: 6(float) FAdd 431 430
Store 196(f) 432
433: 7(fvec4) Load 9(v)
434: 7(fvec4) Load 9(v)
435: 6(float) Dot 433 434
436: 6(float) Load 196(f)
437: 6(float) FAdd 436 435
Store 196(f) 437
438: 6(float) Load 196(f)
439: 6(float) Load 220(uf)
440: 6(float) FMul 438 439
441: 6(float) Load 196(f)
442: 6(float) FAdd 441 440
Store 196(f) 442
444: 7(fvec4) Load 9(v)
445: 443(fvec3) VectorShuffle 444 444 0 1 2
446: 7(fvec4) Load 9(v)
447: 443(fvec3) VectorShuffle 446 446 0 1 2
448: 443(fvec3) ExtInst 1(GLSL.std.450) 68(Cross) 445 447
449: 6(float) CompositeExtract 448 0
450: 6(float) Load 196(f)
451: 6(float) FAdd 450 449
Store 196(f) 451
452: 6(float) Load 196(f)
453: 6(float) Load 220(uf)
454: 186(bool) FOrdEqual 452 453
455: 186(bool) LogicalNot 454
SelectionMerge 457 None
BranchConditional 455 456 457
456: Label
458: 6(float) Load 196(f)
459: 6(float) Load 220(uf)
460: 186(bool) FOrdNotEqual 458 459
461: 6(float) Load 196(f)
463: 186(bool) FOrdNotEqual 461 462
464: 186(bool) LogicalAnd 460 463
Branch 457
457: Label
465: 186(bool) Phi 454 411 464 456
SelectionMerge 467 None
BranchConditional 465 466 467
466: Label
468: 6(float) Load 196(f)
470: 6(float) FAdd 468 469
Store 196(f) 470
Branch 467
467: Label
471: 18(int) Load 22(ui)
472: 18(int) Load 20(i)
473: 18(int) BitwiseAnd 472 471
Store 20(i) 473
475: 18(int) Load 20(i)
476: 18(int) ShiftRightArithmetic 475 398
476: 18(int) BitwiseOr 475 474
Store 20(i) 476
477: 18(int) Load 22(ui)
478: 18(int) Load 20(i)
479: 18(int) ShiftLeftLogical 478 477
479: 18(int) BitwiseXor 478 477
Store 20(i) 479
480: 18(int) Load 20(i)
481: 18(int) Not 480
Store 20(i) 481
482: 178(bool) Load 305(b)
483: 178(bool) LogicalNot 482
Store 305(b) 483
486: 178(bool) Load 305(b)
SelectionMerge 489 None
BranchConditional 486 488 498
488: Label
490: 18(int) Load 20(i)
491: 6(float) ConvertSToF 490
492: 7(fvec4) CompositeConstruct 491 491 491 491
493: 6(float) Load 188(f)
494: 7(fvec4) CompositeConstruct 493 493 493 493
495: 7(fvec4) FAdd 492 494
496: 7(fvec4) Load 9(v)
497: 7(fvec4) FAdd 495 496
Store 487 497
Branch 489
498: Label
499: 7(fvec4) Load 9(v)
Store 487 499
Branch 489
489: Label
500: 7(fvec4) Load 487
Store 485(FragColor) 500
Store 503(m1) 509
Store 510(m2) 512
513: 178(bool) Load 305(b)
SelectionMerge 516 None
BranchConditional 513 515 518
515: Label
517: 501 Load 503(m1)
Store 514 517
Branch 516
518: Label
519: 501 Load 510(m2)
Store 514 519
Branch 516
516: Label
520: 8(ptr) AccessChain 514 405
521: 7(fvec4) Load 520
522: 7(fvec4) Load 485(FragColor)
523: 7(fvec4) FAdd 522 521
Store 485(FragColor) 523
481: 18(int) Load 20(i)
482: 18(int) SMod 481 480
Store 20(i) 482
483: 18(int) Load 20(i)
484: 18(int) ShiftRightArithmetic 483 406
Store 20(i) 484
485: 18(int) Load 22(ui)
486: 18(int) Load 20(i)
487: 18(int) ShiftLeftLogical 486 485
Store 20(i) 487
488: 18(int) Load 20(i)
489: 18(int) Not 488
Store 20(i) 489
490: 186(bool) Load 313(b)
491: 186(bool) LogicalNot 490
Store 313(b) 491
494: 186(bool) Load 313(b)
SelectionMerge 497 None
BranchConditional 494 496 506
496: Label
498: 18(int) Load 20(i)
499: 6(float) ConvertSToF 498
500: 7(fvec4) CompositeConstruct 499 499 499 499
501: 6(float) Load 196(f)
502: 7(fvec4) CompositeConstruct 501 501 501 501
503: 7(fvec4) FAdd 500 502
504: 7(fvec4) Load 9(v)
505: 7(fvec4) FAdd 503 504
Store 495 505
Branch 497
506: Label
507: 7(fvec4) Load 9(v)
Store 495 507
Branch 497
497: Label
508: 7(fvec4) Load 495
Store 493(FragColor) 508
Store 511(m1) 517
Store 518(m2) 520
521: 186(bool) Load 313(b)
SelectionMerge 524 None
BranchConditional 521 523 526
523: Label
525: 509 Load 511(m1)
Store 522 525
Branch 524
526: Label
527: 509 Load 518(m2)
Store 522 527
Branch 524
524: Label
528: 8(ptr) AccessChain 522 413
529: 7(fvec4) Load 528
530: 7(fvec4) Load 493(FragColor)
531: 7(fvec4) FAdd 530 529
Store 493(FragColor) 531
Return
FunctionEnd

View File

@ -55,9 +55,10 @@ void main()
v += ceil(v);
v += fract(v);
v += mod(v, v);
v += mod(v, v.x);
v += mod(v, v.x);
v += modf(v, v);
v += modf(v, v.yzxw);
v += min(v, uv4);
v += max(v, uv4);