blob: fe5f9e071764653b79e19fe756a55621b8cd3688 [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"
Ady Abraham8cb21882020-08-26 18:22:05 -070036#include "mock/MockVsyncController.h"
Ady Abraham60e42ea2020-03-09 19:17:31 -070037
38namespace android {
39
40using testing::_;
41using testing::DoAll;
42using testing::Mock;
43using testing::Return;
44using testing::SetArgPointee;
45
46using android::Hwc2::IComposer;
47using android::Hwc2::IComposerClient;
48
49using FakeHwcDisplayInjector = TestableSurfaceFlinger::FakeHwcDisplayInjector;
50
Dominik Laskowski068173d2021-08-11 17:22:59 -070051using scheduler::LayerHistory;
52
Ady Abraham60e42ea2020-03-09 19:17:31 -070053using FrameRate = Layer::FrameRate;
54using FrameRateCompatibility = Layer::FrameRateCompatibility;
55
56class LayerFactory {
57public:
58 virtual ~LayerFactory() = default;
59
60 virtual std::string name() = 0;
61 virtual sp<Layer> createLayer(TestableSurfaceFlinger& flinger) = 0;
62
63protected:
64 static constexpr uint32_t WIDTH = 100;
65 static constexpr uint32_t HEIGHT = 100;
66 static constexpr uint32_t LAYER_FLAGS = 0;
67};
68
Ady Abraham60e42ea2020-03-09 19:17:31 -070069class BufferStateLayerFactory : public LayerFactory {
70public:
71 std::string name() override { return "BufferStateLayer"; }
72 sp<Layer> createLayer(TestableSurfaceFlinger& flinger) override {
73 sp<Client> client;
Vishnu Nair7fb9e5a2021-11-08 12:44:05 -080074 LayerCreationArgs args(flinger.flinger(), client, "buffer-state-layer", LAYER_FLAGS,
75 LayerMetadata());
Ady Abraham60e42ea2020-03-09 19:17:31 -070076 return new BufferStateLayer(args);
77 }
78};
79
80class EffectLayerFactory : public LayerFactory {
81public:
82 std::string name() override { return "EffectLayer"; }
83 sp<Layer> createLayer(TestableSurfaceFlinger& flinger) override {
84 sp<Client> client;
Vishnu Nair7fb9e5a2021-11-08 12:44:05 -080085 LayerCreationArgs args(flinger.flinger(), client, "color-layer", LAYER_FLAGS,
Ady Abraham60e42ea2020-03-09 19:17:31 -070086 LayerMetadata());
87 return new EffectLayer(args);
88 }
89};
90
91std::string PrintToStringParamName(
92 const ::testing::TestParamInfo<std::shared_ptr<LayerFactory>>& info) {
93 return info.param->name();
94}
95
96/**
97 * This class tests the behaviour of Layer::SetFrameRate and Layer::GetFrameRate
98 */
99class SetFrameRateTest : public ::testing::TestWithParam<std::shared_ptr<LayerFactory>> {
100protected:
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700101 const FrameRate FRAME_RATE_VOTE1 = FrameRate(67_Hz, FrameRateCompatibility::Default);
102 const FrameRate FRAME_RATE_VOTE2 = FrameRate(14_Hz, FrameRateCompatibility::ExactOrMultiple);
103 const FrameRate FRAME_RATE_VOTE3 = FrameRate(99_Hz, FrameRateCompatibility::NoVote);
104 const FrameRate FRAME_RATE_TREE = FrameRate(Fps(), FrameRateCompatibility::NoVote);
105 const FrameRate FRAME_RATE_NO_VOTE = FrameRate(Fps(), FrameRateCompatibility::Default);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700106
107 SetFrameRateTest();
108
109 void setupScheduler();
Ady Abraham60e42ea2020-03-09 19:17:31 -0700110
111 void addChild(sp<Layer> layer, sp<Layer> child);
112 void removeChild(sp<Layer> layer, sp<Layer> child);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700113 void commitTransaction();
114
115 TestableSurfaceFlinger mFlinger;
Ady Abraham60e42ea2020-03-09 19:17:31 -0700116
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}
Dominik Laskowski13948602021-03-08 20:48:28 -0800129
Ady Abraham60e42ea2020-03-09 19:17:31 -0700130void SetFrameRateTest::addChild(sp<Layer> layer, sp<Layer> child) {
131 layer.get()->addChild(child.get());
132}
133
134void SetFrameRateTest::removeChild(sp<Layer> layer, sp<Layer> child) {
135 layer.get()->removeChild(child.get());
136}
137
Ady Abraham60e42ea2020-03-09 19:17:31 -0700138void SetFrameRateTest::commitTransaction() {
139 for (auto layer : mLayers) {
Robert Carr6a160312021-05-17 12:08:20 -0700140 auto c = layer->getDrawingState();
Robert Carr0758e5d2021-03-11 22:15:04 -0800141 layer->commitTransaction(c);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700142 }
143}
144
145void SetFrameRateTest::setupScheduler() {
146 auto eventThread = std::make_unique<mock::EventThread>();
147 auto sfEventThread = std::make_unique<mock::EventThread>();
148
149 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
150 EXPECT_CALL(*eventThread, createEventConnection(_, _))
Ady Abraham0bb6a472020-10-12 10:22:13 -0700151 .WillOnce(Return(new EventThreadConnection(eventThread.get(), /*callingUid=*/0,
Ady Abraham62f216c2020-10-13 19:07:23 -0700152 ResyncCallback())));
Ady Abraham60e42ea2020-03-09 19:17:31 -0700153
154 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
155 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
Ady Abraham0bb6a472020-10-12 10:22:13 -0700156 .WillOnce(Return(new EventThreadConnection(sfEventThread.get(), /*callingUid=*/0,
Ady Abraham62f216c2020-10-13 19:07:23 -0700157 ResyncCallback())));
Ady Abraham60e42ea2020-03-09 19:17:31 -0700158
Ady Abraham8cb21882020-08-26 18:22:05 -0700159 auto vsyncController = std::make_unique<mock::VsyncController>();
160 auto vsyncTracker = std::make_unique<mock::VSyncTracker>();
Ady Abraham60e42ea2020-03-09 19:17:31 -0700161
Ady Abraham8cb21882020-08-26 18:22:05 -0700162 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
163 EXPECT_CALL(*vsyncTracker, currentPeriod())
Marin Shalamanov045b7002021-01-07 16:56:24 +0100164 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
Ady Abraham8cb21882020-08-26 18:22:05 -0700165 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
166 mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker),
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800167 std::move(eventThread), std::move(sfEventThread), /*callback*/ nullptr,
168 /*hasMultipleModes*/ true);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700169}
170
Ady Abraham60e42ea2020-03-09 19:17:31 -0700171namespace {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700172
Ady Abraham60e42ea2020-03-09 19:17:31 -0700173TEST_P(SetFrameRateTest, SetAndGet) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700174 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700175
176 const auto& layerFactory = GetParam();
177
178 auto layer = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
179 layer->setFrameRate(FRAME_RATE_VOTE1);
180 commitTransaction();
181 EXPECT_EQ(FRAME_RATE_VOTE1, layer->getFrameRateForLayerTree());
182}
183
184TEST_P(SetFrameRateTest, SetAndGetParent) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700185 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700186
187 const auto& layerFactory = GetParam();
188
189 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
190 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
191 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
192
193 addChild(parent, child1);
194 addChild(child1, child2);
195
196 child2->setFrameRate(FRAME_RATE_VOTE1);
197 commitTransaction();
198 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
199 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
200 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
201
202 child2->setFrameRate(FRAME_RATE_NO_VOTE);
203 commitTransaction();
204 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
205 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
206 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
207}
208
209TEST_P(SetFrameRateTest, SetAndGetParentAllVote) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700210 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700211
212 const auto& layerFactory = GetParam();
213
214 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
215 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
216 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
217
218 addChild(parent, child1);
219 addChild(child1, child2);
220
221 child2->setFrameRate(FRAME_RATE_VOTE1);
222 child1->setFrameRate(FRAME_RATE_VOTE2);
223 parent->setFrameRate(FRAME_RATE_VOTE3);
224 commitTransaction();
225 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
226 EXPECT_EQ(FRAME_RATE_VOTE2, 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_VOTE3, parent->getFrameRateForLayerTree());
232 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700233 EXPECT_EQ(FRAME_RATE_VOTE2, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700234
235 child1->setFrameRate(FRAME_RATE_NO_VOTE);
236 commitTransaction();
237 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700238 EXPECT_EQ(FRAME_RATE_VOTE3, child1->getFrameRateForLayerTree());
239 EXPECT_EQ(FRAME_RATE_VOTE3, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700240
241 parent->setFrameRate(FRAME_RATE_NO_VOTE);
242 commitTransaction();
243 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
244 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
245 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
246}
247
248TEST_P(SetFrameRateTest, SetAndGetChild) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700249 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700250
251 const auto& layerFactory = GetParam();
252
253 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
254 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
255 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
256
257 addChild(parent, child1);
258 addChild(child1, child2);
259
260 parent->setFrameRate(FRAME_RATE_VOTE1);
261 commitTransaction();
262 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700263 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
264 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700265
266 parent->setFrameRate(FRAME_RATE_NO_VOTE);
267 commitTransaction();
268 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
269 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
270 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
271}
272
273TEST_P(SetFrameRateTest, SetAndGetChildAllVote) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700274 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700275
276 const auto& layerFactory = GetParam();
277
278 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
279 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
280 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
281
282 addChild(parent, child1);
283 addChild(child1, child2);
284
285 child2->setFrameRate(FRAME_RATE_VOTE1);
286 child1->setFrameRate(FRAME_RATE_VOTE2);
287 parent->setFrameRate(FRAME_RATE_VOTE3);
288 commitTransaction();
289 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
290 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
291 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
292
293 parent->setFrameRate(FRAME_RATE_NO_VOTE);
294 commitTransaction();
295 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
296 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
297 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
298
299 child1->setFrameRate(FRAME_RATE_NO_VOTE);
300 commitTransaction();
301 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
302 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
303 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
304
305 child2->setFrameRate(FRAME_RATE_NO_VOTE);
306 commitTransaction();
307 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
308 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
309 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
310}
311
312TEST_P(SetFrameRateTest, SetAndGetChildAddAfterVote) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700313 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700314
315 const auto& layerFactory = GetParam();
316
317 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
318 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
319 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
320
321 addChild(parent, child1);
322
323 parent->setFrameRate(FRAME_RATE_VOTE1);
324 commitTransaction();
325 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700326 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700327 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
328
329 addChild(child1, child2);
330 commitTransaction();
331 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700332 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
333 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700334
335 parent->setFrameRate(FRAME_RATE_NO_VOTE);
336 commitTransaction();
337 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
338 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
339 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
340}
341
342TEST_P(SetFrameRateTest, SetAndGetChildRemoveAfterVote) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700343 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700344
345 const auto& layerFactory = GetParam();
346
347 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
348 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
349 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
350
351 addChild(parent, child1);
352 addChild(child1, child2);
353
354 parent->setFrameRate(FRAME_RATE_VOTE1);
355 commitTransaction();
356 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700357 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
358 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700359
360 removeChild(child1, child2);
361 commitTransaction();
362 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700363 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700364 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
365
366 parent->setFrameRate(FRAME_RATE_NO_VOTE);
367 commitTransaction();
368 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
369 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
370 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
371}
372
373TEST_P(SetFrameRateTest, SetAndGetParentNotInTree) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700374 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700375
376 const auto& layerFactory = GetParam();
377
378 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
379 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
380 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
381 auto child2_1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
382
383 addChild(parent, child1);
384 addChild(child1, child2);
385 addChild(child1, child2_1);
386
387 child2->setFrameRate(FRAME_RATE_VOTE1);
388 commitTransaction();
389 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
390 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
391 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
392 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2_1->getFrameRateForLayerTree());
393
394 child2->setFrameRate(FRAME_RATE_NO_VOTE);
395 commitTransaction();
396 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
397 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
398 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
399 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2_1->getFrameRateForLayerTree());
400}
401
Ady Abraham60e42ea2020-03-09 19:17:31 -0700402INSTANTIATE_TEST_SUITE_P(PerLayerType, SetFrameRateTest,
Robert Carr80b1b1c2021-09-29 12:44:17 -0700403 testing::Values(std::make_shared<BufferStateLayerFactory>(),
Ady Abraham60e42ea2020-03-09 19:17:31 -0700404 std::make_shared<EffectLayerFactory>()),
405 PrintToStringParamName);
406
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800407TEST_F(SetFrameRateTest, ValidateFrameRate) {
Marin Shalamanovc5986772021-03-16 16:09:49 +0100408 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
409 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
410 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
411 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
412 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
413 ANATIVEWINDOW_CHANGE_FRAME_RATE_ALWAYS, ""));
414 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
415 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
416 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT,
417 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, "",
418 /*privileged=*/true));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800419
Marin Shalamanovc5986772021-03-16 16:09:49 +0100420 EXPECT_FALSE(ValidateFrameRate(-1, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
421 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
422 EXPECT_FALSE(ValidateFrameRate(1.0f / 0.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
423 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
424 EXPECT_FALSE(ValidateFrameRate(0.0f / 0.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
425 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800426
Marin Shalamanovc5986772021-03-16 16:09:49 +0100427 EXPECT_FALSE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT,
428 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
429
430 // Invalid compatibility
431 EXPECT_FALSE(
432 ValidateFrameRate(60.0f, -1, ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
433 EXPECT_FALSE(ValidateFrameRate(60.0f, 2, ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
434
435 // Invalid change frame rate strategy
436 EXPECT_FALSE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT, -1, ""));
437 EXPECT_FALSE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT, 2, ""));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800438}
439
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800440TEST_P(SetFrameRateTest, SetOnParentActivatesTree) {
441 const auto& layerFactory = GetParam();
442
443 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
444 if (!parent->isVisible()) {
445 // This is a hack as all the test layers except EffectLayer are not visible,
446 // but since the logic is unified in Layer, it should be fine.
447 return;
448 }
449
450 auto child = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
451 addChild(parent, child);
452
453 parent->setFrameRate(FRAME_RATE_VOTE1);
454 commitTransaction();
455
Dominik Laskowski9c93d602021-10-07 19:38:26 -0700456 auto& history = mFlinger.mutableScheduler().mutableLayerHistory();
457 history.record(parent.get(), 0, 0, LayerHistory::LayerUpdateType::Buffer);
458 history.record(child.get(), 0, 0, LayerHistory::LayerUpdateType::Buffer);
Ady Abrahambdda8f02021-04-01 16:06:11 -0700459
Dominik Laskowski9c93d602021-10-07 19:38:26 -0700460 const auto configs = mFlinger.mutableScheduler().refreshRateConfigs();
461 const auto summary = history.summarize(*configs, 0);
462
463 ASSERT_EQ(2u, summary.size());
464 EXPECT_EQ(FRAME_RATE_VOTE1.rate, summary[0].desiredRefreshRate);
465 EXPECT_EQ(FRAME_RATE_VOTE1.rate, summary[1].desiredRefreshRate);
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800466}
467
Ady Abrahama850c182021-08-04 13:04:37 -0700468TEST_P(SetFrameRateTest, addChildForParentWithTreeVote) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700469 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abrahama850c182021-08-04 13:04:37 -0700470
471 const auto& layerFactory = GetParam();
472
473 const auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
474 const auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
475 const auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
476 const auto childOfChild1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
477
478 addChild(parent, child1);
479 addChild(child1, childOfChild1);
480
481 childOfChild1->setFrameRate(FRAME_RATE_VOTE1);
482 commitTransaction();
483 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
484 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
485 EXPECT_EQ(FRAME_RATE_VOTE1, childOfChild1->getFrameRateForLayerTree());
486 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
487
488 addChild(parent, child2);
489 commitTransaction();
490 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
491 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
492 EXPECT_EQ(FRAME_RATE_VOTE1, childOfChild1->getFrameRateForLayerTree());
493 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
494
495 childOfChild1->setFrameRate(FRAME_RATE_NO_VOTE);
496 commitTransaction();
497 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
498 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
499 EXPECT_EQ(FRAME_RATE_NO_VOTE, childOfChild1->getFrameRateForLayerTree());
500 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
501}
502
Ady Abraham60e42ea2020-03-09 19:17:31 -0700503} // namespace
504} // namespace android