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

Commit 54de25d6 authored by Ady Abraham's avatar Ady Abraham Committed by Ana Krulec
Browse files

SurfaceFlinger: get present time from SF and not from Scheduler

SF hold the most accurate expected present time as it also knows
whether we are operating at negative offset and which vsync
we are targeting.

Bug: 133241520
Bug: 134589085
Test: systrace when scrolling
Change-Id: I934df3a8bf807b0e52555765a6861f252b69c0d1
Merged-In: I934df3a8bf807b0e52555765a6861f252b69c0d1
parent 2b2bbd39
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -201,7 +201,7 @@ uint64_t BufferQueueLayer::getFrameNumber() const {
    uint64_t frameNumber = mQueueItems[0].mFrameNumber;

    // The head of the queue will be dropped if there are signaled and timely frames behind it
    nsecs_t expectedPresentTime = mFlinger->mScheduler->expectedPresentTime();
    nsecs_t expectedPresentTime = mFlinger->getExpectedPresentTime();

    if (isRemovedFromCurrentState()) {
        expectedPresentTime = 0;
@@ -280,7 +280,7 @@ status_t BufferQueueLayer::updateTexImage(bool& recomputeVisibleRegions, nsecs_t
                    getProducerStickyTransform() != 0, mName.string(), mOverrideScalingMode,
                    getTransformToDisplayInverse(), mFreezeGeometryUpdates);

    nsecs_t expectedPresentTime = mFlinger->mScheduler->expectedPresentTime();
    nsecs_t expectedPresentTime = mFlinger->getExpectedPresentTime();

    if (isRemovedFromCurrentState()) {
        expectedPresentTime = 0;
+1 −1
Original line number Diff line number Diff line
@@ -309,7 +309,7 @@ void Scheduler::setIgnorePresentFences(bool ignore) {
    mPrimaryDispSync->setIgnorePresentFences(ignore);
}

nsecs_t Scheduler::expectedPresentTime() {
nsecs_t Scheduler::getDispSyncExpectedPresentTime() {
    return mPrimaryDispSync->expectedPresentTime();
}

+1 −1
Original line number Diff line number Diff line
@@ -149,7 +149,7 @@ public:
    void addResyncSample(const nsecs_t timestamp, bool* periodFlushed);
    void addPresentFence(const std::shared_ptr<FenceTime>& fenceTime);
    void setIgnorePresentFences(bool ignore);
    nsecs_t expectedPresentTime();
    nsecs_t getDispSyncExpectedPresentTime();
    // Registers the layer in the scheduler, and returns the handle for future references.
    std::unique_ptr<scheduler::LayerHistory::LayerHandle> registerLayer(std::string const& name,
                                                                        int windowType);
+2 −2
Original line number Diff line number Diff line
@@ -1658,7 +1658,7 @@ bool SurfaceFlinger::previousFrameMissed() NO_THREAD_SAFETY_ANALYSIS {
nsecs_t SurfaceFlinger::getExpectedPresentTime() NO_THREAD_SAFETY_ANALYSIS {
    DisplayStatInfo stats;
    mScheduler->getDisplayStatInfo(&stats);
    const nsecs_t presentTime = mScheduler->expectedPresentTime();
    const nsecs_t presentTime = mScheduler->getDispSyncExpectedPresentTime();
    // Inflate the expected present time if we're targetting the next vsync.
    const nsecs_t correctedTime =
            mVsyncModulator.getOffsets().sf < mPhaseOffsets->getOffsetThresholdForNextVsync()
@@ -3672,7 +3672,7 @@ bool SurfaceFlinger::containsAnyInvalidClientState(const Vector<ComposerState>&

bool SurfaceFlinger::transactionIsReadyToBeApplied(int64_t desiredPresentTime,
                                                   const Vector<ComposerState>& states) {
    nsecs_t expectedPresentTime = mScheduler->expectedPresentTime();
    nsecs_t expectedPresentTime = getExpectedPresentTime();
    // Do not present if the desiredPresentTime has not passed unless it is more than one second
    // in the future. We ignore timestamps more than 1 second in the future for stability reasons.
    if (desiredPresentTime >= 0 && desiredPresentTime >= expectedPresentTime &&