Migrate additional FPs to `return` instead of `sk_OutColor`.

These changes cause fewer unnecessary temporary variables to be emitted
in the final gencode and give the optimizer less work to do.

Change-Id: Ied0e83904e2d108382666d18ab733334292e5a63
Bug: skia:10549
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/328838
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
diff --git a/src/gpu/effects/GrCircleBlurFragmentProcessor.fp b/src/gpu/effects/GrCircleBlurFragmentProcessor.fp
index e333eb5..11076ca 100644
--- a/src/gpu/effects/GrCircleBlurFragmentProcessor.fp
+++ b/src/gpu/effects/GrCircleBlurFragmentProcessor.fp
@@ -295,13 +295,13 @@
     }
 }
 
-void main() {
+half4 main() {
     // We just want to compute "(length(vec) - circleData.z + 0.5) * circleData.w" but need to
     // rearrange to avoid passing large values to length() that would overflow.
     half2 vec = half2((sk_FragCoord.xy - circleData.xy) * circleData.w);
     half dist = length(vec) + (0.5 - circleData.z) * circleData.w;
     half4 inputColor = sample(inputFP);
-    sk_OutColor = inputColor * sample(blurProfile, half2(dist, 0.5)).a;
+    return inputColor * sample(blurProfile, half2(dist, 0.5)).a;
 }
 
 @test(testData) {
diff --git a/src/gpu/effects/GrCircleEffect.fp b/src/gpu/effects/GrCircleEffect.fp
index bca5998..b4d1ca9 100644
--- a/src/gpu/effects/GrCircleEffect.fp
+++ b/src/gpu/effects/GrCircleEffect.fp
@@ -51,7 +51,7 @@
     }
 }
 
-void main() {
+half4 main() {
     // TODO: Right now the distance to circle calculation is performed in a space normalized to the
     // radius and then denormalized. This is to mitigate overflow on devices that don't have full
     // float.
@@ -65,9 +65,9 @@
     half4 inputColor = sample(inputFP);
     @if (edgeType == GrClipEdgeType::kFillAA ||
          edgeType == GrClipEdgeType::kInverseFillAA) {
-        sk_OutColor = inputColor * saturate(d);
+        return inputColor * saturate(d);
     } else {
-        sk_OutColor = d > 0.5 ? inputColor : half4(0);
+        return d > 0.5 ? inputColor : half4(0);
     }
 }
 
diff --git a/src/gpu/effects/GrClampFragmentProcessor.fp b/src/gpu/effects/GrClampFragmentProcessor.fp
index 5b93066..3c4b936 100644
--- a/src/gpu/effects/GrClampFragmentProcessor.fp
+++ b/src/gpu/effects/GrClampFragmentProcessor.fp
@@ -14,13 +14,13 @@
      kPreservesOpaqueInput_OptimizationFlag)
 }
 
-void main() {
+half4 main() {
     half4 inputColor = sample(inputFP);
     @if (clampToPremul) {
         half alpha = saturate(inputColor.a);
-        sk_OutColor = half4(clamp(inputColor.rgb, 0, alpha), alpha);
+        return half4(clamp(inputColor.rgb, 0, alpha), alpha);
     } else {
-        sk_OutColor = saturate(inputColor);
+        return saturate(inputColor);
     }
 }
 
diff --git a/src/gpu/effects/GrDitherEffect.fp b/src/gpu/effects/GrDitherEffect.fp
index bce636d..bbf295f 100644
--- a/src/gpu/effects/GrDitherEffect.fp
+++ b/src/gpu/effects/GrDitherEffect.fp
@@ -10,7 +10,7 @@
 // Larger values increase the strength of the dithering effect.
 in uniform half range;
 
-void main() {
+half4 main() {
     half4 color = sample(inputFP);
     half value;
     @if (sk_Caps.integerSupport)
@@ -43,7 +43,7 @@
     }
     // For each color channel, add the random offset to the channel value and then clamp
     // between 0 and alpha to keep the color premultiplied.
-    sk_OutColor = half4(clamp(color.rgb + value * range, 0.0, color.a), color.a);
+    return half4(clamp(color.rgb + value * range, 0.0, color.a), color.a);
 }
 
 @optimizationFlags {
diff --git a/src/gpu/effects/GrYUVtoRGBEffect.cpp b/src/gpu/effects/GrYUVtoRGBEffect.cpp
index 07b9406..29aa91b 100644
--- a/src/gpu/effects/GrYUVtoRGBEffect.cpp
+++ b/src/gpu/effects/GrYUVtoRGBEffect.cpp
@@ -252,7 +252,7 @@
                 // premultiply alpha
                 fragBuilder->codeAppendf("color.rgb *= color.a;");
             }
-            fragBuilder->codeAppendf("%s = color;", args.fOutputColor);
+            fragBuilder->codeAppendf("return color;");
         }
 
     private:
diff --git a/src/gpu/effects/GrYUVtoRGBEffect.h b/src/gpu/effects/GrYUVtoRGBEffect.h
index 6078033..31bba47 100644
--- a/src/gpu/effects/GrYUVtoRGBEffect.h
+++ b/src/gpu/effects/GrYUVtoRGBEffect.h
@@ -26,6 +26,7 @@
     std::unique_ptr<GrFragmentProcessor> clone() const override;
 
     const char* name() const override { return "YUVtoRGBEffect"; }
+    bool usesExplicitReturn() const override { return true; }
 
 private:
     GrYUVtoRGBEffect(std::unique_ptr<GrFragmentProcessor> planeFPs[4],
diff --git a/src/gpu/effects/generated/GrCircleBlurFragmentProcessor.cpp b/src/gpu/effects/generated/GrCircleBlurFragmentProcessor.cpp
index 2b1ac09..1a0d3e6 100644
--- a/src/gpu/effects/generated/GrCircleBlurFragmentProcessor.cpp
+++ b/src/gpu/effects/generated/GrCircleBlurFragmentProcessor.cpp
@@ -307,18 +307,18 @@
                 args.fUniformHandler->getUniformCStr(circleDataVar),
                 args.fUniformHandler->getUniformCStr(circleDataVar),
                 args.fUniformHandler->getUniformCStr(circleDataVar));
-        SkString _sample13763 = this->invokeChild(0, args);
+        SkString _sample13764 = this->invokeChild(0, args);
         fragBuilder->codeAppendf(
                 R"SkSL(
 half4 inputColor = %s;)SkSL",
-                _sample13763.c_str());
-        SkString _coords13811("float2(half2(dist, 0.5))");
-        SkString _sample13811 = this->invokeChild(1, args, _coords13811.c_str());
+                _sample13764.c_str());
+        SkString _coords13805("float2(half2(dist, 0.5))");
+        SkString _sample13805 = this->invokeChild(1, args, _coords13805.c_str());
         fragBuilder->codeAppendf(
                 R"SkSL(
-%s = inputColor * %s.w;
+return inputColor * %s.w;
 )SkSL",
-                args.fOutputColor, _sample13811.c_str());
+                _sample13805.c_str());
     }
 
 private:
@@ -352,7 +352,7 @@
     if (textureRadius != that.textureRadius) return false;
     return true;
 }
-bool GrCircleBlurFragmentProcessor::usesExplicitReturn() const { return false; }
+bool GrCircleBlurFragmentProcessor::usesExplicitReturn() const { return true; }
 GrCircleBlurFragmentProcessor::GrCircleBlurFragmentProcessor(
         const GrCircleBlurFragmentProcessor& src)
         : INHERITED(kGrCircleBlurFragmentProcessor_ClassID, src.optimizationFlags())
diff --git a/src/gpu/effects/generated/GrCircleEffect.cpp b/src/gpu/effects/generated/GrCircleEffect.cpp
index d1a9391..b8c8ba1 100644
--- a/src/gpu/effects/generated/GrCircleEffect.cpp
+++ b/src/gpu/effects/generated/GrCircleEffect.cpp
@@ -49,18 +49,17 @@
                 args.fUniformHandler->getUniformCStr(circleVar),
                 args.fUniformHandler->getUniformCStr(circleVar),
                 args.fUniformHandler->getUniformCStr(circleVar));
-        SkString _sample2509 = this->invokeChild(0, args);
+        SkString _sample2510 = this->invokeChild(0, args);
         fragBuilder->codeAppendf(
                 R"SkSL(
 half4 inputColor = %s;
 @if (%d == 1 || %d == 3) {
-    %s = inputColor * clamp(d, 0.0, 1.0);
+    return inputColor * clamp(d, 0.0, 1.0);
 } else {
-    %s = d > 0.5 ? inputColor : half4(0.0);
+    return d > 0.5 ? inputColor : half4(0.0);
 }
 )SkSL",
-                _sample2509.c_str(), (int)_outer.edgeType, (int)_outer.edgeType, args.fOutputColor,
-                args.fOutputColor);
+                _sample2510.c_str(), (int)_outer.edgeType, (int)_outer.edgeType);
     }
 
 private:
@@ -111,7 +110,7 @@
     if (radius != that.radius) return false;
     return true;
 }
-bool GrCircleEffect::usesExplicitReturn() const { return false; }
+bool GrCircleEffect::usesExplicitReturn() const { return true; }
 GrCircleEffect::GrCircleEffect(const GrCircleEffect& src)
         : INHERITED(kGrCircleEffect_ClassID, src.optimizationFlags())
         , edgeType(src.edgeType)
diff --git a/src/gpu/effects/generated/GrClampFragmentProcessor.cpp b/src/gpu/effects/generated/GrClampFragmentProcessor.cpp
index e963276..4c2eb16 100644
--- a/src/gpu/effects/generated/GrClampFragmentProcessor.cpp
+++ b/src/gpu/effects/generated/GrClampFragmentProcessor.cpp
@@ -26,18 +26,17 @@
         (void)_outer;
         auto clampToPremul = _outer.clampToPremul;
         (void)clampToPremul;
-        SkString _sample464 = this->invokeChild(0, args);
+        SkString _sample465 = this->invokeChild(0, args);
         fragBuilder->codeAppendf(
                 R"SkSL(half4 inputColor = %s;
 @if (%s) {
     half alpha = clamp(inputColor.w, 0.0, 1.0);
-    %s = half4(clamp(inputColor.xyz, 0.0, alpha), alpha);
+    return half4(clamp(inputColor.xyz, 0.0, alpha), alpha);
 } else {
-    %s = clamp(inputColor, 0.0, 1.0);
+    return clamp(inputColor, 0.0, 1.0);
 }
 )SkSL",
-                _sample464.c_str(), (_outer.clampToPremul ? "true" : "false"), args.fOutputColor,
-                args.fOutputColor);
+                _sample465.c_str(), (_outer.clampToPremul ? "true" : "false"));
     }
 
 private:
@@ -57,7 +56,7 @@
     if (clampToPremul != that.clampToPremul) return false;
     return true;
 }
-bool GrClampFragmentProcessor::usesExplicitReturn() const { return false; }
+bool GrClampFragmentProcessor::usesExplicitReturn() const { return true; }
 GrClampFragmentProcessor::GrClampFragmentProcessor(const GrClampFragmentProcessor& src)
         : INHERITED(kGrClampFragmentProcessor_ClassID, src.optimizationFlags())
         , clampToPremul(src.clampToPremul) {
diff --git a/src/gpu/effects/generated/GrDitherEffect.cpp b/src/gpu/effects/generated/GrDitherEffect.cpp
index 878bb51..0c5afde 100644
--- a/src/gpu/effects/generated/GrDitherEffect.cpp
+++ b/src/gpu/effects/generated/GrDitherEffect.cpp
@@ -28,7 +28,7 @@
         (void)range;
         rangeVar = args.fUniformHandler->addUniform(&_outer, kFragment_GrShaderFlag, kHalf_GrSLType,
                                                     "range");
-        SkString _sample302 = this->invokeChild(0, args);
+        SkString _sample303 = this->invokeChild(0, args);
         fragBuilder->codeAppendf(
                 R"SkSL(half4 color = %s;
 half value;
@@ -43,10 +43,9 @@
     bits.xz = abs(bits.xz - bits.yw);
     value = dot(bits, half4(0.5, 0.25, 0.125, 0.0625)) - 0.46875;
 }
-%s = half4(clamp(color.xyz + value * %s, 0.0, color.w), color.w);
+return half4(clamp(color.xyz + value * %s, 0.0, color.w), color.w);
 )SkSL",
-                _sample302.c_str(), args.fOutputColor,
-                args.fUniformHandler->getUniformCStr(rangeVar));
+                _sample303.c_str(), args.fUniformHandler->getUniformCStr(rangeVar));
     }
 
 private:
@@ -68,7 +67,7 @@
     if (range != that.range) return false;
     return true;
 }
-bool GrDitherEffect::usesExplicitReturn() const { return false; }
+bool GrDitherEffect::usesExplicitReturn() const { return true; }
 GrDitherEffect::GrDitherEffect(const GrDitherEffect& src)
         : INHERITED(kGrDitherEffect_ClassID, src.optimizationFlags()), range(src.range) {
     this->cloneAndRegisterAllChildProcessors(src);
diff --git a/src/gpu/gradients/GrClampedGradientEffect.fp b/src/gpu/gradients/GrClampedGradientEffect.fp
index 57dc65a..2e9a513 100644
--- a/src/gpu/gradients/GrClampedGradientEffect.fp
+++ b/src/gpu/gradients/GrClampedGradientEffect.fp
@@ -24,27 +24,29 @@
 // Trust the creator that this matches the color spec of the gradient
 in bool colorsAreOpaque;
 
-void main() {
+half4 main() {
     half4 t = sample(gradLayout);
+    half4 outColor;
+
     // If t.x is below 0, use the left border color without invoking the child processor. If any t.x
     // is above 1, use the right border color. Otherwise, t is in the [0, 1] range assumed by the
     // colorizer FP, so delegate to the child processor.
     if (!gradLayout.preservesOpaqueInput && t.y < 0) {
         // layout has rejected this fragment (rely on sksl to remove this branch if the layout FP
         // preserves opacity is false)
-        sk_OutColor = half4(0);
+        outColor = half4(0);
     } else if (t.x < 0) {
-        sk_OutColor = leftBorderColor;
+        outColor = leftBorderColor;
     } else if (t.x > 1.0) {
-        sk_OutColor = rightBorderColor;
+        outColor = rightBorderColor;
     } else {
         // Always sample from (x, 0), discarding y, since the layout FP can use y as a side-channel.
-        sk_OutColor = sample(colorizer, t.x0);
+        outColor = sample(colorizer, t.x0);
     }
-
     @if (makePremul) {
-        sk_OutColor.xyz *= sk_OutColor.w;
+        outColor.rgb *= outColor.a;
     }
+    return outColor;
 }
 
 //////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/gradients/GrTiledGradientEffect.fp b/src/gpu/gradients/GrTiledGradientEffect.fp
index 370f48a..30b94ff 100644
--- a/src/gpu/gradients/GrTiledGradientEffect.fp
+++ b/src/gpu/gradients/GrTiledGradientEffect.fp
@@ -15,13 +15,13 @@
 // Trust the creator that this matches the color spec of the gradient
 in bool colorsAreOpaque;
 
-void main() {
+half4 main() {
     half4 t = sample(gradLayout);
 
     if (!gradLayout.preservesOpaqueInput && t.y < 0) {
         // layout has rejected this fragment (rely on sksl to remove this branch if the layout FP
         // preserves opacity is false)
-        sk_OutColor = half4(0);
+        return half4(0);
     } else {
         @if (mirror) {
             half t_1 = t.x - 1;
@@ -39,11 +39,12 @@
         }
 
         // Always sample from (x, 0), discarding y, since the layout FP can use y as a side-channel.
-        sk_OutColor = sample(colorizer, t.x0);
-    }
-
-    @if (makePremul) {
-        sk_OutColor.xyz *= sk_OutColor.w;
+        @if (!makePremul) {
+            return sample(colorizer, t.x0);
+        } else {
+            half4 outColor = sample(colorizer, t.x0);
+            return outColor * outColor.aaa1;
+        }
     }
 }
 
diff --git a/src/gpu/gradients/generated/GrClampedGradientEffect.cpp b/src/gpu/gradients/generated/GrClampedGradientEffect.cpp
index 8320a71..bd3f4f6 100644
--- a/src/gpu/gradients/generated/GrClampedGradientEffect.cpp
+++ b/src/gpu/gradients/generated/GrClampedGradientEffect.cpp
@@ -36,33 +36,33 @@
                                                               kHalf4_GrSLType, "leftBorderColor");
         rightBorderColorVar = args.fUniformHandler->addUniform(&_outer, kFragment_GrShaderFlag,
                                                                kHalf4_GrSLType, "rightBorderColor");
-        SkString _sample1102 = this->invokeChild(1, args);
+        SkString _sample1103 = this->invokeChild(1, args);
         fragBuilder->codeAppendf(
                 R"SkSL(half4 t = %s;
+half4 outColor;
 if (!%s && t.y < 0.0) {
-    %s = half4(0.0);
+    outColor = half4(0.0);
 } else if (t.x < 0.0) {
-    %s = %s;
+    outColor = %s;
 } else if (t.x > 1.0) {
-    %s = %s;
+    outColor = %s;
 } else {)SkSL",
-                _sample1102.c_str(),
+                _sample1103.c_str(),
                 (_outer.childProcessor(1)->preservesOpaqueInput() ? "true" : "false"),
-                args.fOutputColor, args.fOutputColor,
-                args.fUniformHandler->getUniformCStr(leftBorderColorVar), args.fOutputColor,
+                args.fUniformHandler->getUniformCStr(leftBorderColorVar),
                 args.fUniformHandler->getUniformCStr(rightBorderColorVar));
-        SkString _coords1871("float2(half2(t.x, 0.0))");
-        SkString _sample1871 = this->invokeChild(0, args, _coords1871.c_str());
+        SkString _coords1881("float2(half2(t.x, 0.0))");
+        SkString _sample1881 = this->invokeChild(0, args, _coords1881.c_str());
         fragBuilder->codeAppendf(
                 R"SkSL(
-    %s = %s;
+    outColor = %s;
 }
 @if (%s) {
-    %s.xyz *= %s.w;
+    outColor.xyz *= outColor.w;
 }
+return outColor;
 )SkSL",
-                args.fOutputColor, _sample1871.c_str(), (_outer.makePremul ? "true" : "false"),
-                args.fOutputColor, args.fOutputColor);
+                _sample1881.c_str(), (_outer.makePremul ? "true" : "false"));
     }
 
 private:
@@ -103,7 +103,7 @@
     if (colorsAreOpaque != that.colorsAreOpaque) return false;
     return true;
 }
-bool GrClampedGradientEffect::usesExplicitReturn() const { return false; }
+bool GrClampedGradientEffect::usesExplicitReturn() const { return true; }
 GrClampedGradientEffect::GrClampedGradientEffect(const GrClampedGradientEffect& src)
         : INHERITED(kGrClampedGradientEffect_ClassID, src.optimizationFlags())
         , leftBorderColor(src.leftBorderColor)
diff --git a/src/gpu/gradients/generated/GrTiledGradientEffect.cpp b/src/gpu/gradients/generated/GrTiledGradientEffect.cpp
index 2a8315e..10fee8c 100644
--- a/src/gpu/gradients/generated/GrTiledGradientEffect.cpp
+++ b/src/gpu/gradients/generated/GrTiledGradientEffect.cpp
@@ -30,11 +30,11 @@
         (void)makePremul;
         auto colorsAreOpaque = _outer.colorsAreOpaque;
         (void)colorsAreOpaque;
-        SkString _sample453 = this->invokeChild(1, args);
+        SkString _sample454 = this->invokeChild(1, args);
         fragBuilder->codeAppendf(
                 R"SkSL(half4 t = %s;
 if (!%s && t.y < 0.0) {
-    %s = half4(0.0);
+    return half4(0.0);
 } else {
     @if (%s) {
         half t_1 = t.x - 1.0;
@@ -45,22 +45,28 @@
         t.x = abs(tiled_t);
     } else {
         t.x = fract(t.x);
-    })SkSL",
-                _sample453.c_str(),
+    }
+    @if (!%s) {)SkSL",
+                _sample454.c_str(),
                 (_outer.childProcessor(1)->preservesOpaqueInput() ? "true" : "false"),
-                args.fOutputColor, (_outer.mirror ? "true" : "false"));
-        SkString _coords1451("float2(half2(t.x, 0.0))");
-        SkString _sample1451 = this->invokeChild(0, args, _coords1451.c_str());
+                (_outer.mirror ? "true" : "false"), (_outer.makePremul ? "true" : "false"));
+        SkString _coords1470("float2(half2(t.x, 0.0))");
+        SkString _sample1470 = this->invokeChild(0, args, _coords1470.c_str());
         fragBuilder->codeAppendf(
                 R"SkSL(
-    %s = %s;
-}
-@if (%s) {
-    %s.xyz *= %s.w;
+        return %s;
+    } else {)SkSL",
+                _sample1470.c_str());
+        SkString _coords1541("float2(half2(t.x, 0.0))");
+        SkString _sample1541 = this->invokeChild(0, args, _coords1541.c_str());
+        fragBuilder->codeAppendf(
+                R"SkSL(
+        half4 outColor = %s;
+        return outColor * half4(outColor.www, 1.0);
+    }
 }
 )SkSL",
-                args.fOutputColor, _sample1451.c_str(), (_outer.makePremul ? "true" : "false"),
-                args.fOutputColor, args.fOutputColor);
+                _sample1541.c_str());
     }
 
 private:
@@ -83,7 +89,7 @@
     if (colorsAreOpaque != that.colorsAreOpaque) return false;
     return true;
 }
-bool GrTiledGradientEffect::usesExplicitReturn() const { return false; }
+bool GrTiledGradientEffect::usesExplicitReturn() const { return true; }
 GrTiledGradientEffect::GrTiledGradientEffect(const GrTiledGradientEffect& src)
         : INHERITED(kGrTiledGradientEffect_ClassID, src.optimizationFlags())
         , mirror(src.mirror)