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

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

SurfaceFlinger: get expectedPresentTime from Scheduler

DispSync is owned by Scheduler when it is enabled.
This is a fix to get expectedPresentTime from Scheduler instead of
directly from DispSync.

Test: scroll within app and check systrace
Change-Id: I103d2a56767c49fc5d0c472c6307f3d84e353ac9
parent a5bdd9d8
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -232,7 +232,7 @@ status_t BufferQueueLayer::updateTexImage(bool& recomputeVisibleRegions, nsecs_t
                    getTransformToDisplayInverse(), mFreezeGeometryUpdates);

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

    // updateTexImage() below might drop the some buffers at the head of the queue if there is a
+4 −0
Original line number Diff line number Diff line
@@ -238,6 +238,10 @@ void Scheduler::makeHWSyncAvailable(bool makeAvailable) {
    mHWVsyncAvailable = makeAvailable;
}

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

void Scheduler::addFramePresentTimeForLayer(const nsecs_t framePresentTime, bool isAutoTimestamp,
                                            const std::string layerName) {
    // This is V1 logic. It calculates the average FPS based on the timestamp frequency
+1 −3
Original line number Diff line number Diff line
@@ -109,6 +109,7 @@ public:
    void addPresentFence(const std::shared_ptr<FenceTime>& fenceTime);
    void setIgnorePresentFences(bool ignore);
    void makeHWSyncAvailable(bool makeAvailable);
    nsecs_t expectedPresentTime();
    // Adds the present time for given layer to the history of present times.
    void addFramePresentTimeForLayer(const nsecs_t framePresentTime, bool isAutoTimestamp,
                                     const std::string layerName);
@@ -142,9 +143,6 @@ private:
    // Function that is called when the timer expires.
    void expiredTimerCallback();

    // TODO(b/113612090): Instead of letting BufferQueueLayer to access mDispSync directly, it
    // should make request to Scheduler to compute next refresh.
    friend class BufferQueueLayer;

    // If fences from sync Framework are supported.
    const bool mHasSyncFramework;
+30 −9
Original line number Diff line number Diff line
@@ -351,10 +351,6 @@ SurfaceFlinger::SurfaceFlinger(surfaceflinger::Factory& factory)
    }
    ALOGV("Primary Display Orientation is set to %2d.", SurfaceFlinger::primaryDisplayOrientation);

    mPrimaryDispSync =
            getFactory().createDispSync("PrimaryDispSync", SurfaceFlinger::hasSyncFramework,
                                        SurfaceFlinger::dispSyncPresentTimeOffset);

    auto surfaceFlingerConfigsServiceV1_2 = V1_2::ISurfaceFlingerConfigs::getService();
    if (surfaceFlingerConfigsServiceV1_2) {
        surfaceFlingerConfigsServiceV1_2->getDisplayNativePrimaries(
@@ -400,6 +396,12 @@ SurfaceFlinger::SurfaceFlinger(surfaceflinger::Factory& factory)
    property_get("debug.sf.use_scheduler", value, "0");
    mUseScheduler = atoi(value);

    if (!mUseScheduler) {
        mPrimaryDispSync =
                getFactory().createDispSync("PrimaryDispSync", SurfaceFlinger::hasSyncFramework,
                                            SurfaceFlinger::dispSyncPresentTimeOffset);
    }

    const auto [early, gl, late] = mPhaseOffsets->getCurrentOffsets();
    mVsyncModulator.setPhaseOffsets(early, gl, late);

@@ -719,8 +721,10 @@ void SurfaceFlinger::init() {
        }
    }

    if (!mUseScheduler) {
        mEventControlThread = getFactory().createEventControlThread(
                [this](bool enabled) { setPrimaryVsyncEnabled(enabled); });
    }

    // initialize our drawing state
    mDrawingState = mCurrentState;
@@ -1399,6 +1403,7 @@ nsecs_t SurfaceFlinger::getVsyncPeriod() const {
}

void SurfaceFlinger::enableHardwareVsync() {
    assert(!mUseScheduler);
    Mutex::Autolock _l(mHWVsyncLock);
    if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) {
        mPrimaryDispSync->beginResync();
@@ -1441,6 +1446,7 @@ void SurfaceFlinger::resyncToHardwareVsync(bool makeAvailable, nsecs_t period) {
}

void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) {
    assert(!mUseScheduler);
    Mutex::Autolock _l(mHWVsyncLock);
    if (mPrimaryHWVsyncEnabled) {
        mEventControlThread->setVsyncEnabled(false);
@@ -3109,7 +3115,12 @@ void SurfaceFlinger::updateCursorAsync()

void SurfaceFlinger::latchAndReleaseBuffer(const sp<Layer>& layer) {
    if (layer->hasReadyFrame()) {
        const nsecs_t expectedPresentTime = mPrimaryDispSync->expectedPresentTime();
        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);
@@ -3341,7 +3352,12 @@ bool SurfaceFlinger::handlePageFlip()
    mDrawingState.traverseInZOrder([&](Layer* layer) {
        if (layer->hasReadyFrame()) {
            frameQueued = true;
            const nsecs_t expectedPresentTime = mPrimaryDispSync->expectedPresentTime();
            nsecs_t expectedPresentTime;
            if (mUseScheduler) {
                expectedPresentTime = mScheduler->expectedPresentTime();
            } else {
                expectedPresentTime = mPrimaryDispSync->expectedPresentTime();
            }
            if (layer->shouldPresentNow(expectedPresentTime)) {
                mLayersWithQueuedFrames.push_back(layer);
            } else {
@@ -3682,7 +3698,12 @@ bool SurfaceFlinger::containsAnyInvalidClientState(const Vector<ComposerState>&

bool SurfaceFlinger::transactionIsReadyToBeApplied(int64_t desiredPresentTime,
                                                   const Vector<ComposerState>& states) {
    const nsecs_t expectedPresentTime = mPrimaryDispSync->expectedPresentTime();
    nsecs_t expectedPresentTime;
    if (mUseScheduler) {
        expectedPresentTime = mScheduler->expectedPresentTime();
    } else {
        expectedPresentTime = mPrimaryDispSync->expectedPresentTime();
    }
    // 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 &&