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

Commit 4fc2fcea authored by Ady Abraham's avatar Ady Abraham
Browse files

SF: change the render rate directly instead of starting a new VsyncTimeline

So we would preserve the old vsync cadence

Bug: 328140524
Change-Id: Ibdd4e49ab5494605e39957cedc6fba00146d18d9
Test: presubmit
parent 940b7a60
Loading
Loading
Loading
Loading
+8 −1
Original line number Original line Diff line number Diff line
@@ -379,9 +379,16 @@ void VSyncPredictor::setRenderRate(Fps renderRate, bool applyImmediately) {
            prevRenderRate ? prevRenderRate->getPeriodNsecs() - renderRate.getPeriodNsecs() : 0;
            prevRenderRate ? prevRenderRate->getPeriodNsecs() - renderRate.getPeriodNsecs() : 0;
    const bool newRenderRateIsHigher = renderPeriodDelta > renderRate.getPeriodNsecs() &&
    const bool newRenderRateIsHigher = renderPeriodDelta > renderRate.getPeriodNsecs() &&
            mLastCommittedVsync.ns() - mClock->now() > 2 * renderRate.getPeriodNsecs();
            mLastCommittedVsync.ns() - mClock->now() > 2 * renderRate.getPeriodNsecs();
    if (applyImmediately || newRenderRateIsHigher) {
    if (applyImmediately) {
        while (mTimelines.size() > 1) {
            mTimelines.pop_front();
        }

        mTimelines.front().setRenderRate(renderRate);
    } else if (newRenderRateIsHigher) {
        mTimelines.clear();
        mTimelines.clear();
        mLastCommittedVsync = TimePoint::fromNs(0);
        mLastCommittedVsync = TimePoint::fromNs(0);

    } else {
    } else {
        mTimelines.back().freeze(
        mTimelines.back().freeze(
                TimePoint::fromNs(mLastCommittedVsync.ns() + mIdealPeriod.ns() / 2));
                TimePoint::fromNs(mLastCommittedVsync.ns() + mIdealPeriod.ns() / 2));
+2 −1
Original line number Original line Diff line number Diff line
@@ -97,6 +97,7 @@ private:
        std::optional<TimePoint> validUntil() const { return mValidUntil; }
        std::optional<TimePoint> validUntil() const { return mValidUntil; }
        bool isVSyncInPhase(Model, nsecs_t vsync, Fps frameRate);
        bool isVSyncInPhase(Model, nsecs_t vsync, Fps frameRate);
        void shiftVsyncSequence(Duration phase);
        void shiftVsyncSequence(Duration phase);
        void setRenderRate(Fps renderRate) { mRenderRateOpt = renderRate; }


    private:
    private:
        nsecs_t snapToVsyncAlignedWithRenderRate(Model model, nsecs_t vsync);
        nsecs_t snapToVsyncAlignedWithRenderRate(Model model, nsecs_t vsync);
@@ -104,7 +105,7 @@ private:
        std::optional<VsyncSequence> makeVsyncSequence(TimePoint knownVsync);
        std::optional<VsyncSequence> makeVsyncSequence(TimePoint knownVsync);


        const Period mIdealPeriod = Duration::fromNs(0);
        const Period mIdealPeriod = Duration::fromNs(0);
        const std::optional<Fps> mRenderRateOpt;
        std::optional<Fps> mRenderRateOpt;
        std::optional<TimePoint> mValidUntil;
        std::optional<TimePoint> mValidUntil;
        std::optional<VsyncSequence> mLastVsyncSequence;
        std::optional<VsyncSequence> mLastVsyncSequence;
    };
    };
+3 −3
Original line number Original line Diff line number Diff line
@@ -768,9 +768,9 @@ TEST_F(VSyncPredictorTest, setRenderRateExplicitAppliedImmediately) {
    EXPECT_EQ(6000, vrrTracker.nextAnticipatedVSyncTimeFrom(5000, 2000));
    EXPECT_EQ(6000, vrrTracker.nextAnticipatedVSyncTimeFrom(5000, 2000));


    vrrTracker.setRenderRate(Fps::fromPeriodNsecs(2000), /*applyImmediately*/ true);
    vrrTracker.setRenderRate(Fps::fromPeriodNsecs(2000), /*applyImmediately*/ true);
    EXPECT_EQ(4500, vrrTracker.nextAnticipatedVSyncTimeFrom(4000));
    EXPECT_EQ(5000, vrrTracker.nextAnticipatedVSyncTimeFrom(4000));
    EXPECT_EQ(6500, vrrTracker.nextAnticipatedVSyncTimeFrom(5000, 4500));
    EXPECT_EQ(7000, vrrTracker.nextAnticipatedVSyncTimeFrom(5000, 5000));
    EXPECT_EQ(8500, vrrTracker.nextAnticipatedVSyncTimeFrom(6000, 6500));
    EXPECT_EQ(9000, vrrTracker.nextAnticipatedVSyncTimeFrom(7000, 7000));
}
}


TEST_F(VSyncPredictorTest, selectsClosestVsyncAfterInactivity) {
TEST_F(VSyncPredictorTest, selectsClosestVsyncAfterInactivity) {