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

Commit 11663406 authored by Ady Abraham's avatar Ady Abraham
Browse files

SF: reset idle state when RefreshRateConfigs changes

RefreshRateConfigs calls back into Scheduler for updating the idle timer.
When RefreshRateConfigs changes as a result of the active display changed,
we need to stop the idle timer on the old RefreshRateConfigs and reset
Scheduler's state.

Bug: 205664808
Test: manual using below steps
1. Boot device on unfold state
2. Fold device
3. Unfold device
4. Launch Chrome from taskbar

Change-Id: I554fe2b2447c0ad662f06329ff74e0b9b3e999b3
parent fe34457d
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -701,7 +701,6 @@ void RefreshRateConfigs::initializeIdleTimer() {
                [getCallback] {
                    if (const auto callback = getCallback()) callback->onExpired();
                });
        mIdleTimer->start();
    }
}

+16 −4
Original line number Diff line number Diff line
@@ -362,10 +362,22 @@ public:
                               std::function<void()> kernelTimerExpired) {
        std::scoped_lock lock(mIdleTimerCallbacksMutex);
        mIdleTimerCallbacks.emplace();
        mIdleTimerCallbacks->platform.onReset = platformTimerReset;
        mIdleTimerCallbacks->platform.onExpired = platformTimerExpired;
        mIdleTimerCallbacks->kernel.onReset = kernelTimerReset;
        mIdleTimerCallbacks->kernel.onExpired = kernelTimerExpired;
        mIdleTimerCallbacks->platform.onReset = std::move(platformTimerReset);
        mIdleTimerCallbacks->platform.onExpired = std::move(platformTimerExpired);
        mIdleTimerCallbacks->kernel.onReset = std::move(kernelTimerReset);
        mIdleTimerCallbacks->kernel.onExpired = std::move(kernelTimerExpired);
    }

    void startIdleTimer() {
        if (mIdleTimer) {
            mIdleTimer->start();
        }
    }

    void stopIdleTimer() {
        if (mIdleTimer) {
            mIdleTimer->stop();
        }
    }

    void resetIdleTimer(bool kernelOnly) {
+26 −11
Original line number Diff line number Diff line
@@ -181,17 +181,32 @@ public:

    void setRefreshRateConfigs(std::shared_ptr<scheduler::RefreshRateConfigs> refreshRateConfigs)
            EXCLUDES(mRefreshRateConfigsLock) {
        // We need to stop the idle timer on the previous RefreshRateConfigs instance
        // and cleanup the scheduler's state before we switch to the other RefreshRateConfigs.
        {
            std::scoped_lock lock(mRefreshRateConfigsLock);
            if (mRefreshRateConfigs) mRefreshRateConfigs->stopIdleTimer();
        }
        {
            std::scoped_lock lock(mFeatureStateLock);
            mFeatures = {};
        }
        {
            std::scoped_lock lock(mRefreshRateConfigsLock);
            mRefreshRateConfigs = std::move(refreshRateConfigs);
            mRefreshRateConfigs->setIdleTimerCallbacks(
                    [this] { std::invoke(&Scheduler::idleTimerCallback, this, TimerState::Reset); },
                [this] { std::invoke(&Scheduler::idleTimerCallback, this, TimerState::Expired); },
                    [this] {
                        std::invoke(&Scheduler::idleTimerCallback, this, TimerState::Expired);
                    },
                    [this] {
                        std::invoke(&Scheduler::kernelIdleTimerCallback, this, TimerState::Reset);
                    },
                    [this] {
                        std::invoke(&Scheduler::kernelIdleTimerCallback, this, TimerState::Expired);
                    });
            mRefreshRateConfigs->startIdleTimer();
        }
    }

    nsecs_t getVsyncPeriodFromRefreshRateConfigs() const EXCLUDES(mRefreshRateConfigsLock) {