| Alec Mouri | 0a1cc96 | 2019-03-14 12:33:02 -0700 | [diff] [blame] | 1 | /* | 
|  | 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 |  | 
|  | 17 | #undef LOG_TAG | 
|  | 18 | #define LOG_TAG "SchedulerUnittests" | 
|  | 19 |  | 
|  | 20 | #include <gmock/gmock.h> | 
|  | 21 | #include <log/log.h> | 
|  | 22 | #include <thread> | 
|  | 23 |  | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 24 | #include "../../Scheduler/RefreshRateConfigs.h" | 
| Alec Mouri | 0a1cc96 | 2019-03-14 12:33:02 -0700 | [diff] [blame] | 25 | #include "DisplayHardware/HWC2.h" | 
|  | 26 | #include "Scheduler/RefreshRateConfigs.h" | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 27 | #include "mock/DisplayHardware/MockDisplay.h" | 
| Alec Mouri | 0a1cc96 | 2019-03-14 12:33:02 -0700 | [diff] [blame] | 28 |  | 
|  | 29 | using namespace std::chrono_literals; | 
|  | 30 | using testing::_; | 
|  | 31 |  | 
|  | 32 | namespace android { | 
|  | 33 | namespace scheduler { | 
|  | 34 |  | 
| Alec Mouri | 0a1cc96 | 2019-03-14 12:33:02 -0700 | [diff] [blame] | 35 | using RefreshRate = RefreshRateConfigs::RefreshRate; | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 36 | using LayerVoteType = RefreshRateConfigs::LayerVoteType; | 
|  | 37 | using LayerRequirement = RefreshRateConfigs::LayerRequirement; | 
| Alec Mouri | 0a1cc96 | 2019-03-14 12:33:02 -0700 | [diff] [blame] | 38 |  | 
|  | 39 | class RefreshRateConfigsTest : public testing::Test { | 
|  | 40 | protected: | 
| Alec Mouri | 0a1cc96 | 2019-03-14 12:33:02 -0700 | [diff] [blame] | 41 | RefreshRateConfigsTest(); | 
|  | 42 | ~RefreshRateConfigsTest(); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 43 |  | 
|  | 44 | // Test config IDs | 
|  | 45 | static inline const HwcConfigIndexType HWC_CONFIG_ID_60 = HwcConfigIndexType(0); | 
|  | 46 | static inline const HwcConfigIndexType HWC_CONFIG_ID_90 = HwcConfigIndexType(1); | 
|  | 47 | static inline const HwcConfigIndexType HWC_CONFIG_ID_72 = HwcConfigIndexType(2); | 
|  | 48 | static inline const HwcConfigIndexType HWC_CONFIG_ID_120 = HwcConfigIndexType(3); | 
|  | 49 | static inline const HwcConfigIndexType HWC_CONFIG_ID_30 = HwcConfigIndexType(4); | 
|  | 50 |  | 
|  | 51 | // Test configs | 
|  | 52 | std::shared_ptr<const HWC2::Display::Config> mConfig60 = | 
|  | 53 | createConfig(HWC_CONFIG_ID_60, 0, static_cast<int64_t>(1e9f / 60)); | 
|  | 54 | std::shared_ptr<const HWC2::Display::Config> mConfig90 = | 
|  | 55 | createConfig(HWC_CONFIG_ID_90, 0, static_cast<int64_t>(1e9f / 90)); | 
|  | 56 | std::shared_ptr<const HWC2::Display::Config> mConfig90DifferentGroup = | 
|  | 57 | createConfig(HWC_CONFIG_ID_90, 1, static_cast<int64_t>(1e9f / 90)); | 
|  | 58 | std::shared_ptr<const HWC2::Display::Config> mConfig90DifferentResolution = | 
|  | 59 | createConfig(HWC_CONFIG_ID_90, 0, static_cast<int64_t>(1e9f / 90), 111, 222); | 
|  | 60 | std::shared_ptr<const HWC2::Display::Config> mConfig72 = | 
|  | 61 | createConfig(HWC_CONFIG_ID_72, 0, static_cast<int64_t>(1e9f / 72)); | 
|  | 62 | std::shared_ptr<const HWC2::Display::Config> mConfig72DifferentGroup = | 
|  | 63 | createConfig(HWC_CONFIG_ID_72, 1, static_cast<int64_t>(1e9f / 72)); | 
|  | 64 | std::shared_ptr<const HWC2::Display::Config> mConfig120 = | 
|  | 65 | createConfig(HWC_CONFIG_ID_120, 0, static_cast<int64_t>(1e9f / 120)); | 
|  | 66 | std::shared_ptr<const HWC2::Display::Config> mConfig120DifferentGroup = | 
|  | 67 | createConfig(HWC_CONFIG_ID_120, 1, static_cast<int64_t>(1e9f / 120)); | 
|  | 68 | std::shared_ptr<const HWC2::Display::Config> mConfig30 = | 
|  | 69 | createConfig(HWC_CONFIG_ID_30, 0, static_cast<int64_t>(1e9f / 30)); | 
|  | 70 |  | 
|  | 71 | // Test device configurations | 
|  | 72 | std::vector<std::shared_ptr<const HWC2::Display::Config>> m60OnlyConfigDevice = {mConfig60}; | 
|  | 73 | std::vector<std::shared_ptr<const HWC2::Display::Config>> m60_90Device = {mConfig60, mConfig90}; | 
|  | 74 | std::vector<std::shared_ptr<const HWC2::Display::Config>> m60_90DeviceWithDifferentGroups = | 
|  | 75 | {mConfig60, mConfig90DifferentGroup}; | 
|  | 76 | std::vector<std::shared_ptr<const HWC2::Display::Config>> m60_90DeviceWithDifferentResolutions = | 
|  | 77 | {mConfig60, mConfig90DifferentResolution}; | 
|  | 78 | std::vector<std::shared_ptr<const HWC2::Display::Config>> m60_72_90Device = {mConfig60, | 
|  | 79 | mConfig90, | 
|  | 80 | mConfig72}; | 
|  | 81 | std::vector<std::shared_ptr<const HWC2::Display::Config>> m60_90_72_120Device = {mConfig60, | 
|  | 82 | mConfig90, | 
|  | 83 | mConfig72, | 
|  | 84 | mConfig120}; | 
|  | 85 | std::vector<std::shared_ptr<const HWC2::Display::Config>> m30_60_72_90_120Device = {mConfig60, | 
|  | 86 | mConfig90, | 
|  | 87 | mConfig72, | 
|  | 88 | mConfig120, | 
|  | 89 | mConfig30}; | 
|  | 90 | std::vector<std::shared_ptr<const HWC2::Display::Config>> m30_60Device = | 
|  | 91 | {mConfig60, mConfig90DifferentGroup, mConfig72DifferentGroup, mConfig120DifferentGroup, | 
|  | 92 | mConfig30}; | 
|  | 93 | std::vector<std::shared_ptr<const HWC2::Display::Config>> m30_60_72_90Device = | 
|  | 94 | {mConfig60, mConfig90, mConfig72, mConfig120DifferentGroup, mConfig30}; | 
|  | 95 | std::vector<std::shared_ptr<const HWC2::Display::Config>> m30_60_90Device = | 
|  | 96 | {mConfig60, mConfig90, mConfig72DifferentGroup, mConfig120DifferentGroup, mConfig30}; | 
|  | 97 |  | 
|  | 98 | // Expected RefreshRate objects | 
|  | 99 | RefreshRate mExpected60Config = {HWC_CONFIG_ID_60, mConfig60, "60fps", 60, | 
|  | 100 | RefreshRate::ConstructorTag(0)}; | 
|  | 101 | RefreshRate mExpectedAlmost60Config = {HWC_CONFIG_ID_60, | 
|  | 102 | createConfig(HWC_CONFIG_ID_60, 0, 16666665), "60fps", 60, | 
|  | 103 | RefreshRate::ConstructorTag(0)}; | 
|  | 104 | RefreshRate mExpected90Config = {HWC_CONFIG_ID_90, mConfig90, "90fps", 90, | 
|  | 105 | RefreshRate::ConstructorTag(0)}; | 
|  | 106 | RefreshRate mExpected90DifferentGroupConfig = {HWC_CONFIG_ID_90, mConfig90DifferentGroup, | 
|  | 107 | "90fps", 90, RefreshRate::ConstructorTag(0)}; | 
|  | 108 | RefreshRate mExpected90DifferentResolutionConfig = {HWC_CONFIG_ID_90, | 
|  | 109 | mConfig90DifferentResolution, "90fps", 90, | 
|  | 110 | RefreshRate::ConstructorTag(0)}; | 
|  | 111 | RefreshRate mExpected72Config = {HWC_CONFIG_ID_72, mConfig72, "72fps", 72, | 
|  | 112 | RefreshRate::ConstructorTag(0)}; | 
|  | 113 | RefreshRate mExpected30Config = {HWC_CONFIG_ID_30, mConfig30, "30fps", 30, | 
|  | 114 | RefreshRate::ConstructorTag(0)}; | 
|  | 115 | RefreshRate mExpected120Config = {HWC_CONFIG_ID_120, mConfig120, "120fps", 120, | 
|  | 116 | RefreshRate::ConstructorTag(0)}; | 
|  | 117 |  | 
|  | 118 | Hwc2::mock::Display mDisplay; | 
|  | 119 |  | 
|  | 120 | private: | 
|  | 121 | std::shared_ptr<const HWC2::Display::Config> createConfig(HwcConfigIndexType configId, | 
|  | 122 | int32_t configGroup, | 
|  | 123 | int64_t vsyncPeriod, | 
|  | 124 | int32_t hight = -1, | 
|  | 125 | int32_t width = -1); | 
| Alec Mouri | 0a1cc96 | 2019-03-14 12:33:02 -0700 | [diff] [blame] | 126 | }; | 
|  | 127 |  | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 128 | using Builder = HWC2::Display::Config::Builder; | 
|  | 129 |  | 
| Alec Mouri | 0a1cc96 | 2019-03-14 12:33:02 -0700 | [diff] [blame] | 130 | RefreshRateConfigsTest::RefreshRateConfigsTest() { | 
|  | 131 | const ::testing::TestInfo* const test_info = | 
|  | 132 | ::testing::UnitTest::GetInstance()->current_test_info(); | 
|  | 133 | ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name()); | 
|  | 134 | } | 
|  | 135 |  | 
|  | 136 | RefreshRateConfigsTest::~RefreshRateConfigsTest() { | 
|  | 137 | const ::testing::TestInfo* const test_info = | 
|  | 138 | ::testing::UnitTest::GetInstance()->current_test_info(); | 
|  | 139 | ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name()); | 
|  | 140 | } | 
|  | 141 |  | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 142 | std::shared_ptr<const HWC2::Display::Config> RefreshRateConfigsTest::createConfig( | 
|  | 143 | HwcConfigIndexType configId, int32_t configGroup, int64_t vsyncPeriod, int32_t hight, | 
|  | 144 | int32_t width) { | 
|  | 145 | return HWC2::Display::Config::Builder(mDisplay, hwc2_config_t(configId.value())) | 
|  | 146 | .setVsyncPeriod(int32_t(vsyncPeriod)) | 
|  | 147 | .setConfigGroup(configGroup) | 
|  | 148 | .setHeight(hight) | 
|  | 149 | .setWidth(width) | 
|  | 150 | .build(); | 
|  | 151 | } | 
|  | 152 |  | 
| Alec Mouri | 0a1cc96 | 2019-03-14 12:33:02 -0700 | [diff] [blame] | 153 | namespace { | 
|  | 154 | /* ------------------------------------------------------------------------ | 
|  | 155 | * Test cases | 
|  | 156 | */ | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 157 | TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingSupported) { | 
| Steven Thomas | 2bbaabe | 2019-08-28 16:08:35 -0700 | [diff] [blame] | 158 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 159 | std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice, | 
|  | 160 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Alec Mouri | 0a1cc96 | 2019-03-14 12:33:02 -0700 | [diff] [blame] | 161 | } | 
|  | 162 |  | 
| Ana Krulec | ed3a8cc | 2019-11-14 00:55:07 +0100 | [diff] [blame] | 163 | TEST_F(RefreshRateConfigsTest, invalidPolicy) { | 
| Ana Krulec | ed3a8cc | 2019-11-14 00:55:07 +0100 | [diff] [blame] | 164 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 165 | std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice, | 
|  | 166 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Steven Thomas | d407190 | 2020-03-24 16:02:53 -0700 | [diff] [blame] | 167 | ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({HwcConfigIndexType(10), 60, 60}), 0); | 
|  | 168 | ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, 20, 40}), 0); | 
| Ana Krulec | ed3a8cc | 2019-11-14 00:55:07 +0100 | [diff] [blame] | 169 | } | 
|  | 170 |  | 
| Steven Thomas | 2bbaabe | 2019-08-28 16:08:35 -0700 | [diff] [blame] | 171 | TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap) { | 
| Steven Thomas | 2bbaabe | 2019-08-28 16:08:35 -0700 | [diff] [blame] | 172 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 173 | std::make_unique<RefreshRateConfigs>(m60_90Device, | 
|  | 174 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Alec Mouri | 0a1cc96 | 2019-03-14 12:33:02 -0700 | [diff] [blame] | 175 |  | 
| Ady Abraham | 2e1dd89 | 2020-03-05 13:48:36 -0800 | [diff] [blame] | 176 | const auto& minRate = refreshRateConfigs->getMinRefreshRate(); | 
|  | 177 | const auto& performanceRate = refreshRateConfigs->getMaxRefreshRate(); | 
| Alec Mouri | 0a1cc96 | 2019-03-14 12:33:02 -0700 | [diff] [blame] | 178 |  | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 179 | ASSERT_EQ(mExpected60Config, minRate); | 
|  | 180 | ASSERT_EQ(mExpected90Config, performanceRate); | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 181 |  | 
| Ady Abraham | 2e1dd89 | 2020-03-05 13:48:36 -0800 | [diff] [blame] | 182 | const auto& minRateByPolicy = refreshRateConfigs->getMinRefreshRateByPolicy(); | 
|  | 183 | const auto& performanceRateByPolicy = refreshRateConfigs->getMaxRefreshRateByPolicy(); | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 184 | ASSERT_EQ(minRateByPolicy, minRate); | 
|  | 185 | ASSERT_EQ(performanceRateByPolicy, performanceRate); | 
| Alec Mouri | 0a1cc96 | 2019-03-14 12:33:02 -0700 | [diff] [blame] | 186 | } | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 187 |  | 
|  | 188 | TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentGroups) { | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 189 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 190 | std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups, | 
|  | 191 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 192 |  | 
| Ady Abraham | 2e1dd89 | 2020-03-05 13:48:36 -0800 | [diff] [blame] | 193 | const auto& minRate = refreshRateConfigs->getMinRefreshRateByPolicy(); | 
|  | 194 | const auto& performanceRate = refreshRateConfigs->getMaxRefreshRate(); | 
|  | 195 | const auto& minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy(); | 
|  | 196 | const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy(); | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 197 |  | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 198 | ASSERT_EQ(mExpected60Config, minRate); | 
|  | 199 | ASSERT_EQ(mExpected60Config, minRate60); | 
|  | 200 | ASSERT_EQ(mExpected60Config, performanceRate60); | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 201 |  | 
| Steven Thomas | d407190 | 2020-03-24 16:02:53 -0700 | [diff] [blame] | 202 | ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, 60, 90}), 0); | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 203 | refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90); | 
|  | 204 |  | 
| Ady Abraham | 2e1dd89 | 2020-03-05 13:48:36 -0800 | [diff] [blame] | 205 | const auto& minRate90 = refreshRateConfigs->getMinRefreshRateByPolicy(); | 
|  | 206 | const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy(); | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 207 |  | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 208 | ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate); | 
|  | 209 | ASSERT_EQ(mExpected90DifferentGroupConfig, minRate90); | 
|  | 210 | ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate90); | 
|  | 211 | } | 
|  | 212 |  | 
|  | 213 | TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentResolutions) { | 
|  | 214 | auto refreshRateConfigs = | 
|  | 215 | std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentResolutions, | 
|  | 216 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
|  | 217 |  | 
|  | 218 | const auto& minRate = refreshRateConfigs->getMinRefreshRateByPolicy(); | 
|  | 219 | const auto& performanceRate = refreshRateConfigs->getMaxRefreshRate(); | 
|  | 220 | const auto& minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy(); | 
|  | 221 | const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy(); | 
|  | 222 |  | 
|  | 223 | ASSERT_EQ(mExpected60Config, minRate); | 
|  | 224 | ASSERT_EQ(mExpected60Config, minRate60); | 
|  | 225 | ASSERT_EQ(mExpected60Config, performanceRate60); | 
|  | 226 |  | 
|  | 227 | ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, 60, 90}), 0); | 
|  | 228 | refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90); | 
|  | 229 |  | 
|  | 230 | const auto& minRate90 = refreshRateConfigs->getMinRefreshRateByPolicy(); | 
|  | 231 | const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy(); | 
|  | 232 |  | 
|  | 233 | ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate); | 
|  | 234 | ASSERT_EQ(mExpected90DifferentResolutionConfig, minRate90); | 
|  | 235 | ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate90); | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 236 | } | 
|  | 237 |  | 
|  | 238 | TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_policyChange) { | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 239 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 240 | std::make_unique<RefreshRateConfigs>(m60_90Device, | 
|  | 241 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Ana Krulec | 3f6a206 | 2020-01-23 15:48:01 -0800 | [diff] [blame] | 242 |  | 
| Ady Abraham | 2e1dd89 | 2020-03-05 13:48:36 -0800 | [diff] [blame] | 243 | auto& minRate = refreshRateConfigs->getMinRefreshRateByPolicy(); | 
|  | 244 | auto& performanceRate = refreshRateConfigs->getMaxRefreshRateByPolicy(); | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 245 |  | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 246 | ASSERT_EQ(mExpected60Config, minRate); | 
|  | 247 | ASSERT_EQ(mExpected90Config, performanceRate); | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 248 |  | 
| Steven Thomas | d407190 | 2020-03-24 16:02:53 -0700 | [diff] [blame] | 249 | ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, 60, 60}), 0); | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 250 |  | 
| Ady Abraham | 2e1dd89 | 2020-03-05 13:48:36 -0800 | [diff] [blame] | 251 | auto& minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy(); | 
|  | 252 | auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy(); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 253 | ASSERT_EQ(mExpected60Config, minRate60); | 
|  | 254 | ASSERT_EQ(mExpected60Config, performanceRate60); | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 255 | } | 
|  | 256 |  | 
|  | 257 | TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getCurrentRefreshRate) { | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 258 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 259 | std::make_unique<RefreshRateConfigs>(m60_90Device, | 
|  | 260 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 261 | { | 
| Ady Abraham | 2e1dd89 | 2020-03-05 13:48:36 -0800 | [diff] [blame] | 262 | auto& current = refreshRateConfigs->getCurrentRefreshRate(); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 263 | EXPECT_EQ(current.getConfigId(), HWC_CONFIG_ID_60); | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 264 | } | 
|  | 265 |  | 
|  | 266 | refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90); | 
|  | 267 | { | 
| Ady Abraham | 2e1dd89 | 2020-03-05 13:48:36 -0800 | [diff] [blame] | 268 | auto& current = refreshRateConfigs->getCurrentRefreshRate(); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 269 | EXPECT_EQ(current.getConfigId(), HWC_CONFIG_ID_90); | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 270 | } | 
|  | 271 |  | 
| Steven Thomas | d407190 | 2020-03-24 16:02:53 -0700 | [diff] [blame] | 272 | ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, 90, 90}), 0); | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 273 | { | 
| Ady Abraham | 2e1dd89 | 2020-03-05 13:48:36 -0800 | [diff] [blame] | 274 | auto& current = refreshRateConfigs->getCurrentRefreshRate(); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 275 | EXPECT_EQ(current.getConfigId(), HWC_CONFIG_ID_90); | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 276 | } | 
|  | 277 | } | 
|  | 278 |  | 
|  | 279 | TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContent) { | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 280 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 281 | std::make_unique<RefreshRateConfigs>(m60_90Device, | 
|  | 282 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 283 |  | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 284 | const auto makeLayerRequirements = [](float refreshRate) -> std::vector<LayerRequirement> { | 
|  | 285 | return {{"testLayer", LayerVoteType::Heuristic, refreshRate, 1.0f}}; | 
|  | 286 | }; | 
|  | 287 |  | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 288 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 289 | refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f))); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 290 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 291 | refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f))); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 292 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 293 | refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f))); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 294 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 295 | refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f))); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 296 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 297 | refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f))); | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 298 |  | 
| Steven Thomas | d407190 | 2020-03-24 16:02:53 -0700 | [diff] [blame] | 299 | ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, 60, 60}), 0); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 300 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 301 | refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f))); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 302 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 303 | refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f))); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 304 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 305 | refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f))); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 306 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 307 | refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f))); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 308 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 309 | refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f))); | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 310 |  | 
| Steven Thomas | d407190 | 2020-03-24 16:02:53 -0700 | [diff] [blame] | 311 | ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, 90, 90}), 0); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 312 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 313 | refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f))); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 314 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 315 | refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f))); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 316 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 317 | refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f))); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 318 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 319 | refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f))); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 320 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 321 | refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f))); | 
| Steven Thomas | d407190 | 2020-03-24 16:02:53 -0700 | [diff] [blame] | 322 | ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, 0, 120}), 0); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 323 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 324 | refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f))); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 325 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 326 | refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f))); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 327 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 328 | refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f))); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 329 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 330 | refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f))); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 331 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 332 | refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f))); | 
|  | 333 | } | 
|  | 334 |  | 
| Ana Krulec | 3d367c8 | 2020-02-25 15:02:01 -0800 | [diff] [blame] | 335 | TEST_F(RefreshRateConfigsTest, getRefreshRateForContentV2_noLayers) { | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 336 | bool ignored; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 337 | auto refreshRateConfigs = | 
|  | 338 | std::make_unique<RefreshRateConfigs>(m60_72_90Device, /*currentConfigId=*/ | 
|  | 339 | HWC_CONFIG_ID_72); | 
| Ana Krulec | 3d367c8 | 2020-02-25 15:02:01 -0800 | [diff] [blame] | 340 |  | 
|  | 341 | // If there are not layers, there is not content detection, so return the current | 
|  | 342 | // refresh rate. | 
|  | 343 | auto layers = std::vector<LayerRequirement>{}; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 344 | EXPECT_EQ(mExpected72Config, | 
| Ana Krulec | 3d367c8 | 2020-02-25 15:02:01 -0800 | [diff] [blame] | 345 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 346 | false, &ignored)); | 
| Ana Krulec | 3d367c8 | 2020-02-25 15:02:01 -0800 | [diff] [blame] | 347 |  | 
|  | 348 | // Current refresh rate can always be changed. | 
|  | 349 | refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_60); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 350 | EXPECT_EQ(mExpected60Config, | 
| Ana Krulec | 3d367c8 | 2020-02-25 15:02:01 -0800 | [diff] [blame] | 351 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 352 | false, &ignored)); | 
| Ana Krulec | 3d367c8 | 2020-02-25 15:02:01 -0800 | [diff] [blame] | 353 | } | 
|  | 354 |  | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 355 | TEST_F(RefreshRateConfigsTest, getRefreshRateForContentV2_60_90) { | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 356 | bool ignored; | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 357 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 358 | std::make_unique<RefreshRateConfigs>(m60_90Device, | 
|  | 359 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 360 |  | 
|  | 361 | auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}}; | 
|  | 362 | auto& lr = layers[0]; | 
|  | 363 |  | 
|  | 364 | lr.vote = LayerVoteType::Min; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 365 | lr.name = "Min"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 366 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 367 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 368 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 369 |  | 
|  | 370 | lr.vote = LayerVoteType::Max; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 371 | lr.name = "Max"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 372 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 373 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 374 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 375 |  | 
|  | 376 | lr.desiredRefreshRate = 90.0f; | 
|  | 377 | lr.vote = LayerVoteType::Heuristic; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 378 | lr.name = "90Hz Heuristic"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 379 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 380 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 381 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 382 |  | 
|  | 383 | lr.desiredRefreshRate = 60.0f; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 384 | lr.name = "60Hz Heuristic"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 385 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 386 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 387 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 388 |  | 
|  | 389 | lr.desiredRefreshRate = 45.0f; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 390 | lr.name = "45Hz Heuristic"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 391 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 392 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 393 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 394 |  | 
|  | 395 | lr.desiredRefreshRate = 30.0f; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 396 | lr.name = "30Hz Heuristic"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 397 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 398 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 399 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 400 |  | 
|  | 401 | lr.desiredRefreshRate = 24.0f; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 402 | lr.name = "24Hz Heuristic"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 403 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 404 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 405 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 406 |  | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 407 | lr.name = ""; | 
| Steven Thomas | d407190 | 2020-03-24 16:02:53 -0700 | [diff] [blame] | 408 | ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, 60, 60}), 0); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 409 |  | 
|  | 410 | lr.vote = LayerVoteType::Min; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 411 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 412 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 413 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 414 |  | 
|  | 415 | lr.vote = LayerVoteType::Max; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 416 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 417 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 418 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 419 |  | 
|  | 420 | lr.desiredRefreshRate = 90.0f; | 
|  | 421 | lr.vote = LayerVoteType::Heuristic; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 422 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 423 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 424 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 425 |  | 
|  | 426 | lr.desiredRefreshRate = 60.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 427 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 428 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 429 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 430 |  | 
|  | 431 | lr.desiredRefreshRate = 45.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 432 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 433 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 434 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 435 |  | 
|  | 436 | lr.desiredRefreshRate = 30.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 437 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 438 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 439 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 440 |  | 
|  | 441 | lr.desiredRefreshRate = 24.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 442 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 443 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 444 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 445 |  | 
| Steven Thomas | d407190 | 2020-03-24 16:02:53 -0700 | [diff] [blame] | 446 | ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, 90, 90}), 0); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 447 |  | 
|  | 448 | lr.vote = LayerVoteType::Min; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 449 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 450 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 451 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 452 |  | 
|  | 453 | lr.vote = LayerVoteType::Max; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 454 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 455 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 456 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 457 |  | 
|  | 458 | lr.desiredRefreshRate = 90.0f; | 
|  | 459 | lr.vote = LayerVoteType::Heuristic; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 460 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 461 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 462 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 463 |  | 
|  | 464 | lr.desiredRefreshRate = 60.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 465 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 466 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 467 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 468 |  | 
|  | 469 | lr.desiredRefreshRate = 45.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 470 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 471 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 472 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 473 |  | 
|  | 474 | lr.desiredRefreshRate = 30.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 475 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 476 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 477 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 478 |  | 
|  | 479 | lr.desiredRefreshRate = 24.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 480 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 481 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 482 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 483 |  | 
| Steven Thomas | d407190 | 2020-03-24 16:02:53 -0700 | [diff] [blame] | 484 | ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, 0, 120}), 0); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 485 | lr.vote = LayerVoteType::Min; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 486 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 487 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 488 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 489 |  | 
|  | 490 | lr.vote = LayerVoteType::Max; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 491 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 492 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 493 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 494 |  | 
|  | 495 | lr.desiredRefreshRate = 90.0f; | 
|  | 496 | lr.vote = LayerVoteType::Heuristic; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 497 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 498 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 499 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 500 |  | 
|  | 501 | lr.desiredRefreshRate = 60.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 502 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 503 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 504 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 505 |  | 
|  | 506 | lr.desiredRefreshRate = 45.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 507 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 508 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 509 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 510 |  | 
|  | 511 | lr.desiredRefreshRate = 30.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 512 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 513 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 514 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 515 |  | 
|  | 516 | lr.desiredRefreshRate = 24.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 517 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 518 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 519 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 520 | } | 
|  | 521 |  | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 522 | TEST_F(RefreshRateConfigsTest, getRefreshRateForContentV2_60_72_90) { | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 523 | bool ignored; | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 524 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 525 | std::make_unique<RefreshRateConfigs>(m60_72_90Device, | 
|  | 526 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 527 |  | 
|  | 528 | auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}}; | 
|  | 529 | auto& lr = layers[0]; | 
|  | 530 |  | 
|  | 531 | lr.vote = LayerVoteType::Min; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 532 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 533 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 534 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 535 |  | 
|  | 536 | lr.vote = LayerVoteType::Max; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 537 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 538 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 539 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 540 |  | 
|  | 541 | lr.desiredRefreshRate = 90.0f; | 
|  | 542 | lr.vote = LayerVoteType::Heuristic; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 543 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 544 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 545 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 546 |  | 
|  | 547 | lr.desiredRefreshRate = 60.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 548 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 549 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 550 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 551 |  | 
|  | 552 | lr.desiredRefreshRate = 45.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 553 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 554 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 555 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 556 |  | 
|  | 557 | lr.desiredRefreshRate = 30.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 558 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 559 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 560 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 561 |  | 
|  | 562 | lr.desiredRefreshRate = 24.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 563 | EXPECT_EQ(mExpected72Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 564 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 565 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 566 | } | 
|  | 567 |  | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 568 | TEST_F(RefreshRateConfigsTest, getRefreshRateForContentV2_30_60_72_90_120) { | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 569 | bool ignored; | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 570 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 571 | std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, | 
|  | 572 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 573 |  | 
|  | 574 | auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}, | 
|  | 575 | LayerRequirement{.weight = 1.0f}}; | 
|  | 576 | auto& lr1 = layers[0]; | 
|  | 577 | auto& lr2 = layers[1]; | 
|  | 578 |  | 
|  | 579 | lr1.desiredRefreshRate = 24.0f; | 
|  | 580 | lr1.vote = LayerVoteType::Heuristic; | 
|  | 581 | lr2.desiredRefreshRate = 60.0f; | 
|  | 582 | lr2.vote = LayerVoteType::Heuristic; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 583 | EXPECT_EQ(mExpected120Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 584 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 585 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 586 |  | 
|  | 587 | lr1.desiredRefreshRate = 24.0f; | 
|  | 588 | lr1.vote = LayerVoteType::Heuristic; | 
|  | 589 | lr2.desiredRefreshRate = 48.0f; | 
|  | 590 | lr2.vote = LayerVoteType::Heuristic; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 591 | EXPECT_EQ(mExpected72Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 592 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 593 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 594 |  | 
|  | 595 | lr1.desiredRefreshRate = 24.0f; | 
|  | 596 | lr1.vote = LayerVoteType::Heuristic; | 
|  | 597 | lr2.desiredRefreshRate = 48.0f; | 
|  | 598 | lr2.vote = LayerVoteType::Heuristic; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 599 | EXPECT_EQ(mExpected72Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 600 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 601 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 602 | } | 
|  | 603 |  | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 604 | TEST_F(RefreshRateConfigsTest, getRefreshRateForContentV2_30_60_90_120_DifferentTypes) { | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 605 | bool ignored; | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 606 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 607 | std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, | 
|  | 608 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 609 |  | 
|  | 610 | auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}, | 
|  | 611 | LayerRequirement{.weight = 1.0f}}; | 
|  | 612 | auto& lr1 = layers[0]; | 
|  | 613 | auto& lr2 = layers[1]; | 
|  | 614 |  | 
|  | 615 | lr1.desiredRefreshRate = 24.0f; | 
|  | 616 | lr1.vote = LayerVoteType::ExplicitDefault; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 617 | lr1.name = "24Hz ExplicitDefault"; | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 618 | lr2.desiredRefreshRate = 60.0f; | 
|  | 619 | lr2.vote = LayerVoteType::Heuristic; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 620 | lr2.name = "60Hz Heuristic"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 621 | EXPECT_EQ(mExpected120Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 622 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 623 | &ignored)); | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 624 |  | 
|  | 625 | lr1.desiredRefreshRate = 24.0f; | 
|  | 626 | lr1.vote = LayerVoteType::ExplicitExactOrMultiple; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 627 | lr1.name = "24Hz ExplicitExactOrMultiple"; | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 628 | lr2.desiredRefreshRate = 60.0f; | 
|  | 629 | lr2.vote = LayerVoteType::Heuristic; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 630 | lr2.name = "60Hz Heuristic"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 631 | EXPECT_EQ(mExpected120Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 632 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 633 | &ignored)); | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 634 |  | 
|  | 635 | lr1.desiredRefreshRate = 24.0f; | 
|  | 636 | lr1.vote = LayerVoteType::ExplicitExactOrMultiple; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 637 | lr1.name = "24Hz ExplicitExactOrMultiple"; | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 638 | lr2.desiredRefreshRate = 60.0f; | 
|  | 639 | lr2.vote = LayerVoteType::ExplicitDefault; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 640 | lr2.name = "60Hz ExplicitDefault"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 641 | EXPECT_EQ(mExpected120Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 642 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 643 | &ignored)); | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 644 |  | 
|  | 645 | lr1.desiredRefreshRate = 24.0f; | 
|  | 646 | lr1.vote = LayerVoteType::ExplicitExactOrMultiple; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 647 | lr1.name = "24Hz ExplicitExactOrMultiple"; | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 648 | lr2.desiredRefreshRate = 90.0f; | 
|  | 649 | lr2.vote = LayerVoteType::Heuristic; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 650 | lr2.name = "90Hz Heuristic"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 651 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 652 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 653 | &ignored)); | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 654 |  | 
|  | 655 | lr1.desiredRefreshRate = 24.0f; | 
|  | 656 | lr1.vote = LayerVoteType::ExplicitExactOrMultiple; | 
|  | 657 | lr1.name = "24Hz ExplicitExactOrMultiple"; | 
|  | 658 | lr2.desiredRefreshRate = 90.0f; | 
|  | 659 | lr2.vote = LayerVoteType::ExplicitDefault; | 
|  | 660 | lr2.name = "90Hz Heuristic"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 661 | EXPECT_EQ(mExpected72Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 662 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 663 | &ignored)); | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 664 |  | 
|  | 665 | lr1.desiredRefreshRate = 24.0f; | 
|  | 666 | lr1.vote = LayerVoteType::ExplicitDefault; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 667 | lr1.name = "24Hz ExplicitDefault"; | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 668 | lr2.desiredRefreshRate = 90.0f; | 
|  | 669 | lr2.vote = LayerVoteType::Heuristic; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 670 | lr2.name = "90Hz Heuristic"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 671 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 672 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 673 | &ignored)); | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 674 |  | 
|  | 675 | lr1.desiredRefreshRate = 24.0f; | 
|  | 676 | lr1.vote = LayerVoteType::Heuristic; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 677 | lr1.name = "24Hz Heuristic"; | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 678 | lr2.desiredRefreshRate = 90.0f; | 
|  | 679 | lr2.vote = LayerVoteType::ExplicitDefault; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 680 | lr2.name = "90Hz ExplicitDefault"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 681 | EXPECT_EQ(mExpected72Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 682 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 683 | &ignored)); | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 684 |  | 
|  | 685 | lr1.desiredRefreshRate = 24.0f; | 
|  | 686 | lr1.vote = LayerVoteType::ExplicitExactOrMultiple; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 687 | lr1.name = "24Hz ExplicitExactOrMultiple"; | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 688 | lr2.desiredRefreshRate = 90.0f; | 
|  | 689 | lr2.vote = LayerVoteType::ExplicitDefault; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 690 | lr2.name = "90Hz ExplicitDefault"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 691 | EXPECT_EQ(mExpected72Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 692 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 693 | &ignored)); | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 694 |  | 
|  | 695 | lr1.desiredRefreshRate = 24.0f; | 
|  | 696 | lr1.vote = LayerVoteType::ExplicitDefault; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 697 | lr1.name = "24Hz ExplicitDefault"; | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 698 | lr2.desiredRefreshRate = 90.0f; | 
|  | 699 | lr2.vote = LayerVoteType::ExplicitExactOrMultiple; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 700 | lr2.name = "90Hz ExplicitExactOrMultiple"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 701 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 702 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 703 | &ignored)); | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 704 | } | 
|  | 705 |  | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 706 | TEST_F(RefreshRateConfigsTest, getRefreshRateForContentV2_30_60) { | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 707 | bool ignored; | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 708 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 709 | std::make_unique<RefreshRateConfigs>(m30_60Device, | 
|  | 710 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 711 |  | 
|  | 712 | auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}}; | 
|  | 713 | auto& lr = layers[0]; | 
|  | 714 |  | 
|  | 715 | lr.vote = LayerVoteType::Min; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 716 | EXPECT_EQ(mExpected30Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 717 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 718 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 719 |  | 
|  | 720 | lr.vote = LayerVoteType::Max; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 721 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 722 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 723 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 724 |  | 
|  | 725 | lr.desiredRefreshRate = 90.0f; | 
|  | 726 | lr.vote = LayerVoteType::Heuristic; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 727 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 728 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 729 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 730 |  | 
|  | 731 | lr.desiredRefreshRate = 60.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 732 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 733 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 734 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 735 |  | 
|  | 736 | lr.desiredRefreshRate = 45.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 737 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 738 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 739 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 740 |  | 
|  | 741 | lr.desiredRefreshRate = 30.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 742 | EXPECT_EQ(mExpected30Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 743 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 744 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 745 |  | 
|  | 746 | lr.desiredRefreshRate = 24.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 747 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 748 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 749 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 750 | } | 
|  | 751 |  | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 752 | TEST_F(RefreshRateConfigsTest, getRefreshRateForContentV2_30_60_72_90) { | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 753 | bool ignored; | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 754 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 755 | std::make_unique<RefreshRateConfigs>(m30_60_72_90Device, | 
|  | 756 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 757 |  | 
|  | 758 | auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}}; | 
|  | 759 | auto& lr = layers[0]; | 
|  | 760 |  | 
|  | 761 | lr.vote = LayerVoteType::Min; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 762 | lr.name = "Min"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 763 | EXPECT_EQ(mExpected30Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 764 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 765 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 766 |  | 
|  | 767 | lr.vote = LayerVoteType::Max; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 768 | lr.name = "Max"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 769 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 770 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 771 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 772 |  | 
|  | 773 | lr.desiredRefreshRate = 90.0f; | 
|  | 774 | lr.vote = LayerVoteType::Heuristic; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 775 | lr.name = "90Hz Heuristic"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 776 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 777 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 778 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 779 |  | 
|  | 780 | lr.desiredRefreshRate = 60.0f; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 781 | lr.name = "60Hz Heuristic"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 782 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 783 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 784 | &ignored)); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 785 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 786 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ true, | 
|  | 787 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 788 |  | 
|  | 789 | lr.desiredRefreshRate = 45.0f; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 790 | lr.name = "45Hz Heuristic"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 791 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 792 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 793 | &ignored)); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 794 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 795 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ true, | 
|  | 796 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 797 |  | 
|  | 798 | lr.desiredRefreshRate = 30.0f; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 799 | lr.name = "30Hz Heuristic"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 800 | EXPECT_EQ(mExpected30Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 801 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 802 | &ignored)); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 803 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 804 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ true, | 
|  | 805 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 806 |  | 
|  | 807 | lr.desiredRefreshRate = 24.0f; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 808 | lr.name = "24Hz Heuristic"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 809 | EXPECT_EQ(mExpected72Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 810 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 811 | &ignored)); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 812 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 813 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ true, | 
|  | 814 | &ignored)); | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 815 |  | 
|  | 816 | lr.desiredRefreshRate = 24.0f; | 
|  | 817 | lr.vote = LayerVoteType::ExplicitExactOrMultiple; | 
|  | 818 | lr.name = "24Hz ExplicitExactOrMultiple"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 819 | EXPECT_EQ(mExpected72Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 820 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 821 | &ignored)); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 822 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 823 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ true, | 
|  | 824 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 825 | } | 
|  | 826 |  | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 827 | TEST_F(RefreshRateConfigsTest, getRefreshRateForContentV2_PriorityTest) { | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 828 | bool ignored; | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 829 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 830 | std::make_unique<RefreshRateConfigs>(m30_60_90Device, | 
|  | 831 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 832 |  | 
|  | 833 | auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}, | 
|  | 834 | LayerRequirement{.weight = 1.0f}}; | 
|  | 835 | auto& lr1 = layers[0]; | 
|  | 836 | auto& lr2 = layers[1]; | 
|  | 837 |  | 
|  | 838 | lr1.vote = LayerVoteType::Min; | 
|  | 839 | lr2.vote = LayerVoteType::Max; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 840 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 841 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 842 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 843 |  | 
|  | 844 | lr1.vote = LayerVoteType::Min; | 
|  | 845 | lr2.vote = LayerVoteType::Heuristic; | 
|  | 846 | lr2.desiredRefreshRate = 24.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 847 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 848 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 849 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 850 |  | 
|  | 851 | lr1.vote = LayerVoteType::Min; | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 852 | lr2.vote = LayerVoteType::ExplicitExactOrMultiple; | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 853 | lr2.desiredRefreshRate = 24.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 854 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 855 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 856 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 857 |  | 
|  | 858 | lr1.vote = LayerVoteType::Max; | 
|  | 859 | lr2.vote = LayerVoteType::Heuristic; | 
|  | 860 | lr2.desiredRefreshRate = 60.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 861 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 862 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 863 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 864 |  | 
|  | 865 | lr1.vote = LayerVoteType::Max; | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 866 | lr2.vote = LayerVoteType::ExplicitExactOrMultiple; | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 867 | lr2.desiredRefreshRate = 60.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 868 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 869 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 870 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 871 |  | 
|  | 872 | lr1.vote = LayerVoteType::Heuristic; | 
|  | 873 | lr1.desiredRefreshRate = 15.0f; | 
|  | 874 | lr2.vote = LayerVoteType::Heuristic; | 
|  | 875 | lr2.desiredRefreshRate = 45.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 876 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 877 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 878 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 879 |  | 
|  | 880 | lr1.vote = LayerVoteType::Heuristic; | 
|  | 881 | lr1.desiredRefreshRate = 30.0f; | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 882 | lr2.vote = LayerVoteType::ExplicitExactOrMultiple; | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 883 | lr2.desiredRefreshRate = 45.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 884 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 885 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 886 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 887 | } | 
|  | 888 |  | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 889 | TEST_F(RefreshRateConfigsTest, getRefreshRateForContentV2_24FpsVideo) { | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 890 | bool ignored; | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 891 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 892 | std::make_unique<RefreshRateConfigs>(m60_90Device, | 
|  | 893 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 894 |  | 
|  | 895 | auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}}; | 
|  | 896 | auto& lr = layers[0]; | 
|  | 897 |  | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 898 | lr.vote = LayerVoteType::ExplicitExactOrMultiple; | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 899 | for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) { | 
|  | 900 | lr.desiredRefreshRate = fps; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 901 | const auto& refreshRate = | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 902 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 903 | &ignored); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 904 | printf("%.2fHz chooses %s\n", fps, refreshRate.getName().c_str()); | 
|  | 905 | EXPECT_EQ(mExpected60Config, refreshRate); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 906 | } | 
|  | 907 | } | 
|  | 908 |  | 
|  | 909 | TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContent_Explicit) { | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 910 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 911 | std::make_unique<RefreshRateConfigs>(m60_90Device, | 
|  | 912 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 913 |  | 
|  | 914 | auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}, | 
|  | 915 | LayerRequirement{.weight = 1.0f}}; | 
|  | 916 | auto& lr1 = layers[0]; | 
|  | 917 | auto& lr2 = layers[1]; | 
|  | 918 |  | 
|  | 919 | lr1.vote = LayerVoteType::Heuristic; | 
|  | 920 | lr1.desiredRefreshRate = 60.0f; | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 921 | lr2.vote = LayerVoteType::ExplicitExactOrMultiple; | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 922 | lr2.desiredRefreshRate = 90.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 923 | EXPECT_EQ(mExpected90Config, refreshRateConfigs->getRefreshRateForContent(layers)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 924 |  | 
|  | 925 | lr1.vote = LayerVoteType::Heuristic; | 
|  | 926 | lr1.desiredRefreshRate = 90.0f; | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 927 | lr2.vote = LayerVoteType::ExplicitExactOrMultiple; | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 928 | lr2.desiredRefreshRate = 60.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 929 | EXPECT_EQ(mExpected60Config, refreshRateConfigs->getRefreshRateForContent(layers)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 930 | } | 
|  | 931 |  | 
|  | 932 | TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContentV2_Explicit) { | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 933 | bool ignored; | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 934 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 935 | std::make_unique<RefreshRateConfigs>(m60_90Device, | 
|  | 936 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 937 |  | 
|  | 938 | auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}, | 
|  | 939 | LayerRequirement{.weight = 1.0f}}; | 
|  | 940 | auto& lr1 = layers[0]; | 
|  | 941 | auto& lr2 = layers[1]; | 
|  | 942 |  | 
|  | 943 | lr1.vote = LayerVoteType::Heuristic; | 
|  | 944 | lr1.desiredRefreshRate = 60.0f; | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 945 | lr2.vote = LayerVoteType::ExplicitExactOrMultiple; | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 946 | lr2.desiredRefreshRate = 90.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 947 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 948 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 949 | &ignored)); | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 950 |  | 
|  | 951 | lr1.vote = LayerVoteType::ExplicitDefault; | 
|  | 952 | lr1.desiredRefreshRate = 90.0f; | 
|  | 953 | lr2.vote = LayerVoteType::ExplicitExactOrMultiple; | 
|  | 954 | lr2.desiredRefreshRate = 60.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 955 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 956 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 957 | &ignored)); | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 958 |  | 
|  | 959 | lr1.vote = LayerVoteType::Heuristic; | 
|  | 960 | lr1.desiredRefreshRate = 90.0f; | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 961 | lr2.vote = LayerVoteType::ExplicitExactOrMultiple; | 
| Ady Abraham | 8a82ba6 | 2020-01-17 12:43:17 -0800 | [diff] [blame] | 962 | lr2.desiredRefreshRate = 60.0f; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 963 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 964 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 965 | &ignored)); | 
| Ady Abraham | 2139f73 | 2019-11-13 18:56:40 -0800 | [diff] [blame] | 966 | } | 
|  | 967 |  | 
| Ana Krulec | 72f0d6e | 2020-01-06 15:24:47 -0800 | [diff] [blame] | 968 | TEST_F(RefreshRateConfigsTest, testInPolicy) { | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 969 | ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(60.000004f, 60.000004f)); | 
|  | 970 | ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(59.0f, 60.1f)); | 
|  | 971 | ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(75.0f, 90.0f)); | 
|  | 972 | ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(60.0011f, 90.0f)); | 
|  | 973 | ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(50.0f, 59.998f)); | 
| Ana Krulec | 72f0d6e | 2020-01-06 15:24:47 -0800 | [diff] [blame] | 974 | } | 
|  | 975 |  | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 976 | TEST_F(RefreshRateConfigsTest, getRefreshRateForContentV2_75HzContent) { | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 977 | bool ignored; | 
| Ady Abraham | f6b7707 | 2020-01-30 14:22:54 -0800 | [diff] [blame] | 978 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 979 | std::make_unique<RefreshRateConfigs>(m60_90Device, | 
|  | 980 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Ady Abraham | f6b7707 | 2020-01-30 14:22:54 -0800 | [diff] [blame] | 981 |  | 
|  | 982 | auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}}; | 
|  | 983 | auto& lr = layers[0]; | 
|  | 984 |  | 
| Ady Abraham | 71c437d | 2020-01-31 15:56:57 -0800 | [diff] [blame] | 985 | lr.vote = LayerVoteType::ExplicitExactOrMultiple; | 
| Ady Abraham | f6b7707 | 2020-01-30 14:22:54 -0800 | [diff] [blame] | 986 | for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) { | 
|  | 987 | lr.desiredRefreshRate = fps; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 988 | const auto& refreshRate = | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 989 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 990 | &ignored); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 991 | printf("%.2fHz chooses %s\n", fps, refreshRate.getName().c_str()); | 
|  | 992 | EXPECT_EQ(mExpected90Config, refreshRate); | 
| Ady Abraham | f6b7707 | 2020-01-30 14:22:54 -0800 | [diff] [blame] | 993 | } | 
|  | 994 | } | 
|  | 995 |  | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 996 | TEST_F(RefreshRateConfigsTest, getRefreshRateForContentV2_Multiples) { | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 997 | bool ignored; | 
| Ady Abraham | 3470210 | 2020-02-10 14:12:05 -0800 | [diff] [blame] | 998 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 999 | std::make_unique<RefreshRateConfigs>(m60_90Device, | 
|  | 1000 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Ady Abraham | 3470210 | 2020-02-10 14:12:05 -0800 | [diff] [blame] | 1001 |  | 
|  | 1002 | auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}, | 
|  | 1003 | LayerRequirement{.weight = 1.0f}}; | 
|  | 1004 | auto& lr1 = layers[0]; | 
|  | 1005 | auto& lr2 = layers[1]; | 
|  | 1006 |  | 
|  | 1007 | lr1.vote = LayerVoteType::ExplicitExactOrMultiple; | 
|  | 1008 | lr1.desiredRefreshRate = 60.0f; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 1009 | lr1.name = "60Hz ExplicitExactOrMultiple"; | 
| Ady Abraham | 3470210 | 2020-02-10 14:12:05 -0800 | [diff] [blame] | 1010 | lr2.vote = LayerVoteType::Heuristic; | 
|  | 1011 | lr2.desiredRefreshRate = 90.0f; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 1012 | lr2.name = "90Hz Heuristic"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 1013 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 1014 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 1015 | &ignored)); | 
| Ady Abraham | 3470210 | 2020-02-10 14:12:05 -0800 | [diff] [blame] | 1016 |  | 
|  | 1017 | lr1.vote = LayerVoteType::ExplicitExactOrMultiple; | 
|  | 1018 | lr1.desiredRefreshRate = 60.0f; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 1019 | lr1.name = "60Hz ExplicitExactOrMultiple"; | 
|  | 1020 | lr2.vote = LayerVoteType::ExplicitDefault; | 
|  | 1021 | lr2.desiredRefreshRate = 90.0f; | 
|  | 1022 | lr2.name = "90Hz ExplicitDefault"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 1023 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 1024 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 1025 | &ignored)); | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 1026 |  | 
|  | 1027 | lr1.vote = LayerVoteType::ExplicitExactOrMultiple; | 
|  | 1028 | lr1.desiredRefreshRate = 60.0f; | 
|  | 1029 | lr1.name = "60Hz ExplicitExactOrMultiple"; | 
| Ady Abraham | 3470210 | 2020-02-10 14:12:05 -0800 | [diff] [blame] | 1030 | lr2.vote = LayerVoteType::Max; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 1031 | lr2.name = "Max"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 1032 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 1033 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 1034 | &ignored)); | 
| Ady Abraham | 3470210 | 2020-02-10 14:12:05 -0800 | [diff] [blame] | 1035 |  | 
|  | 1036 | lr1.vote = LayerVoteType::ExplicitExactOrMultiple; | 
|  | 1037 | lr1.desiredRefreshRate = 30.0f; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 1038 | lr1.name = "30Hz ExplicitExactOrMultiple"; | 
| Ady Abraham | 3470210 | 2020-02-10 14:12:05 -0800 | [diff] [blame] | 1039 | lr2.vote = LayerVoteType::Heuristic; | 
|  | 1040 | lr2.desiredRefreshRate = 90.0f; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 1041 | lr2.name = "90Hz Heuristic"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 1042 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 1043 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 1044 | &ignored)); | 
| Ady Abraham | 3470210 | 2020-02-10 14:12:05 -0800 | [diff] [blame] | 1045 |  | 
|  | 1046 | lr1.vote = LayerVoteType::ExplicitExactOrMultiple; | 
|  | 1047 | lr1.desiredRefreshRate = 30.0f; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 1048 | lr1.name = "30Hz ExplicitExactOrMultiple"; | 
| Ady Abraham | 3470210 | 2020-02-10 14:12:05 -0800 | [diff] [blame] | 1049 | lr2.vote = LayerVoteType::Max; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 1050 | lr2.name = "Max"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 1051 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 1052 | refreshRateConfigs->getRefreshRateForContentV2(layers, /*touchActive*/ false, | 
|  | 1053 | &ignored)); | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 1054 | } | 
|  | 1055 |  | 
|  | 1056 | TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) { | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 1057 | bool ignored; | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 1058 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 1059 | std::make_unique<RefreshRateConfigs>(m60_90Device, | 
|  | 1060 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 1061 |  | 
|  | 1062 | auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}, | 
|  | 1063 | LayerRequirement{.weight = 1.0f}}; | 
|  | 1064 | auto& lr1 = layers[0]; | 
|  | 1065 | auto& lr2 = layers[1]; | 
|  | 1066 |  | 
|  | 1067 | lr1.vote = LayerVoteType::ExplicitExactOrMultiple; | 
|  | 1068 | lr1.desiredRefreshRate = 60.0f; | 
|  | 1069 | lr1.name = "60Hz ExplicitExactOrMultiple"; | 
|  | 1070 | lr2.vote = LayerVoteType::NoVote; | 
|  | 1071 | lr2.name = "NoVote"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 1072 | EXPECT_EQ(mExpected60Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 1073 | refreshRateConfigs->getRefreshRateForContentV2(layers, false, &ignored)); | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 1074 |  | 
|  | 1075 | lr1.vote = LayerVoteType::ExplicitExactOrMultiple; | 
|  | 1076 | lr1.desiredRefreshRate = 60.0f; | 
|  | 1077 | lr1.name = "60Hz ExplicitExactOrMultiple"; | 
|  | 1078 | lr2.vote = LayerVoteType::NoVote; | 
|  | 1079 | lr2.name = "NoVote"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 1080 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 1081 | refreshRateConfigs->getRefreshRateForContentV2(layers, true, &ignored)); | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 1082 |  | 
|  | 1083 | lr1.vote = LayerVoteType::ExplicitExactOrMultiple; | 
|  | 1084 | lr1.desiredRefreshRate = 60.0f; | 
|  | 1085 | lr1.name = "60Hz ExplicitExactOrMultiple"; | 
|  | 1086 | lr2.vote = LayerVoteType::Max; | 
|  | 1087 | lr2.name = "Max"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 1088 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 1089 | refreshRateConfigs->getRefreshRateForContentV2(layers, true, &ignored)); | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 1090 |  | 
|  | 1091 | lr1.vote = LayerVoteType::ExplicitExactOrMultiple; | 
|  | 1092 | lr1.desiredRefreshRate = 60.0f; | 
|  | 1093 | lr1.name = "60Hz ExplicitExactOrMultiple"; | 
|  | 1094 | lr2.vote = LayerVoteType::Max; | 
|  | 1095 | lr2.name = "Max"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 1096 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 1097 | refreshRateConfigs->getRefreshRateForContentV2(layers, false, &ignored)); | 
| Ady Abraham | 4ccdcb4 | 2020-02-11 17:34:34 -0800 | [diff] [blame] | 1098 |  | 
|  | 1099 | // The other layer starts to provide buffers | 
|  | 1100 | lr1.vote = LayerVoteType::ExplicitExactOrMultiple; | 
|  | 1101 | lr1.desiredRefreshRate = 60.0f; | 
|  | 1102 | lr1.name = "60Hz ExplicitExactOrMultiple"; | 
|  | 1103 | lr2.vote = LayerVoteType::Heuristic; | 
|  | 1104 | lr2.desiredRefreshRate = 90.0f; | 
|  | 1105 | lr2.name = "90Hz Heuristic"; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 1106 | EXPECT_EQ(mExpected90Config, | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 1107 | refreshRateConfigs->getRefreshRateForContentV2(layers, false, &ignored)); | 
|  | 1108 | } | 
|  | 1109 |  | 
|  | 1110 | TEST_F(RefreshRateConfigsTest, touchConsidered) { | 
|  | 1111 | bool touchConsidered; | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 1112 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 1113 | std::make_unique<RefreshRateConfigs>(m60_90Device, | 
|  | 1114 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Ady Abraham | 6fb599b | 2020-03-05 13:48:22 -0800 | [diff] [blame] | 1115 |  | 
|  | 1116 | refreshRateConfigs->getRefreshRateForContentV2({}, false, &touchConsidered); | 
|  | 1117 | EXPECT_EQ(false, touchConsidered); | 
|  | 1118 |  | 
|  | 1119 | refreshRateConfigs->getRefreshRateForContentV2({}, true, &touchConsidered); | 
|  | 1120 | EXPECT_EQ(true, touchConsidered); | 
|  | 1121 |  | 
|  | 1122 | auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}, | 
|  | 1123 | LayerRequirement{.weight = 1.0f}}; | 
|  | 1124 | auto& lr1 = layers[0]; | 
|  | 1125 | auto& lr2 = layers[1]; | 
|  | 1126 |  | 
|  | 1127 | lr1.vote = LayerVoteType::ExplicitExactOrMultiple; | 
|  | 1128 | lr1.desiredRefreshRate = 60.0f; | 
|  | 1129 | lr1.name = "60Hz ExplicitExactOrMultiple"; | 
|  | 1130 | lr2.vote = LayerVoteType::Heuristic; | 
|  | 1131 | lr2.name = "NoVote"; | 
|  | 1132 | refreshRateConfigs->getRefreshRateForContentV2(layers, true, &touchConsidered); | 
|  | 1133 | EXPECT_EQ(true, touchConsidered); | 
|  | 1134 |  | 
|  | 1135 | lr1.vote = LayerVoteType::ExplicitDefault; | 
|  | 1136 | lr1.desiredRefreshRate = 60.0f; | 
|  | 1137 | lr1.name = "60Hz ExplicitExactOrMultiple"; | 
|  | 1138 | lr2.vote = LayerVoteType::Heuristic; | 
|  | 1139 | lr2.name = "NoVote"; | 
|  | 1140 | refreshRateConfigs->getRefreshRateForContentV2(layers, true, &touchConsidered); | 
|  | 1141 | EXPECT_EQ(false, touchConsidered); | 
|  | 1142 |  | 
|  | 1143 | lr1.vote = LayerVoteType::ExplicitExactOrMultiple; | 
|  | 1144 | lr1.desiredRefreshRate = 60.0f; | 
|  | 1145 | lr1.name = "60Hz ExplicitExactOrMultiple"; | 
|  | 1146 | lr2.vote = LayerVoteType::Heuristic; | 
|  | 1147 | lr2.name = "NoVote"; | 
|  | 1148 | refreshRateConfigs->getRefreshRateForContentV2(layers, true, &touchConsidered); | 
|  | 1149 | EXPECT_EQ(true, touchConsidered); | 
|  | 1150 |  | 
|  | 1151 | lr1.vote = LayerVoteType::ExplicitDefault; | 
|  | 1152 | lr1.desiredRefreshRate = 60.0f; | 
|  | 1153 | lr1.name = "60Hz ExplicitExactrMultiple"; | 
|  | 1154 | lr2.vote = LayerVoteType::Heuristic; | 
|  | 1155 | lr2.name = "NoVote"; | 
|  | 1156 | refreshRateConfigs->getRefreshRateForContentV2(layers, true, &touchConsidered); | 
|  | 1157 | EXPECT_EQ(false, touchConsidered); | 
| Ady Abraham | 3470210 | 2020-02-10 14:12:05 -0800 | [diff] [blame] | 1158 | } | 
|  | 1159 |  | 
| Ady Abraham | 5b8afb5a | 2020-03-06 14:57:26 -0800 | [diff] [blame] | 1160 | TEST_F(RefreshRateConfigsTest, getRefreshRateForContentV2_ExplicitDefault) { | 
|  | 1161 | bool ignored; | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 1162 | auto refreshRateConfigs = | 
|  | 1163 | std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/ | 
|  | 1164 | HWC_CONFIG_ID_60); | 
| Ady Abraham | 5b8afb5a | 2020-03-06 14:57:26 -0800 | [diff] [blame] | 1165 |  | 
|  | 1166 | auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}}; | 
|  | 1167 | auto& lr = layers[0]; | 
|  | 1168 |  | 
|  | 1169 | // Prepare a table with the vote and the expected refresh rate | 
|  | 1170 | const std::vector<std::pair<float, float>> testCases = { | 
|  | 1171 | {130, 120}, {120, 120}, {119, 120}, {110, 120}, | 
|  | 1172 |  | 
|  | 1173 | {100, 90},  {90, 90},   {89, 90}, | 
|  | 1174 |  | 
|  | 1175 | {80, 72},   {73, 72},   {72, 72},   {71, 72},   {70, 72}, | 
|  | 1176 |  | 
|  | 1177 | {65, 60},   {60, 60},   {59, 60},   {58, 60}, | 
|  | 1178 |  | 
|  | 1179 | {55, 90},   {50, 90},   {45, 90}, | 
|  | 1180 |  | 
|  | 1181 | {42, 120},  {40, 120},  {39, 120}, | 
|  | 1182 |  | 
|  | 1183 | {37, 72},   {36, 72},   {35, 72}, | 
|  | 1184 |  | 
|  | 1185 | {30, 60}, | 
|  | 1186 | }; | 
|  | 1187 |  | 
|  | 1188 | for (const auto& test : testCases) { | 
|  | 1189 | lr.vote = LayerVoteType::ExplicitDefault; | 
|  | 1190 | lr.desiredRefreshRate = test.first; | 
|  | 1191 |  | 
|  | 1192 | std::stringstream ss; | 
|  | 1193 | ss << "ExplicitDefault " << test.first << " fps"; | 
|  | 1194 | lr.name = ss.str(); | 
|  | 1195 |  | 
|  | 1196 | const auto& refreshRate = | 
|  | 1197 | refreshRateConfigs->getRefreshRateForContentV2(layers, false, &ignored); | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 1198 | EXPECT_FLOAT_EQ(refreshRate.getFps(), test.second) | 
| Ady Abraham | 5b8afb5a | 2020-03-06 14:57:26 -0800 | [diff] [blame] | 1199 | << "Expecting " << test.first << "fps => " << test.second << "Hz"; | 
|  | 1200 | } | 
| Alec Mouri | 0a1cc96 | 2019-03-14 12:33:02 -0700 | [diff] [blame] | 1201 | } | 
|  | 1202 |  | 
| Steven Thomas | d407190 | 2020-03-24 16:02:53 -0700 | [diff] [blame] | 1203 | TEST_F(RefreshRateConfigsTest, groupSwitching) { | 
| Steven Thomas | d407190 | 2020-03-24 16:02:53 -0700 | [diff] [blame] | 1204 | auto refreshRateConfigs = | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 1205 | std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups, | 
|  | 1206 | /*currentConfigId=*/HWC_CONFIG_ID_60); | 
| Steven Thomas | d407190 | 2020-03-24 16:02:53 -0700 | [diff] [blame] | 1207 |  | 
|  | 1208 | auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}}; | 
|  | 1209 | auto& layer = layers[0]; | 
|  | 1210 | layer.vote = LayerVoteType::ExplicitDefault; | 
|  | 1211 | layer.desiredRefreshRate = 90.0f; | 
|  | 1212 | layer.name = "90Hz ExplicitDefault"; | 
|  | 1213 |  | 
|  | 1214 | bool touchConsidered; | 
|  | 1215 | ASSERT_EQ(HWC_CONFIG_ID_60, | 
|  | 1216 | refreshRateConfigs->getRefreshRateForContentV2(layers, false, &touchConsidered) | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 1217 | .getConfigId()); | 
| Steven Thomas | d407190 | 2020-03-24 16:02:53 -0700 | [diff] [blame] | 1218 |  | 
|  | 1219 | RefreshRateConfigs::Policy policy; | 
|  | 1220 | policy.defaultConfig = refreshRateConfigs->getCurrentPolicy().defaultConfig; | 
|  | 1221 | policy.allowGroupSwitching = true; | 
|  | 1222 | ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0); | 
|  | 1223 | ASSERT_EQ(HWC_CONFIG_ID_90, | 
|  | 1224 | refreshRateConfigs->getRefreshRateForContentV2(layers, false, &touchConsidered) | 
| Ady Abraham | abc2760 | 2020-04-08 17:20:29 -0700 | [diff] [blame] | 1225 | .getConfigId()); | 
| Steven Thomas | d407190 | 2020-03-24 16:02:53 -0700 | [diff] [blame] | 1226 | } | 
|  | 1227 |  | 
| Alec Mouri | 0a1cc96 | 2019-03-14 12:33:02 -0700 | [diff] [blame] | 1228 | } // namespace | 
|  | 1229 | } // namespace scheduler | 
|  | 1230 | } // namespace android |