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

Commit a0629234 authored by Robert Carr's avatar Robert Carr
Browse files

SurfaceFlinger: Rework buffer latching when removing from current state

When removed from current state we want to latch and release buffers independent of
their present time as we may not get another chance later (once we are disconnected
from the VSync pulse).

Bug: 123284777
Test: Manual
Change-Id: Ie46ff6199e6648ca9a15cf92048219715ffe26f4
parent f6d3044c
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -237,10 +237,14 @@ status_t BufferQueueLayer::updateTexImage(bool& recomputeVisibleRegions, nsecs_t
                    getProducerStickyTransform() != 0, mName.string(), mOverrideScalingMode,
                    getTransformToDisplayInverse(), mFreezeGeometryUpdates);

    const nsecs_t expectedPresentTime = mFlinger->mUseScheduler
    nsecs_t expectedPresentTime = mFlinger->mUseScheduler
            ? mFlinger->mScheduler->expectedPresentTime()
            : mFlinger->mPrimaryDispSync->expectedPresentTime();

    if (isRemovedFromCurrentState()) {
        expectedPresentTime = 0;
    }

    // updateTexImage() below might drop the some buffers at the head of the queue if there is a
    // buffer behind them which is timely to be presented. However this buffer may not be signaled
    // yet. The code below makes sure that this wouldn't happen by setting maxFrameNumber to the
@@ -259,6 +263,7 @@ status_t BufferQueueLayer::updateTexImage(bool& recomputeVisibleRegions, nsecs_t
    }
    const uint64_t maxFrameNumberToAcquire =
            std::min(mLastFrameNumberReceived.load(), lastSignaledFrameNumber);

    status_t updateResult =
            mConsumer->updateTexImage(&r, expectedPresentTime, &mAutoRefresh, &queuedBuffer,
                                      maxFrameNumberToAcquire, releaseFence);
+2 −10
Original line number Diff line number Diff line
@@ -3156,17 +3156,9 @@ void SurfaceFlinger::updateCursorAsync()

void SurfaceFlinger::latchAndReleaseBuffer(const sp<Layer>& layer) {
    if (layer->hasReadyFrame()) {
        nsecs_t expectedPresentTime;
        if (mUseScheduler) {
            expectedPresentTime = mScheduler->expectedPresentTime();
        } else {
            expectedPresentTime = mPrimaryDispSync->expectedPresentTime();
        }
        if (layer->shouldPresentNow(expectedPresentTime)) {
        bool ignored = false;
        layer->latchBuffer(ignored, systemTime(), Fence::NO_FENCE);
    }
    }
    layer->releasePendingBuffer(systemTime());
}