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)