blob: 9899d4290b27ff66430a08cae88a6ffcdd61c751 [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>
Ady Abraham6cdd3fd2023-09-07 18:45:58 -070022#include <gui/FrameRateUtils.h>
Ady Abraham60e42ea2020-03-09 19:17:31 -070023#include <gui/LayerMetadata.h>
24
25// TODO(b/129481165): remove the #pragma below and fix conversion issues
26#pragma clang diagnostic push
27#pragma clang diagnostic ignored "-Wconversion"
Ady Abraham60e42ea2020-03-09 19:17:31 -070028#include "Layer.h"
29// TODO(b/129481165): remove the #pragma below and fix conversion issues
30#pragma clang diagnostic pop // ignored "-Wconversion"
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070031#include "FpsOps.h"
Garfield Tan23202892022-03-02 16:10:21 -080032#include "LayerTestUtils.h"
Ady Abraham60e42ea2020-03-09 19:17:31 -070033#include "TestableSurfaceFlinger.h"
34#include "mock/DisplayHardware/MockComposer.h"
Ady Abraham8cb21882020-08-26 18:22:05 -070035#include "mock/MockVsyncController.h"
Ady Abraham60e42ea2020-03-09 19:17:31 -070036
37namespace android {
38
Ady Abraham60e42ea2020-03-09 19:17:31 -070039using testing::DoAll;
40using testing::Mock;
Ady Abraham60e42ea2020-03-09 19:17:31 -070041using testing::SetArgPointee;
42
43using android::Hwc2::IComposer;
44using android::Hwc2::IComposerClient;
45
Dominik Laskowski068173d2021-08-11 17:22:59 -070046using scheduler::LayerHistory;
47
Ady Abraham60e42ea2020-03-09 19:17:31 -070048using FrameRate = Layer::FrameRate;
49using FrameRateCompatibility = Layer::FrameRateCompatibility;
50
Ady Abraham60e42ea2020-03-09 19:17:31 -070051/**
52 * This class tests the behaviour of Layer::SetFrameRate and Layer::GetFrameRate
53 */
Garfield Tan23202892022-03-02 16:10:21 -080054class SetFrameRateTest : public BaseLayerTest {
Ady Abraham60e42ea2020-03-09 19:17:31 -070055protected:
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070056 const FrameRate FRAME_RATE_VOTE1 = FrameRate(67_Hz, FrameRateCompatibility::Default);
57 const FrameRate FRAME_RATE_VOTE2 = FrameRate(14_Hz, FrameRateCompatibility::ExactOrMultiple);
58 const FrameRate FRAME_RATE_VOTE3 = FrameRate(99_Hz, FrameRateCompatibility::NoVote);
59 const FrameRate FRAME_RATE_TREE = FrameRate(Fps(), FrameRateCompatibility::NoVote);
60 const FrameRate FRAME_RATE_NO_VOTE = FrameRate(Fps(), FrameRateCompatibility::Default);
Ady Abraham60e42ea2020-03-09 19:17:31 -070061
62 SetFrameRateTest();
63
Ady Abraham60e42ea2020-03-09 19:17:31 -070064 void addChild(sp<Layer> layer, sp<Layer> child);
65 void removeChild(sp<Layer> layer, sp<Layer> child);
Ady Abraham60e42ea2020-03-09 19:17:31 -070066 void commitTransaction();
67
Ady Abraham60e42ea2020-03-09 19:17:31 -070068 std::vector<sp<Layer>> mLayers;
69};
70
71SetFrameRateTest::SetFrameRateTest() {
72 const ::testing::TestInfo* const test_info =
73 ::testing::UnitTest::GetInstance()->current_test_info();
74 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
75
Dominik Laskowski13948602021-03-08 20:48:28 -080076 mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>());
Ady Abraham60e42ea2020-03-09 19:17:31 -070077}
Dominik Laskowski13948602021-03-08 20:48:28 -080078
Ady Abraham60e42ea2020-03-09 19:17:31 -070079void SetFrameRateTest::addChild(sp<Layer> layer, sp<Layer> child) {
Ady Abrahamd11bade2022-08-01 16:18:03 -070080 layer->addChild(child);
Ady Abraham60e42ea2020-03-09 19:17:31 -070081}
82
83void SetFrameRateTest::removeChild(sp<Layer> layer, sp<Layer> child) {
Ady Abrahamd11bade2022-08-01 16:18:03 -070084 layer->removeChild(child);
Ady Abraham60e42ea2020-03-09 19:17:31 -070085}
86
Ady Abraham60e42ea2020-03-09 19:17:31 -070087void SetFrameRateTest::commitTransaction() {
88 for (auto layer : mLayers) {
Vishnu Nairc1d19d72023-08-10 12:35:11 -070089 layer->commitTransaction();
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));
Rachel Leece6e0042023-06-27 11:22:54 -0700101 layer->setFrameRate(FRAME_RATE_VOTE1.vote);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700102 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
Rachel Leece6e0042023-06-27 11:22:54 -0700118 child2->setFrameRate(FRAME_RATE_VOTE1.vote);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700119 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
Rachel Leece6e0042023-06-27 11:22:54 -0700124 child2->setFrameRate(FRAME_RATE_NO_VOTE.vote);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700125 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
Rachel Leece6e0042023-06-27 11:22:54 -0700143 child2->setFrameRate(FRAME_RATE_VOTE1.vote);
144 child1->setFrameRate(FRAME_RATE_VOTE2.vote);
145 parent->setFrameRate(FRAME_RATE_VOTE3.vote);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700146 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
Rachel Leece6e0042023-06-27 11:22:54 -0700151 child2->setFrameRate(FRAME_RATE_NO_VOTE.vote);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700152 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
Rachel Leece6e0042023-06-27 11:22:54 -0700157 child1->setFrameRate(FRAME_RATE_NO_VOTE.vote);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700158 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
Rachel Leece6e0042023-06-27 11:22:54 -0700163 parent->setFrameRate(FRAME_RATE_NO_VOTE.vote);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700164 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
Rachel Leece6e0042023-06-27 11:22:54 -0700182 parent->setFrameRate(FRAME_RATE_VOTE1.vote);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700183 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
Rachel Leece6e0042023-06-27 11:22:54 -0700188 parent->setFrameRate(FRAME_RATE_NO_VOTE.vote);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700189 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
Rachel Leece6e0042023-06-27 11:22:54 -0700207 child2->setFrameRate(FRAME_RATE_VOTE1.vote);
208 child1->setFrameRate(FRAME_RATE_VOTE2.vote);
209 parent->setFrameRate(FRAME_RATE_VOTE3.vote);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700210 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
Rachel Leece6e0042023-06-27 11:22:54 -0700215 parent->setFrameRate(FRAME_RATE_NO_VOTE.vote);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700216 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
Rachel Leece6e0042023-06-27 11:22:54 -0700221 child1->setFrameRate(FRAME_RATE_NO_VOTE.vote);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700222 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
Rachel Leece6e0042023-06-27 11:22:54 -0700227 child2->setFrameRate(FRAME_RATE_NO_VOTE.vote);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700228 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
Rachel Leece6e0042023-06-27 11:22:54 -0700245 parent->setFrameRate(FRAME_RATE_VOTE1.vote);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700246 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
Rachel Leece6e0042023-06-27 11:22:54 -0700257 parent->setFrameRate(FRAME_RATE_NO_VOTE.vote);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700258 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
Rachel Leece6e0042023-06-27 11:22:54 -0700276 parent->setFrameRate(FRAME_RATE_VOTE1.vote);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700277 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
Rachel Leece6e0042023-06-27 11:22:54 -0700288 parent->setFrameRate(FRAME_RATE_NO_VOTE.vote);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700289 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
Rachel Leece6e0042023-06-27 11:22:54 -0700309 child2->setFrameRate(FRAME_RATE_VOTE1.vote);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700310 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
Rachel Leece6e0042023-06-27 11:22:54 -0700316 child2->setFrameRate(FRAME_RATE_NO_VOTE.vote);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700317 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 Abraham44e9f3b2021-02-16 15:22:58 -0800329TEST_P(SetFrameRateTest, SetOnParentActivatesTree) {
330 const auto& layerFactory = GetParam();
331
332 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800333
334 auto child = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
335 addChild(parent, child);
336
Rachel Leece6e0042023-06-27 11:22:54 -0700337 parent->setFrameRate(FRAME_RATE_VOTE1.vote);
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800338 commitTransaction();
339
Dominik Laskowski9c93d602021-10-07 19:38:26 -0700340 auto& history = mFlinger.mutableScheduler().mutableLayerHistory();
Vishnu Nairef68d6d2023-02-28 06:18:27 +0000341 history.record(parent->getSequence(), parent->getLayerProps(), 0, 0,
342 LayerHistory::LayerUpdateType::Buffer);
343 history.record(child->getSequence(), child->getLayerProps(), 0, 0,
344 LayerHistory::LayerUpdateType::Buffer);
Ady Abrahambdda8f02021-04-01 16:06:11 -0700345
Dominik Laskowskid82e0f02022-10-26 15:23:04 -0400346 const auto selectorPtr = mFlinger.mutableScheduler().refreshRateSelector();
347 const auto summary = history.summarize(*selectorPtr, 0);
Dominik Laskowski9c93d602021-10-07 19:38:26 -0700348
349 ASSERT_EQ(2u, summary.size());
Rachel Leece6e0042023-06-27 11:22:54 -0700350 EXPECT_EQ(FRAME_RATE_VOTE1.vote.rate, summary[0].desiredRefreshRate);
351 EXPECT_EQ(FRAME_RATE_VOTE1.vote.rate, summary[1].desiredRefreshRate);
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800352}
353
Ady Abrahama850c182021-08-04 13:04:37 -0700354TEST_P(SetFrameRateTest, addChildForParentWithTreeVote) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700355 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abrahama850c182021-08-04 13:04:37 -0700356
357 const auto& layerFactory = GetParam();
358
359 const auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
360 const auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
361 const auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
362 const auto childOfChild1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
363
364 addChild(parent, child1);
365 addChild(child1, childOfChild1);
366
Rachel Leece6e0042023-06-27 11:22:54 -0700367 childOfChild1->setFrameRate(FRAME_RATE_VOTE1.vote);
Ady Abrahama850c182021-08-04 13:04:37 -0700368 commitTransaction();
369 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
370 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
371 EXPECT_EQ(FRAME_RATE_VOTE1, childOfChild1->getFrameRateForLayerTree());
372 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
373
374 addChild(parent, child2);
375 commitTransaction();
376 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
377 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
378 EXPECT_EQ(FRAME_RATE_VOTE1, childOfChild1->getFrameRateForLayerTree());
379 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
380
Rachel Leece6e0042023-06-27 11:22:54 -0700381 childOfChild1->setFrameRate(FRAME_RATE_NO_VOTE.vote);
Ady Abrahama850c182021-08-04 13:04:37 -0700382 commitTransaction();
383 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
384 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
385 EXPECT_EQ(FRAME_RATE_NO_VOTE, childOfChild1->getFrameRateForLayerTree());
386 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
387}
388
Ady Abraham60e42ea2020-03-09 19:17:31 -0700389} // namespace
390} // namespace android