Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1323c952 authored by Robert Carr's avatar Robert Carr
Browse files

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
parent e1f12b08
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -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>& 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);
}

+2 −0
Original line number Diff line number Diff line
@@ -841,6 +841,8 @@ protected:

    // Can only be accessed with the SF state lock held.
    bool mLayerDetached{false};
    // Can only be accessed with the SF state lock held.
    bool mChildrenChanged{false};

private:
    /**