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");
}
//////////////////////////////////////////////////////////////////////////////