Improve gencode for inlined blend and composition functions.

Using `return` instead of assigning to the output color removes an
unnecessary temporary variable from the output.

Change-Id: Ica31e290f8745a7309ae32c7148516d2189308ea
Bug: skia:10549
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/328386
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/GrFragmentProcessor.cpp b/src/gpu/GrFragmentProcessor.cpp
index b94326c..bed7a9f 100644
--- a/src/gpu/GrFragmentProcessor.cpp
+++ b/src/gpu/GrFragmentProcessor.cpp
@@ -425,7 +425,7 @@
                 void emitCode(EmitArgs& args) override {
                     SkString result = this->invokeChild(0, args);
                     result = this->invokeChild(1, result.c_str(), args);
-                    args.fFragBuilder->codeAppendf("%s = %s;", args.fOutputColor, result.c_str());
+                    args.fFragBuilder->codeAppendf("return %s;", result.c_str());
                 }
             };
             return new GLFP;
@@ -447,6 +447,7 @@
         void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override {}
 
         bool onIsEqual(const GrFragmentProcessor&) const override { return true; }
+        bool usesExplicitReturn() const override { return true; }
 
         SkPMColor4f constantOutputForConstantInput(const SkPMColor4f& inColor) const override {
             SkPMColor4f color = inColor;
diff --git a/src/gpu/effects/GrBlendFragmentProcessor.cpp b/src/gpu/effects/GrBlendFragmentProcessor.cpp
index cbfa512..ea77666 100644
--- a/src/gpu/effects/GrBlendFragmentProcessor.cpp
+++ b/src/gpu/effects/GrBlendFragmentProcessor.cpp
@@ -176,6 +176,8 @@
         return fMode == cs.fMode;
     }
 
+    bool usesExplicitReturn() const override { return true; }
+
     SkPMColor4f constantOutputForConstantInput(const SkPMColor4f& input) const override {
         const auto* src = this->childProcessor(0);
         const auto* dst = this->childProcessor(1);
@@ -309,13 +311,15 @@
     }
 
     // Blend src and dst colors together.
-    GrGLSLBlend::AppendMode(fragBuilder, srcColor.c_str(), dstColor.c_str(),
-                            args.fOutputColor, mode);
+    fragBuilder->codeAppendf("return %s(%s, %s)", GrGLSLBlend::BlendFuncName(mode),
+                             srcColor.c_str(), dstColor.c_str());
 
     // Reapply alpha from input color if we are doing a compose-two.
     if (behavior == BlendBehavior::kComposeTwoBehavior) {
-        fragBuilder->codeAppendf("%s *= %s.a;\n", args.fOutputColor, args.fInputColor);
+        fragBuilder->codeAppendf(" * %s.a", args.fInputColor);
     }
+
+    fragBuilder->codeAppendf(";\n");
 }
 
 //////////////////////////////////////////////////////////////////////////////