summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Nathaniel Nifong <nifong@google.com> 2021-06-01 12:50:25 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2021-06-01 12:50:25 +0000
commitf1804968780f975fa8fe361c480a15e8dd85d131 (patch)
tree07556136c141c93ad175f5df0084c1e0bd3f8875
parent8092d1a60ccaeac1018ed263c3cce3b5c5682536 (diff)
parentafeac5b9fe949a93921e4c0af42ac35bc6191372 (diff)
Merge "Cache a larger variety of clipped rounded rects" into sc-dev
-rw-r--r--libs/renderengine/skia/Cache.cpp64
1 files changed, 33 insertions, 31 deletions
diff --git a/libs/renderengine/skia/Cache.cpp b/libs/renderengine/skia/Cache.cpp
index 77e01f4967..61c297cf19 100644
--- a/libs/renderengine/skia/Cache.cpp
+++ b/libs/renderengine/skia/Cache.cpp
@@ -37,6 +37,10 @@ const auto kScaleAndTranslate = mat4(0.7f, 0.f, 0.f, 0.f,
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 kScaleAsymmetric = mat4(0.8f, 0.f, 0.f, 0.f,
+ 0.f, 1.1f, 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.
@@ -77,12 +81,7 @@ static void drawShadowLayers(SkiaRenderEngine* renderengine, const DisplaySettin
// This matrix, which has different scales for x and y, will
// generate the slower (more general case) version, which has variants for translucent
// casters and rounded rects.
- // clang-format off
- layer.geometry.positionTransform = mat4(0.7f, 0.f, 0.f, 0.f,
- 0.f, 0.8f, 0.f, 0.f,
- 0.f, 0.f, 1.f, 0.f,
- 0.f, 0.f, 0.f, 1.f);
- // clang-format on
+ layer.geometry.positionTransform = kScaleAsymmetric;
for (auto translucent : {false, true}) {
layer.shadow.casterIsTranslucent = translucent;
renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache,
@@ -150,7 +149,6 @@ static void drawSolidLayers(SkiaRenderEngine* renderengine, const DisplaySetting
PixelSource{
.solidColor = half3(0.1f, 0.2f, 0.3f),
},
- .alpha = 1,
};
auto layers = std::vector<const LayerSettings*>{&layer};
@@ -186,23 +184,26 @@ static void drawBlurLayers(SkiaRenderEngine* renderengine, const DisplaySettings
// 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.
+// For buffers, this is done with a stage that computes coverage and it will differ for round and
+// elliptical corners.
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() - 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);
+ PixelSource bufferSource{.buffer = Buffer{
+ .buffer = srcTexture,
+ .isOpaque = 0,
+ .maxLuminanceNits = 1000.f,
+ }};
+ PixelSource bufferOpaque{.buffer = Buffer{
+ .buffer = srcTexture,
+ .isOpaque = 1,
+ .maxLuminanceNits = 1000.f,
+ }};
+ PixelSource colorSource{.solidColor = half3(0.1f, 0.2f, 0.3f)};
- // clang-format on
LayerSettings layer{
.geometry =
Geometry{
@@ -211,23 +212,24 @@ static void drawClippedLayers(SkiaRenderEngine* renderengine, const DisplaySetti
.roundedCornersCrop =
FloatRect(0, 0, displayRect.width(), displayRect.height()),
},
- .source = PixelSource{.buffer =
- Buffer{
- .buffer = srcTexture,
- .isOpaque = 0,
- .maxLuminanceNits = 1000.f,
- }},
- .sourceDataspace = kOtherDataSpace,
};
auto layers = std::vector<const LayerSettings*>{&layer};
- 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);
+ for (auto pixelSource : {bufferSource, bufferOpaque, colorSource}) {
+ layer.source = pixelSource;
+ for (auto dataspace : {kDestDataSpace, kOtherDataSpace}) {
+ layer.sourceDataspace = dataspace;
+ // Produce a CircularRRect clip and an EllipticalRRect clip
+ for (auto transform : {kScaleAndTranslate, kScaleAsymmetric}) {
+ 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);
+ }
+ }
}
}
}