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
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index e108d1e..f63d428 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -1067,6 +1067,11 @@
         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 @@
 }
 
 void Layer::addChild(const sp<Layer>& layer) {
+    mChildrenChanged = true;
+
     mCurrentChildren.add(layer);
     layer->setParent(this);
 }
 
 ssize_t Layer::removeChild(const sp<Layer>& layer) {
-    layer->setParent(nullptr);
+    mChildrenChanged = true;
 
+    layer->setParent(nullptr);
     return mCurrentChildren.remove(layer);
 }