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(); spec_constant_op_mode_setter.turnOnSpecConstantOpMode();
spv::Id result = spv::NoResult; 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()); }; auto resultType = [&invertedType, &node, this](){ return invertedType != spv::NoType ? invertedType : convertGlslangToSpvType(node->getType()); };
// try texturing // 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; // Does it need a swizzle inversion? If so, evaluation is inverted;
// operate first on the swizzle base, then apply the swizzle. // operate first on the swizzle base, then apply the swizzle.
// That is, we transform
//
// interpolate(v.zy) -> interpolate(v).zy
//
if (glslangOperands[0]->getAsOperator() && if (glslangOperands[0]->getAsOperator() &&
glslangOperands[0]->getAsOperator()->getOp() == glslang::EOpVectorSwizzle) glslangOperands[0]->getAsOperator()->getOp() == glslang::EOpVectorSwizzle)
invertedType = convertGlslangToSpvType(glslangOperands[0]->getAsBinaryNode()->getLeft()->getType()); invertedType = convertGlslangToSpvType(glslangOperands[0]->getAsBinaryNode()->getLeft()->getType());
@ -2819,8 +2826,19 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
} }
#endif #endif
// for l-values, pass the address, for r-values, pass the value
if (lvalue) { 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 = builder.getAccessChain().coherentFlags;
lvalueCoherentFlags |= TranslateCoherent(glslangOperands[arg]->getAsTyped()->getType()); lvalueCoherentFlags |= TranslateCoherent(glslangOperands[arg]->getAsTyped()->getType());
} else { } else {
@ -2883,8 +2901,12 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
result = createMiscOperation(node->getOp(), precision, resultType(), operands, node->getBasicType()); result = createMiscOperation(node->getOp(), precision, resultType(), operands, node->getBasicType());
break; break;
} }
if (invertedType) if (invertedType != spv::NoResult)
result = createInvertedSwizzle(precision, *glslangOperands[0]->getAsBinaryNode(), result); result = createInvertedSwizzle(precision, *glslangOperands[0]->getAsBinaryNode(), result);
else if (temporaryLvalue != spv::NoResult) {
builder.setAccessChain(complexLvalue);
builder.accessChainStore(builder.createLoad(temporaryLvalue));
}
} }
if (noReturnValue) if (noReturnValue)

View File

@ -676,6 +676,11 @@ public:
// use accessChain and swizzle to load an r-value // 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); 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 // get the direct pointer for an l-value
Id accessChainGetLValue(); Id accessChainGetLValue();

View File

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

View File

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