SF: Move layer visibility state to CompositionEngine
The layer visibility/coverage state was the last bit of
display-dependent data that had not yet been moved to
OutputLayerCompositionState. This moves it, and fixes up all references
to the data to get it in a display-dependent way.
Test: atest libsurfaceflinger_unittest libcompositionengine_test
Bug: 121291683
Change-Id: Id9f314f05b743212dba3a113df2baeb38fd19eb8
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index 557d0bb..b669421 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -443,10 +443,6 @@
const auto& drawingState{getDrawingState()};
compositionState.forceClientComposition = false;
- // TODO(lpique): b/121291683 Remove this one we are sure we don't need the
- // value recomputed / set every frame.
- compositionState.geomVisibleRegion = visibleRegion;
-
compositionState.isColorspaceAgnostic = isColorSpaceAgnostic();
compositionState.dataspace = mCurrentDataSpace;
compositionState.colorTransform = getColorTransform();
@@ -567,27 +563,6 @@
return (s.flags & layer_state_t::eLayerSecure);
}
-void Layer::setVisibleRegion(const Region& visibleRegion) {
- // always called from main thread
- this->visibleRegion = visibleRegion;
-}
-
-void Layer::setCoveredRegion(const Region& coveredRegion) {
- // always called from main thread
- this->coveredRegion = coveredRegion;
-}
-
-void Layer::setVisibleNonTransparentRegion(const Region& setVisibleNonTransparentRegion) {
- // always called from main thread
- this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
-}
-
-void Layer::clearVisibilityRegions() {
- visibleRegion.clear();
- visibleNonTransparentRegion.clear();
- coveredRegion.clear();
-}
-
// ----------------------------------------------------------------------------
// transaction
// ----------------------------------------------------------------------------
@@ -1202,7 +1177,8 @@
info.mParentName = (parent == nullptr ? std::string("none") : parent->getName().string());
info.mType = getType();
info.mTransparentRegion = ds.activeTransparentRegion_legacy;
- info.mVisibleRegion = visibleRegion;
+
+ info.mVisibleRegion = debugGetVisibleRegionOnDefaultDisplay();
info.mSurfaceDamageRegion = surfaceDamageRegion;
info.mLayerStack = getLayerStack();
info.mX = ds.active_legacy.transform.tx();
@@ -1826,7 +1802,7 @@
LayerProtoHelper::writePositionToProto(transform.tx(), transform.ty(),
[&]() { return layerInfo->mutable_position(); });
LayerProtoHelper::writeToProto(mBounds, [&]() { return layerInfo->mutable_bounds(); });
- LayerProtoHelper::writeToProto(visibleRegion,
+ LayerProtoHelper::writeToProto(debugGetVisibleRegionOnDefaultDisplay(),
[&]() { return layerInfo->mutable_visible_region(); });
LayerProtoHelper::writeToProto(surfaceDamageRegion,
[&]() { return layerInfo->mutable_damage_region(); });
@@ -2003,6 +1979,20 @@
return display->getCompositionDisplay()->getOutputLayerForLayer(getCompositionLayer().get());
}
+Region Layer::debugGetVisibleRegionOnDefaultDisplay() const {
+ sp<DisplayDevice> displayDevice = mFlinger->getDefaultDisplayDeviceLocked();
+ if (displayDevice == nullptr) {
+ return {};
+ }
+
+ auto outputLayer = findOutputLayerForDisplay(displayDevice);
+ if (outputLayer == nullptr) {
+ return {};
+ }
+
+ return outputLayer->getState().visibleRegion;
+}
+
// ---------------------------------------------------------------------------
}; // namespace android