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

Commit 0625533e authored by Marissa Wall's avatar Marissa Wall
Browse files

blast: fix 30 hz with desiredPresentTime

When a transaction is applied on the main thread, first the transaction
is applied and then handleTransaction is called. If we realize a
transaction requires a traversal when we are applying it, handleTransaction
will do a traversal. Since handleTransaction will preform the traversal,
there is no need to schedule a wake up for the next frame to preform
an unneeded traversal.

Bug: 128520233
Test: run chrome video and look at the systrace.
Change-Id: Idf9dda8ddfdf88b34abe5a3fe648ef693998b9a0
parent 08014733
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -280,6 +280,7 @@ SurfaceFlinger::SurfaceFlinger(surfaceflinger::Factory& factory,
        mFactory(factory),
        mTransactionPending(false),
        mAnimTransactionPending(false),
        mTraversalNeededMainThread(false),
        mLayersRemoved(false),
        mLayersAdded(false),
        mBootTime(systemTime()),
@@ -2782,7 +2783,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
     * (perform the transaction for each of them if needed)
     */

    if (transactionFlags & eTraversalNeeded) {
    if ((transactionFlags & eTraversalNeeded) || mTraversalNeededMainThread) {
        mCurrentState.traverseInZOrder([&](Layer* layer) {
            uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
            if (!trFlags) return;
@@ -2795,6 +2796,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
                mInputInfoChanged = true;
            }
        });
        mTraversalNeededMainThread = false;
    }

    /*
@@ -3682,6 +3684,13 @@ void SurfaceFlinger::applyTransactionState(const Vector<ComposerState>& states,
        transactionFlags = eTransactionNeeded;
    }

    // If we are on the main thread, we are about to preform a traversal. Clear the traversal bit
    // so we don't have to wake up again next frame to preform an uneeded traversal.
    if (isMainThread && (transactionFlags & eTraversalNeeded)) {
        transactionFlags = transactionFlags & (~eTraversalNeeded);
        mTraversalNeededMainThread = true;
    }

    if (transactionFlags) {
        if (mInterceptor->isEnabled()) {
            mInterceptor->saveTransaction(states, mCurrentState.displays, displays, flags);
+1 −0
Original line number Diff line number Diff line
@@ -963,6 +963,7 @@ private:
    bool mTransactionPending;
    bool mAnimTransactionPending;
    SortedVector< sp<Layer> > mLayersPendingRemoval;
    bool mTraversalNeededMainThread;

    // guards access to the mDrawing state if tracing is enabled.
    mutable std::mutex mDrawingStateLock;