blob: b9a5f3679493cffeada8d20c04d9b57a7ef4d324 [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 "BufferStateLayer.h"
28#include "EffectLayer.h"
29#include "Layer.h"
30// TODO(b/129481165): remove the #pragma below and fix conversion issues
31#pragma clang diagnostic pop // ignored "-Wconversion"
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070032#include "FpsOps.h"
Garfield Tan23202892022-03-02 16:10:21 -080033#include "LayerTestUtils.h"
Ady Abraham60e42ea2020-03-09 19:17:31 -070034#include "TestableSurfaceFlinger.h"
35#include "mock/DisplayHardware/MockComposer.h"
Ady Abraham8cb21882020-08-26 18:22:05 -070036#include "mock/MockVsyncController.h"
Ady Abraham60e42ea2020-03-09 19:17:31 -070037
38namespace android {
39
Ady Abraham60e42ea2020-03-09 19:17:31 -070040using testing::DoAll;
41using testing::Mock;
Ady Abraham60e42ea2020-03-09 19:17:31 -070042using testing::SetArgPointee;
43
44using android::Hwc2::IComposer;
45using android::Hwc2::IComposerClient;
46
Dominik Laskowski068173d2021-08-11 17:22:59 -070047using scheduler::LayerHistory;
48
Ady Abraham60e42ea2020-03-09 19:17:31 -070049using FrameRate = Layer::FrameRate;
50using FrameRateCompatibility = Layer::FrameRateCompatibility;
51
Ady Abraham60e42ea2020-03-09 19:17:31 -070052/**
53 * This class tests the behaviour of Layer::SetFrameRate and Layer::GetFrameRate
54 */
Garfield Tan23202892022-03-02 16:10:21 -080055class SetFrameRateTest : public BaseLayerTest {
Ady Abraham60e42ea2020-03-09 19:17:31 -070056protected:
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070057 const FrameRate FRAME_RATE_VOTE1 = FrameRate(67_Hz, FrameRateCompatibility::Default);
58 const FrameRate FRAME_RATE_VOTE2 = FrameRate(14_Hz, FrameRateCompatibility::ExactOrMultiple);
59 const FrameRate FRAME_RATE_VOTE3 = FrameRate(99_Hz, FrameRateCompatibility::NoVote);
60 const FrameRate FRAME_RATE_TREE = FrameRate(Fps(), FrameRateCompatibility::NoVote);
61 const FrameRate FRAME_RATE_NO_VOTE = FrameRate(Fps(), FrameRateCompatibility::Default);
Ady Abraham60e42ea2020-03-09 19:17:31 -070062
63 SetFrameRateTest();
64
Ady Abraham60e42ea2020-03-09 19:17:31 -070065 void addChild(sp<Layer> layer, sp<Layer> child);
66 void removeChild(sp<Layer> layer, sp<Layer> child);
Ady Abraham60e42ea2020-03-09 19:17:31 -070067 void commitTransaction();
68
Ady Abraham60e42ea2020-03-09 19:17:31 -070069 std::vector<sp<Layer>> mLayers;
70};
71
72SetFrameRateTest::SetFrameRateTest() {
73 const ::testing::TestInfo* const test_info =
74 ::testing::UnitTest::GetInstance()->current_test_info();
75 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
76
Dominik Laskowski13948602021-03-08 20:48:28 -080077 mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>());
Ady Abraham60e42ea2020-03-09 19:17:31 -070078}
Dominik Laskowski13948602021-03-08 20:48:28 -080079
Ady Abraham60e42ea2020-03-09 19:17:31 -070080void SetFrameRateTest::addChild(sp<Layer> layer, sp<Layer> child) {
81 layer.get()->addChild(child.get());
82}
83
84void SetFrameRateTest::removeChild(sp<Layer> layer, sp<Layer> child) {
85 layer.get()->removeChild(child.get());
86}
87
Ady Abraham60e42ea2020-03-09 19:17:31 -070088void SetFrameRateTest::commitTransaction() {
89 for (auto layer : mLayers) {
Robert Carr6a160312021-05-17 12:08:20 -070090 auto c = layer->getDrawingState();
Robert Carr0758e5d2021-03-11 22:15:04 -080091 layer->commitTransaction(c);
Ady Abraham60e42ea2020-03-09 19:17:31 -070092 }
93}
94
Ady Abraham60e42ea2020-03-09 19:17:31 -070095namespace {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070096
Ady Abraham60e42ea2020-03-09 19:17:31 -070097TEST_P(SetFrameRateTest, SetAndGet) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -070098 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -070099
100 const auto& layerFactory = GetParam();
101
102 auto layer = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
103 layer->setFrameRate(FRAME_RATE_VOTE1);
104 commitTransaction();
105 EXPECT_EQ(FRAME_RATE_VOTE1, layer->getFrameRateForLayerTree());
106}
107
108TEST_P(SetFrameRateTest, SetAndGetParent) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700109 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700110
111 const auto& layerFactory = GetParam();
112
113 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
114 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
115 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
116
117 addChild(parent, child1);
118 addChild(child1, child2);
119
120 child2->setFrameRate(FRAME_RATE_VOTE1);
121 commitTransaction();
122 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
123 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
124 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
125
126 child2->setFrameRate(FRAME_RATE_NO_VOTE);
127 commitTransaction();
128 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
129 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
130 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
131}
132
133TEST_P(SetFrameRateTest, SetAndGetParentAllVote) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700134 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700135
136 const auto& layerFactory = GetParam();
137
138 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
139 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
140 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
141
142 addChild(parent, child1);
143 addChild(child1, child2);
144
145 child2->setFrameRate(FRAME_RATE_VOTE1);
146 child1->setFrameRate(FRAME_RATE_VOTE2);
147 parent->setFrameRate(FRAME_RATE_VOTE3);
148 commitTransaction();
149 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
150 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
151 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
152
153 child2->setFrameRate(FRAME_RATE_NO_VOTE);
154 commitTransaction();
155 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
156 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700157 EXPECT_EQ(FRAME_RATE_VOTE2, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700158
159 child1->setFrameRate(FRAME_RATE_NO_VOTE);
160 commitTransaction();
161 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700162 EXPECT_EQ(FRAME_RATE_VOTE3, child1->getFrameRateForLayerTree());
163 EXPECT_EQ(FRAME_RATE_VOTE3, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700164
165 parent->setFrameRate(FRAME_RATE_NO_VOTE);
166 commitTransaction();
167 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
168 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
169 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
170}
171
172TEST_P(SetFrameRateTest, SetAndGetChild) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700173 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700174
175 const auto& layerFactory = GetParam();
176
177 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
178 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
179 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
180
181 addChild(parent, child1);
182 addChild(child1, child2);
183
184 parent->setFrameRate(FRAME_RATE_VOTE1);
185 commitTransaction();
186 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700187 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
188 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700189
190 parent->setFrameRate(FRAME_RATE_NO_VOTE);
191 commitTransaction();
192 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
193 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
194 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
195}
196
197TEST_P(SetFrameRateTest, SetAndGetChildAllVote) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700198 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700199
200 const auto& layerFactory = GetParam();
201
202 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
203 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
204 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
205
206 addChild(parent, child1);
207 addChild(child1, child2);
208
209 child2->setFrameRate(FRAME_RATE_VOTE1);
210 child1->setFrameRate(FRAME_RATE_VOTE2);
211 parent->setFrameRate(FRAME_RATE_VOTE3);
212 commitTransaction();
213 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
214 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
215 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
216
217 parent->setFrameRate(FRAME_RATE_NO_VOTE);
218 commitTransaction();
219 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
220 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
221 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
222
223 child1->setFrameRate(FRAME_RATE_NO_VOTE);
224 commitTransaction();
225 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
226 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
227 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
228
229 child2->setFrameRate(FRAME_RATE_NO_VOTE);
230 commitTransaction();
231 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
232 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
233 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
234}
235
236TEST_P(SetFrameRateTest, SetAndGetChildAddAfterVote) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700237 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700238
239 const auto& layerFactory = GetParam();
240
241 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
242 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
243 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
244
245 addChild(parent, child1);
246
247 parent->setFrameRate(FRAME_RATE_VOTE1);
248 commitTransaction();
249 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700250 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700251 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
252
253 addChild(child1, child2);
254 commitTransaction();
255 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700256 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
257 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700258
259 parent->setFrameRate(FRAME_RATE_NO_VOTE);
260 commitTransaction();
261 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
262 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
263 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
264}
265
266TEST_P(SetFrameRateTest, SetAndGetChildRemoveAfterVote) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700267 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700268
269 const auto& layerFactory = GetParam();
270
271 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
272 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
273 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
274
275 addChild(parent, child1);
276 addChild(child1, child2);
277
278 parent->setFrameRate(FRAME_RATE_VOTE1);
279 commitTransaction();
280 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700281 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
282 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700283
284 removeChild(child1, child2);
285 commitTransaction();
286 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700287 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700288 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
289
290 parent->setFrameRate(FRAME_RATE_NO_VOTE);
291 commitTransaction();
292 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
293 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
294 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
295}
296
297TEST_P(SetFrameRateTest, SetAndGetParentNotInTree) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700298 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700299
300 const auto& layerFactory = GetParam();
301
302 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
303 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
304 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
305 auto child2_1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
306
307 addChild(parent, child1);
308 addChild(child1, child2);
309 addChild(child1, child2_1);
310
311 child2->setFrameRate(FRAME_RATE_VOTE1);
312 commitTransaction();
313 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
314 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
315 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
316 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2_1->getFrameRateForLayerTree());
317
318 child2->setFrameRate(FRAME_RATE_NO_VOTE);
319 commitTransaction();
320 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
321 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
322 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
323 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2_1->getFrameRateForLayerTree());
324}
325
Ady Abraham60e42ea2020-03-09 19:17:31 -0700326INSTANTIATE_TEST_SUITE_P(PerLayerType, SetFrameRateTest,
Robert Carr80b1b1c2021-09-29 12:44:17 -0700327 testing::Values(std::make_shared<BufferStateLayerFactory>(),
Ady Abraham60e42ea2020-03-09 19:17:31 -0700328 std::make_shared<EffectLayerFactory>()),
329 PrintToStringParamName);
330
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800331TEST_F(SetFrameRateTest, ValidateFrameRate) {
Marin Shalamanovc5986772021-03-16 16:09:49 +0100332 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_ONLY_IF_SEAMLESS, ""));
336 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
337 ANATIVEWINDOW_CHANGE_FRAME_RATE_ALWAYS, ""));
338 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
339 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
Dominik Laskowski1f6fc702022-03-21 08:34:50 -0700340
341 // Privileged APIs.
342 EXPECT_FALSE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT,
343 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
344 EXPECT_FALSE(ValidateFrameRate(0.0f, ANATIVEWINDOW_FRAME_RATE_NO_VOTE,
345 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
346
347 constexpr bool kPrivileged = true;
Marin Shalamanovc5986772021-03-16 16:09:49 +0100348 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT,
349 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, "",
Dominik Laskowski1f6fc702022-03-21 08:34:50 -0700350 kPrivileged));
351 EXPECT_TRUE(ValidateFrameRate(0.0f, ANATIVEWINDOW_FRAME_RATE_NO_VOTE,
352 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, "",
353 kPrivileged));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800354
Dominik Laskowski1f6fc702022-03-21 08:34:50 -0700355 // Invalid frame rate.
Marin Shalamanovc5986772021-03-16 16:09:49 +0100356 EXPECT_FALSE(ValidateFrameRate(-1, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
357 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
358 EXPECT_FALSE(ValidateFrameRate(1.0f / 0.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
359 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
360 EXPECT_FALSE(ValidateFrameRate(0.0f / 0.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
361 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800362
Dominik Laskowski1f6fc702022-03-21 08:34:50 -0700363 // Invalid compatibility.
Marin Shalamanovc5986772021-03-16 16:09:49 +0100364 EXPECT_FALSE(
365 ValidateFrameRate(60.0f, -1, ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
366 EXPECT_FALSE(ValidateFrameRate(60.0f, 2, ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
367
Dominik Laskowski1f6fc702022-03-21 08:34:50 -0700368 // Invalid change frame rate strategy.
Marin Shalamanovc5986772021-03-16 16:09:49 +0100369 EXPECT_FALSE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT, -1, ""));
370 EXPECT_FALSE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT, 2, ""));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800371}
372
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800373TEST_P(SetFrameRateTest, SetOnParentActivatesTree) {
374 const auto& layerFactory = GetParam();
375
376 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
377 if (!parent->isVisible()) {
378 // This is a hack as all the test layers except EffectLayer are not visible,
379 // but since the logic is unified in Layer, it should be fine.
380 return;
381 }
382
383 auto child = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
384 addChild(parent, child);
385
386 parent->setFrameRate(FRAME_RATE_VOTE1);
387 commitTransaction();
388
Dominik Laskowski9c93d602021-10-07 19:38:26 -0700389 auto& history = mFlinger.mutableScheduler().mutableLayerHistory();
390 history.record(parent.get(), 0, 0, LayerHistory::LayerUpdateType::Buffer);
391 history.record(child.get(), 0, 0, LayerHistory::LayerUpdateType::Buffer);
Ady Abrahambdda8f02021-04-01 16:06:11 -0700392
Dominik Laskowski9c93d602021-10-07 19:38:26 -0700393 const auto configs = mFlinger.mutableScheduler().refreshRateConfigs();
394 const auto summary = history.summarize(*configs, 0);
395
396 ASSERT_EQ(2u, summary.size());
397 EXPECT_EQ(FRAME_RATE_VOTE1.rate, summary[0].desiredRefreshRate);
398 EXPECT_EQ(FRAME_RATE_VOTE1.rate, summary[1].desiredRefreshRate);
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800399}
400
Ady Abrahama850c182021-08-04 13:04:37 -0700401TEST_P(SetFrameRateTest, addChildForParentWithTreeVote) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700402 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abrahama850c182021-08-04 13:04:37 -0700403
404 const auto& layerFactory = GetParam();
405
406 const auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
407 const auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
408 const auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
409 const auto childOfChild1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
410
411 addChild(parent, child1);
412 addChild(child1, childOfChild1);
413
414 childOfChild1->setFrameRate(FRAME_RATE_VOTE1);
415 commitTransaction();
416 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
417 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
418 EXPECT_EQ(FRAME_RATE_VOTE1, childOfChild1->getFrameRateForLayerTree());
419 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
420
421 addChild(parent, child2);
422 commitTransaction();
423 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
424 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
425 EXPECT_EQ(FRAME_RATE_VOTE1, childOfChild1->getFrameRateForLayerTree());
426 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
427
428 childOfChild1->setFrameRate(FRAME_RATE_NO_VOTE);
429 commitTransaction();
430 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
431 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
432 EXPECT_EQ(FRAME_RATE_NO_VOTE, childOfChild1->getFrameRateForLayerTree());
433 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
434}
435
Ady Abraham60e42ea2020-03-09 19:17:31 -0700436} // namespace
437} // namespace android