diff options
| -rw-r--r-- | services/surfaceflinger/Scheduler/RefreshRateSelector.cpp | 15 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/unittests/RefreshRateSelectorTest.cpp | 13 |
2 files changed, 23 insertions, 5 deletions
diff --git a/services/surfaceflinger/Scheduler/RefreshRateSelector.cpp b/services/surfaceflinger/Scheduler/RefreshRateSelector.cpp index 4be1ac7c6f..c781a6d922 100644 --- a/services/surfaceflinger/Scheduler/RefreshRateSelector.cpp +++ b/services/surfaceflinger/Scheduler/RefreshRateSelector.cpp @@ -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; diff --git a/services/surfaceflinger/tests/unittests/RefreshRateSelectorTest.cpp b/services/surfaceflinger/tests/unittests/RefreshRateSelectorTest.cpp index fdf2ffe3ce..a3b3c4cf58 100644 --- a/services/surfaceflinger/tests/unittests/RefreshRateSelectorTest.cpp +++ b/services/surfaceflinger/tests/unittests/RefreshRateSelectorTest.cpp @@ -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 |