Fix #1843: Handle built-in function output parameters to a swizzled arg
authorJohn Kessenich <cepheus@frii.com>
Tue, 3 Mar 2020 14:21:37 +0000 (07:21 -0700)
committerJohn Kessenich <cepheus@frii.com>
Tue, 3 Mar 2020 14:21:37 +0000 (07:21 -0700)
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
SPIRV/SpvBuilder.h
Test/baseResults/spv.Operations.frag.out
Test/spv.Operations.frag

index b2a93cf..ccf112d 100755 (executable)
@@ -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)
index 602bd08..835d2d3 100644 (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();
 
index 22aeecd..77f345a 100644 (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
index 52f0a30..d34032d 100644 (file)
@@ -55,9 +55,10 @@ void main()
     v += ceil(v);\r
     v += fract(v);\r
     v += mod(v, v);\r
-       v += mod(v, v.x);\r
+    v += mod(v, v.x);\r
 \r
     v += modf(v, v);\r
+    v += modf(v, v.yzxw);\r
 \r
     v += min(v, uv4);\r
     v += max(v, uv4);\r