From 1323c9525fbe7a70b40be9258fe39d254574e3cc Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Mon, 28 Jan 2019 18:13:27 -0800 Subject: Ensure visible regions are recomputed when children change. Currently a reparent operation by itself may not be enough to trigger visible region computation, leading to invalid results on-screen. Note that reparent does not change the geometry, or the state sequence number, this means that doTransaction does not return Layer::eVisibleRegion. For layer addition and removal we explicitly mark the visible regions dirty (see mLayersAdded and mLayersRemoved in SurfaceFlinger.cpp). We implement a similar model for children, with parents setting mChildrenChanged, and consuming it in doTransaction in order to emit an eVisibleRegion flag. Test: Manual Bug: 123333167 Bug: 123131546 Bug: 123285451 Change-Id: I131c814e6bde927353f78c7f62d98b0f5cd2ff73 --- services/surfaceflinger/Layer.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'services/surfaceflinger/Layer.cpp') diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index e108d1e74d..f63d4283ce 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -1067,6 +1067,11 @@ uint32_t Layer::doTransaction(uint32_t flags) { mNeedsFiltering = (!getActiveTransform(c).preserveRects() || type >= ui::Transform::SCALE); } + if (mChildrenChanged) { + flags |= eVisibleRegion; + mChildrenChanged = false; + } + // If the layer is hidden, signal and clear out all local sync points so // that transactions for layers depending on this layer's frames becoming // visible are not blocked @@ -1571,13 +1576,16 @@ size_t Layer::getChildrenCount() const { } void Layer::addChild(const sp& layer) { + mChildrenChanged = true; + mCurrentChildren.add(layer); layer->setParent(this); } ssize_t Layer::removeChild(const sp& layer) { - layer->setParent(nullptr); + mChildrenChanged = true; + layer->setParent(nullptr); return mCurrentChildren.remove(layer); } -- cgit v1.2.3-59-g8ed1b