Remove reliance on constant propagation from Ellipse effect.
Being able to copy an sk_Caps bit into a boolean with a nicer name is
helpful, but it relies on the optimizer. Using the sk_Caps value
directly will work even if the optimizer is off.
Change-Id: I3d976f13c435cf471ab764917f78d27dacbf331c
Bug: skia:11378
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/377842
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
diff --git a/src/gpu/effects/GrEllipseEffect.fp b/src/gpu/effects/GrEllipseEffect.fp
index 4d52330..f2fd9dc 100644
--- a/src/gpu/effects/GrEllipseEffect.fp
+++ b/src/gpu/effects/GrEllipseEffect.fp
@@ -20,8 +20,7 @@
// The last two terms can underflow when float != fp32, so we also provide a workaround.
uniform float4 ellipse;
-bool medPrecision = !sk_Caps.floatIs32Bits;
-layout(when=medPrecision) uniform float2 scale;
+layout(when=!sk_Caps.floatIs32Bits) uniform float2 scale;
@make {
static GrFPResult Make(std::unique_ptr<GrFragmentProcessor> inputFP, GrClipEdgeType edgeType,
@@ -82,7 +81,7 @@
// that is normalized by the larger radius or 128, whichever is smaller. The scale uniform will
// be scale, 1/scale. The inverse squared radii uniform values are already in this normalized space.
// The center is not.
- @if (medPrecision) {
+ @if (!sk_Caps.floatIs32Bits) {
d *= scale.y;
}
float2 Z = d * ellipse.zw;
@@ -91,13 +90,13 @@
// grad_dot is the squared length of the gradient of the implicit.
float grad_dot = 4 * dot(Z, Z);
// Avoid calling inversesqrt on zero.
- @if (medPrecision) {
+ @if (!sk_Caps.floatIs32Bits) {
grad_dot = max(grad_dot, 6.1036e-5);
} else {
grad_dot = max(grad_dot, 1.1755e-38);
}
float approx_dist = implicit * inversesqrt(grad_dot);
- @if (medPrecision) {
+ @if (!sk_Caps.floatIs32Bits) {
approx_dist *= scale.x;
}
diff --git a/src/gpu/effects/generated/GrEllipseEffect.cpp b/src/gpu/effects/generated/GrEllipseEffect.cpp
index 961da12..2649f1e 100644
--- a/src/gpu/effects/generated/GrEllipseEffect.cpp
+++ b/src/gpu/effects/generated/GrEllipseEffect.cpp
@@ -31,31 +31,29 @@
auto radii = _outer.radii;
(void)radii;
prevRadii = float2(-1.0);
- medPrecision = !sk_Caps.floatIs32Bits;
ellipseVar = args.fUniformHandler->addUniform(&_outer, kFragment_GrShaderFlag,
kFloat4_GrSLType, "ellipse");
- if (medPrecision) {
+ if (!sk_Caps.floatIs32Bits) {
scaleVar = args.fUniformHandler->addUniform(&_outer, kFragment_GrShaderFlag,
kFloat2_GrSLType, "scale");
}
fragBuilder->codeAppendf(
R"SkSL(float2 prevCenter;
float2 prevRadii = float2(%f, %f);
-bool medPrecision = %s;
float2 d = sk_FragCoord.xy - %s.xy;
-@if (medPrecision) {
+@if (!sk_Caps.floatIs32Bits) {
d *= %s.y;
}
float2 Z = d * %s.zw;
float implicit = dot(Z, d) - 1.0;
float grad_dot = 4.0 * dot(Z, Z);
-@if (medPrecision) {
+@if (!sk_Caps.floatIs32Bits) {
grad_dot = max(grad_dot, 6.1036000261083245e-05);
} else {
grad_dot = max(grad_dot, 1.1754999560161448e-38);
}
float approx_dist = implicit * inversesqrt(grad_dot);
-@if (medPrecision) {
+@if (!sk_Caps.floatIs32Bits) {
approx_dist *= %s.x;
}
half alpha;
@@ -75,8 +73,7 @@
default:
discard;
})SkSL",
- prevRadii.fX, prevRadii.fY, (medPrecision ? "true" : "false"),
- args.fUniformHandler->getUniformCStr(ellipseVar),
+ prevRadii.fX, prevRadii.fY, args.fUniformHandler->getUniformCStr(ellipseVar),
scaleVar.isValid() ? args.fUniformHandler->getUniformCStr(scaleVar) : "float2(0)",
args.fUniformHandler->getUniformCStr(ellipseVar),
scaleVar.isValid() ? args.fUniformHandler->getUniformCStr(scaleVar) : "float2(0)",
@@ -131,7 +128,6 @@
}
SkPoint prevCenter = float2(0);
SkPoint prevRadii = float2(0);
- bool medPrecision = false;
UniformHandle ellipseVar;
UniformHandle scaleVar;
};