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

Commit a8dc965d authored by Rachel Lee's avatar Rachel Lee
Browse files

Revert "Skip primaryRangeIsSingleRate check for ARR"

This reverts commit 861e3478.

Reason for revert: The policy is being ignored. Also see doc http://docs/document/d/1Bu4AMHFZ3UMVHM_-jyp2ogu-oEaeBy0EgKcoMbkCM1w?tab=t.0

Test: atest libsurfaceflinger_unittest
Change-Id: I7a80540ff4cc398d0764d3af53bfea77731b01a8
parent bd2be80b
Loading
Loading
Loading
Loading
+2 −14
Original line number Diff line number Diff line
@@ -770,17 +770,13 @@ auto RefreshRateSelector::getRankedFrameRatesLocked(const std::vector<LayerRequi
            const bool inPrimaryPhysicalRange =
                    policy->primaryRanges.physical.includes(modePtr->getPeakFps());
            const bool inPrimaryRenderRange = policy->primaryRanges.render.includes(fps);
            if (!mIsVrrDevice.load() &&
                ((policy->primaryRangeIsSingleRate() && !inPrimaryPhysicalRange) ||
            if (((policy->primaryRangeIsSingleRate() && !inPrimaryPhysicalRange) ||
                 !inPrimaryRenderRange) &&
                !(layer.focused &&
                  (layer.vote == LayerVoteType::ExplicitDefault ||
                   layer.vote == LayerVoteType::ExplicitExact))) {
                // Only focused layers with ExplicitDefault frame rate settings are allowed to score
                // refresh rates outside the primary range.
                ALOGV("%s ignores %s (primaryRangeIsSingleRate). Current mode = %s",
                      formatLayerInfo(layer, weight).c_str(), to_string(*modePtr).c_str(),
                      to_string(activeMode).c_str());
                continue;
            }

@@ -904,8 +900,7 @@ auto RefreshRateSelector::getRankedFrameRatesLocked(const std::vector<LayerRequi
                                   to_string(descending.front().frameRateMode.fps).c_str());
            return {descending, kNoSignals};
        } else {
            ALOGV("%s (primaryRangeIsSingleRate)",
                  to_string(ranking.front().frameRateMode.fps).c_str());
            ALOGV("primaryRangeIsSingleRate");
            SFTRACE_FORMAT_INSTANT("%s (primaryRangeIsSingleRate)",
                                   to_string(ranking.front().frameRateMode.fps).c_str());
            return {ranking, kNoSignals};
@@ -1041,14 +1036,12 @@ auto RefreshRateSelector::getFrameRateOverrides(const std::vector<LayerRequireme

        // Layers with ExplicitExactOrMultiple expect touch boost
        if (globalSignals.touch && hasExplicitExactOrMultiple) {
            ALOGV("%s: Skipping for touch (input signal): uid=%d", __func__, uid);
            continue;
        }

        // Mirrors getRankedFrameRates. If there is no ExplicitDefault, expect touch boost and
        // skip frame rate override.
        if (hasHighHint && !hasExplicitDefault) {
            ALOGV("%s: Skipping for touch (HighHint): uid=%d", __func__, uid);
            continue;
        }

@@ -1072,9 +1065,6 @@ auto RefreshRateSelector::getFrameRateOverrides(const std::vector<LayerRequireme
                constexpr bool isSeamlessSwitch = true;
                const auto layerScore = calculateLayerScoreLocked(*layer, fps, isSeamlessSwitch);
                score += layer->weight * layerScore;
                ALOGV("%s: %s gives %s fps score of %.4f", __func__,
                      formatLayerInfo(*layer, layer->weight).c_str(), to_string(fps).c_str(),
                      layerScore);
            }
        }

@@ -1329,8 +1319,6 @@ void RefreshRateSelector::updateDisplayModes(DisplayModes modes, DisplayModeId a
    LOG_ALWAYS_FATAL_IF(!activeModeOpt);
    mActiveModeOpt = FrameRateMode{activeModeOpt->get()->getPeakFps(),
                                   ftl::as_non_null(activeModeOpt->get())};
    mIsVrrDevice = FlagManager::getInstance().vrr_config() &&
            activeModeOpt->get()->getVrrConfig().has_value();

    const auto sortedModes = sortByRefreshRate(mDisplayModes);
    mMinRefreshRateModeIt = sortedModes.front();
+0 −128
Original line number Diff line number Diff line
@@ -308,42 +308,6 @@ protected:
                    << " category=" << ftl::enum_string(testCase.frameRateCategory);
        }
    }

    template <class T>
    std::vector<LayerRequirement> createLayers(const std::initializer_list<T>& surfaceVotes) {
        std::vector<LayerRequirement> layers;
        for (auto surfaceVote : surfaceVotes) {
            ALOGI("**** %s: Adding layers for %s: (desiredFrameRate=%s, voteType=%s), "
                  "(frameRateCategory=%s)",
                  __func__, surfaceVote.name.c_str(),
                  to_string(surfaceVote.desiredFrameRate).c_str(),
                  ftl::enum_string(surfaceVote.voteType).c_str(),
                  ftl::enum_string(surfaceVote.frameRateCategory).c_str());

            if (surfaceVote.desiredFrameRate.isValid()) {
                std::stringstream ss;
                ss << surfaceVote.name << " (" << surfaceVote.weight << "): ExplicitDefault ("
                   << to_string(surfaceVote.desiredFrameRate) << ")";
                LayerRequirement layer = {.name = ss.str(),
                                          .vote = surfaceVote.voteType,
                                          .desiredRefreshRate = surfaceVote.desiredFrameRate,
                                          .weight = surfaceVote.weight};
                layers.push_back(layer);
            }

            if (surfaceVote.frameRateCategory != FrameRateCategory::Default) {
                std::stringstream ss;
                ss << surfaceVote.name << " (" << surfaceVote.weight << "): ExplicitCategory ("
                   << ftl::enum_string(surfaceVote.frameRateCategory) << ")";
                LayerRequirement layer = {.name = ss.str(),
                                          .vote = LayerVoteType::ExplicitCategory,
                                          .frameRateCategory = surfaceVote.frameRateCategory,
                                          .weight = surfaceVote.weight};
                layers.push_back(layer);
            }
        }
        return layers;
    }
};

RefreshRateSelectorTest::RefreshRateSelectorTest() {
@@ -1812,98 +1776,6 @@ TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategoryMultiL
            selector);
}

TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_multiSurface_arr) {
    if (GetParam() != Config::FrameRateOverride::Enabled) {
        return;
    }

    SET_FLAG_FOR_TEST(flags::vrr_config, true);

    auto selector = createSelector(kVrrMode_120, kModeId120);

    // Switch the policy to be more like an ARR device (primary range is a single rate).
    constexpr FpsRange k120_120Hz = {120_Hz, 120_Hz};
    constexpr FpsRange k0_120Hz = {0_Hz, 120_Hz};
    constexpr FpsRanges kPrimaryRanges = {/*physical*/ k120_120Hz,
                                          /*render*/ k120_120Hz};
    constexpr FpsRanges kAppRequestRanges = {/*physical*/ k120_120Hz,
                                             /*render*/ k0_120Hz};
    EXPECT_EQ(SetPolicyResult::Changed,
              selector.setDisplayManagerPolicy(
                      {/*defaultMode*/ kModeId120, kPrimaryRanges, kAppRequestRanges}));

    // Surface can translate to multiple layers in SF  scheduler due to category and frame rate
    // value.
    struct SurfaceVote {
        // Params
        std::string name = "";
        Fps desiredFrameRate = 0_Hz;
        LayerVoteType voteType = LayerVoteType::ExplicitDefault;
        FrameRateCategory frameRateCategory = FrameRateCategory::Default;
        float weight = 1.f;
    };

    auto layers = createLayers(
            std::initializer_list<SurfaceVote>{{.name = "60 fixed source",
                                                .desiredFrameRate = 60_Hz,
                                                .voteType = LayerVoteType::ExplicitExactOrMultiple,
                                                .weight = 0.27f},
                                               {.name = "1 fixed source + NoPreference",
                                                .desiredFrameRate = 1_Hz,
                                                .voteType = LayerVoteType::ExplicitExactOrMultiple,
                                                .frameRateCategory =
                                                        FrameRateCategory::NoPreference}});
    auto actualRankedFrameRates = selector.getRankedFrameRates(layers);
    EXPECT_EQ(60_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps);

    layers = createLayers(
            std::initializer_list<SurfaceVote>{{.name = "60 fixed source",
                                                .desiredFrameRate = 60_Hz,
                                                .voteType = LayerVoteType::ExplicitExactOrMultiple,
                                                .weight = 0.27f},
                                               {.name = "1 fixed source + Normal",
                                                .desiredFrameRate = 1_Hz,
                                                .voteType = LayerVoteType::ExplicitExactOrMultiple,
                                                .frameRateCategory = FrameRateCategory::Normal}});
    actualRankedFrameRates = selector.getRankedFrameRates(layers);
    EXPECT_EQ(60_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps);

    layers = createLayers(std::initializer_list<SurfaceVote>{
            {.name = "30 fixed source + NoPreference",
             .desiredFrameRate = 30_Hz,
             .voteType = LayerVoteType::ExplicitExactOrMultiple,
             .frameRateCategory = FrameRateCategory::NoPreference}});
    actualRankedFrameRates = selector.getRankedFrameRates(layers);
    EXPECT_EQ(30_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps);

    layers = createLayers(std::initializer_list<SurfaceVote>{
            {.name = "1 fixed source + NoPreference",
             .desiredFrameRate = 1_Hz,
             .voteType = LayerVoteType::ExplicitExactOrMultiple,
             .frameRateCategory = FrameRateCategory::NoPreference}});
    actualRankedFrameRates = selector.getRankedFrameRates(layers);
    // Result affected by RefreshRateSelector.kMinSupportedFrameRate.
    EXPECT_EQ(20_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps);

    layers = createLayers(std::initializer_list<SurfaceVote>{
            {.name = "24 fixed source + NoPreference",
             .desiredFrameRate = 24_Hz,
             .voteType = LayerVoteType::ExplicitExactOrMultiple,
             .frameRateCategory = FrameRateCategory::NoPreference}});
    actualRankedFrameRates = selector.getRankedFrameRates(layers);
    EXPECT_EQ(24_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps);

    layers = createLayers(std::initializer_list<SurfaceVote>{
            {.name = "23.976 fixed source + NoPreference",
             .desiredFrameRate = 23.976_Hz,
             .voteType = LayerVoteType::ExplicitExactOrMultiple,
             .frameRateCategory = FrameRateCategory::NoPreference}});
    actualRankedFrameRates = selector.getRankedFrameRates(layers);
    // Chooses 120 unless certain threshold is set, see tests test23976Chooses120 and
    // test23976Chooses60IfThresholdIs120.
    EXPECT_EQ(120_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps);
}

TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_60_120) {
    auto selector = createSelector(makeModes(kMode60, kMode120), kModeId60);