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

Commit 38c84988 authored by ramindani's avatar ramindani
Browse files

SF Adds powerOnImminent to the GlobalSignals

This helps with moving the refresh rate selection into
RefreshRateConfigs instead of calling from Scheduler.

BUG: 240743471
Test: atest libsurfaceflinger_unittest
Change-Id: I4dba607e82ddb139be3daebe7f5c764fd5ae418c
parent 3e6583fc
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -280,6 +280,15 @@ auto RefreshRateConfigs::getBestRefreshRateLocked(const std::vector<LayerRequire
    ATRACE_CALL();
    ALOGV("%s: %zu layers", __func__, layers.size());

    const auto& activeMode = *getActiveModeItLocked()->second;

    // Keep the display at max refresh rate for the duration of powering on the display.
    if (signals.powerOnImminent) {
        ALOGV("Power On Imminent");
        const auto& max = getMaxRefreshRateByPolicyLocked(activeMode.getGroup());
        return {max, GlobalSignals{.powerOnImminent = true}};
    }

    int noVoteLayers = 0;
    int minVoteLayers = 0;
    int maxVoteLayers = 0;
@@ -326,7 +335,6 @@ auto RefreshRateConfigs::getBestRefreshRateLocked(const std::vector<LayerRequire

    const Policy* policy = getCurrentPolicyLocked();
    const auto& defaultMode = mDisplayModes.get(policy->defaultMode)->get();
    const auto& activeMode = *getActiveModeItLocked()->second;

    // If the default mode group is different from the group of current mode,
    // this means a layer requesting a seamed mode switch just disappeared and
+5 −1
Original line number Diff line number Diff line
@@ -185,9 +185,13 @@ public:
        bool touch = false;
        // True if the system hasn't seen any buffers posted to layers recently.
        bool idle = false;
        // Whether the display is about to be powered on, or has been in PowerMode::ON
        // within the timeout of DisplayPowerTimer.
        bool powerOnImminent = false;

        bool operator==(GlobalSignals other) const {
            return touch == other.touch && idle == other.idle;
            return touch == other.touch && idle == other.idle &&
                    powerOnImminent == other.powerOnImminent;
        }
    };

+5 −9
Original line number Diff line number Diff line
@@ -704,17 +704,13 @@ auto Scheduler::chooseDisplayMode() -> std::pair<DisplayModePtr, GlobalSignals>

    const auto configs = holdRefreshRateConfigs();

    // If Display Power is not in normal operation we want to be in performance mode. When coming
    // back to normal mode, a grace period is given with DisplayPowerTimer.
    if (mDisplayPowerTimer &&
    const bool powerOnImminent = mDisplayPowerTimer &&
            (mPolicy.displayPowerMode != hal::PowerMode::ON ||
         mPolicy.displayPowerTimer == TimerState::Reset)) {
        constexpr GlobalSignals kNoSignals;
        return {configs->getMaxRefreshRateByPolicy(), kNoSignals};
    }
             mPolicy.displayPowerTimer == TimerState::Reset);

    const GlobalSignals signals{.touch = mTouchTimer && mPolicy.touch == TouchState::Active,
                                .idle = mPolicy.idleTimer == TimerState::Expired};
                                .idle = mPolicy.idleTimer == TimerState::Expired,
                                .powerOnImminent = powerOnImminent};

    return configs->getBestRefreshRate(mPolicy.contentRequirements, signals);
}
+26 −0
Original line number Diff line number Diff line
@@ -977,6 +977,32 @@ TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
    EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
}

TEST_F(RefreshRateConfigsTest, powerOnImminentConsidered) {
    RefreshRateConfigs configs(kModes_60_90, kModeId60);

    auto [refreshRate, signals] = configs.getBestRefreshRate({}, {});
    EXPECT_FALSE(signals.powerOnImminent);
    EXPECT_EQ(kMode90, refreshRate);

    std::tie(refreshRate, signals) = configs.getBestRefreshRate({}, {.powerOnImminent = true});
    EXPECT_TRUE(signals.powerOnImminent);
    EXPECT_EQ(kMode90, refreshRate);

    std::vector<LayerRequirement> layers = {{.weight = 1.f}};
    auto& lr1 = layers[0];
    lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
    lr1.desiredRefreshRate = 60_Hz;
    lr1.name = "60Hz ExplicitExactOrMultiple";

    std::tie(refreshRate, signals) = configs.getBestRefreshRate(layers, {.powerOnImminent = false});
    EXPECT_FALSE(signals.powerOnImminent);
    EXPECT_EQ(kMode60, refreshRate);

    std::tie(refreshRate, signals) = configs.getBestRefreshRate(layers, {.powerOnImminent = true});
    EXPECT_TRUE(signals.powerOnImminent);
    EXPECT_EQ(kMode90, refreshRate);
}

TEST_F(RefreshRateConfigsTest, touchConsidered) {
    RefreshRateConfigs configs(kModes_60_90, kModeId60);