SF: Add ability to get basic geometry
For computing the layer visibility, CompositionEngine will need to get
basic geometry state for every layer, without getting everything. Add a
new request type for the basic geometry state, and modify the existing
code in computeVisibleRegions to use it rather than accessing directly
through the front-end layer pointer.
Test: atest libsurfaceflinger_unittest libcompositionengine_test
Test: go/wm-smoke
Bug: 121291683
Change-Id: Ie286fe1986a4c383ee390c1f646c7a8a5b8c14f4
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index 5e5302d..974488d 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -417,14 +417,43 @@
win.bottom -= roundedCornersCrop.top;
}
+void Layer::latchBasicGeometry(compositionengine::LayerFECompositionState& compositionState) const {
+ const auto& drawingState{getDrawingState()};
+ const uint32_t layerStack = getLayerStack();
+ const auto alpha = static_cast<float>(getAlpha());
+ const bool opaque = isOpaque(drawingState);
+ const bool usesRoundedCorners = getRoundedCornerState().radius != 0.f;
+
+ auto blendMode = Hwc2::IComposerClient::BlendMode::NONE;
+ if (!opaque || alpha != 1.0f) {
+ blendMode = mPremultipliedAlpha ? Hwc2::IComposerClient::BlendMode::PREMULTIPLIED
+ : Hwc2::IComposerClient::BlendMode::COVERAGE;
+ }
+
+ // TODO(b/121291683): Instead of filling in a passed-in compositionState
+ // structure, switch to Layer owning the structure and have
+ // CompositionEngine be able to get a reference to it.
+
+ compositionState.layerStackId =
+ (layerStack != ~0u) ? std::make_optional(layerStack) : std::nullopt;
+ compositionState.internalOnly = getPrimaryDisplayOnly();
+ compositionState.isVisible = isVisible();
+ compositionState.isOpaque = opaque && !usesRoundedCorners && alpha == 1.f;
+
+ compositionState.contentDirty = contentDirty;
+ contentDirty = false;
+
+ compositionState.geomLayerBounds = mBounds;
+ compositionState.geomLayerTransform = getTransform();
+ compositionState.geomInverseLayerTransform = compositionState.geomLayerTransform.inverse();
+ compositionState.transparentRegionHint = getActiveTransparentRegion(drawingState);
+
+ compositionState.blendMode = static_cast<Hwc2::IComposerClient::BlendMode>(blendMode);
+ compositionState.alpha = alpha;
+}
+
void Layer::latchGeometry(compositionengine::LayerFECompositionState& compositionState) const {
const auto& drawingState{getDrawingState()};
- auto alpha = static_cast<float>(getAlpha());
- auto blendMode = HWC2::BlendMode::None;
- if (!isOpaque(drawingState) || alpha != 1.0f) {
- blendMode =
- mPremultipliedAlpha ? HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage;
- }
int type = drawingState.metadata.getInt32(METADATA_WINDOW_TYPE, 0);
int appId = drawingState.metadata.getInt32(METADATA_OWNER_UID, 0);
@@ -439,20 +468,14 @@
}
}
- compositionState.geomLayerTransform = getTransform();
- compositionState.geomInverseLayerTransform = compositionState.geomLayerTransform.inverse();
compositionState.geomBufferSize = getBufferSize(drawingState);
compositionState.geomContentCrop = getContentCrop();
compositionState.geomCrop = getCrop(drawingState);
compositionState.geomBufferTransform = mCurrentTransform;
compositionState.geomBufferUsesDisplayInverseTransform = getTransformToDisplayInverse();
- compositionState.geomActiveTransparentRegion = getActiveTransparentRegion(drawingState);
- compositionState.geomLayerBounds = mBounds;
compositionState.geomUsesSourceCrop = usesSourceCrop();
compositionState.isSecure = isSecure();
- compositionState.blendMode = static_cast<Hwc2::IComposerClient::BlendMode>(blendMode);
- compositionState.alpha = alpha;
compositionState.type = type;
compositionState.appId = appId;
}
@@ -498,12 +521,24 @@
}
void Layer::latchCompositionState(compositionengine::LayerFECompositionState& compositionState,
- bool includeGeometry) const {
- if (includeGeometry) {
- latchGeometry(compositionState);
- }
+ compositionengine::LayerFE::StateSubset subset) const {
+ using StateSubset = compositionengine::LayerFE::StateSubset;
- latchPerFrameState(compositionState);
+ switch (subset) {
+ case StateSubset::BasicGeometry:
+ latchBasicGeometry(compositionState);
+ break;
+
+ case StateSubset::GeometryAndContent:
+ latchBasicGeometry(compositionState);
+ latchGeometry(compositionState);
+ latchPerFrameState(compositionState);
+ break;
+
+ case StateSubset::Content:
+ latchPerFrameState(compositionState);
+ break;
+ }
}
const char* Layer::getDebugName() const {