Revert "Calculate texture clamping X/Y coordinates in parallel."
This reverts commit a38945abe337019886f3b6bdcac4a7e3060870c2.
Reason for revert: Pinpoint says it costs RAM on Mac (?), and doesn't show any visible perf benefit
Original change's description:
> Calculate texture clamping X/Y coordinates in parallel.
>
> The X and Y values of `clampedCoord`, `extraRepeatCoord`, and `snapped`
> were being calculated and stored separately, even in cases where work
> could easily be done in tandem. Updated the code so that we use .xy when
> it makes sense to do so.
>
> Change-Id: I10d85670acb4fec960444b3f3c30f2929c6dcaf2
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/318436
> Auto-Submit: John Stiles <johnstiles@google.com>
> Reviewed-by: Brian Salomon <bsalomon@google.com>
> Commit-Queue: Brian Salomon <bsalomon@google.com>
> Commit-Queue: John Stiles <johnstiles@google.com>
TBR=bsalomon@google.com,johnstiles@google.com
Change-Id: I10aaba4caeacaa0b081d10cc900044c37f690782
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/319021
Reviewed-by: John Stiles <johnstiles@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
diff --git a/src/gpu/effects/GrTextureEffect.cpp b/src/gpu/effects/GrTextureEffect.cpp
index a71d330..d62d5ea 100644
--- a/src/gpu/effects/GrTextureEffect.cpp
+++ b/src/gpu/effects/GrTextureEffect.cpp
@@ -479,7 +479,8 @@
case ShaderMode::kRepeat_Nearest_None:
case ShaderMode::kRepeat_Linear_None:
fb->codeAppendf(
- "subsetCoord.%s = mod(inCoord.%s - %s.%s, %s.%s - %s.%s) + %s.%s;",
+ "subsetCoord.%s = mod(inCoord.%s - %s.%s, %s.%s - %s.%s) + "
+ "%s.%s;",
coordSwizzle, coordSwizzle, subsetName, subsetStartSwizzle, subsetName,
subsetStopSwizzle, subsetName, subsetStartSwizzle, subsetName,
subsetStartSwizzle);
@@ -513,8 +514,10 @@
// sample taken using subsetCoord and a sample at extraCoord.
fb->codeAppend("float hw = w/2;");
fb->codeAppend("float n = mod(d - hw, w2);");
- fb->codeAppendf("%s = saturate(half(mix(n, w2 - n, step(w, n)) - hw + 0.5));",
- coordWeight);
+ fb->codeAppendf(
+ "%s = saturate(half(mix(n, w2 - n, step(w, n)) - hw + "
+ "0.5));",
+ coordWeight);
fb->codeAppend("}");
break;
case ShaderMode::kMirrorRepeat:
@@ -555,17 +558,14 @@
bool mipmapRepeatY = m[1] == ShaderMode::kRepeat_Nearest_Mipmap ||
m[1] == ShaderMode::kRepeat_Linear_Mipmap;
- if (mipmapRepeatX || mipmapRepeatY) {
- fb->codeAppend("float2 extraRepeatCoord;");
- }
if (mipmapRepeatX) {
- fb->codeAppend("half repeatCoordWeightX;");
- extraRepeatCoordX = "extraRepeatCoord.x";
+ fb->codeAppend("float extraRepeatCoordX; half repeatCoordWeightX;");
+ extraRepeatCoordX = "extraRepeatCoordX";
repeatCoordWeightX = "repeatCoordWeightX";
}
if (mipmapRepeatY) {
- fb->codeAppend("half repeatCoordWeightY;");
- extraRepeatCoordY = "extraRepeatCoord.y";
+ fb->codeAppend("float extraRepeatCoordY; half repeatCoordWeightY;");
+ extraRepeatCoordY = "extraRepeatCoordY";
repeatCoordWeightY = "repeatCoordWeightY";
}
@@ -574,22 +574,17 @@
subsetCoord(te.fShaderModes[0], "x", "x", "z", extraRepeatCoordX, repeatCoordWeightX);
subsetCoord(te.fShaderModes[1], "y", "y", "w", extraRepeatCoordY, repeatCoordWeightY);
fb->codeAppend("float2 clampedCoord;");
- if (useClamp[0] == useClamp[1]) {
- clampCoord(useClamp[0], "xy", "xy", "zw");
- } else {
- clampCoord(useClamp[0], "x", "x", "z");
- clampCoord(useClamp[1], "y", "y", "w");
- }
+ clampCoord(useClamp[0], "x", "x", "z");
+ clampCoord(useClamp[1], "y", "y", "w");
+
// Additional clamping for the extra coords for kRepeat with mip maps.
- if (mipmapRepeatX && mipmapRepeatY) {
- fb->codeAppendf("extraRepeatCoord = clamp(extraRepeatCoord, %s.xy, %s.zw);",
- clampName, clampName);
- } else if (mipmapRepeatX) {
- fb->codeAppendf("extraRepeatCoord.x = clamp(extraRepeatCoord.x, %s.x, %s.z);",
- clampName, clampName);
- } else if (mipmapRepeatY) {
- fb->codeAppendf("extraRepeatCoord.y = clamp(extraRepeatCoord.y, %s.y, %s.w);",
- clampName, clampName);
+ if (mipmapRepeatX) {
+ fb->codeAppendf("extraRepeatCoordX = clamp(extraRepeatCoordX, %s.x, %s.z);", clampName,
+ clampName);
+ }
+ if (mipmapRepeatY) {
+ fb->codeAppendf("extraRepeatCoordY = clamp(extraRepeatCoordY, %s.y, %s.w);", clampName,
+ clampName);
}
// Do the 2 or 4 texture reads for kRepeatMipMap and then apply the weight(s)
@@ -602,18 +597,18 @@
" mix(%s, %s, repeatCoordWeightX),"
" repeatCoordWeightY);",
read("clampedCoord").c_str(),
- read("float2(extraRepeatCoord.x, clampedCoord.y)").c_str(),
- read("float2(clampedCoord.x, extraRepeatCoord.y)").c_str(),
- read("float2(extraRepeatCoord.x, extraRepeatCoord.y)").c_str());
+ read("float2(extraRepeatCoordX, clampedCoord.y)").c_str(),
+ read("float2(clampedCoord.x, extraRepeatCoordY)").c_str(),
+ read("float2(extraRepeatCoordX, extraRepeatCoordY)").c_str());
} else if (mipmapRepeatX) {
fb->codeAppendf("half4 textureColor = mix(%s, %s, repeatCoordWeightX);",
read("clampedCoord").c_str(),
- read("float2(extraRepeatCoord.x, clampedCoord.y)").c_str());
+ read("float2(extraRepeatCoordX, clampedCoord.y)").c_str());
} else if (mipmapRepeatY) {
fb->codeAppendf("half4 textureColor = mix(%s, %s, repeatCoordWeightY);",
read("clampedCoord").c_str(),
- read("float2(clampedCoord.x, extraRepeatCoord.y)").c_str());
+ read("float2(clampedCoord.x, extraRepeatCoordY)").c_str());
} else {
fb->codeAppendf("half4 textureColor = %s;", read("clampedCoord").c_str());
}
@@ -690,22 +685,15 @@
// Do hard-edge shader transition to border color for kClampToBorderNearest at the
// subset boundaries. Snap the input coordinates to nearest neighbor (with an
// epsilon) before comparing to the subset rect to avoid GPU interpolation errors
- if (m[0] == ShaderMode::kClampToBorder_Nearest &&
- m[1] == ShaderMode::kClampToBorder_Nearest) {
- fb->codeAppendf(
- "float2 snappedXY = floor(inCoord + float2(0.001)) + float2(0.5);"
- "if (any(lessThan(snappedXY, %s.xy)) || any(greaterThan(snappedXY, %s.zw))) {"
- " textureColor = %s;"
- "}",
- subsetName, subsetName, borderName);
- } else if (m[0] == ShaderMode::kClampToBorder_Nearest) {
+ if (m[0] == ShaderMode::kClampToBorder_Nearest) {
fb->codeAppendf(
"float snappedX = floor(inCoord.x + 0.001) + 0.5;"
"if (snappedX < %s.x || snappedX > %s.z) {"
" textureColor = %s;"
"}",
subsetName, subsetName, borderName);
- } else if (m[1] == ShaderMode::kClampToBorder_Nearest) {
+ }
+ if (m[1] == ShaderMode::kClampToBorder_Nearest) {
fb->codeAppendf(
"float snappedY = floor(inCoord.y + 0.001) + 0.5;"
"if (snappedY < %s.y || snappedY > %s.w) {"
@@ -713,7 +701,6 @@
"}",
subsetName, subsetName, borderName);
}
-
fb->codeAppendf("%s = textureColor;", args.fOutputColor);
}
}