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

Commit 08048ce2 authored by Ady Abraham's avatar Ady Abraham
Browse files

SF: fix a bug when FpsRange is Infinity

Bug: 260874985
Test: adb shell /data/nativetest64/libsurfaceflinger_unittest/libsurfaceflinger_unittest
Change-Id: I2bd5eeb023cbabc55febaf1fd2ced3e7b8ec0bc5
parent 5c306974
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -107,7 +107,8 @@ std::pair<unsigned, unsigned> divisorRange(Fps fps, FpsRange range,
    }

    using fps_approx_ops::operator/;
    const auto start = std::max(1u, fps / range.max - 1);
    // use signed type as `fps / range.max` might be 0
    const auto start = std::max(1, static_cast<int>(fps / range.max) - 1);
    const auto end = fps /
            std::max(range.min, RefreshRateSelector::kMinSupportedFrameRate,
                     fps_approx_ops::operator<);
@@ -1053,8 +1054,12 @@ bool RefreshRateSelector::isPolicyValidLocked(const Policy& policy) const {
    const auto& primaryRanges = policy.primaryRanges;
    const auto& appRequestRanges = policy.appRequestRanges;
    ALOGE_IF(!appRequestRanges.physical.includes(primaryRanges.physical),
             "Physical range is invalid");
    ALOGE_IF(!appRequestRanges.render.includes(primaryRanges.render), "Render range is invalid");
             "Physical range is invalid: primary: %s appRequest: %s",
             to_string(primaryRanges.physical).c_str(),
             to_string(appRequestRanges.physical).c_str());
    ALOGE_IF(!appRequestRanges.render.includes(primaryRanges.render),
             "Render range is invalid: primary: %s appRequest: %s",
             to_string(primaryRanges.render).c_str(), to_string(appRequestRanges.render).c_str());

    return primaryRanges.valid() && appRequestRanges.valid();
}
@@ -1156,8 +1161,8 @@ void RefreshRateSelector::constructAvailableRefreshRates() {

        const auto frameRateModes = createFrameRateModes(filterModes, ranges.render);
        LOG_ALWAYS_FATAL_IF(frameRateModes.empty(),
                            "No matching frame rate modes for %s physicalRange %s", rangeName,
                            to_string(ranges.physical).c_str());
                            "No matching frame rate modes for %s range. policy: %s", rangeName,
                            policy->toString().c_str());

        const auto stringifyModes = [&] {
            std::string str;
+13 −0
Original line number Diff line number Diff line
@@ -2943,5 +2943,18 @@ TEST_P(RefreshRateSelectorTest, idleWhenLowestRefreshRateIsNotDivisor) {
    EXPECT_EQ(kModeId35, selector.getBestFrameRateMode({}, {.idle = true})->getId());
}

TEST_P(RefreshRateSelectorTest, policyCanBeInfinity) {
    auto selector = createSelector(kModes_60_120, kModeId120);

    constexpr Fps inf = Fps::fromValue(std::numeric_limits<float>::infinity());

    using namespace fps_approx_ops;
    selector.setDisplayManagerPolicy({kModeId60, {0_Hz, inf}});

    // With no layers, idle should still be lower priority than touch boost.
    EXPECT_EQ(kMode120, selector.getMaxRefreshRateByPolicy());
    EXPECT_EQ(kMode60, selector.getMinRefreshRateByPolicy());
}

} // namespace
} // namespace android::scheduler