blob: b0c0b6d602c27254b29330079c58e1e992bb00b7 [file] [log] [blame]
Alec Mouri0a1cc962019-03-14 12:33:02 -07001/*
2 * Copyright 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Marin Shalamanovbed7fd32020-12-21 20:02:20 +010017// TODO(b/129481165): remove the #pragma below and fix conversion issues
18#pragma clang diagnostic push
19#pragma clang diagnostic ignored "-Wextra"
20
Alec Mouri0a1cc962019-03-14 12:33:02 -070021#undef LOG_TAG
22#define LOG_TAG "SchedulerUnittests"
23
24#include <gmock/gmock.h>
25#include <log/log.h>
26#include <thread>
27
Marin Shalamanov3ea1d602020-12-16 19:59:39 +010028#include <ui/Size.h>
29
Ady Abraham6fb599b2020-03-05 13:48:22 -080030#include "../../Scheduler/RefreshRateConfigs.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070031#include "DisplayHardware/HWC2.h"
32#include "Scheduler/RefreshRateConfigs.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070033
34using namespace std::chrono_literals;
Alec Mouri0a1cc962019-03-14 12:33:02 -070035
36namespace android {
Marin Shalamanove8a663d2020-11-24 17:48:00 +010037
Alec Mouri0a1cc962019-03-14 12:33:02 -070038namespace scheduler {
39
Peiyong Line9d809e2020-04-14 13:10:48 -070040namespace hal = android::hardware::graphics::composer::hal;
41
Alec Mouri0a1cc962019-03-14 12:33:02 -070042using RefreshRate = RefreshRateConfigs::RefreshRate;
Ady Abraham8a82ba62020-01-17 12:43:17 -080043using LayerVoteType = RefreshRateConfigs::LayerVoteType;
44using LayerRequirement = RefreshRateConfigs::LayerRequirement;
Alec Mouri0a1cc962019-03-14 12:33:02 -070045
46class RefreshRateConfigsTest : public testing::Test {
47protected:
Alec Mouri0a1cc962019-03-14 12:33:02 -070048 RefreshRateConfigsTest();
49 ~RefreshRateConfigsTest();
Ady Abrahamabc27602020-04-08 17:20:29 -070050
Marin Shalamanove8a663d2020-11-24 17:48:00 +010051 Fps findClosestKnownFrameRate(const RefreshRateConfigs& refreshRateConfigs, Fps frameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -070052 return refreshRateConfigs.findClosestKnownFrameRate(frameRate);
53 }
54
Marin Shalamanove8a663d2020-11-24 17:48:00 +010055 std::vector<Fps> getKnownFrameRate(const RefreshRateConfigs& refreshRateConfigs) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -070056 return refreshRateConfigs.mKnownFrameRates;
57 }
58
Marin Shalamanoveadf2e72020-12-10 15:35:28 +010059 RefreshRate getMinRefreshRateByPolicy(const RefreshRateConfigs& refreshRateConfigs) {
60 std::lock_guard lock(refreshRateConfigs.mLock);
61 return refreshRateConfigs.getMinRefreshRateByPolicyLocked();
62 }
63
64 RefreshRate getMinSupportedRefreshRate(const RefreshRateConfigs& refreshRateConfigs) {
65 std::lock_guard lock(refreshRateConfigs.mLock);
66 return *refreshRateConfigs.mMinSupportedRefreshRate;
67 }
68
69 RefreshRate getMaxSupportedRefreshRate(const RefreshRateConfigs& refreshRateConfigs) {
70 std::lock_guard lock(refreshRateConfigs.mLock);
71 return *refreshRateConfigs.mMaxSupportedRefreshRate;
72 }
73
Ady Abrahamabc27602020-04-08 17:20:29 -070074 // Test config IDs
Marin Shalamanov23c44202020-12-22 19:09:20 +010075 static inline const DisplayModeId HWC_CONFIG_ID_60 = DisplayModeId(0);
76 static inline const DisplayModeId HWC_CONFIG_ID_90 = DisplayModeId(1);
77 static inline const DisplayModeId HWC_CONFIG_ID_72 = DisplayModeId(2);
78 static inline const DisplayModeId HWC_CONFIG_ID_120 = DisplayModeId(3);
79 static inline const DisplayModeId HWC_CONFIG_ID_30 = DisplayModeId(4);
80 static inline const DisplayModeId HWC_CONFIG_ID_25 = DisplayModeId(5);
81 static inline const DisplayModeId HWC_CONFIG_ID_50 = DisplayModeId(6);
Ady Abrahamabc27602020-04-08 17:20:29 -070082
83 // Test configs
Marin Shalamanova7fe3042021-01-29 21:02:08 +010084 DisplayModePtr mConfig60 = createDisplayMode(HWC_CONFIG_ID_60, 0, Fps(60.0f).getPeriodNsecs());
85 DisplayModePtr mConfig90 = createDisplayMode(HWC_CONFIG_ID_90, 0, Fps(90.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +010086 DisplayModePtr mConfig90DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +010087 createDisplayMode(HWC_CONFIG_ID_90, 1, Fps(90.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +010088 DisplayModePtr mConfig90DifferentResolution =
Marin Shalamanova7fe3042021-01-29 21:02:08 +010089 createDisplayMode(HWC_CONFIG_ID_90, 0, Fps(90.0f).getPeriodNsecs(), ui::Size(111, 222));
90 DisplayModePtr mConfig72 = createDisplayMode(HWC_CONFIG_ID_72, 0, Fps(72.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +010091 DisplayModePtr mConfig72DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +010092 createDisplayMode(HWC_CONFIG_ID_72, 1, Fps(72.0f).getPeriodNsecs());
93 DisplayModePtr mConfig120 =
94 createDisplayMode(HWC_CONFIG_ID_120, 0, Fps(120.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +010095 DisplayModePtr mConfig120DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +010096 createDisplayMode(HWC_CONFIG_ID_120, 1, Fps(120.0f).getPeriodNsecs());
97 DisplayModePtr mConfig30 = createDisplayMode(HWC_CONFIG_ID_30, 0, Fps(30.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +010098 DisplayModePtr mConfig30DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +010099 createDisplayMode(HWC_CONFIG_ID_30, 1, Fps(30.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100100 DisplayModePtr mConfig25DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100101 createDisplayMode(HWC_CONFIG_ID_25, 1, Fps(25.0f).getPeriodNsecs());
102 DisplayModePtr mConfig50 = createDisplayMode(HWC_CONFIG_ID_50, 0, Fps(50.0f).getPeriodNsecs());
Ady Abrahamabc27602020-04-08 17:20:29 -0700103
104 // Test device configurations
Marin Shalamanov46084422020-10-13 12:33:42 +0200105 // The positions of the configs in the arrays below MUST match their IDs. For example,
106 // the first config should always be 60Hz, the second 90Hz etc.
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100107 DisplayModes m60OnlyConfigDevice = {mConfig60};
108 DisplayModes m60_90Device = {mConfig60, mConfig90};
109 DisplayModes m60_90DeviceWithDifferentGroups = {mConfig60, mConfig90DifferentGroup};
110 DisplayModes m60_90DeviceWithDifferentResolutions = {mConfig60, mConfig90DifferentResolution};
111 DisplayModes m60_72_90Device = {mConfig60, mConfig90, mConfig72};
112 DisplayModes m60_90_72_120Device = {mConfig60, mConfig90, mConfig72, mConfig120};
113 DisplayModes m30_60_72_90_120Device = {mConfig60, mConfig90, mConfig72, mConfig120, mConfig30};
114 DisplayModes m30_60Device = {mConfig60, mConfig90DifferentGroup, mConfig72DifferentGroup,
115 mConfig120DifferentGroup, mConfig30};
116 DisplayModes m30_60_72_90Device = {mConfig60, mConfig90, mConfig72, mConfig120DifferentGroup,
117 mConfig30};
118 DisplayModes m30_60_90Device = {mConfig60, mConfig90, mConfig72DifferentGroup,
119 mConfig120DifferentGroup, mConfig30};
120 DisplayModes m25_30_50_60Device = {mConfig60,
121 mConfig90,
122 mConfig72DifferentGroup,
123 mConfig120DifferentGroup,
124 mConfig30DifferentGroup,
125 mConfig25DifferentGroup,
126 mConfig50};
Ady Abrahamabc27602020-04-08 17:20:29 -0700127
128 // Expected RefreshRate objects
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100129 RefreshRate mExpected60Config = {HWC_CONFIG_ID_60, mConfig60, Fps(60),
Ady Abrahamabc27602020-04-08 17:20:29 -0700130 RefreshRate::ConstructorTag(0)};
131 RefreshRate mExpectedAlmost60Config = {HWC_CONFIG_ID_60,
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100132 createDisplayMode(HWC_CONFIG_ID_60, 0, 16666665),
133 Fps(60), RefreshRate::ConstructorTag(0)};
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100134 RefreshRate mExpected90Config = {HWC_CONFIG_ID_90, mConfig90, Fps(90),
Ady Abrahamabc27602020-04-08 17:20:29 -0700135 RefreshRate::ConstructorTag(0)};
136 RefreshRate mExpected90DifferentGroupConfig = {HWC_CONFIG_ID_90, mConfig90DifferentGroup,
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100137 Fps(90), RefreshRate::ConstructorTag(0)};
Ady Abrahamabc27602020-04-08 17:20:29 -0700138 RefreshRate mExpected90DifferentResolutionConfig = {HWC_CONFIG_ID_90,
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100139 mConfig90DifferentResolution, Fps(90),
Ady Abrahamabc27602020-04-08 17:20:29 -0700140 RefreshRate::ConstructorTag(0)};
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100141 RefreshRate mExpected72Config = {HWC_CONFIG_ID_72, mConfig72, Fps(72.0f),
Ady Abrahamabc27602020-04-08 17:20:29 -0700142 RefreshRate::ConstructorTag(0)};
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100143 RefreshRate mExpected30Config = {HWC_CONFIG_ID_30, mConfig30, Fps(30),
Ady Abrahamabc27602020-04-08 17:20:29 -0700144 RefreshRate::ConstructorTag(0)};
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100145 RefreshRate mExpected120Config = {HWC_CONFIG_ID_120, mConfig120, Fps(120),
Ady Abrahamabc27602020-04-08 17:20:29 -0700146 RefreshRate::ConstructorTag(0)};
Ady Abrahamabc27602020-04-08 17:20:29 -0700147private:
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100148 DisplayModePtr createDisplayMode(DisplayModeId modeId, int32_t group, int64_t vsyncPeriod,
149 ui::Size resolution = ui::Size());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700150};
151
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100152using Builder = DisplayMode::Builder;
Ady Abrahamabc27602020-04-08 17:20:29 -0700153
Alec Mouri0a1cc962019-03-14 12:33:02 -0700154RefreshRateConfigsTest::RefreshRateConfigsTest() {
155 const ::testing::TestInfo* const test_info =
156 ::testing::UnitTest::GetInstance()->current_test_info();
157 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
158}
159
160RefreshRateConfigsTest::~RefreshRateConfigsTest() {
161 const ::testing::TestInfo* const test_info =
162 ::testing::UnitTest::GetInstance()->current_test_info();
163 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
164}
165
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100166DisplayModePtr RefreshRateConfigsTest::createDisplayMode(DisplayModeId modeId, int32_t group,
167 int64_t vsyncPeriod, ui::Size resolution) {
168 return DisplayMode::Builder(hal::HWConfigId(modeId.value()))
169 .setId(modeId)
Ady Abrahamabc27602020-04-08 17:20:29 -0700170 .setVsyncPeriod(int32_t(vsyncPeriod))
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100171 .setGroup(group)
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100172 .setHeight(resolution.height)
173 .setWidth(resolution.width)
Ady Abrahamabc27602020-04-08 17:20:29 -0700174 .build();
175}
176
Alec Mouri0a1cc962019-03-14 12:33:02 -0700177namespace {
178/* ------------------------------------------------------------------------
179 * Test cases
180 */
Ady Abraham2139f732019-11-13 18:56:40 -0800181TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingSupported) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700182 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700183 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
184 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700185}
186
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100187TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100188 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700189 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
190 /*currentConfigId=*/HWC_CONFIG_ID_60);
Marin Shalamanov23c44202020-12-22 19:09:20 +0100191 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({DisplayModeId(10), {Fps(60), Fps(60)}}),
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100192 0);
193 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(20), Fps(40)}}),
194 0);
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100195}
196
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700197TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700198 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700199 std::make_unique<RefreshRateConfigs>(m60_90Device,
200 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700201
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100202 const auto& minRate = getMinSupportedRefreshRate(*refreshRateConfigs);
203 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700204
Ady Abrahamabc27602020-04-08 17:20:29 -0700205 ASSERT_EQ(mExpected60Config, minRate);
206 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800207
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100208 const auto& minRateByPolicy = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800209 const auto& performanceRateByPolicy = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800210 ASSERT_EQ(minRateByPolicy, minRate);
211 ASSERT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700212}
Ady Abraham2139f732019-11-13 18:56:40 -0800213
214TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentGroups) {
Ady Abraham2139f732019-11-13 18:56:40 -0800215 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700216 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
217 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800218
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100219 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
220 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
221 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800222 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800223
Ady Abrahamabc27602020-04-08 17:20:29 -0700224 ASSERT_EQ(mExpected60Config, minRate);
225 ASSERT_EQ(mExpected60Config, minRate60);
226 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800227
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100228 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(60), Fps(90)}}),
229 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100230 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800231
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100232 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800233 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800234
Ady Abrahamabc27602020-04-08 17:20:29 -0700235 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate);
236 ASSERT_EQ(mExpected90DifferentGroupConfig, minRate90);
237 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate90);
238}
239
240TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentResolutions) {
241 auto refreshRateConfigs =
242 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentResolutions,
243 /*currentConfigId=*/HWC_CONFIG_ID_60);
244
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100245 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
246 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
247 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700248 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
249
250 ASSERT_EQ(mExpected60Config, minRate);
251 ASSERT_EQ(mExpected60Config, minRate60);
252 ASSERT_EQ(mExpected60Config, performanceRate60);
253
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100254 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(60), Fps(90)}}),
255 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100256 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700257
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100258 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700259 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
260
261 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate);
262 ASSERT_EQ(mExpected90DifferentResolutionConfig, minRate90);
263 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800264}
265
266TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_policyChange) {
Ady Abraham2139f732019-11-13 18:56:40 -0800267 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700268 std::make_unique<RefreshRateConfigs>(m60_90Device,
269 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800270
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100271 auto minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
272 auto performanceRate = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800273
Ady Abrahamabc27602020-04-08 17:20:29 -0700274 ASSERT_EQ(mExpected60Config, minRate);
275 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800276
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100277 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
278 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800279
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100280 auto minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
281 auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700282 ASSERT_EQ(mExpected60Config, minRate60);
283 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800284}
285
286TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getCurrentRefreshRate) {
Ady Abraham2139f732019-11-13 18:56:40 -0800287 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700288 std::make_unique<RefreshRateConfigs>(m60_90Device,
289 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800290 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100291 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100292 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800293 }
294
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100295 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800296 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100297 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100298 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800299 }
300
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100301 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
302 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800303 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100304 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100305 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800306 }
307}
308
Steven Thomasbb374322020-04-28 22:47:16 -0700309TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700310 auto refreshRateConfigs =
311 std::make_unique<RefreshRateConfigs>(m60_72_90Device, /*currentConfigId=*/
312 HWC_CONFIG_ID_72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800313
Steven Thomasdebafed2020-05-18 17:30:35 -0700314 // If there are no layers we select the default frame rate, which is the max of the primary
315 // range.
Ana Krulec3d367c82020-02-25 15:02:01 -0800316 auto layers = std::vector<LayerRequirement>{};
Steven Thomasdebafed2020-05-18 17:30:35 -0700317 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700318 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800319
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100320 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
321 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700322 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700323 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800324}
325
Steven Thomasbb374322020-04-28 22:47:16 -0700326TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800327 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700328 std::make_unique<RefreshRateConfigs>(m60_90Device,
329 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800330
331 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
332 auto& lr = layers[0];
333
334 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800335 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700336 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700337 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800338
339 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800340 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700341 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700342 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800343
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100344 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800345 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800346 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700347 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700348 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800349
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100350 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800351 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700352 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700353 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800354
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100355 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800356 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700357 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700358 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800359
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100360 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800361 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700362 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700363 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800364
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100365 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800366 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700367 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700368 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800369
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800370 lr.name = "";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100371 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
372 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800373
374 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700375 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700376 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800377
378 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700379 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700380 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800381
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100382 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800383 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700384 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700385 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800386
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100387 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700388 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700389 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800390
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100391 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700392 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700393 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800394
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100395 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700396 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700397 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800398
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100399 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700400 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700401 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800402
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100403 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
404 {HWC_CONFIG_ID_90, {Fps(90.0f), Fps(90.0f)}}),
405 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800406
407 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700408 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700409 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800410
411 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700412 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700413 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800414
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100415 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800416 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700417 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700418 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800419
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100420 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700421 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700422 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800423
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100424 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700425 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700426 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800427
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100428 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700429 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700430 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800431
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100432 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700433 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700434 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800435
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100436 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
437 {HWC_CONFIG_ID_60, {Fps(0.0f), Fps(120.0f)}}),
438 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800439 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700440 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700441 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800442
443 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700444 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700445 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800446
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100447 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800448 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700449 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700450 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800451
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100452 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700453 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700454 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800455
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100456 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700457 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700458 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800459
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100460 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700461 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700462 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800463
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100464 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700465 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700466 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800467}
468
Steven Thomasbb374322020-04-28 22:47:16 -0700469TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800470 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700471 std::make_unique<RefreshRateConfigs>(m60_72_90Device,
472 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800473
474 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
475 auto& lr = layers[0];
476
477 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700478 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700479 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800480
481 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700482 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700483 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800484
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100485 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800486 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700487 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700488 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800489
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100490 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700491 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700492 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800493
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100494 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700495 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700496 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800497
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100498 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700499 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700500 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800501
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100502 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700503 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700504 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800505}
506
Steven Thomasbb374322020-04-28 22:47:16 -0700507TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800508 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700509 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
510 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800511
512 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
513 LayerRequirement{.weight = 1.0f}};
514 auto& lr1 = layers[0];
515 auto& lr2 = layers[1];
516
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100517 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800518 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100519 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800520 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700521 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700522 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800523
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100524 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800525 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100526 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800527 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700528 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700529 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800530
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100531 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800532 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100533 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800534 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700535 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700536 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800537}
538
Steven Thomasbb374322020-04-28 22:47:16 -0700539TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Ady Abraham71c437d2020-01-31 15:56:57 -0800540 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700541 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
542 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800543
544 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
545 LayerRequirement{.weight = 1.0f}};
546 auto& lr1 = layers[0];
547 auto& lr2 = layers[1];
548
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100549 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800550 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800551 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100552 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800553 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800554 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700555 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700556 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800557
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100558 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800559 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800560 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100561 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800562 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800563 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700564 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700565 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800566
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100567 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800568 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800569 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100570 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800571 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800572 lr2.name = "60Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700573 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700574 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800575
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100576 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800577 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800578 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100579 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800580 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800581 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700582 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700583 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800584
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100585 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800586 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
587 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100588 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800589 lr2.vote = LayerVoteType::ExplicitDefault;
590 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700591 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700592 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800593
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100594 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800595 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800596 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100597 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800598 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800599 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700600 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700601 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800602
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100603 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800604 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800605 lr1.name = "24Hz Heuristic";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100606 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800607 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800608 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700609 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700610 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800611
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100612 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800613 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800614 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100615 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800616 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800617 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700618 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700619 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800620
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100621 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800622 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800623 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100624 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800625 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800626 lr2.name = "90Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700627 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700628 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800629}
630
Steven Thomasbb374322020-04-28 22:47:16 -0700631TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800632 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700633 std::make_unique<RefreshRateConfigs>(m30_60Device,
634 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800635
636 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
637 auto& lr = layers[0];
638
639 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700640 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700641 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800642
643 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700644 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700645 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800646
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100647 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800648 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700649 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700650 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800651
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100652 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700653 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700654 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800655
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100656 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700657 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700658 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800659
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100660 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700661 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700662 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800663
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100664 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700665 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700666 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800667}
668
Steven Thomasbb374322020-04-28 22:47:16 -0700669TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800670 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700671 std::make_unique<RefreshRateConfigs>(m30_60_72_90Device,
672 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800673
674 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
675 auto& lr = layers[0];
676
677 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800678 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700679 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700680 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800681
682 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800683 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700684 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700685 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800686
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100687 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800688 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800689 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700690 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700691 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800692
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100693 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800694 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700695 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700696 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700697 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700698 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800699
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100700 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800701 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700702 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700703 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700704 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700705 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800706
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100707 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800708 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700709 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700710 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700711 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700712 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800713
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100714 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800715 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700716 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700717 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700718 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700719 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800720
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100721 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800722 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
723 lr.name = "24Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700724 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700725 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700726 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700727 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800728}
729
Steven Thomasbb374322020-04-28 22:47:16 -0700730TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800731 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700732 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
733 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800734
735 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
736 LayerRequirement{.weight = 1.0f}};
737 auto& lr1 = layers[0];
738 auto& lr2 = layers[1];
739
740 lr1.vote = LayerVoteType::Min;
741 lr2.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700742 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700743 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800744
745 lr1.vote = LayerVoteType::Min;
746 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100747 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700748 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700749 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800750
751 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800752 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100753 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700754 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700755 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800756
757 lr1.vote = LayerVoteType::Max;
758 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100759 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700760 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700761 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800762
763 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800764 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100765 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700766 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700767 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800768
769 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100770 lr1.desiredRefreshRate = Fps(15.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800771 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100772 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700773 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700774 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800775
776 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100777 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800778 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100779 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700780 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700781 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800782}
783
Steven Thomasbb374322020-04-28 22:47:16 -0700784TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800785 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700786 std::make_unique<RefreshRateConfigs>(m60_90Device,
787 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800788
789 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
790 auto& lr = layers[0];
791
Ady Abraham71c437d2020-01-31 15:56:57 -0800792 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800793 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100794 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800795 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700796 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700797 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abraham8a82ba62020-01-17 12:43:17 -0800798 }
799}
800
Steven Thomasbb374322020-04-28 22:47:16 -0700801TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800802 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700803 std::make_unique<RefreshRateConfigs>(m60_90Device,
804 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800805
806 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
807 LayerRequirement{.weight = 1.0f}};
808 auto& lr1 = layers[0];
809 auto& lr2 = layers[1];
810
811 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100812 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800813 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100814 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700815 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700816 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800817
818 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100819 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800820 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100821 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700822 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700823 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800824
825 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100826 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800827 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100828 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700829 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700830 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham2139f732019-11-13 18:56:40 -0800831}
832
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800833TEST_F(RefreshRateConfigsTest, testInPolicy) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100834 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(60.000004f), Fps(60.000004f)));
835 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(59.0f), Fps(60.1f)));
836 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(75.0f), Fps(90.0f)));
837 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(60.0011f), Fps(90.0f)));
838 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(50.0f), Fps(59.998f)));
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800839}
840
Steven Thomasbb374322020-04-28 22:47:16 -0700841TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Ady Abrahamf6b77072020-01-30 14:22:54 -0800842 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700843 std::make_unique<RefreshRateConfigs>(m60_90Device,
844 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800845
846 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
847 auto& lr = layers[0];
848
Ady Abraham71c437d2020-01-31 15:56:57 -0800849 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800850 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100851 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800852 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700853 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700854 EXPECT_EQ(mExpected90Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -0800855 }
856}
857
Steven Thomasbb374322020-04-28 22:47:16 -0700858TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Ady Abraham34702102020-02-10 14:12:05 -0800859 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700860 std::make_unique<RefreshRateConfigs>(m60_90Device,
861 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham34702102020-02-10 14:12:05 -0800862
863 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
864 LayerRequirement{.weight = 1.0f}};
865 auto& lr1 = layers[0];
866 auto& lr2 = layers[1];
867
868 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100869 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800870 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800871 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100872 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800873 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700874 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700875 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -0800876
877 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100878 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800879 lr1.name = "60Hz ExplicitExactOrMultiple";
880 lr2.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100881 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800882 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700883 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700884 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800885
886 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100887 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800888 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800889 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800890 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700891 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700892 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -0800893
894 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100895 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800896 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800897 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100898 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800899 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700900 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700901 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -0800902
903 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100904 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800905 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800906 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800907 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700908 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700909 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800910}
911
912TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800913 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700914 std::make_unique<RefreshRateConfigs>(m60_90Device,
915 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800916
917 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
918 LayerRequirement{.weight = 1.0f}};
919 auto& lr1 = layers[0];
920 auto& lr2 = layers[1];
921
922 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100923 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800924 lr1.name = "60Hz ExplicitExactOrMultiple";
925 lr2.vote = LayerVoteType::NoVote;
926 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -0700927 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700928 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800929
930 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100931 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800932 lr1.name = "60Hz ExplicitExactOrMultiple";
933 lr2.vote = LayerVoteType::NoVote;
934 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -0700935 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700936 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800937
938 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100939 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800940 lr1.name = "60Hz ExplicitExactOrMultiple";
941 lr2.vote = LayerVoteType::Max;
942 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700943 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700944 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800945
946 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100947 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800948 lr1.name = "60Hz ExplicitExactOrMultiple";
949 lr2.vote = LayerVoteType::Max;
950 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700951 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700952 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800953
954 // The other layer starts to provide buffers
955 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100956 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800957 lr1.name = "60Hz ExplicitExactOrMultiple";
958 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100959 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800960 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700961 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700962 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham6fb599b2020-03-05 13:48:22 -0800963}
964
965TEST_F(RefreshRateConfigsTest, touchConsidered) {
Ady Abrahamdfd62162020-06-10 16:11:56 -0700966 RefreshRateConfigs::GlobalSignals consideredSignals;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800967 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700968 std::make_unique<RefreshRateConfigs>(m60_90Device,
969 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800970
Ady Abrahamdfd62162020-06-10 16:11:56 -0700971 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false}, &consideredSignals);
972 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800973
Ady Abrahamdfd62162020-06-10 16:11:56 -0700974 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = false}, &consideredSignals);
975 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800976
977 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
978 LayerRequirement{.weight = 1.0f}};
979 auto& lr1 = layers[0];
980 auto& lr2 = layers[1];
981
982 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100983 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800984 lr1.name = "60Hz ExplicitExactOrMultiple";
985 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100986 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -0700987 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -0700988 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
989 &consideredSignals);
990 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800991
992 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100993 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800994 lr1.name = "60Hz ExplicitExactOrMultiple";
995 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100996 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -0700997 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -0700998 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
999 &consideredSignals);
1000 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001001
1002 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001003 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001004 lr1.name = "60Hz ExplicitExactOrMultiple";
1005 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001006 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001007 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001008 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1009 &consideredSignals);
1010 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001011
1012 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001013 lr1.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001014 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001015 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001016 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001017 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001018 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1019 &consideredSignals);
1020 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001021}
1022
Steven Thomasbb374322020-04-28 22:47:16 -07001023TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Ady Abrahamabc27602020-04-08 17:20:29 -07001024 auto refreshRateConfigs =
1025 std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/
1026 HWC_CONFIG_ID_60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001027
1028 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1029 auto& lr = layers[0];
1030
1031 // Prepare a table with the vote and the expected refresh rate
1032 const std::vector<std::pair<float, float>> testCases = {
1033 {130, 120}, {120, 120}, {119, 120}, {110, 120},
1034
1035 {100, 90}, {90, 90}, {89, 90},
1036
1037 {80, 72}, {73, 72}, {72, 72}, {71, 72}, {70, 72},
1038
1039 {65, 60}, {60, 60}, {59, 60}, {58, 60},
1040
1041 {55, 90}, {50, 90}, {45, 90},
1042
1043 {42, 120}, {40, 120}, {39, 120},
1044
1045 {37, 72}, {36, 72}, {35, 72},
1046
1047 {30, 60},
1048 };
1049
1050 for (const auto& test : testCases) {
1051 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001052 lr.desiredRefreshRate = Fps(test.first);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001053
1054 std::stringstream ss;
1055 ss << "ExplicitDefault " << test.first << " fps";
1056 lr.name = ss.str();
1057
1058 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001059 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001060 EXPECT_TRUE(refreshRate.getFps().equalsWithMargin(Fps(test.second)))
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001061 << "Expecting " << test.first << "fps => " << test.second << "Hz";
1062 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001063}
1064
Alec Mouri11232a22020-05-14 18:06:25 -07001065TEST_F(RefreshRateConfigsTest,
1066 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
1067 auto refreshRateConfigs =
1068 std::make_unique<RefreshRateConfigs>(m60_90Device,
1069 /*currentConfigId=*/HWC_CONFIG_ID_90);
1070
1071 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001072 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001073 0);
1074
1075 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1076 auto& lr = layers[0];
1077
Ady Abrahamdfd62162020-06-10 16:11:56 -07001078 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001079 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001080 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001081 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001082 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001083 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001084 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = true},
1085 &consideredSignals));
1086 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001087}
1088
1089TEST_F(RefreshRateConfigsTest,
1090 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
1091 auto refreshRateConfigs =
1092 std::make_unique<RefreshRateConfigs>(m60_90Device,
1093 /*currentConfigId=*/HWC_CONFIG_ID_60);
1094
1095 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001096 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001097 0);
1098
1099 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1100 auto& lr = layers[0];
1101
Alec Mouri11232a22020-05-14 18:06:25 -07001102 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001103 lr.desiredRefreshRate = Fps(90.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001104 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001105 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001106 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001107 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001108}
1109
1110TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001111 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Alec Mouri11232a22020-05-14 18:06:25 -07001112 auto refreshRateConfigs =
1113 std::make_unique<RefreshRateConfigs>(m60_90Device,
1114 /*currentConfigId=*/HWC_CONFIG_ID_90);
1115
1116 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001117 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001118 0);
1119
Ady Abrahamdfd62162020-06-10 16:11:56 -07001120 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001121 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001122 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false},
1123 &consideredSignals));
1124 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001125
1126 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1127 auto& lr = layers[0];
1128
1129 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001130 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001131 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001132 lr.focused = false;
1133 EXPECT_EQ(mExpected90Config,
1134 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1135
1136 lr.focused = true;
Ady Abraham20c029c2020-07-06 12:58:05 -07001137 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001138 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001139
1140 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001141 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001142 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001143 lr.focused = false;
1144 EXPECT_EQ(mExpected90Config,
1145 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1146
1147 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001148 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001149 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001150
1151 lr.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001152 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001153 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001154 lr.focused = false;
1155 EXPECT_EQ(mExpected90Config,
1156 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1157
1158 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001159 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001160 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001161
1162 lr.vote = LayerVoteType::Max;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001163 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001164 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001165 lr.focused = false;
1166 EXPECT_EQ(mExpected90Config,
1167 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1168
1169 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001170 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001171 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001172
1173 lr.vote = LayerVoteType::Min;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001174 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001175 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001176 lr.focused = false;
1177 EXPECT_EQ(mExpected90Config,
1178 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1179
1180 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001181 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001182 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001183}
1184
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001185TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Steven Thomasd4071902020-03-24 16:02:53 -07001186 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001187 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1188 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001189
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001190 // The default policy doesn't allow group switching. Verify that no
1191 // group switches are performed.
Steven Thomasd4071902020-03-24 16:02:53 -07001192 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1193 auto& layer = layers[0];
1194 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001195 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001196 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001197 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001198 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001199
Steven Thomasd4071902020-03-24 16:02:53 -07001200 ASSERT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001201 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001202 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001203}
Steven Thomasd4071902020-03-24 16:02:53 -07001204
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001205TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
1206 auto refreshRateConfigs =
1207 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1208 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001209 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001210 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001211 policy.allowGroupSwitching = true;
1212 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001213
1214 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1215 auto& layer = layers[0];
1216 layer.vote = LayerVoteType::ExplicitDefault;
1217 layer.desiredRefreshRate = Fps(90.0f);
1218 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1219 layer.name = "90Hz ExplicitDefault";
1220 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001221 ASSERT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001222 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001223 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001224}
1225
1226TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
1227 auto refreshRateConfigs =
1228 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1229 /*currentConfigId=*/HWC_CONFIG_ID_60);
1230 RefreshRateConfigs::Policy policy;
1231 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1232 policy.allowGroupSwitching = true;
1233 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001234
1235 // Verify that we won't change the group if seamless switch is required.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001236 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1237 auto& layer = layers[0];
1238 layer.vote = LayerVoteType::ExplicitDefault;
1239 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001240 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001241 layer.name = "90Hz ExplicitDefault";
1242 layer.focused = true;
Marin Shalamanov46084422020-10-13 12:33:42 +02001243 ASSERT_EQ(HWC_CONFIG_ID_60,
1244 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001245 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001246}
1247
1248TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
1249 auto refreshRateConfigs =
1250 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1251 /*currentConfigId=*/HWC_CONFIG_ID_60);
1252 RefreshRateConfigs::Policy policy;
1253 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1254 policy.allowGroupSwitching = true;
1255 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1256
1257 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001258
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001259 // Verify that we won't do a seamless switch if we request the same mode as the default
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001260 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1261 auto& layer = layers[0];
1262 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001263 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001264 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001265 layer.name = "60Hz ExplicitDefault";
1266 layer.focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001267 ASSERT_EQ(HWC_CONFIG_ID_90,
1268 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001269 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001270}
1271
1272TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
1273 auto refreshRateConfigs =
1274 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1275 /*currentConfigId=*/HWC_CONFIG_ID_60);
1276 RefreshRateConfigs::Policy policy;
1277 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1278 policy.allowGroupSwitching = true;
1279 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1280
1281 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001282
1283 // Verify that if the current config is in another group and there are no layers with
1284 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001285
1286 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1287 auto& layer = layers[0];
1288 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001289 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001290 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001291 layer.name = "60Hz ExplicitDefault";
1292 layer.focused = true;
1293
Marin Shalamanov46084422020-10-13 12:33:42 +02001294 ASSERT_EQ(HWC_CONFIG_ID_60,
1295 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001296 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001297}
1298
1299TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
1300 auto refreshRateConfigs =
1301 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1302 /*currentConfigId=*/HWC_CONFIG_ID_60);
1303 RefreshRateConfigs::Policy policy;
1304 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1305 policy.allowGroupSwitching = true;
1306 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1307
1308 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001309
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001310 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001311 // seamlessness=OnlySeamless can't change the mode group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001312 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1313 layers[0].vote = LayerVoteType::ExplicitDefault;
1314 layers[0].desiredRefreshRate = Fps(60.0f);
1315 layers[0].seamlessness = Seamlessness::OnlySeamless;
1316 layers[0].name = "60Hz ExplicitDefault";
1317 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001318
1319 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001320 layers[1].vote = LayerVoteType::ExplicitDefault;
1321 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1322 layers[1].desiredRefreshRate = Fps(90.0f);
1323 layers[1].name = "90Hz ExplicitDefault";
1324 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001325
1326 ASSERT_EQ(HWC_CONFIG_ID_90,
1327 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001328 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001329}
1330
1331TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultAndSeamed) {
1332 auto refreshRateConfigs =
1333 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1334 /*currentConfigId=*/HWC_CONFIG_ID_60);
1335 RefreshRateConfigs::Policy policy;
1336 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1337 policy.allowGroupSwitching = true;
1338 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1339
1340 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001341
1342 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001343 // seamlessness=Default can't change the mode group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001344 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001345 layers[0].seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001346 layers[0].desiredRefreshRate = Fps(60.0f);
1347 layers[0].focused = true;
1348 layers[0].vote = LayerVoteType::ExplicitDefault;
1349 layers[0].name = "60Hz ExplicitDefault";
1350
1351 layers.push_back(LayerRequirement{.weight = 0.5f});
1352 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1353 layers[1].desiredRefreshRate = Fps(90.0f);
1354 layers[1].focused = false;
1355 layers[1].vote = LayerVoteType::ExplicitDefault;
1356 layers[1].name = "90Hz ExplicitDefault";
1357
Marin Shalamanov46084422020-10-13 12:33:42 +02001358 ASSERT_EQ(HWC_CONFIG_ID_90,
1359 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001360 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001361}
1362
1363TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
1364 auto refreshRateConfigs =
1365 std::make_unique<RefreshRateConfigs>(m30_60Device,
1366 /*currentConfigId=*/HWC_CONFIG_ID_60);
1367
1368 // Allow group switching.
1369 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001370 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001371 policy.allowGroupSwitching = true;
1372 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1373
1374 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1375 auto& layer = layers[0];
1376 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001377 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001378 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001379 layer.name = "60Hz ExplicitExactOrMultiple";
1380 layer.focused = true;
1381
1382 ASSERT_EQ(HWC_CONFIG_ID_60,
1383 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001384 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001385
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001386 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Marin Shalamanov46084422020-10-13 12:33:42 +02001387 ASSERT_EQ(HWC_CONFIG_ID_120,
1388 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001389 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001390}
1391
1392TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
1393 auto refreshRateConfigs =
1394 std::make_unique<RefreshRateConfigs>(m25_30_50_60Device,
1395 /*currentConfigId=*/HWC_CONFIG_ID_60);
1396
1397 // Allow group switching.
1398 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001399 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001400 policy.allowGroupSwitching = true;
1401 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1402
1403 auto layers = std::vector<
1404 LayerRequirement>{LayerRequirement{.name = "60Hz ExplicitDefault",
1405 .vote = LayerVoteType::ExplicitDefault,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001406 .desiredRefreshRate = Fps(60.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001407 .seamlessness = Seamlessness::SeamedAndSeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001408 .weight = 0.5f,
1409 .focused = false},
1410 LayerRequirement{.name = "25Hz ExplicitExactOrMultiple",
1411 .vote = LayerVoteType::ExplicitExactOrMultiple,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001412 .desiredRefreshRate = Fps(25.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001413 .seamlessness = Seamlessness::OnlySeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001414 .weight = 1.0f,
1415 .focused = true}};
1416 auto& seamedLayer = layers[0];
1417
1418 ASSERT_EQ(HWC_CONFIG_ID_50,
1419 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001420 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001421
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001422 seamedLayer.name = "30Hz ExplicitDefault", seamedLayer.desiredRefreshRate = Fps(30.0f);
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001423 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001424
1425 ASSERT_EQ(HWC_CONFIG_ID_25,
1426 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001427 .getModeId());
Steven Thomasd4071902020-03-24 16:02:53 -07001428}
1429
Steven Thomasf734df42020-04-13 21:09:28 -07001430TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
1431 auto refreshRateConfigs =
Alec Mouri11232a22020-05-14 18:06:25 -07001432 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
Steven Thomasf734df42020-04-13 21:09:28 -07001433 /*currentConfigId=*/HWC_CONFIG_ID_60);
1434
1435 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1436 layers[0].name = "Test layer";
1437
Steven Thomasbb374322020-04-28 22:47:16 -07001438 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001439 // given voteType and fps.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001440 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, bool touchActive = false,
Marin Shalamanov23c44202020-12-22 19:09:20 +01001441 bool focused = true) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001442 layers[0].vote = voteType;
1443 layers[0].desiredRefreshRate = fps;
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001444 layers[0].focused = focused;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001445 return refreshRateConfigs->getBestRefreshRate(layers, {.touch = touchActive, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001446 .getModeId();
Steven Thomasf734df42020-04-13 21:09:28 -07001447 };
1448
1449 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001450 {HWC_CONFIG_ID_60, {Fps(30.f), Fps(60.f)}, {Fps(30.f), Fps(90.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001451 0);
Steven Thomasf734df42020-04-13 21:09:28 -07001452 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001453 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001454 .getModeId());
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001455 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1456 EXPECT_EQ(HWC_CONFIG_ID_30, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1457 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1458 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1459 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1460 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001461
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001462 // Layers not focused are not allowed to override primary config
1463 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001464 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001465 /*focused=*/false));
1466 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001467 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001468 /*focused=*/false));
1469
Steven Thomasf734df42020-04-13 21:09:28 -07001470 // Touch boost should be restricted to the primary range.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001471 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001472 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1473 // shouldn't drag us back down to the primary range max.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001474 EXPECT_EQ(HWC_CONFIG_ID_90,
1475 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/true));
Ady Abraham20c029c2020-07-06 12:58:05 -07001476 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001477 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001478
1479 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001480 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(60.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001481 0);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001482 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1483 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1484 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1485 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1486 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1487 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001488}
1489
Steven Thomasbb374322020-04-28 22:47:16 -07001490TEST_F(RefreshRateConfigsTest, idle) {
1491 auto refreshRateConfigs =
1492 std::make_unique<RefreshRateConfigs>(m60_90Device,
1493 /*currentConfigId=*/HWC_CONFIG_ID_60);
1494
1495 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1496 layers[0].name = "Test layer";
1497
Marin Shalamanov23c44202020-12-22 19:09:20 +01001498 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001499 layers[0].vote = voteType;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001500 layers[0].desiredRefreshRate = Fps(90.f);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001501 RefreshRateConfigs::GlobalSignals consideredSignals;
1502 const auto configId =
1503 refreshRateConfigs
1504 ->getBestRefreshRate(layers, {.touch = touchActive, .idle = true},
1505 &consideredSignals)
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001506 .getModeId();
Ady Abrahamdfd62162020-06-10 16:11:56 -07001507 // Refresh rate will be chosen by either touch state or idle state
1508 EXPECT_EQ(!touchActive, consideredSignals.idle);
1509 return configId;
Steven Thomasbb374322020-04-28 22:47:16 -07001510 };
1511
1512 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001513 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Steven Thomasbb374322020-04-28 22:47:16 -07001514 0);
1515
1516 // Idle should be lower priority than touch boost.
Ady Abrahamdfd62162020-06-10 16:11:56 -07001517 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/true));
1518 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/true));
1519 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/true));
1520 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/true));
1521 EXPECT_EQ(HWC_CONFIG_ID_90,
1522 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/true));
1523 EXPECT_EQ(HWC_CONFIG_ID_90,
1524 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/true));
Steven Thomasbb374322020-04-28 22:47:16 -07001525
1526 // With no layers, idle should still be lower priority than touch boost.
Steven Thomasbb374322020-04-28 22:47:16 -07001527 EXPECT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001528 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001529 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001530
1531 // Idle should be higher precedence than other layer frame rate considerations.
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001532 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001533 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/false));
1534 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/false));
1535 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/false));
1536 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/false));
1537 EXPECT_EQ(HWC_CONFIG_ID_60,
1538 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/false));
1539 EXPECT_EQ(HWC_CONFIG_ID_60,
1540 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/false));
Steven Thomasbb374322020-04-28 22:47:16 -07001541
1542 // Idle should be applied rather than the current config when there are no layers.
1543 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001544 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001545 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001546}
1547
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001548TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
1549 auto refreshRateConfigs =
1550 std::make_unique<RefreshRateConfigs>(m60_90Device,
1551 /*currentConfigId=*/HWC_CONFIG_ID_60);
1552
1553 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001554 const auto knownFrameRate = findClosestKnownFrameRate(*refreshRateConfigs, Fps(fps));
1555 Fps expectedFrameRate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001556 if (fps < 26.91f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001557 expectedFrameRate = Fps(24.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001558 } else if (fps < 37.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001559 expectedFrameRate = Fps(30.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001560 } else if (fps < 52.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001561 expectedFrameRate = Fps(45.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001562 } else if (fps < 66.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001563 expectedFrameRate = Fps(60.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001564 } else if (fps < 81.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001565 expectedFrameRate = Fps(72.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001566 } else {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001567 expectedFrameRate = Fps(90.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001568 }
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001569 EXPECT_TRUE(expectedFrameRate.equalsWithMargin(knownFrameRate))
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001570 << "findClosestKnownFrameRate(" << fps << ") = " << knownFrameRate;
1571 }
1572}
1573
1574TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001575 auto refreshRateConfigs =
1576 std::make_unique<RefreshRateConfigs>(m60_90Device,
1577 /*currentConfigId=*/HWC_CONFIG_ID_60);
1578
1579 struct ExpectedRate {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001580 Fps rate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001581 const RefreshRate& expected;
1582 };
1583
1584 /* clang-format off */
1585 std::vector<ExpectedRate> knownFrameRatesExpectations = {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001586 {Fps(24.0f), mExpected60Config},
1587 {Fps(30.0f), mExpected60Config},
1588 {Fps(45.0f), mExpected90Config},
1589 {Fps(60.0f), mExpected60Config},
1590 {Fps(72.0f), mExpected90Config},
1591 {Fps(90.0f), mExpected90Config},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001592 };
1593 /* clang-format on */
1594
1595 // Make sure the test tests all the known frame rate
1596 const auto knownFrameRateList = getKnownFrameRate(*refreshRateConfigs);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001597 const auto equal =
1598 std::equal(knownFrameRateList.begin(), knownFrameRateList.end(),
1599 knownFrameRatesExpectations.begin(),
1600 [](Fps a, const ExpectedRate& b) { return a.equalsWithMargin(b.rate); });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001601 EXPECT_TRUE(equal);
1602
1603 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1604 auto& layer = layers[0];
1605 layer.vote = LayerVoteType::Heuristic;
1606 for (const auto& expectedRate : knownFrameRatesExpectations) {
1607 layer.desiredRefreshRate = expectedRate.rate;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001608 const auto& refreshRate =
1609 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001610 EXPECT_EQ(expectedRate.expected, refreshRate);
1611 }
1612}
1613
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001614TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
1615 auto refreshRateConfigs =
1616 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1617 /*currentConfigId=*/HWC_CONFIG_ID_60);
1618
1619 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1620 LayerRequirement{.weight = 0.5f}};
1621 auto& explicitExactLayer = layers[0];
1622 auto& explicitExactOrMultipleLayer = layers[1];
1623
1624 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1625 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
1626 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
1627
1628 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1629 explicitExactLayer.name = "ExplicitExact";
1630 explicitExactLayer.desiredRefreshRate = Fps(30);
1631
1632 EXPECT_EQ(mExpected30Config,
1633 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1634 EXPECT_EQ(mExpected30Config,
1635 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
1636
1637 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
1638 explicitExactLayer.desiredRefreshRate = Fps(60);
1639 EXPECT_EQ(mExpected60Config,
1640 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1641
1642 explicitExactLayer.desiredRefreshRate = Fps(72);
1643 EXPECT_EQ(mExpected72Config,
1644 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1645
1646 explicitExactLayer.desiredRefreshRate = Fps(90);
1647 EXPECT_EQ(mExpected90Config,
1648 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1649
1650 explicitExactLayer.desiredRefreshRate = Fps(120);
1651 EXPECT_EQ(mExpected120Config,
1652 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1653}
1654
1655TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
1656 auto refreshRateConfigs =
1657 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1658 /*currentConfigId=*/HWC_CONFIG_ID_60,
1659 /*enableFrameRateOverride=*/true);
1660
1661 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1662 LayerRequirement{.weight = 0.5f}};
1663 auto& explicitExactLayer = layers[0];
1664 auto& explicitExactOrMultipleLayer = layers[1];
1665
1666 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1667 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
1668 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
1669
1670 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1671 explicitExactLayer.name = "ExplicitExact";
1672 explicitExactLayer.desiredRefreshRate = Fps(30);
1673
1674 EXPECT_EQ(mExpected60Config,
1675 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1676 EXPECT_EQ(mExpected120Config,
1677 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
1678
1679 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
1680 explicitExactLayer.desiredRefreshRate = Fps(60);
1681 EXPECT_EQ(mExpected120Config,
1682 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1683
1684 explicitExactLayer.desiredRefreshRate = Fps(72);
1685 EXPECT_EQ(mExpected72Config,
1686 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1687
1688 explicitExactLayer.desiredRefreshRate = Fps(90);
1689 EXPECT_EQ(mExpected90Config,
1690 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1691
1692 explicitExactLayer.desiredRefreshRate = Fps(120);
1693 EXPECT_EQ(mExpected120Config,
1694 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1695}
1696
Ana Krulecb9afd792020-06-11 13:16:15 -07001697TEST_F(RefreshRateConfigsTest, testComparisonOperator) {
1698 EXPECT_TRUE(mExpected60Config < mExpected90Config);
1699 EXPECT_FALSE(mExpected60Config < mExpected60Config);
1700 EXPECT_FALSE(mExpected90Config < mExpected90Config);
1701}
1702
1703TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
1704 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
1705
1706 auto refreshRateConfigs =
1707 std::make_unique<RefreshRateConfigs>(m60_90Device,
1708 /*currentConfigId=*/HWC_CONFIG_ID_90);
1709 // SetPolicy(60, 90), current 90Hz => TurnOn.
1710 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
1711
1712 // SetPolicy(60, 90), current 60Hz => TurnOn.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001713 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(90)}}),
1714 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07001715 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
1716
1717 // SetPolicy(60, 60), current 60Hz => NoChange, avoid extra calls.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001718 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
1719 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07001720 EXPECT_EQ(KernelIdleTimerAction::NoChange, refreshRateConfigs->getIdleTimerAction());
1721
1722 // SetPolicy(90, 90), current 90Hz => TurnOff.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001723 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
1724 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07001725 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
1726}
1727
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001728TEST_F(RefreshRateConfigsTest, getRefreshRateDivider) {
Ady Abraham0bb6a472020-10-12 10:22:13 -07001729 auto refreshRateConfigs =
1730 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1731 /*currentConfigId=*/HWC_CONFIG_ID_30);
Ady Abraham62a0be22020-12-08 16:54:10 -08001732
1733 const auto frameRate = Fps(30.f);
1734 EXPECT_EQ(1, refreshRateConfigs->getRefreshRateDivider(frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001735
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001736 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_60);
Ady Abraham62a0be22020-12-08 16:54:10 -08001737 EXPECT_EQ(2, refreshRateConfigs->getRefreshRateDivider(frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001738
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001739 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_72);
Ady Abraham62a0be22020-12-08 16:54:10 -08001740 EXPECT_EQ(0, refreshRateConfigs->getRefreshRateDivider(frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001741
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001742 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham62a0be22020-12-08 16:54:10 -08001743 EXPECT_EQ(3, refreshRateConfigs->getRefreshRateDivider(frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001744
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001745 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Ady Abraham62a0be22020-12-08 16:54:10 -08001746 EXPECT_EQ(4, refreshRateConfigs->getRefreshRateDivider(frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07001747
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001748 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham62a0be22020-12-08 16:54:10 -08001749 EXPECT_EQ(4, refreshRateConfigs->getRefreshRateDivider(Fps(22.5f)));
1750 EXPECT_EQ(4, refreshRateConfigs->getRefreshRateDivider(Fps(22.6f)));
1751}
1752
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001753TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Ady Abraham62a0be22020-12-08 16:54:10 -08001754 auto refreshRateConfigs =
1755 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
1756 HWC_CONFIG_ID_120);
1757
1758 auto layers = std::vector<LayerRequirement>{};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001759 ASSERT_TRUE(refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false)
1760 .empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001761}
1762
1763TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
1764 auto refreshRateConfigs =
1765 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001766 HWC_CONFIG_ID_120,
1767 /*enableFrameRateOverride=*/true);
Ady Abraham62a0be22020-12-08 16:54:10 -08001768
1769 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1770 layers[0].name = "Test layer";
1771 layers[0].ownerUid = 1234;
1772 layers[0].desiredRefreshRate = Fps(60.0f);
1773 layers[0].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001774 auto frameRateOverrides =
1775 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001776 ASSERT_EQ(1, frameRateOverrides.size());
1777 ASSERT_EQ(1, frameRateOverrides.count(1234));
1778 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
1779
1780 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001781 frameRateOverrides =
1782 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001783 ASSERT_EQ(1, frameRateOverrides.size());
1784 ASSERT_EQ(1, frameRateOverrides.count(1234));
1785 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
1786
1787 layers[0].vote = LayerVoteType::NoVote;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001788 frameRateOverrides =
1789 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001790 ASSERT_TRUE(frameRateOverrides.empty());
1791
1792 layers[0].vote = LayerVoteType::Min;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001793 frameRateOverrides =
1794 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001795 ASSERT_TRUE(frameRateOverrides.empty());
1796
1797 layers[0].vote = LayerVoteType::Max;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001798 frameRateOverrides =
1799 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001800 ASSERT_TRUE(frameRateOverrides.empty());
1801
1802 layers[0].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001803 frameRateOverrides =
1804 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001805 ASSERT_TRUE(frameRateOverrides.empty());
1806}
1807
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001808TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
Ady Abraham62a0be22020-12-08 16:54:10 -08001809 auto refreshRateConfigs =
1810 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001811 HWC_CONFIG_ID_120,
1812 /*enableFrameRateOverride=*/true);
Ady Abraham62a0be22020-12-08 16:54:10 -08001813
1814 auto layers = std::vector<LayerRequirement>{
1815 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
1816 LayerRequirement{.ownerUid = 5678, .weight = 1.0f},
1817 };
1818
1819 layers[0].name = "Test layer 1234";
1820 layers[0].desiredRefreshRate = Fps(60.0f);
1821 layers[0].vote = LayerVoteType::ExplicitDefault;
1822
1823 layers[1].name = "Test layer 5678";
1824 layers[1].desiredRefreshRate = Fps(30.0f);
1825 layers[1].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001826 auto frameRateOverrides =
1827 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001828
1829 ASSERT_EQ(2, frameRateOverrides.size());
1830 ASSERT_EQ(1, frameRateOverrides.count(1234));
1831 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
1832 ASSERT_EQ(1, frameRateOverrides.count(5678));
1833 ASSERT_EQ(30.0f, frameRateOverrides.at(5678).getValue());
1834
1835 layers[1].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001836 frameRateOverrides =
1837 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001838 ASSERT_EQ(1, frameRateOverrides.size());
1839 ASSERT_EQ(1, frameRateOverrides.count(1234));
1840 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
1841
1842 layers[1].ownerUid = 1234;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001843 frameRateOverrides =
1844 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
1845 ASSERT_TRUE(frameRateOverrides.empty());
1846}
1847
1848TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
1849 auto refreshRateConfigs =
1850 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
1851 HWC_CONFIG_ID_120,
1852 /*enableFrameRateOverride=*/true);
1853
1854 auto layers = std::vector<LayerRequirement>{
1855 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
1856 };
1857
1858 layers[0].name = "Test layer";
1859 layers[0].desiredRefreshRate = Fps(60.0f);
1860 layers[0].vote = LayerVoteType::ExplicitDefault;
1861
1862 auto frameRateOverrides =
1863 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
1864 ASSERT_EQ(1, frameRateOverrides.size());
1865 ASSERT_EQ(1, frameRateOverrides.count(1234));
1866 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
1867
1868 frameRateOverrides =
1869 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
1870 ASSERT_EQ(1, frameRateOverrides.size());
1871 ASSERT_EQ(1, frameRateOverrides.count(1234));
1872 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
1873
1874 layers[0].vote = LayerVoteType::ExplicitExact;
1875 frameRateOverrides =
1876 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
1877 ASSERT_EQ(1, frameRateOverrides.size());
1878 ASSERT_EQ(1, frameRateOverrides.count(1234));
1879 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
1880
1881 frameRateOverrides =
1882 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
1883 ASSERT_EQ(1, frameRateOverrides.size());
1884 ASSERT_EQ(1, frameRateOverrides.count(1234));
1885 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
1886
1887 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
1888 frameRateOverrides =
1889 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
1890 ASSERT_EQ(1, frameRateOverrides.size());
1891 ASSERT_EQ(1, frameRateOverrides.count(1234));
1892 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
1893
1894 frameRateOverrides =
1895 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
Ady Abraham62a0be22020-12-08 16:54:10 -08001896 ASSERT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07001897}
1898
Marin Shalamanov75f37252021-02-10 21:43:57 +01001899TEST_F(RefreshRateConfigsTest, updateDisplayModes) {
1900 auto refreshRateConfigs =
1901 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1902 /*currentConfigId=*/HWC_CONFIG_ID_30);
1903 refreshRateConfigs->setDisplayManagerPolicy({DisplayModeId(HWC_CONFIG_ID_30),
1904 /* allowGroupSwitching */ false,
1905 /* range */ {Fps(30.0f), Fps(30.0f)}});
1906
1907 refreshRateConfigs->updateDisplayModes(m60_90Device, HWC_CONFIG_ID_60);
1908
1909 const auto currentRefreshRate = refreshRateConfigs->getCurrentRefreshRate();
1910 EXPECT_TRUE(currentRefreshRate.getFps().equalsWithMargin(Fps(60.0)));
1911 EXPECT_EQ(currentRefreshRate.getModeId(), HWC_CONFIG_ID_60);
1912
1913 EXPECT_TRUE(
1914 getMaxSupportedRefreshRate(*refreshRateConfigs).getFps().equalsWithMargin(Fps(90.0)));
1915 EXPECT_TRUE(
1916 getMinSupportedRefreshRate(*refreshRateConfigs).getFps().equalsWithMargin(Fps(60.0)));
1917}
1918
Alec Mouri0a1cc962019-03-14 12:33:02 -07001919} // namespace
1920} // namespace scheduler
1921} // namespace android
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01001922
1923// TODO(b/129481165): remove the #pragma below and fix conversion issues
1924#pragma clang diagnostic pop // ignored "-Wextra"