blob: 44ab569bd16f15c291e41feb7b393163f613d1d8 [file] [log] [blame]
Ady Abraham60e42ea2020-03-09 19:17:31 -07001/*
2 * Copyright 2020 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 "LibSurfaceFlingerUnittests"
19
20#include <gmock/gmock.h>
21#include <gtest/gtest.h>
22#include <gui/LayerMetadata.h>
23
24// TODO(b/129481165): remove the #pragma below and fix conversion issues
25#pragma clang diagnostic push
26#pragma clang diagnostic ignored "-Wconversion"
Ady Abraham60e42ea2020-03-09 19:17:31 -070027#include "Layer.h"
28// TODO(b/129481165): remove the #pragma below and fix conversion issues
29#pragma clang diagnostic pop // ignored "-Wconversion"
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070030#include "FpsOps.h"
Garfield Tan23202892022-03-02 16:10:21 -080031#include "LayerTestUtils.h"
Ady Abraham60e42ea2020-03-09 19:17:31 -070032#include "TestableSurfaceFlinger.h"
33#include "mock/DisplayHardware/MockComposer.h"
Ady Abraham8cb21882020-08-26 18:22:05 -070034#include "mock/MockVsyncController.h"
Ady Abraham60e42ea2020-03-09 19:17:31 -070035
36namespace android {
37
Ady Abraham60e42ea2020-03-09 19:17:31 -070038using testing::DoAll;
39using testing::Mock;
Ady Abraham60e42ea2020-03-09 19:17:31 -070040using testing::SetArgPointee;
41
42using android::Hwc2::IComposer;
43using android::Hwc2::IComposerClient;
44
Dominik Laskowski068173d2021-08-11 17:22:59 -070045using scheduler::LayerHistory;
46
Ady Abraham60e42ea2020-03-09 19:17:31 -070047using FrameRate = Layer::FrameRate;
48using FrameRateCompatibility = Layer::FrameRateCompatibility;
49
Ady Abraham60e42ea2020-03-09 19:17:31 -070050/**
51 * This class tests the behaviour of Layer::SetFrameRate and Layer::GetFrameRate
52 */
Garfield Tan23202892022-03-02 16:10:21 -080053class SetFrameRateTest : public BaseLayerTest {
Ady Abraham60e42ea2020-03-09 19:17:31 -070054protected:
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070055 const FrameRate FRAME_RATE_VOTE1 = FrameRate(67_Hz, FrameRateCompatibility::Default);
56 const FrameRate FRAME_RATE_VOTE2 = FrameRate(14_Hz, FrameRateCompatibility::ExactOrMultiple);
57 const FrameRate FRAME_RATE_VOTE3 = FrameRate(99_Hz, FrameRateCompatibility::NoVote);
58 const FrameRate FRAME_RATE_TREE = FrameRate(Fps(), FrameRateCompatibility::NoVote);
59 const FrameRate FRAME_RATE_NO_VOTE = FrameRate(Fps(), FrameRateCompatibility::Default);
Ady Abraham60e42ea2020-03-09 19:17:31 -070060
61 SetFrameRateTest();
62
Ady Abraham60e42ea2020-03-09 19:17:31 -070063 void addChild(sp<Layer> layer, sp<Layer> child);
64 void removeChild(sp<Layer> layer, sp<Layer> child);
Ady Abraham60e42ea2020-03-09 19:17:31 -070065 void commitTransaction();
66
Ady Abraham60e42ea2020-03-09 19:17:31 -070067 std::vector<sp<Layer>> mLayers;
68};
69
70SetFrameRateTest::SetFrameRateTest() {
71 const ::testing::TestInfo* const test_info =
72 ::testing::UnitTest::GetInstance()->current_test_info();
73 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
74
Dominik Laskowski13948602021-03-08 20:48:28 -080075 mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>());
Ady Abraham60e42ea2020-03-09 19:17:31 -070076}
Dominik Laskowski13948602021-03-08 20:48:28 -080077
Ady Abraham60e42ea2020-03-09 19:17:31 -070078void SetFrameRateTest::addChild(sp<Layer> layer, sp<Layer> child) {
Ady Abrahamd11bade2022-08-01 16:18:03 -070079 layer->addChild(child);
Ady Abraham60e42ea2020-03-09 19:17:31 -070080}
81
82void SetFrameRateTest::removeChild(sp<Layer> layer, sp<Layer> child) {
Ady Abrahamd11bade2022-08-01 16:18:03 -070083 layer->removeChild(child);
Ady Abraham60e42ea2020-03-09 19:17:31 -070084}
85
Ady Abraham60e42ea2020-03-09 19:17:31 -070086void SetFrameRateTest::commitTransaction() {
87 for (auto layer : mLayers) {
Robert Carr6a160312021-05-17 12:08:20 -070088 auto c = layer->getDrawingState();
Robert Carr0758e5d2021-03-11 22:15:04 -080089 layer->commitTransaction(c);
Ady Abraham60e42ea2020-03-09 19:17:31 -070090 }
91}
92
Ady Abraham60e42ea2020-03-09 19:17:31 -070093namespace {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070094
Ady Abraham60e42ea2020-03-09 19:17:31 -070095TEST_P(SetFrameRateTest, SetAndGet) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -070096 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -070097
98 const auto& layerFactory = GetParam();
99
100 auto layer = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
101 layer->setFrameRate(FRAME_RATE_VOTE1);
102 commitTransaction();
103 EXPECT_EQ(FRAME_RATE_VOTE1, layer->getFrameRateForLayerTree());
104}
105
106TEST_P(SetFrameRateTest, SetAndGetParent) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700107 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700108
109 const auto& layerFactory = GetParam();
110
111 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
112 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
113 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
114
115 addChild(parent, child1);
116 addChild(child1, child2);
117
118 child2->setFrameRate(FRAME_RATE_VOTE1);
119 commitTransaction();
120 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
121 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
122 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
123
124 child2->setFrameRate(FRAME_RATE_NO_VOTE);
125 commitTransaction();
126 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
127 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
128 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
129}
130
131TEST_P(SetFrameRateTest, SetAndGetParentAllVote) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700132 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700133
134 const auto& layerFactory = GetParam();
135
136 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
137 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
138 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
139
140 addChild(parent, child1);
141 addChild(child1, child2);
142
143 child2->setFrameRate(FRAME_RATE_VOTE1);
144 child1->setFrameRate(FRAME_RATE_VOTE2);
145 parent->setFrameRate(FRAME_RATE_VOTE3);
146 commitTransaction();
147 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
148 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
149 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
150
151 child2->setFrameRate(FRAME_RATE_NO_VOTE);
152 commitTransaction();
153 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
154 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700155 EXPECT_EQ(FRAME_RATE_VOTE2, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700156
157 child1->setFrameRate(FRAME_RATE_NO_VOTE);
158 commitTransaction();
159 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700160 EXPECT_EQ(FRAME_RATE_VOTE3, child1->getFrameRateForLayerTree());
161 EXPECT_EQ(FRAME_RATE_VOTE3, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700162
163 parent->setFrameRate(FRAME_RATE_NO_VOTE);
164 commitTransaction();
165 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
166 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
167 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
168}
169
170TEST_P(SetFrameRateTest, SetAndGetChild) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700171 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700172
173 const auto& layerFactory = GetParam();
174
175 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
176 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
177 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
178
179 addChild(parent, child1);
180 addChild(child1, child2);
181
182 parent->setFrameRate(FRAME_RATE_VOTE1);
183 commitTransaction();
184 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700185 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
186 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700187
188 parent->setFrameRate(FRAME_RATE_NO_VOTE);
189 commitTransaction();
190 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
191 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
192 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
193}
194
195TEST_P(SetFrameRateTest, SetAndGetChildAllVote) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700196 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700197
198 const auto& layerFactory = GetParam();
199
200 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
201 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
202 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
203
204 addChild(parent, child1);
205 addChild(child1, child2);
206
207 child2->setFrameRate(FRAME_RATE_VOTE1);
208 child1->setFrameRate(FRAME_RATE_VOTE2);
209 parent->setFrameRate(FRAME_RATE_VOTE3);
210 commitTransaction();
211 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
212 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
213 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
214
215 parent->setFrameRate(FRAME_RATE_NO_VOTE);
216 commitTransaction();
217 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
218 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
219 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
220
221 child1->setFrameRate(FRAME_RATE_NO_VOTE);
222 commitTransaction();
223 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
224 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
225 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
226
227 child2->setFrameRate(FRAME_RATE_NO_VOTE);
228 commitTransaction();
229 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
230 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
231 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
232}
233
234TEST_P(SetFrameRateTest, SetAndGetChildAddAfterVote) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700235 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700236
237 const auto& layerFactory = GetParam();
238
239 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
240 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
241 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
242
243 addChild(parent, child1);
244
245 parent->setFrameRate(FRAME_RATE_VOTE1);
246 commitTransaction();
247 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700248 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700249 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
250
251 addChild(child1, child2);
252 commitTransaction();
253 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700254 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
255 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700256
257 parent->setFrameRate(FRAME_RATE_NO_VOTE);
258 commitTransaction();
259 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
260 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
261 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
262}
263
264TEST_P(SetFrameRateTest, SetAndGetChildRemoveAfterVote) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700265 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700266
267 const auto& layerFactory = GetParam();
268
269 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
270 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
271 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
272
273 addChild(parent, child1);
274 addChild(child1, child2);
275
276 parent->setFrameRate(FRAME_RATE_VOTE1);
277 commitTransaction();
278 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700279 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
280 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700281
282 removeChild(child1, child2);
283 commitTransaction();
284 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700285 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700286 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
287
288 parent->setFrameRate(FRAME_RATE_NO_VOTE);
289 commitTransaction();
290 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
291 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
292 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
293}
294
295TEST_P(SetFrameRateTest, SetAndGetParentNotInTree) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700296 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700297
298 const auto& layerFactory = GetParam();
299
300 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
301 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
302 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
303 auto child2_1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
304
305 addChild(parent, child1);
306 addChild(child1, child2);
307 addChild(child1, child2_1);
308
309 child2->setFrameRate(FRAME_RATE_VOTE1);
310 commitTransaction();
311 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
312 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
313 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
314 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2_1->getFrameRateForLayerTree());
315
316 child2->setFrameRate(FRAME_RATE_NO_VOTE);
317 commitTransaction();
318 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
319 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
320 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
321 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2_1->getFrameRateForLayerTree());
322}
323
Ady Abraham60e42ea2020-03-09 19:17:31 -0700324INSTANTIATE_TEST_SUITE_P(PerLayerType, SetFrameRateTest,
Robert Carr80b1b1c2021-09-29 12:44:17 -0700325 testing::Values(std::make_shared<BufferStateLayerFactory>(),
Ady Abraham60e42ea2020-03-09 19:17:31 -0700326 std::make_shared<EffectLayerFactory>()),
327 PrintToStringParamName);
328
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800329TEST_F(SetFrameRateTest, ValidateFrameRate) {
Marin Shalamanovc5986772021-03-16 16:09:49 +0100330 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
331 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
332 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
333 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
334 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
335 ANATIVEWINDOW_CHANGE_FRAME_RATE_ALWAYS, ""));
336 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
337 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
Dominik Laskowski1f6fc702022-03-21 08:34:50 -0700338
339 // Privileged APIs.
340 EXPECT_FALSE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT,
341 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
342 EXPECT_FALSE(ValidateFrameRate(0.0f, ANATIVEWINDOW_FRAME_RATE_NO_VOTE,
343 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
344
345 constexpr bool kPrivileged = true;
Marin Shalamanovc5986772021-03-16 16:09:49 +0100346 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT,
347 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, "",
Dominik Laskowski1f6fc702022-03-21 08:34:50 -0700348 kPrivileged));
349 EXPECT_TRUE(ValidateFrameRate(0.0f, ANATIVEWINDOW_FRAME_RATE_NO_VOTE,
350 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, "",
351 kPrivileged));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800352
Dominik Laskowski1f6fc702022-03-21 08:34:50 -0700353 // Invalid frame rate.
Marin Shalamanovc5986772021-03-16 16:09:49 +0100354 EXPECT_FALSE(ValidateFrameRate(-1, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
355 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
356 EXPECT_FALSE(ValidateFrameRate(1.0f / 0.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
357 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
358 EXPECT_FALSE(ValidateFrameRate(0.0f / 0.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
359 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800360
Dominik Laskowski1f6fc702022-03-21 08:34:50 -0700361 // Invalid compatibility.
Marin Shalamanovc5986772021-03-16 16:09:49 +0100362 EXPECT_FALSE(
363 ValidateFrameRate(60.0f, -1, ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
364 EXPECT_FALSE(ValidateFrameRate(60.0f, 2, ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
365
Dominik Laskowski1f6fc702022-03-21 08:34:50 -0700366 // Invalid change frame rate strategy.
Marin Shalamanovc5986772021-03-16 16:09:49 +0100367 EXPECT_FALSE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT, -1, ""));
368 EXPECT_FALSE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT, 2, ""));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800369}
370
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800371TEST_P(SetFrameRateTest, SetOnParentActivatesTree) {
372 const auto& layerFactory = GetParam();
373
374 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800375
376 auto child = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
377 addChild(parent, child);
378
379 parent->setFrameRate(FRAME_RATE_VOTE1);
380 commitTransaction();
381
Dominik Laskowski9c93d602021-10-07 19:38:26 -0700382 auto& history = mFlinger.mutableScheduler().mutableLayerHistory();
Vishnu Nairef68d6d2023-02-28 06:18:27 +0000383 history.record(parent->getSequence(), parent->getLayerProps(), 0, 0,
384 LayerHistory::LayerUpdateType::Buffer);
385 history.record(child->getSequence(), child->getLayerProps(), 0, 0,
386 LayerHistory::LayerUpdateType::Buffer);
Ady Abrahambdda8f02021-04-01 16:06:11 -0700387
Dominik Laskowskid82e0f02022-10-26 15:23:04 -0400388 const auto selectorPtr = mFlinger.mutableScheduler().refreshRateSelector();
389 const auto summary = history.summarize(*selectorPtr, 0);
Dominik Laskowski9c93d602021-10-07 19:38:26 -0700390
391 ASSERT_EQ(2u, summary.size());
392 EXPECT_EQ(FRAME_RATE_VOTE1.rate, summary[0].desiredRefreshRate);
393 EXPECT_EQ(FRAME_RATE_VOTE1.rate, summary[1].desiredRefreshRate);
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800394}
395
Ady Abrahama850c182021-08-04 13:04:37 -0700396TEST_P(SetFrameRateTest, addChildForParentWithTreeVote) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700397 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abrahama850c182021-08-04 13:04:37 -0700398
399 const auto& layerFactory = GetParam();
400
401 const auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
402 const auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
403 const auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
404 const auto childOfChild1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
405
406 addChild(parent, child1);
407 addChild(child1, childOfChild1);
408
409 childOfChild1->setFrameRate(FRAME_RATE_VOTE1);
410 commitTransaction();
411 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
412 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
413 EXPECT_EQ(FRAME_RATE_VOTE1, childOfChild1->getFrameRateForLayerTree());
414 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
415
416 addChild(parent, child2);
417 commitTransaction();
418 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
419 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
420 EXPECT_EQ(FRAME_RATE_VOTE1, childOfChild1->getFrameRateForLayerTree());
421 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
422
423 childOfChild1->setFrameRate(FRAME_RATE_NO_VOTE);
424 commitTransaction();
425 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
426 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
427 EXPECT_EQ(FRAME_RATE_NO_VOTE, childOfChild1->getFrameRateForLayerTree());
428 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
429}
430
Ady Abraham60e42ea2020-03-09 19:17:31 -0700431} // namespace
432} // namespace android