Clean up KawaseBlurFilter
The clamp() calls aren't necessary with the current design and since
x/y are treated the same any duplicated code around stepX/stepY can
also be deleted.
This makes the shader a little simpler and reduces the number of
intermediate const variables that are passed in twice for x and y.
The reason for doing this is to prepare to use this code as a base
for other implementations of blur.
Bug: 185365391
Test: atest BlurTests
Change-Id: I6c75d89dd10d568651f6a6183d25b170ab8526ad
diff --git a/libs/renderengine/skia/filters/KawaseBlurFilter.cpp b/libs/renderengine/skia/filters/KawaseBlurFilter.cpp
index 366d830..e3a0e58 100644
--- a/libs/renderengine/skia/filters/KawaseBlurFilter.cpp
+++ b/libs/renderengine/skia/filters/KawaseBlurFilter.cpp
@@ -35,20 +35,14 @@
KawaseBlurFilter::KawaseBlurFilter(): BlurFilter() {
SkString blurString(R"(
uniform shader child;
- uniform float2 in_blurOffset;
- uniform float2 in_maxSizeXY;
+ uniform float in_blurOffset;
half4 main(float2 xy) {
half4 c = child.eval(xy);
- c += child.eval(float2(clamp( in_blurOffset.x + xy.x, 0, in_maxSizeXY.x),
- clamp( in_blurOffset.y + xy.y, 0, in_maxSizeXY.y)));
- c += child.eval(float2(clamp( in_blurOffset.x + xy.x, 0, in_maxSizeXY.x),
- clamp(-in_blurOffset.y + xy.y, 0, in_maxSizeXY.y)));
- c += child.eval(float2(clamp(-in_blurOffset.x + xy.x, 0, in_maxSizeXY.x),
- clamp( in_blurOffset.y + xy.y, 0, in_maxSizeXY.y)));
- c += child.eval(float2(clamp(-in_blurOffset.x + xy.x, 0, in_maxSizeXY.x),
- clamp(-in_blurOffset.y + xy.y, 0, in_maxSizeXY.y)));
-
+ c += child.eval(xy + float2(+in_blurOffset, +in_blurOffset));
+ c += child.eval(xy + float2(+in_blurOffset, -in_blurOffset));
+ c += child.eval(xy + float2(-in_blurOffset, -in_blurOffset));
+ c += child.eval(xy + float2(-in_blurOffset, +in_blurOffset));
return half4(c.rgb * 0.2, 1.0);
}
)");
@@ -90,9 +84,6 @@
SkImageInfo scaledInfo = input->imageInfo().makeWH(std::ceil(blurRect.width() * kInputScale),
std::ceil(blurRect.height() * kInputScale));
- const float stepX = radiusByPasses;
- const float stepY = radiusByPasses;
-
// For sampling Skia's API expects the inverse of what logically seems appropriate. In this
// case you might expect Translate(blurRect.fLeft, blurRect.fTop) X Scale(kInverseInputScale)
// but instead we must do the inverse.
@@ -104,20 +95,15 @@
SkRuntimeShaderBuilder blurBuilder(mBlurEffect);
blurBuilder.child("child") =
input->makeShader(SkTileMode::kClamp, SkTileMode::kClamp, linear, blurMatrix);
- blurBuilder.uniform("in_blurOffset") = SkV2{stepX * kInputScale, stepY * kInputScale};
- blurBuilder.uniform("in_maxSizeXY") =
- SkV2{blurRect.width() * kInputScale, blurRect.height() * kInputScale};
+ blurBuilder.uniform("in_blurOffset") = radiusByPasses * kInputScale;
sk_sp<SkImage> tmpBlur(blurBuilder.makeImage(context, nullptr, scaledInfo, false));
// And now we'll build our chain of scaled blur stages
for (auto i = 1; i < numberOfPasses; i++) {
- const float stepScale = (float)i * kInputScale;
blurBuilder.child("child") =
tmpBlur->makeShader(SkTileMode::kClamp, SkTileMode::kClamp, linear);
- blurBuilder.uniform("in_blurOffset") = SkV2{stepX * stepScale, stepY * stepScale};
- blurBuilder.uniform("in_maxSizeXY") =
- SkV2{blurRect.width() * kInputScale, blurRect.height() * kInputScale};
+ blurBuilder.uniform("in_blurOffset") = (float) i * radiusByPasses * kInputScale;
tmpBlur = blurBuilder.makeImage(context, nullptr, scaledInfo, false);
}