Change texture transformation group to have elliptical round rects
Bug: b/178661709
Test: Cache shaders on specific device, confirm with perfetto no cache miss during open and close
of calculator in portrait mode with gesture nav
Change-Id: Iafd3a978da51cf946ed03d929c0c60536c0ccba4
diff --git a/libs/renderengine/skia/Cache.cpp b/libs/renderengine/skia/Cache.cpp
index 0eee564..77e01f4 100644
--- a/libs/renderengine/skia/Cache.cpp
+++ b/libs/renderengine/skia/Cache.cpp
@@ -37,10 +37,6 @@
0.f, 0.7f, 0.f, 0.f,
0.f, 0.f, 1.f, 0.f,
67.3f, 52.2f, 0.f, 1.f);
-const auto kScaleYOnly = mat4(1.f, 0.f, 0.f, 0.f,
- 0.f, 0.7f, 0.f, 0.f,
- 0.f, 0.f, 1.f, 0.f,
- 0.f, 0.f, 0.f, 1.f);
// clang-format on
// When setting layer.sourceDataspace, whether it matches the destination or not determines whether
// a color correction effect is added to the shader.
@@ -188,33 +184,51 @@
}
}
-static void drawTextureScaleLayers(SkiaRenderEngine* renderengine, const DisplaySettings& display,
- const std::shared_ptr<ExternalTexture>& dstTexture,
- const std::shared_ptr<ExternalTexture>& srcTexture) {
+// The unique feature of these layers is that the boundary is slightly smaller than the rounded
+// rect crop, so the rounded edges intersect that boundary and require a different clipping method.
+static void drawClippedLayers(SkiaRenderEngine* renderengine, const DisplaySettings& display,
+ const std::shared_ptr<ExternalTexture>& dstTexture,
+ const std::shared_ptr<ExternalTexture>& srcTexture) {
const Rect& displayRect = display.physicalDisplay;
- FloatRect rect(0, 0, displayRect.width(), displayRect.height());
+ FloatRect rect(0, 0, displayRect.width(), displayRect.height() - 20); // boundary is smaller
+
+ // clang-format off
+ const auto symmetric = mat4(0.9f, 0.f, 0.f, 0.f,
+ 0.f, 0.9f, 0.f, 0.f,
+ 0.f, 0.f, 1.f, 0.f,
+ 8.8f, 8.1f, 0.f, 1.f);
+ const auto asymmetric = mat4(0.9f, 0.f, 0.f, 0.f,
+ 0.f, 0.7f, 0.f, 0.f,
+ 0.f, 0.f, 1.f, 0.f,
+ 8.8f, 8.1f, 0.f, 1.f);
+
+ // clang-format on
LayerSettings layer{
.geometry =
Geometry{
.boundaries = rect,
- .roundedCornersCrop = rect,
- .positionTransform = kScaleAndTranslate,
- .roundedCornersRadius = 300,
+ .roundedCornersRadius = 27, // larger than the 20 above.
+ .roundedCornersCrop =
+ FloatRect(0, 0, displayRect.width(), displayRect.height()),
},
.source = PixelSource{.buffer =
Buffer{
.buffer = srcTexture,
+ .isOpaque = 0,
.maxLuminanceNits = 1000.f,
- .textureTransform = kScaleYOnly,
}},
.sourceDataspace = kOtherDataSpace,
};
auto layers = std::vector<const LayerSettings*>{&layer};
- for (float alpha : {0.5f, 1.f}) {
- layer.alpha = alpha,
- renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache,
- base::unique_fd(), nullptr);
+ for (auto transform : {symmetric, asymmetric}) {
+ layer.geometry.positionTransform = transform;
+ // In real use, I saw alpha of 1.0 and 0.999, probably a mistake, but cache both shaders.
+ for (float alpha : {0.5f, 1.f}) {
+ layer.alpha = alpha,
+ renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache,
+ base::unique_fd(), nullptr);
+ }
}
}
@@ -293,7 +307,7 @@
drawImageLayers(renderengine, display, dstTexture, externalTexture);
// Draw layers for b/185569240.
- drawTextureScaleLayers(renderengine, display, dstTexture, externalTexture);
+ drawClippedLayers(renderengine, display, dstTexture, externalTexture);
const nsecs_t timeAfter = systemTime();
const float compileTimeMs = static_cast<float>(timeAfter - timeBefore) / 1.0E6;