Retrieve a list of composition settings from front end layer
Replace prepareClientComposition and prepareShadowClientComposition
calls with one that provides a list of composition settings in z-order
to handle layers that renders shadows wihtout any content.
If the EffectLayer is called with an invalid color, skip the color fill.
Test: atest libcompositionengine_test
Test: LayerTransactionTest.SetFlagsSecureEUidSystem
Test: go/wm-smoke
Change-Id: Iad16931341fc2e58247f4439a322c0ad1e8750f8
diff --git a/services/surfaceflinger/EffectLayer.cpp b/services/surfaceflinger/EffectLayer.cpp
index e928c57..9d45e33 100644
--- a/services/surfaceflinger/EffectLayer.cpp
+++ b/services/surfaceflinger/EffectLayer.cpp
@@ -47,18 +47,35 @@
EffectLayer::~EffectLayer() = default;
-std::optional<compositionengine::LayerFE::LayerSettings> EffectLayer::prepareClientComposition(
+std::vector<compositionengine::LayerFE::LayerSettings> EffectLayer::prepareClientCompositionList(
compositionengine::LayerFE::ClientCompositionTargetSettings& targetSettings) {
- auto result = Layer::prepareClientComposition(targetSettings);
- if (!result) {
- return result;
+ std::vector<compositionengine::LayerFE::LayerSettings> results;
+ std::optional<compositionengine::LayerFE::LayerSettings> layerSettings =
+ prepareClientComposition(targetSettings);
+ // Nothing to render.
+ if (!layerSettings) {
+ return {};
}
- result->source.solidColor = getColor().rgb;
- return result;
+
+ std::optional<compositionengine::LayerFE::LayerSettings> shadowSettings =
+ prepareShadowClientComposition(*layerSettings, targetSettings.viewport,
+ targetSettings.dataspace);
+ if (shadowSettings) {
+ results.push_back(*shadowSettings);
+ }
+
+ // If fill bounds are occluded or the fill color is invalid skip the fill settings.
+ if (targetSettings.realContentIsVisible && fillsColor()) {
+ // Set color for color fill settings.
+ layerSettings->source.solidColor = getColor().rgb;
+ results.push_back(*layerSettings);
+ }
+
+ return results;
}
bool EffectLayer::isVisible() const {
- return !isHiddenByPolicy() && getAlpha() > 0.0_hf;
+ return !isHiddenByPolicy() && getAlpha() > 0.0_hf && hasSomethingToDraw();
}
bool EffectLayer::setColor(const half3& color) {
@@ -126,6 +143,11 @@
return layer;
}
+bool EffectLayer::fillsColor() const {
+ return mDrawingState.color.r >= 0.0_hf && mDrawingState.color.g >= 0.0_hf &&
+ mDrawingState.color.b >= 0.0_hf;
+}
+
} // namespace android
// TODO(b/129481165): remove the #pragma below and fix conversion issues