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

Commit bad35774 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add the filter to select the refresh rate"

parents 4fc6c27f 7c487288
Loading
Loading
Loading
Loading
+11 −7
Original line number Diff line number Diff line
@@ -739,13 +739,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