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

Commit 7c487288 authored by ramindani's avatar ramindani
Browse files

Add the filter to select the refresh rate

This select the refresh rate with max score
and is present on all the displays.

Test: unit test
BUG: 240743471
Change-Id: I66d5b7b258d418daf9734386cd42b3e91482212c
parent d55a464d
Loading
Loading
Loading
Loading
+11 −7
Original line number Diff line number Diff line
@@ -781,13 +781,17 @@ std::vector<DisplayModeConfig> Scheduler::getBestDisplayModeConfigs() const {
    std::unordered_map<Fps, AggregatedFpsScore, FpsHash, FpsApproxEqual> aggregatedScoresPerFps =
            getAggregatedScoresPerFps(refreshRateRankingsAndSignalsPerDisplay);

    Fps chosenFps = std::max_element(aggregatedScoresPerFps.begin(), aggregatedScoresPerFps.end(),
                                     [](const auto& max, const auto& current) {
                                         return max.second.totalScore <= current.second.totalScore;
                                     })
                            ->first;

    return getDisplayModeConfigsForTheChosenFps(chosenFps, refreshRateRankingsAndSignalsPerDisplay);
    auto maxScoreIt = aggregatedScoresPerFps.cbegin();
    // Selects the max Fps that is present on all the displays.
    for (auto it = aggregatedScoresPerFps.cbegin(); it != aggregatedScoresPerFps.cend(); ++it) {
        const auto [fps, aggregatedScore] = *it;
        if (aggregatedScore.numDisplays == mDisplays.size() &&
            aggregatedScore.totalScore >= maxScoreIt->second.totalScore) {
            maxScoreIt = it;
        }
    }
    return getDisplayModeConfigsForTheChosenFps(maxScoreIt->first,
                                                refreshRateRankingsAndSignalsPerDisplay);
}

std::vector<DisplayModeConfig> Scheduler::getDisplayModeConfigsForTheChosenFps(
+28 −1
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ protected:
    static inline const DisplayModePtr kMode120_1 = createDisplayMode(DisplayModeId(1), 120_Hz);
    static inline const DisplayModePtr kMode60_2 = createDisplayMode(DisplayModeId(2), 60_Hz);
    static inline const DisplayModePtr kMode120_2 = createDisplayMode(DisplayModeId(3), 120_Hz);
    static inline const DisplayModePtr kMode60_3 = createDisplayMode(DisplayModeId(4), 60_Hz);

    std::shared_ptr<RefreshRateConfigs> mConfigs =
            std::make_shared<RefreshRateConfigs>(makeModes(kMode60_1), kMode60_1->getId());
@@ -305,7 +306,7 @@ TEST_F(SchedulerTest, getBestDisplayModes_multipleDisplays) {
    mScheduler->registerDisplay(display1);
    mScheduler->registerDisplay(display2);

    const std::vector<sp<DisplayDevice>>& expectedDisplays = {display1, display2};
    std::vector<sp<DisplayDevice>> expectedDisplays = {display1, display2};
    std::vector<RefreshRateConfigs::LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
    GlobalSignals globalSignals = {.idle = true};
    std::vector<DisplayModeConfig> expectedConfigs = {DisplayModeConfig{globalSignals, kMode60_1},
@@ -350,6 +351,32 @@ TEST_F(SchedulerTest, getBestDisplayModes_multipleDisplays) {
                << displayModeConfigs.at(i).displayModePtr->getFps().getIntValue();
        EXPECT_EQ(globalSignals, displayModeConfigs.at(i).signals);
    }

    // Filters out the 120Hz as it's not present on the display3, even with touch active
    // we select 60Hz here.
    auto display3 = mFakeDisplayInjector.injectDefaultInternalDisplay(
            [&](FakeDisplayDeviceInjector& injector) {
                injector.setDisplayModes(makeModes(kMode60_3), kMode60_3->getId());
            },
            mFlinger, /* port */ 252u);
    mScheduler->registerDisplay(display3);

    expectedDisplays = {display1, display2, display3};
    globalSignals = {.touch = true};
    mScheduler->replaceTouchTimer(10);
    expectedConfigs = std::vector<DisplayModeConfig>{DisplayModeConfig{globalSignals, kMode60_1},
                                                     DisplayModeConfig{globalSignals, kMode60_2},
                                                     DisplayModeConfig{globalSignals, kMode60_3}};
    mScheduler->setTouchStateAndIdleTimerPolicy(globalSignals);
    displayModeConfigs = mScheduler->getBestDisplayModeConfigs();
    ASSERT_EQ(expectedConfigs.size(), displayModeConfigs.size());
    for (size_t i = 0; i < expectedConfigs.size(); ++i) {
        EXPECT_EQ(expectedConfigs.at(i).displayModePtr, displayModeConfigs.at(i).displayModePtr)
                << "Expected fps " << expectedConfigs.at(i).displayModePtr->getFps().getIntValue()
                << " Actual fps "
                << displayModeConfigs.at(i).displayModePtr->getFps().getIntValue();
        EXPECT_EQ(globalSignals, displayModeConfigs.at(i).signals);
    }
}

} // namespace android::scheduler