Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 12fb9cf

Browse files
Ethan NicholasSkia Commit-Bot
Ethan Nicholas
authored and
Skia Commit-Bot
committed
added SkSL saturate() function
Bug: skia:8220 Change-Id: Ib2e58ac77345a2aa53302c6c1484d52533556f93 Reviewed-on: https://skia-review.googlesource.com/145371 Reviewed-by: Greg Daniel <[email protected]> Commit-Queue: Ethan Nicholas <[email protected]>
1 parent 2e77f54 commit 12fb9cf

24 files changed

+261
-180
lines changed

src/core/SkColorMatrixFilterRowMajor255.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ class ColorMatrixEffect : public GrFragmentProcessor {
221221
uniformHandler->getUniformCStr(fMatrixHandle),
222222
args.fInputColor,
223223
uniformHandler->getUniformCStr(fVectorHandle));
224-
fragBuilder->codeAppendf("\t%s = clamp(%s, 0.0, 1.0);\n",
224+
fragBuilder->codeAppendf("\t%s = saturate(%s);\n",
225225
args.fOutputColor, args.fOutputColor);
226226
fragBuilder->codeAppendf("\t%s.rgb *= %s.a;\n", args.fOutputColor, args.fOutputColor);
227227
}

src/effects/SkHighContrastFilter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ void GLHighContrastFilterEffect::emitCode(EmitArgs& args) {
343343
fragBuilder->codeAppendf("}");
344344

345345
// Clamp.
346-
fragBuilder->codeAppendf("color = clamp(color, 0, 1);");
346+
fragBuilder->codeAppendf("color = saturate(color);");
347347

348348
if (hcfe.linearize()) {
349349
fragBuilder->codeAppend("color.rgb = sqrt(color.rgb);");

src/effects/imagefilters/SkDisplacementMapEffect.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@ void GrGLDisplacementMapEffect::emitCode(EmitArgs& args) {
551551

552552
// Unpremultiply the displacement
553553
fragBuilder->codeAppendf(
554-
"\t\t%s.rgb = (%s.a < %s) ? half3(0.0) : clamp(%s.rgb / %s.a, 0.0, 1.0);",
554+
"\t\t%s.rgb = (%s.a < %s) ? half3(0.0) : saturate(%s.rgb / %s.a);",
555555
dColor, dColor, nearZero, dColor, dColor);
556556
SkString coords2D = fragBuilder->ensureCoords2D(args.fTransformedCoords[1]);
557557
fragBuilder->codeAppendf("\t\tfloat2 %s = %s + %s*(%s.",

src/effects/imagefilters/SkLightingImageFilter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1945,7 +1945,7 @@ void GrGLDiffuseLightingEffect::emitLightFunc(GrGLSLUniformHandler* uniformHandl
19451945
};
19461946
SkString lightBody;
19471947
lightBody.appendf("\thalf colorScale = %s * dot(normal, surfaceToLight);\n", kd);
1948-
lightBody.appendf("\treturn half4(lightColor * clamp(colorScale, 0.0, 1.0), 1.0);\n");
1948+
lightBody.appendf("\treturn half4(lightColor * saturate(colorScale), 1.0);\n");
19491949
fragBuilder->emitFunction(kHalf4_GrSLType,
19501950
"light",
19511951
SK_ARRAY_COUNT(gLightArgs),
@@ -2043,7 +2043,7 @@ void GrGLSpecularLightingEffect::emitLightFunc(GrGLSLUniformHandler* uniformHand
20432043
lightBody.appendf("\thalf3 halfDir = half3(normalize(surfaceToLight + half3(0, 0, 1)));\n");
20442044
lightBody.appendf("\tfloat colorScale = %s * pow(dot(normal, halfDir), %s);\n",
20452045
ks, shininess);
2046-
lightBody.appendf("\thalf3 color = lightColor * clamp(colorScale, 0.0, 1.0);\n");
2046+
lightBody.appendf("\thalf3 color = lightColor * saturate(colorScale);\n");
20472047
lightBody.appendf("\treturn half4(color, max(max(color.r, color.g), color.b));\n");
20482048
fragBuilder->emitFunction(kHalf4_GrSLType,
20492049
"light",

src/gpu/effects/GrArithmeticFP.fp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ uniform float4 k;
1616

1717
void main() {
1818
half4 dst = process(child);
19-
sk_OutColor = clamp(k.x * sk_InColor * dst + k.y * sk_InColor + k.z * dst + k.w, 0, 1);
19+
sk_OutColor = saturate(k.x * sk_InColor * dst + k.y * sk_InColor + k.z * dst + k.w);
2020
if (enforcePMColor) {
2121
sk_OutColor.rgb = min(sk_OutColor.rgb, sk_OutColor.a);
2222
}

src/gpu/effects/GrBezierEffect.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
175175
func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
176176
fragBuilder->codeAppendf("%s = %s / %s;",
177177
edgeAlpha.c_str(), func.c_str(), gFM.c_str());
178-
fragBuilder->codeAppendf("%s = clamp(0.5 - %s, 0.0, 1.0);",
178+
fragBuilder->codeAppendf("%s = saturate(0.5 - %s);",
179179
edgeAlpha.c_str(), edgeAlpha.c_str());
180180
// Add line below for smooth cubic ramp
181181
// fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
@@ -380,7 +380,7 @@ void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
380380
fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
381381
v.fsIn(), v.fsIn(), v.fsIn());
382382
fragBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));");
383-
fragBuilder->codeAppend("edgeAlpha = clamp(0.5 - edgeAlpha, 0.0, 1.0);");
383+
fragBuilder->codeAppend("edgeAlpha = saturate(0.5 - edgeAlpha);");
384384
// Add line below for smooth cubic ramp
385385
// fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
386386
break;
@@ -615,7 +615,7 @@ void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
615615
v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
616616
fragBuilder->codeAppendf("%s = %s * inversesqrt(dot(%s, %s));",
617617
edgeAlpha.c_str(), func.c_str(), gF.c_str(), gF.c_str());
618-
fragBuilder->codeAppendf("%s = clamp(0.5 - %s, 0.0, 1.0);",
618+
fragBuilder->codeAppendf("%s = saturate(0.5 - %s);",
619619
edgeAlpha.c_str(), edgeAlpha.c_str());
620620
// Add line below for smooth cubic ramp
621621
// fragBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);",

src/gpu/effects/GrCircleEffect.fp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ void main() {
6060
@if (edgeType == GrClipEdgeType::kFillAA ||
6161
edgeType == GrClipEdgeType::kInverseFillAA ||
6262
edgeType == GrClipEdgeType::kHairlineAA) {
63-
d = clamp(d, 0.0, 1.0);
63+
d = saturate(d);
6464
} else {
6565
d = d > 0.5 ? 1.0 : 0.0;
6666
}

src/gpu/effects/GrConvexPolyEffect.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ void GrGLConvexPolyEffect::emitCode(EmitArgs& args) {
5454
"1));\n",
5555
edgeArrayName, i);
5656
if (GrProcessorEdgeTypeIsAA(cpe.getEdgeType())) {
57-
fragBuilder->codeAppend("\t\tedge = clamp(edge, 0.0, 1.0);\n");
57+
fragBuilder->codeAppend("\t\tedge = saturate(edge);\n");
5858
} else {
5959
fragBuilder->codeAppend("\t\tedge = edge >= 0.5 ? 1.0 : 0.0;\n");
6060
}

src/gpu/effects/GrDistanceFieldGeoProc.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ class GrGLDistanceFieldA8TextGeoProc : public GrGLSLGeometryProcessor {
152152
// doing gamma-correct rendering (to an sRGB or F16 buffer), then we actually want
153153
// distance mapped linearly to coverage, so use a linear step:
154154
fragBuilder->codeAppend(
155-
"half val = clamp((distance + afwidth) / (2.0 * afwidth), 0.0, 1.0);");
155+
"half val = saturate((distance + afwidth) / (2.0 * afwidth));");
156156
} else {
157157
fragBuilder->codeAppend("half val = smoothstep(-afwidth, afwidth, distance);");
158158
}
@@ -447,7 +447,7 @@ class GrGLDistanceFieldPathGeoProc : public GrGLSLGeometryProcessor {
447447
// mapped linearly to coverage, so use a linear step:
448448
if (isGammaCorrect) {
449449
fragBuilder->codeAppend(
450-
"half val = clamp((distance + afwidth) / (2.0 * afwidth), 0.0, 1.0);");
450+
"half val = saturate((distance + afwidth) / (2.0 * afwidth));");
451451
} else {
452452
fragBuilder->codeAppend("half val = smoothstep(-afwidth, afwidth, distance);");
453453
}
@@ -766,7 +766,7 @@ class GrGLDistanceFieldLCDTextGeoProc : public GrGLSLGeometryProcessor {
766766
// mapped linearly to coverage, so use a linear step:
767767
if (isGammaCorrect) {
768768
fragBuilder->codeAppendf("%s = "
769-
"half4(clamp((distance + half3(afwidth)) / half3(2.0 * afwidth), 0.0, 1.0), 1.0);",
769+
"half4(saturate((distance + half3(afwidth)) / half3(2.0 * afwidth)), 1.0);",
770770
args.fOutputCoverage);
771771
} else {
772772
fragBuilder->codeAppendf(

src/gpu/effects/GrEllipseEffect.fp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,13 @@ void main() {
9191
alpha = approx_dist > 0.0 ? 0.0 : 1.0;
9292
break;
9393
case GrClipEdgeType::kFillAA:
94-
alpha = clamp(0.5 - approx_dist, 0.0, 1.0);
94+
alpha = saturate(0.5 - approx_dist);
9595
break;
9696
case GrClipEdgeType::kInverseFillBW:
9797
alpha = approx_dist > 0.0 ? 1.0 : 0.0;
9898
break;
9999
case GrClipEdgeType::kInverseFillAA:
100-
alpha = clamp(0.5 + approx_dist, 0.0, 1.0);
100+
alpha = saturate(0.5 + approx_dist);
101101
break;
102102
default:
103103
// hairline not supported

src/gpu/effects/GrMatrixConvolutionEffect.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,14 @@ void GrGLMatrixConvolutionEffect::emitCode(EmitArgs& args) {
8787
args.fTexSamplers[0]);
8888
if (!mce.convolveAlpha()) {
8989
fragBuilder->codeAppend("c.rgb /= c.a;");
90-
fragBuilder->codeAppend("c.rgb = clamp(c.rgb, 0.0, 1.0);");
90+
fragBuilder->codeAppend("c.rgb = saturate(c.rgb);");
9191
}
9292
fragBuilder->codeAppend("sum += c * k;");
9393
}
9494
}
9595
if (mce.convolveAlpha()) {
9696
fragBuilder->codeAppendf("%s = sum * %s + %s;", args.fOutputColor, gain, bias);
97-
fragBuilder->codeAppendf("%s.a = clamp(%s.a, 0, 1);", args.fOutputColor, args.fOutputColor);
97+
fragBuilder->codeAppendf("%s.a = saturate(%s.a);", args.fOutputColor, args.fOutputColor);
9898
fragBuilder->codeAppendf("%s.rgb = clamp(%s.rgb, 0.0, %s.a);",
9999
args.fOutputColor, args.fOutputColor, args.fOutputColor);
100100
} else {
@@ -106,7 +106,7 @@ void GrGLMatrixConvolutionEffect::emitCode(EmitArgs& args) {
106106
coords2D,
107107
args.fTexSamplers[0]);
108108
fragBuilder->codeAppendf("%s.a = c.a;", args.fOutputColor);
109-
fragBuilder->codeAppendf("%s.rgb = clamp(sum.rgb * %s + %s, 0, 1);", args.fOutputColor, gain, bias);
109+
fragBuilder->codeAppendf("%s.rgb = saturate(sum.rgb * %s + %s);", args.fOutputColor, gain, bias);
110110
fragBuilder->codeAppendf("%s.rgb *= %s.a;", args.fOutputColor, args.fOutputColor);
111111
}
112112
fragBuilder->codeAppendf("%s *= %s;\n", args.fOutputColor, args.fInputColor);

src/gpu/effects/GrRRectEffect.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -166,10 +166,10 @@ void GLCircularRRectEffect::emitCode(EmitArgs& args) {
166166
// If we're on a device where float != fp32 then the length calculation could overflow.
167167
SkString clampedCircleDistance;
168168
if (!args.fShaderCaps->floatIs32Bits()) {
169-
clampedCircleDistance.printf("clamp(%s.x * (1.0 - length(dxy * %s.y)), 0.0, 1.0);",
169+
clampedCircleDistance.printf("saturate(%s.x * (1.0 - length(dxy * %s.y)));",
170170
radiusPlusHalfName, radiusPlusHalfName);
171171
} else {
172-
clampedCircleDistance.printf("clamp(%s.x - length(dxy), 0.0, 1.0);", radiusPlusHalfName);
172+
clampedCircleDistance.printf("saturate(%s.x - length(dxy));", radiusPlusHalfName);
173173
}
174174

175175
GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
@@ -198,9 +198,9 @@ void GLCircularRRectEffect::emitCode(EmitArgs& args) {
198198
case CircularRRectEffect::kTopLeft_CornerFlag:
199199
fragBuilder->codeAppendf("float2 dxy = max(%s.xy - sk_FragCoord.xy, 0.0);",
200200
rectName);
201-
fragBuilder->codeAppendf("half rightAlpha = clamp(%s.z - sk_FragCoord.x, 0.0, 1.0);",
201+
fragBuilder->codeAppendf("half rightAlpha = saturate(%s.z - sk_FragCoord.x);",
202202
rectName);
203-
fragBuilder->codeAppendf("half bottomAlpha = clamp(%s.w - sk_FragCoord.y, 0.0, 1.0);",
203+
fragBuilder->codeAppendf("half bottomAlpha = saturate(%s.w - sk_FragCoord.y);",
204204
rectName);
205205
fragBuilder->codeAppendf("half alpha = bottomAlpha * rightAlpha * %s;",
206206
clampedCircleDistance.c_str());
@@ -209,19 +209,19 @@ void GLCircularRRectEffect::emitCode(EmitArgs& args) {
209209
fragBuilder->codeAppendf("float2 dxy = max(float2(sk_FragCoord.x - %s.z, "
210210
"%s.y - sk_FragCoord.y), 0.0);",
211211
rectName, rectName);
212-
fragBuilder->codeAppendf("half leftAlpha = clamp(sk_FragCoord.x - %s.x, 0.0, 1.0);",
212+
fragBuilder->codeAppendf("half leftAlpha = saturate(sk_FragCoord.x - %s.x);",
213213
rectName);
214-
fragBuilder->codeAppendf("half bottomAlpha = clamp(%s.w - sk_FragCoord.y, 0.0, 1.0);",
214+
fragBuilder->codeAppendf("half bottomAlpha = saturate(%s.w - sk_FragCoord.y);",
215215
rectName);
216216
fragBuilder->codeAppendf("half alpha = bottomAlpha * leftAlpha * %s;",
217217
clampedCircleDistance.c_str());
218218
break;
219219
case CircularRRectEffect::kBottomRight_CornerFlag:
220220
fragBuilder->codeAppendf("float2 dxy = max(sk_FragCoord.xy - %s.zw, 0.0);",
221221
rectName);
222-
fragBuilder->codeAppendf("half leftAlpha = clamp(sk_FragCoord.x - %s.x, 0.0, 1.0);",
222+
fragBuilder->codeAppendf("half leftAlpha = saturate(sk_FragCoord.x - %s.x);",
223223
rectName);
224-
fragBuilder->codeAppendf("half topAlpha = clamp(sk_FragCoord.y - %s.y, 0.0, 1.0);",
224+
fragBuilder->codeAppendf("half topAlpha = saturate(sk_FragCoord.y - %s.y);",
225225
rectName);
226226
fragBuilder->codeAppendf("half alpha = topAlpha * leftAlpha * %s;",
227227
clampedCircleDistance.c_str());
@@ -230,9 +230,9 @@ void GLCircularRRectEffect::emitCode(EmitArgs& args) {
230230
fragBuilder->codeAppendf("float2 dxy = max(float2(%s.x - sk_FragCoord.x, "
231231
"sk_FragCoord.y - %s.w), 0.0);",
232232
rectName, rectName);
233-
fragBuilder->codeAppendf("half rightAlpha = clamp(%s.z - sk_FragCoord.x, 0.0, 1.0);",
233+
fragBuilder->codeAppendf("half rightAlpha = saturate(%s.z - sk_FragCoord.x);",
234234
rectName);
235-
fragBuilder->codeAppendf("half topAlpha = clamp(sk_FragCoord.y - %s.y, 0.0, 1.0);",
235+
fragBuilder->codeAppendf("half topAlpha = saturate(sk_FragCoord.y - %s.y);",
236236
rectName);
237237
fragBuilder->codeAppendf("half alpha = topAlpha * rightAlpha * %s;",
238238
clampedCircleDistance.c_str());
@@ -241,7 +241,7 @@ void GLCircularRRectEffect::emitCode(EmitArgs& args) {
241241
fragBuilder->codeAppendf("float2 dxy0 = %s.xy - sk_FragCoord.xy;", rectName);
242242
fragBuilder->codeAppendf("float dy1 = sk_FragCoord.y - %s.w;", rectName);
243243
fragBuilder->codeAppend("float2 dxy = max(float2(dxy0.x, max(dxy0.y, dy1)), 0.0);");
244-
fragBuilder->codeAppendf("half rightAlpha = clamp(%s.z - sk_FragCoord.x, 0.0, 1.0);",
244+
fragBuilder->codeAppendf("half rightAlpha = saturate(%s.z - sk_FragCoord.x);",
245245
rectName);
246246
fragBuilder->codeAppendf("half alpha = rightAlpha * %s;",
247247
clampedCircleDistance.c_str());
@@ -250,7 +250,7 @@ void GLCircularRRectEffect::emitCode(EmitArgs& args) {
250250
fragBuilder->codeAppendf("float2 dxy0 = %s.xy - sk_FragCoord.xy;", rectName);
251251
fragBuilder->codeAppendf("float dx1 = sk_FragCoord.x - %s.z;", rectName);
252252
fragBuilder->codeAppend("float2 dxy = max(float2(max(dxy0.x, dx1), dxy0.y), 0.0);");
253-
fragBuilder->codeAppendf("half bottomAlpha = clamp(%s.w - sk_FragCoord.y, 0.0, 1.0);",
253+
fragBuilder->codeAppendf("half bottomAlpha = saturate(%s.w - sk_FragCoord.y);",
254254
rectName);
255255
fragBuilder->codeAppendf("half alpha = bottomAlpha * %s;",
256256
clampedCircleDistance.c_str());
@@ -259,7 +259,7 @@ void GLCircularRRectEffect::emitCode(EmitArgs& args) {
259259
fragBuilder->codeAppendf("float dy0 = %s.y - sk_FragCoord.y;", rectName);
260260
fragBuilder->codeAppendf("float2 dxy1 = sk_FragCoord.xy - %s.zw;", rectName);
261261
fragBuilder->codeAppend("float2 dxy = max(float2(dxy1.x, max(dy0, dxy1.y)), 0.0);");
262-
fragBuilder->codeAppendf("half leftAlpha = clamp(sk_FragCoord.x - %s.x, 0.0, 1.0);",
262+
fragBuilder->codeAppendf("half leftAlpha = saturate(sk_FragCoord.x - %s.x);",
263263
rectName);
264264
fragBuilder->codeAppendf("half alpha = leftAlpha * %s;",
265265
clampedCircleDistance.c_str());
@@ -268,7 +268,7 @@ void GLCircularRRectEffect::emitCode(EmitArgs& args) {
268268
fragBuilder->codeAppendf("float dx0 = %s.x - sk_FragCoord.x;", rectName);
269269
fragBuilder->codeAppendf("float2 dxy1 = sk_FragCoord.xy - %s.zw;", rectName);
270270
fragBuilder->codeAppend("float2 dxy = max(float2(max(dx0, dxy1.x), dxy1.y), 0.0);");
271-
fragBuilder->codeAppendf("half topAlpha = clamp(sk_FragCoord.y - %s.y, 0.0, 1.0);",
271+
fragBuilder->codeAppendf("half topAlpha = saturate(sk_FragCoord.y - %s.y);",
272272
rectName);
273273
fragBuilder->codeAppendf("half alpha = topAlpha * %s;",
274274
clampedCircleDistance.c_str());

src/gpu/ops/GrAAConvexPathRenderer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,7 @@ class QuadEdgeEffect : public GrGeometryProcessor {
611611
fragBuilder->codeAppendf("edgeAlpha = (%s.x*%s.x - %s.y);", v.fsIn(), v.fsIn(),
612612
v.fsIn());
613613
fragBuilder->codeAppendf("edgeAlpha = "
614-
"clamp(0.5 - edgeAlpha / length(gF), 0.0, 1.0);}");
614+
"saturate(0.5 - edgeAlpha / length(gF));}");
615615

616616
fragBuilder->codeAppendf("%s = half4(edgeAlpha);", args.fOutputCoverage);
617617
}

src/gpu/ops/GrDashOp.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -951,7 +951,7 @@ void GLDashingCircleEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
951951
if (dce.aaMode() != AAMode::kNone) {
952952
fragBuilder->codeAppendf("half diff = dist - %s.x;", circleParams.fsIn());
953953
fragBuilder->codeAppend("diff = 1.0 - diff;");
954-
fragBuilder->codeAppend("half alpha = clamp(diff, 0.0, 1.0);");
954+
fragBuilder->codeAppend("half alpha = saturate(diff);");
955955
} else {
956956
fragBuilder->codeAppendf("half alpha = 1.0;");
957957
fragBuilder->codeAppendf("alpha *= dist < %s.x + 0.5 ? 1.0 : 0.0;", circleParams.fsIn());

0 commit comments

Comments
 (0)