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

Commit 33a386ba authored by Ady Abraham's avatar Ady Abraham
Browse files

SF: update frameRateOverride list when policy changes

Otherwise we might use a stale list which results in an incorrect
refresh rate reporting to apps

Bug: 290807889
Test: atest android.graphics.cts.FrameRateOverrideTest
Change-Id: I328d360bf4b63dc29f0c93fe5281ea826b9ac8c9
parent dad32244
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -777,6 +777,12 @@ void Scheduler::dumpVsync(std::string& out) const {
}

bool Scheduler::updateFrameRateOverrides(GlobalSignals consideredSignals, Fps displayRefreshRate) {
    std::scoped_lock lock(mPolicyLock);
    return updateFrameRateOverridesLocked(consideredSignals, displayRefreshRate);
}

bool Scheduler::updateFrameRateOverridesLocked(GlobalSignals consideredSignals,
                                               Fps displayRefreshRate) {
    if (consideredSignals.idle) return false;

    const auto frameRateOverrides =
@@ -995,7 +1001,7 @@ auto Scheduler::applyPolicy(S Policy::*statePtr, T&& newState) -> GlobalSignals
                                                .emitEvent = !choice.consideredSignals.idle});
        }

        frameRateOverridesChanged = updateFrameRateOverrides(consideredSignals, modeOpt->fps);
        frameRateOverridesChanged = updateFrameRateOverridesLocked(consideredSignals, modeOpt->fps);

        if (mPolicy.modeOpt != modeOpt) {
            mPolicy.modeOpt = modeOpt;
+4 −1
Original line number Diff line number Diff line
@@ -302,6 +302,8 @@ public:
        return mLayerHistory.getLayerFramerate(now, id);
    }

    bool updateFrameRateOverrides(GlobalSignals, Fps displayRefreshRate) EXCLUDES(mPolicyLock);

private:
    friend class TestableScheduler;

@@ -386,7 +388,8 @@ private:

    GlobalSignals makeGlobalSignals() const REQUIRES(mPolicyLock);

    bool updateFrameRateOverrides(GlobalSignals, Fps displayRefreshRate) REQUIRES(mPolicyLock);
    bool updateFrameRateOverridesLocked(GlobalSignals, Fps displayRefreshRate)
            REQUIRES(mPolicyLock);
    void updateAttachedChoreographers(const surfaceflinger::frontend::LayerHierarchy&,
                                      Fps displayRefreshRate);
    int updateAttachedChoreographersInternal(const surfaceflinger::frontend::LayerHierarchy&,
+7 −1
Original line number Diff line number Diff line
@@ -7856,7 +7856,13 @@ status_t SurfaceFlinger::applyRefreshRateSelectorPolicy(
        return INVALID_OPERATION;
    }

    setDesiredActiveMode({std::move(preferredMode), .emitEvent = true}, force);
    setDesiredActiveMode({preferredMode, .emitEvent = true}, force);

    // Update the frameRateOverride list as the display render rate might have changed
    if (mScheduler->updateFrameRateOverrides(/*consideredSignals*/ {}, preferredMode.fps)) {
        triggerOnFrameRateOverridesChanged();
    }

    return NO_ERROR;
}