From bbbd9a2a1f41ab301861c6052d9643c626ee9961 Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Tue, 3 Mar 2020 07:21:37 -0700 Subject: [PATCH] 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. --- SPIRV/GlslangToSpv.cpp | 28 +- SPIRV/SpvBuilder.h | 5 + Test/baseResults/spv.Operations.frag.out | 887 ++++++++++++++++--------------- Test/spv.Operations.frag | 3 +- 4 files changed, 481 insertions(+), 442 deletions(-) diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index b2a93cf..ccf112d 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -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) diff --git a/SPIRV/SpvBuilder.h b/SPIRV/SpvBuilder.h index 602bd08..835d2d3 100644 --- a/SPIRV/SpvBuilder.h +++ b/SPIRV/SpvBuilder.h @@ -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(); diff --git a/Test/baseResults/spv.Operations.frag.out b/Test/baseResults/spv.Operations.frag.out index 22aeecd..77f345a 100644 --- a/Test/baseResults/spv.Operations.frag.out +++ b/Test/baseResults/spv.Operations.frag.out @@ -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 diff --git a/Test/spv.Operations.frag b/Test/spv.Operations.frag index 52f0a30..d34032d 100644 --- a/Test/spv.Operations.frag +++ b/Test/spv.Operations.frag @@ -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); -- 2.7.4