Skip to content

Commit cf6db5c

Browse files
author
ramindani
committed
[SF] Use the full frame rates range for supportedRefreshRates api
Test: atest android.display.cts.DisplayTest && atest RefreshRateSelectorTest BUG: 380624084 Flag: EXEMPT bugfix Change-Id: If5d3a23466666c4e6912bcec33cc8af4fcf2ecce
1 parent d3ca472 commit cf6db5c

3 files changed

Lines changed: 60 additions & 3 deletions

File tree

services/surfaceflinger/Scheduler/RefreshRateSelector.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1532,6 +1532,9 @@ void RefreshRateSelector::constructAvailableRefreshRates() {
15321532

15331533
mPrimaryFrameRates = filterRefreshRates(policy->primaryRanges, "primary");
15341534
mAppRequestFrameRates = filterRefreshRates(policy->appRequestRanges, "app request");
1535+
mAllFrameRates = filterRefreshRates(FpsRanges(getSupportedFrameRateRangeLocked(),
1536+
getSupportedFrameRateRangeLocked()),
1537+
"full frame rates");
15351538
}
15361539

15371540
bool RefreshRateSelector::isVrrDevice() const {
@@ -1560,16 +1563,24 @@ Fps RefreshRateSelector::findClosestKnownFrameRate(Fps frameRate) const {
15601563
std::vector<float> RefreshRateSelector::getSupportedFrameRates() const {
15611564
std::scoped_lock lock(mLock);
15621565
// TODO(b/356986687) Remove the limit once we have the anchor list implementation.
1563-
const size_t frameRatesSize = std::min<size_t>(11, mPrimaryFrameRates.size());
1566+
const size_t frameRatesSize = std::min<size_t>(11, mAllFrameRates.size());
15641567
std::vector<float> supportedFrameRates;
15651568
supportedFrameRates.reserve(frameRatesSize);
1566-
std::transform(mPrimaryFrameRates.rbegin(),
1567-
mPrimaryFrameRates.rbegin() + static_cast<int>(frameRatesSize),
1569+
std::transform(mAllFrameRates.rbegin(),
1570+
mAllFrameRates.rbegin() + static_cast<int>(frameRatesSize),
15681571
std::back_inserter(supportedFrameRates),
15691572
[](FrameRateMode mode) { return mode.fps.getValue(); });
15701573
return supportedFrameRates;
15711574
}
15721575

1576+
FpsRange RefreshRateSelector::getSupportedFrameRateRangeLocked() const {
1577+
using fps_approx_ops::operator<;
1578+
if (mMaxRefreshRateModeIt->second->getPeakFps() < kMinSupportedFrameRate) {
1579+
return {mMaxRefreshRateModeIt->second->getPeakFps(), kMinSupportedFrameRate};
1580+
}
1581+
return {kMinSupportedFrameRate, mMaxRefreshRateModeIt->second->getPeakFps()};
1582+
}
1583+
15731584
auto RefreshRateSelector::getIdleTimerAction() const -> KernelIdleTimerAction {
15741585
std::lock_guard lock(mLock);
15751586

services/surfaceflinger/Scheduler/RefreshRateSelector.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,7 @@ class RefreshRateSelector {
553553
// Display modes that satisfy the Policy's ranges, filtered and sorted by refresh rate.
554554
std::vector<FrameRateMode> mPrimaryFrameRates GUARDED_BY(mLock);
555555
std::vector<FrameRateMode> mAppRequestFrameRates GUARDED_BY(mLock);
556+
std::vector<FrameRateMode> mAllFrameRates GUARDED_BY(mLock);
556557

557558
// Caches whether the device is VRR-compatible based on the active display mode.
558559
std::atomic_bool mIsVrrDevice = false;
@@ -597,6 +598,9 @@ class RefreshRateSelector {
597598
// Used to detect (lack of) frame activity.
598599
ftl::Optional<scheduler::OneShotTimer> mIdleTimer;
599600
std::atomic<bool> mIdleTimerStarted = false;
601+
602+
// Returns the range of supported frame rates.
603+
FpsRange getSupportedFrameRateRangeLocked() const REQUIRES(mLock);
600604
};
601605

602606
} // namespace android::scheduler

services/surfaceflinger/tests/unittests/RefreshRateSelectorTest.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4667,5 +4667,47 @@ TEST_P(RefreshRateSelectorTest, renderFrameRatesForVrr) {
46674667
EXPECT_EQ(120_Hz, primaryRefreshRates[i].modePtr->getPeakFps());
46684668
}
46694669
}
4670+
4671+
TEST_P(RefreshRateSelectorTest, getSupportedFrameRates) {
4672+
if (GetParam() != Config::FrameRateOverride::Enabled) {
4673+
return;
4674+
}
4675+
4676+
auto selector = createSelector(kModes_60_90, kModeId90);
4677+
const FpsRange range60 = {0_Hz, 60_Hz};
4678+
EXPECT_EQ(SetPolicyResult::Changed,
4679+
selector.setDisplayManagerPolicy(
4680+
{kModeId60, {range60, range60}, {range60, range60}}));
4681+
4682+
// Irrespective of the policy we get the full range of possible frame rates
4683+
const std::vector<float> expected = {90.0f, 60.0f, 45.0f, 30.0f, 22.5f, 20.0f};
4684+
4685+
const auto allSupportedFrameRates = selector.getSupportedFrameRates();
4686+
ASSERT_EQ(expected.size(), allSupportedFrameRates.size());
4687+
for (size_t i = 0; i < expected.size(); i++) {
4688+
EXPECT_EQ(expected[i], allSupportedFrameRates[i])
4689+
<< "expected " << expected[i] << " received " << allSupportedFrameRates[i];
4690+
}
4691+
}
4692+
4693+
TEST_P(RefreshRateSelectorTest, getSupportedFrameRatesArr) {
4694+
if (GetParam() != Config::FrameRateOverride::Enabled) {
4695+
return;
4696+
}
4697+
4698+
SET_FLAG_FOR_TEST(flags::vrr_config, true);
4699+
const auto selector = createSelector(kVrrMode_120, kModeId120);
4700+
4701+
const std::vector<float> expected = {120.0f, 80.0f, 60.0f, 48.0f, 40.0f, 34.285f,
4702+
30.0f, 26.666f, 24.0f, 21.818f, 20.0f};
4703+
4704+
const auto allSupportedFrameRates = selector.getSupportedFrameRates();
4705+
ASSERT_EQ(expected.size(), allSupportedFrameRates.size());
4706+
constexpr float kEpsilon = 0.001f;
4707+
for (size_t i = 0; i < expected.size(); i++) {
4708+
EXPECT_TRUE(std::abs(expected[i] - allSupportedFrameRates[i]) <= kEpsilon)
4709+
<< "expected " << expected[i] << " received " << allSupportedFrameRates[i];
4710+
}
4711+
}
46704712
} // namespace
46714713
} // namespace android::scheduler

0 commit comments

Comments
 (0)