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

Commit f8f6d4af authored by Rob Carr's avatar Rob Carr Committed by Android (Google) Code Review
Browse files

Merge changes I24be3859,I53d64db0,Ic426d55f into sc-dev

* changes:
  Protect committing child list behind visible regions changed
  Coalesce handlePageFlip and doTransaction traversal
  Factor inputinfo changed out of doTransaction
parents ef1db93c a70e91c9
Loading
Loading
Loading
Loading
+5 −6
Original line number Original line Diff line number Diff line
@@ -700,11 +700,6 @@ uint32_t Layer::doTransaction(uint32_t flags) {
        mNeedsFiltering = getActiveTransform(s).needsBilinearFiltering();
        mNeedsFiltering = getActiveTransform(s).needsBilinearFiltering();
    }
    }


    if (mDrawingState.inputInfoChanged) {
        flags |= eInputInfoChanged;
        mDrawingState.inputInfoChanged = false;
    }

    commitTransaction(mDrawingState);
    commitTransaction(mDrawingState);


    return flags;
    return flags;
@@ -777,6 +772,8 @@ bool Layer::setLayer(int32_t z) {
    mDrawingState.z = z;
    mDrawingState.z = z;
    mDrawingState.modified = true;
    mDrawingState.modified = true;


    mFlinger->mSomeChildrenChanged = true;

    // Discard all relative layering.
    // Discard all relative layering.
    if (mDrawingState.zOrderRelativeOf != nullptr) {
    if (mDrawingState.zOrderRelativeOf != nullptr) {
        sp<Layer> strongRelative = mDrawingState.zOrderRelativeOf.promote();
        sp<Layer> strongRelative = mDrawingState.zOrderRelativeOf.promote();
@@ -827,6 +824,8 @@ bool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t relati
        return false;
        return false;
    }
    }


    mFlinger->mSomeChildrenChanged = true;

    mDrawingState.sequence++;
    mDrawingState.sequence++;
    mDrawingState.modified = true;
    mDrawingState.modified = true;
    mDrawingState.z = relativeZ;
    mDrawingState.z = relativeZ;
@@ -1986,7 +1985,7 @@ void Layer::setInputInfo(const InputWindowInfo& info) {
    mDrawingState.inputInfo = info;
    mDrawingState.inputInfo = info;
    mDrawingState.touchableRegionCrop = extractLayerFromBinder(info.touchableRegionCropHandle);
    mDrawingState.touchableRegionCrop = extractLayerFromBinder(info.touchableRegionCropHandle);
    mDrawingState.modified = true;
    mDrawingState.modified = true;
    mDrawingState.inputInfoChanged = true;
    mFlinger->mInputInfoChanged = true;
    setTransactionFlags(eTransactionNeeded);
    setTransactionFlags(eTransactionNeeded);
}
}


+0 −1
Original line number Original line Diff line number Diff line
@@ -186,7 +186,6 @@ public:
        float cornerRadius;
        float cornerRadius;
        int backgroundBlurRadius;
        int backgroundBlurRadius;


        bool inputInfoChanged;
        InputWindowInfo inputInfo;
        InputWindowInfo inputInfo;
        wp<Layer> touchableRegionCrop;
        wp<Layer> touchableRegionCrop;


+17 −22
Original line number Original line Diff line number Diff line
@@ -2923,24 +2923,8 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) {
        processDisplayChangesLocked();
        processDisplayChangesLocked();
        processDisplayHotplugEventsLocked();
        processDisplayHotplugEventsLocked();
    }
    }

    // Commit layer transactions. This needs to happen after display transactions are
    // committed because some geometry logic relies on display orientation.
    if ((transactionFlags & eTraversalNeeded) || mForceTraversal || displayTransactionNeeded) {
    mForceTraversal = false;
    mForceTraversal = false;
        mCurrentState.traverse([&](Layer* layer) {
    mForceTransactionDisplayChange = displayTransactionNeeded;
            uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
            if (!trFlags && !displayTransactionNeeded) return;

            const uint32_t flags = layer->doTransaction(0);
            if (flags & Layer::eVisibleRegion)
                mVisibleRegionsDirty = true;

            if (flags & Layer::eInputInfoChanged) {
                mInputInfoChanged = true;
            }
        });
    }


    if (mSomeChildrenChanged) {
    if (mSomeChildrenChanged) {
        mVisibleRegionsDirty = true;
        mVisibleRegionsDirty = true;
@@ -3240,9 +3224,12 @@ void SurfaceFlinger::commitTransactionLocked() {
    // clear the "changed" flags in current state
    // clear the "changed" flags in current state
    mCurrentState.colorMatrixChanged = false;
    mCurrentState.colorMatrixChanged = false;


    if (mVisibleRegionsDirty) {
        for (const auto& rootLayer : mDrawingState.layersSortedByZ) {
        for (const auto& rootLayer : mDrawingState.layersSortedByZ) {
            rootLayer->commitChildList();
            rootLayer->commitChildList();
        }
        }
    }

    // TODO(b/163019109): See if this traversal is needed at all...
    // TODO(b/163019109): See if this traversal is needed at all...
    if (!mOffscreenLayers.empty()) {
    if (!mOffscreenLayers.empty()) {
        mDrawingState.traverse([&](Layer* layer) {
        mDrawingState.traverse([&](Layer* layer) {
@@ -3301,6 +3288,13 @@ bool SurfaceFlinger::handlePageFlip() {
    // Display is now waiting on Layer 1's frame, which is behind layer 0's
    // Display is now waiting on Layer 1's frame, which is behind layer 0's
    // second frame. But layer 0's second frame could be waiting on display.
    // second frame. But layer 0's second frame could be waiting on display.
    mDrawingState.traverse([&](Layer* layer) {
    mDrawingState.traverse([&](Layer* layer) {
         uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
         if (trFlags || mForceTransactionDisplayChange) {
             const uint32_t flags = layer->doTransaction(0);
             if (flags & Layer::eVisibleRegion)
                 mVisibleRegionsDirty = true;
         }

         if (layer->hasReadyFrame()) {
         if (layer->hasReadyFrame()) {
            frameQueued = true;
            frameQueued = true;
            if (layer->shouldPresentNow(expectedPresentTime)) {
            if (layer->shouldPresentNow(expectedPresentTime)) {
@@ -3313,6 +3307,7 @@ bool SurfaceFlinger::handlePageFlip() {
            layer->useEmptyDamage();
            layer->useEmptyDamage();
        }
        }
    });
    });
    mForceTransactionDisplayChange = false;


    // The client can continue submitting buffers for offscreen layers, but they will not
    // The client can continue submitting buffers for offscreen layers, but they will not
    // be shown on screen. Therefore, we need to latch and release buffers of offscreen
    // be shown on screen. Therefore, we need to latch and release buffers of offscreen
+1 −0
Original line number Original line Diff line number Diff line
@@ -1234,6 +1234,7 @@ private:
    // TODO: Also move visibleRegions over to a boolean system.
    // TODO: Also move visibleRegions over to a boolean system.
    bool mInputInfoChanged = false;
    bool mInputInfoChanged = false;
    bool mSomeChildrenChanged;
    bool mSomeChildrenChanged;
    bool mForceTransactionDisplayChange = false;


    bool mGeometryInvalid = false;
    bool mGeometryInvalid = false;
    bool mAnimCompositionPending = false;
    bool mAnimCompositionPending = false;