blob: d9c6bfb7ec40800042a8adf446887272776e72ba [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"
Ady Abraham60e42ea2020-03-09 19:17:31 -070033#include "TestableSurfaceFlinger.h"
34#include "mock/DisplayHardware/MockComposer.h"
Ady Abraham60e42ea2020-03-09 19:17:31 -070035#include "mock/MockEventThread.h"
36#include "mock/MockMessageQueue.h"
Ady Abraham8cb21882020-08-26 18:22:05 -070037#include "mock/MockVsyncController.h"
Ady Abraham60e42ea2020-03-09 19:17:31 -070038
39namespace android {
40
41using testing::_;
42using testing::DoAll;
43using testing::Mock;
44using testing::Return;
45using testing::SetArgPointee;
46
47using android::Hwc2::IComposer;
48using android::Hwc2::IComposerClient;
49
50using FakeHwcDisplayInjector = TestableSurfaceFlinger::FakeHwcDisplayInjector;
51
52using FrameRate = Layer::FrameRate;
53using FrameRateCompatibility = Layer::FrameRateCompatibility;
54
55class LayerFactory {
56public:
57 virtual ~LayerFactory() = default;
58
59 virtual std::string name() = 0;
60 virtual sp<Layer> createLayer(TestableSurfaceFlinger& flinger) = 0;
61
62protected:
63 static constexpr uint32_t WIDTH = 100;
64 static constexpr uint32_t HEIGHT = 100;
65 static constexpr uint32_t LAYER_FLAGS = 0;
66};
67
Ady Abraham60e42ea2020-03-09 19:17:31 -070068class BufferStateLayerFactory : public LayerFactory {
69public:
70 std::string name() override { return "BufferStateLayer"; }
71 sp<Layer> createLayer(TestableSurfaceFlinger& flinger) override {
72 sp<Client> client;
Ady Abraham44e9f3b2021-02-16 15:22:58 -080073 LayerCreationArgs args(flinger.flinger(), client, "buffer-state-layer", WIDTH, HEIGHT,
Ady Abraham60e42ea2020-03-09 19:17:31 -070074 LAYER_FLAGS, LayerMetadata());
75 return new BufferStateLayer(args);
76 }
77};
78
79class EffectLayerFactory : public LayerFactory {
80public:
81 std::string name() override { return "EffectLayer"; }
82 sp<Layer> createLayer(TestableSurfaceFlinger& flinger) override {
83 sp<Client> client;
84 LayerCreationArgs args(flinger.flinger(), client, "color-layer", WIDTH, HEIGHT, LAYER_FLAGS,
85 LayerMetadata());
86 return new EffectLayer(args);
87 }
88};
89
90std::string PrintToStringParamName(
91 const ::testing::TestParamInfo<std::shared_ptr<LayerFactory>>& info) {
92 return info.param->name();
93}
94
95/**
96 * This class tests the behaviour of Layer::SetFrameRate and Layer::GetFrameRate
97 */
98class SetFrameRateTest : public ::testing::TestWithParam<std::shared_ptr<LayerFactory>> {
99protected:
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700100 const FrameRate FRAME_RATE_VOTE1 = FrameRate(67_Hz, FrameRateCompatibility::Default);
101 const FrameRate FRAME_RATE_VOTE2 = FrameRate(14_Hz, FrameRateCompatibility::ExactOrMultiple);
102 const FrameRate FRAME_RATE_VOTE3 = FrameRate(99_Hz, FrameRateCompatibility::NoVote);
103 const FrameRate FRAME_RATE_TREE = FrameRate(Fps(), FrameRateCompatibility::NoVote);
104 const FrameRate FRAME_RATE_NO_VOTE = FrameRate(Fps(), FrameRateCompatibility::Default);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700105
106 SetFrameRateTest();
107
108 void setupScheduler();
Ady Abraham60e42ea2020-03-09 19:17:31 -0700109
110 void addChild(sp<Layer> layer, sp<Layer> child);
111 void removeChild(sp<Layer> layer, sp<Layer> child);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700112 void commitTransaction();
113
114 TestableSurfaceFlinger mFlinger;
Ady Abraham60e42ea2020-03-09 19:17:31 -0700115 mock::MessageQueue* mMessageQueue = new mock::MessageQueue();
116
117 std::vector<sp<Layer>> mLayers;
118};
119
120SetFrameRateTest::SetFrameRateTest() {
121 const ::testing::TestInfo* const test_info =
122 ::testing::UnitTest::GetInstance()->current_test_info();
123 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
124
Ady Abraham60e42ea2020-03-09 19:17:31 -0700125 setupScheduler();
Ady Abraham60e42ea2020-03-09 19:17:31 -0700126
Dominik Laskowski13948602021-03-08 20:48:28 -0800127 mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700128 mFlinger.mutableEventQueue().reset(mMessageQueue);
129}
Dominik Laskowski13948602021-03-08 20:48:28 -0800130
Ady Abraham60e42ea2020-03-09 19:17:31 -0700131void SetFrameRateTest::addChild(sp<Layer> layer, sp<Layer> child) {
132 layer.get()->addChild(child.get());
133}
134
135void SetFrameRateTest::removeChild(sp<Layer> layer, sp<Layer> child) {
136 layer.get()->removeChild(child.get());
137}
138
Ady Abraham60e42ea2020-03-09 19:17:31 -0700139void SetFrameRateTest::commitTransaction() {
140 for (auto layer : mLayers) {
Robert Carr6a160312021-05-17 12:08:20 -0700141 auto c = layer->getDrawingState();
Robert Carr0758e5d2021-03-11 22:15:04 -0800142 layer->commitTransaction(c);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700143 }
144}
145
146void SetFrameRateTest::setupScheduler() {
147 auto eventThread = std::make_unique<mock::EventThread>();
148 auto sfEventThread = std::make_unique<mock::EventThread>();
149
150 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
151 EXPECT_CALL(*eventThread, createEventConnection(_, _))
Ady Abraham0bb6a472020-10-12 10:22:13 -0700152 .WillOnce(Return(new EventThreadConnection(eventThread.get(), /*callingUid=*/0,
Ady Abraham62f216c2020-10-13 19:07:23 -0700153 ResyncCallback())));
Ady Abraham60e42ea2020-03-09 19:17:31 -0700154
155 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
156 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
Ady Abraham0bb6a472020-10-12 10:22:13 -0700157 .WillOnce(Return(new EventThreadConnection(sfEventThread.get(), /*callingUid=*/0,
Ady Abraham62f216c2020-10-13 19:07:23 -0700158 ResyncCallback())));
Ady Abraham60e42ea2020-03-09 19:17:31 -0700159
Ady Abraham8cb21882020-08-26 18:22:05 -0700160 auto vsyncController = std::make_unique<mock::VsyncController>();
161 auto vsyncTracker = std::make_unique<mock::VSyncTracker>();
Ady Abraham60e42ea2020-03-09 19:17:31 -0700162
Ady Abraham8cb21882020-08-26 18:22:05 -0700163 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
164 EXPECT_CALL(*vsyncTracker, currentPeriod())
Marin Shalamanov045b7002021-01-07 16:56:24 +0100165 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
Ady Abraham8cb21882020-08-26 18:22:05 -0700166 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
167 mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker),
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800168 std::move(eventThread), std::move(sfEventThread), /*callback*/ nullptr,
169 /*hasMultipleModes*/ true);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700170}
171
Ady Abraham60e42ea2020-03-09 19:17:31 -0700172namespace {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700173
Ady Abraham60e42ea2020-03-09 19:17:31 -0700174TEST_P(SetFrameRateTest, SetAndGet) {
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -0700175 EXPECT_CALL(*mMessageQueue, scheduleCommit()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700176
177 const auto& layerFactory = GetParam();
178
179 auto layer = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
180 layer->setFrameRate(FRAME_RATE_VOTE1);
181 commitTransaction();
182 EXPECT_EQ(FRAME_RATE_VOTE1, layer->getFrameRateForLayerTree());
183}
184
185TEST_P(SetFrameRateTest, SetAndGetParent) {
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -0700186 EXPECT_CALL(*mMessageQueue, scheduleCommit()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700187
188 const auto& layerFactory = GetParam();
189
190 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
191 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
192 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
193
194 addChild(parent, child1);
195 addChild(child1, child2);
196
197 child2->setFrameRate(FRAME_RATE_VOTE1);
198 commitTransaction();
199 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
200 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
201 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
202
203 child2->setFrameRate(FRAME_RATE_NO_VOTE);
204 commitTransaction();
205 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
206 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
207 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
208}
209
210TEST_P(SetFrameRateTest, SetAndGetParentAllVote) {
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -0700211 EXPECT_CALL(*mMessageQueue, scheduleCommit()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700212
213 const auto& layerFactory = GetParam();
214
215 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
216 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
217 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
218
219 addChild(parent, child1);
220 addChild(child1, child2);
221
222 child2->setFrameRate(FRAME_RATE_VOTE1);
223 child1->setFrameRate(FRAME_RATE_VOTE2);
224 parent->setFrameRate(FRAME_RATE_VOTE3);
225 commitTransaction();
226 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
227 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
228 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
229
230 child2->setFrameRate(FRAME_RATE_NO_VOTE);
231 commitTransaction();
232 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
233 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700234 EXPECT_EQ(FRAME_RATE_VOTE2, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700235
236 child1->setFrameRate(FRAME_RATE_NO_VOTE);
237 commitTransaction();
238 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700239 EXPECT_EQ(FRAME_RATE_VOTE3, child1->getFrameRateForLayerTree());
240 EXPECT_EQ(FRAME_RATE_VOTE3, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700241
242 parent->setFrameRate(FRAME_RATE_NO_VOTE);
243 commitTransaction();
244 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
245 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
246 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
247}
248
249TEST_P(SetFrameRateTest, SetAndGetChild) {
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -0700250 EXPECT_CALL(*mMessageQueue, scheduleCommit()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700251
252 const auto& layerFactory = GetParam();
253
254 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
255 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
256 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
257
258 addChild(parent, child1);
259 addChild(child1, child2);
260
261 parent->setFrameRate(FRAME_RATE_VOTE1);
262 commitTransaction();
263 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700264 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
265 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700266
267 parent->setFrameRate(FRAME_RATE_NO_VOTE);
268 commitTransaction();
269 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
270 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
271 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
272}
273
274TEST_P(SetFrameRateTest, SetAndGetChildAllVote) {
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -0700275 EXPECT_CALL(*mMessageQueue, scheduleCommit()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700276
277 const auto& layerFactory = GetParam();
278
279 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
280 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
281 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
282
283 addChild(parent, child1);
284 addChild(child1, child2);
285
286 child2->setFrameRate(FRAME_RATE_VOTE1);
287 child1->setFrameRate(FRAME_RATE_VOTE2);
288 parent->setFrameRate(FRAME_RATE_VOTE3);
289 commitTransaction();
290 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
291 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
292 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
293
294 parent->setFrameRate(FRAME_RATE_NO_VOTE);
295 commitTransaction();
296 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
297 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
298 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
299
300 child1->setFrameRate(FRAME_RATE_NO_VOTE);
301 commitTransaction();
302 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
303 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
304 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
305
306 child2->setFrameRate(FRAME_RATE_NO_VOTE);
307 commitTransaction();
308 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
309 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
310 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
311}
312
313TEST_P(SetFrameRateTest, SetAndGetChildAddAfterVote) {
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -0700314 EXPECT_CALL(*mMessageQueue, scheduleCommit()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700315
316 const auto& layerFactory = GetParam();
317
318 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
319 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
320 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
321
322 addChild(parent, child1);
323
324 parent->setFrameRate(FRAME_RATE_VOTE1);
325 commitTransaction();
326 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700327 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700328 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
329
330 addChild(child1, child2);
331 commitTransaction();
332 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700333 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
334 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700335
336 parent->setFrameRate(FRAME_RATE_NO_VOTE);
337 commitTransaction();
338 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
339 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
340 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
341}
342
343TEST_P(SetFrameRateTest, SetAndGetChildRemoveAfterVote) {
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -0700344 EXPECT_CALL(*mMessageQueue, scheduleCommit()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700345
346 const auto& layerFactory = GetParam();
347
348 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
349 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
350 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
351
352 addChild(parent, child1);
353 addChild(child1, child2);
354
355 parent->setFrameRate(FRAME_RATE_VOTE1);
356 commitTransaction();
357 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700358 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
359 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700360
361 removeChild(child1, child2);
362 commitTransaction();
363 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700364 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700365 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
366
367 parent->setFrameRate(FRAME_RATE_NO_VOTE);
368 commitTransaction();
369 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
370 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
371 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
372}
373
374TEST_P(SetFrameRateTest, SetAndGetParentNotInTree) {
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -0700375 EXPECT_CALL(*mMessageQueue, scheduleCommit()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700376
377 const auto& layerFactory = GetParam();
378
379 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
380 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
381 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
382 auto child2_1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
383
384 addChild(parent, child1);
385 addChild(child1, child2);
386 addChild(child1, child2_1);
387
388 child2->setFrameRate(FRAME_RATE_VOTE1);
389 commitTransaction();
390 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
391 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
392 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
393 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2_1->getFrameRateForLayerTree());
394
395 child2->setFrameRate(FRAME_RATE_NO_VOTE);
396 commitTransaction();
397 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
398 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
399 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
400 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2_1->getFrameRateForLayerTree());
401}
402
Ady Abraham60e42ea2020-03-09 19:17:31 -0700403INSTANTIATE_TEST_SUITE_P(PerLayerType, SetFrameRateTest,
Robert Carr80b1b1c2021-09-29 12:44:17 -0700404 testing::Values(std::make_shared<BufferStateLayerFactory>(),
Ady Abraham60e42ea2020-03-09 19:17:31 -0700405 std::make_shared<EffectLayerFactory>()),
406 PrintToStringParamName);
407
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800408TEST_F(SetFrameRateTest, ValidateFrameRate) {
Marin Shalamanovc5986772021-03-16 16:09:49 +0100409 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
410 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
411 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
412 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
413 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
414 ANATIVEWINDOW_CHANGE_FRAME_RATE_ALWAYS, ""));
415 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
416 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
417 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT,
418 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, "",
419 /*privileged=*/true));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800420
Marin Shalamanovc5986772021-03-16 16:09:49 +0100421 EXPECT_FALSE(ValidateFrameRate(-1, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
422 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
423 EXPECT_FALSE(ValidateFrameRate(1.0f / 0.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
424 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
425 EXPECT_FALSE(ValidateFrameRate(0.0f / 0.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
426 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800427
Marin Shalamanovc5986772021-03-16 16:09:49 +0100428 EXPECT_FALSE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT,
429 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
430
431 // Invalid compatibility
432 EXPECT_FALSE(
433 ValidateFrameRate(60.0f, -1, ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
434 EXPECT_FALSE(ValidateFrameRate(60.0f, 2, ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
435
436 // Invalid change frame rate strategy
437 EXPECT_FALSE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT, -1, ""));
438 EXPECT_FALSE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT, 2, ""));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800439}
440
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800441TEST_P(SetFrameRateTest, SetOnParentActivatesTree) {
442 const auto& layerFactory = GetParam();
443
444 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
445 if (!parent->isVisible()) {
446 // This is a hack as all the test layers except EffectLayer are not visible,
447 // but since the logic is unified in Layer, it should be fine.
448 return;
449 }
450
451 auto child = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
452 addChild(parent, child);
453
454 parent->setFrameRate(FRAME_RATE_VOTE1);
455 commitTransaction();
456
Dominik Laskowski9c93d602021-10-07 19:38:26 -0700457 auto& history = mFlinger.mutableScheduler().mutableLayerHistory();
458 history.record(parent.get(), 0, 0, LayerHistory::LayerUpdateType::Buffer);
459 history.record(child.get(), 0, 0, LayerHistory::LayerUpdateType::Buffer);
Ady Abrahambdda8f02021-04-01 16:06:11 -0700460
Dominik Laskowski9c93d602021-10-07 19:38:26 -0700461 const auto configs = mFlinger.mutableScheduler().refreshRateConfigs();
462 const auto summary = history.summarize(*configs, 0);
463
464 ASSERT_EQ(2u, summary.size());
465 EXPECT_EQ(FRAME_RATE_VOTE1.rate, summary[0].desiredRefreshRate);
466 EXPECT_EQ(FRAME_RATE_VOTE1.rate, summary[1].desiredRefreshRate);
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800467}
468
Ady Abrahama850c182021-08-04 13:04:37 -0700469TEST_P(SetFrameRateTest, addChildForParentWithTreeVote) {
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -0700470 EXPECT_CALL(*mMessageQueue, scheduleCommit()).Times(1);
Ady Abrahama850c182021-08-04 13:04:37 -0700471
472 const auto& layerFactory = GetParam();
473
474 const auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
475 const auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
476 const auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
477 const auto childOfChild1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
478
479 addChild(parent, child1);
480 addChild(child1, childOfChild1);
481
482 childOfChild1->setFrameRate(FRAME_RATE_VOTE1);
483 commitTransaction();
484 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
485 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
486 EXPECT_EQ(FRAME_RATE_VOTE1, childOfChild1->getFrameRateForLayerTree());
487 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
488
489 addChild(parent, child2);
490 commitTransaction();
491 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
492 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
493 EXPECT_EQ(FRAME_RATE_VOTE1, childOfChild1->getFrameRateForLayerTree());
494 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
495
496 childOfChild1->setFrameRate(FRAME_RATE_NO_VOTE);
497 commitTransaction();
498 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
499 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
500 EXPECT_EQ(FRAME_RATE_NO_VOTE, childOfChild1->getFrameRateForLayerTree());
501 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
502}
503
Ady Abraham60e42ea2020-03-09 19:17:31 -0700504} // namespace
505} // namespace android