blob: 84fa1e290a8d6bc5fa06ef667c0aa6cb0ac68317 [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"
32#include "TestableSurfaceFlinger.h"
33#include "mock/DisplayHardware/MockComposer.h"
Ady Abraham60e42ea2020-03-09 19:17:31 -070034#include "mock/MockEventThread.h"
35#include "mock/MockMessageQueue.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
51using FrameRate = Layer::FrameRate;
52using FrameRateCompatibility = Layer::FrameRateCompatibility;
53
54class LayerFactory {
55public:
56 virtual ~LayerFactory() = default;
57
58 virtual std::string name() = 0;
59 virtual sp<Layer> createLayer(TestableSurfaceFlinger& flinger) = 0;
60
61protected:
62 static constexpr uint32_t WIDTH = 100;
63 static constexpr uint32_t HEIGHT = 100;
64 static constexpr uint32_t LAYER_FLAGS = 0;
65};
66
Ady Abraham60e42ea2020-03-09 19:17:31 -070067class BufferStateLayerFactory : public LayerFactory {
68public:
69 std::string name() override { return "BufferStateLayer"; }
70 sp<Layer> createLayer(TestableSurfaceFlinger& flinger) override {
71 sp<Client> client;
Ady Abraham44e9f3b2021-02-16 15:22:58 -080072 LayerCreationArgs args(flinger.flinger(), client, "buffer-state-layer", WIDTH, HEIGHT,
Ady Abraham60e42ea2020-03-09 19:17:31 -070073 LAYER_FLAGS, LayerMetadata());
74 return new BufferStateLayer(args);
75 }
76};
77
78class EffectLayerFactory : public LayerFactory {
79public:
80 std::string name() override { return "EffectLayer"; }
81 sp<Layer> createLayer(TestableSurfaceFlinger& flinger) override {
82 sp<Client> client;
83 LayerCreationArgs args(flinger.flinger(), client, "color-layer", WIDTH, HEIGHT, LAYER_FLAGS,
84 LayerMetadata());
85 return new EffectLayer(args);
86 }
87};
88
89std::string PrintToStringParamName(
90 const ::testing::TestParamInfo<std::shared_ptr<LayerFactory>>& info) {
91 return info.param->name();
92}
93
94/**
95 * This class tests the behaviour of Layer::SetFrameRate and Layer::GetFrameRate
96 */
97class SetFrameRateTest : public ::testing::TestWithParam<std::shared_ptr<LayerFactory>> {
98protected:
Marin Shalamanove8a663d2020-11-24 17:48:00 +010099 const FrameRate FRAME_RATE_VOTE1 = FrameRate(Fps(67.f), FrameRateCompatibility::Default);
100 const FrameRate FRAME_RATE_VOTE2 =
101 FrameRate(Fps(14.f), FrameRateCompatibility::ExactOrMultiple);
102 const FrameRate FRAME_RATE_VOTE3 = FrameRate(Fps(99.f), FrameRateCompatibility::NoVote);
103 const FrameRate FRAME_RATE_TREE = FrameRate(Fps(0.f), FrameRateCompatibility::NoVote);
104 const FrameRate FRAME_RATE_NO_VOTE = FrameRate(Fps(0.f), 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
125 mFlinger.mutableUseFrameRateApi() = true;
126
127 setupScheduler();
Ady Abraham60e42ea2020-03-09 19:17:31 -0700128
Dominik Laskowski13948602021-03-08 20:48:28 -0800129 mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700130 mFlinger.mutableEventQueue().reset(mMessageQueue);
131}
Dominik Laskowski13948602021-03-08 20:48:28 -0800132
Ady Abraham60e42ea2020-03-09 19:17:31 -0700133void SetFrameRateTest::addChild(sp<Layer> layer, sp<Layer> child) {
134 layer.get()->addChild(child.get());
135}
136
137void SetFrameRateTest::removeChild(sp<Layer> layer, sp<Layer> child) {
138 layer.get()->removeChild(child.get());
139}
140
Ady Abraham60e42ea2020-03-09 19:17:31 -0700141void SetFrameRateTest::commitTransaction() {
142 for (auto layer : mLayers) {
Robert Carr6a160312021-05-17 12:08:20 -0700143 auto c = layer->getDrawingState();
Robert Carr0758e5d2021-03-11 22:15:04 -0800144 layer->commitTransaction(c);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700145 }
146}
147
148void SetFrameRateTest::setupScheduler() {
149 auto eventThread = std::make_unique<mock::EventThread>();
150 auto sfEventThread = std::make_unique<mock::EventThread>();
151
152 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
153 EXPECT_CALL(*eventThread, createEventConnection(_, _))
Ady Abraham0bb6a472020-10-12 10:22:13 -0700154 .WillOnce(Return(new EventThreadConnection(eventThread.get(), /*callingUid=*/0,
Ady Abraham62f216c2020-10-13 19:07:23 -0700155 ResyncCallback())));
Ady Abraham60e42ea2020-03-09 19:17:31 -0700156
157 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
158 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
Ady Abraham0bb6a472020-10-12 10:22:13 -0700159 .WillOnce(Return(new EventThreadConnection(sfEventThread.get(), /*callingUid=*/0,
Ady Abraham62f216c2020-10-13 19:07:23 -0700160 ResyncCallback())));
Ady Abraham60e42ea2020-03-09 19:17:31 -0700161
Ady Abraham8cb21882020-08-26 18:22:05 -0700162 auto vsyncController = std::make_unique<mock::VsyncController>();
163 auto vsyncTracker = std::make_unique<mock::VSyncTracker>();
Ady Abraham60e42ea2020-03-09 19:17:31 -0700164
Ady Abraham8cb21882020-08-26 18:22:05 -0700165 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
166 EXPECT_CALL(*vsyncTracker, currentPeriod())
Marin Shalamanov045b7002021-01-07 16:56:24 +0100167 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
Ady Abraham8cb21882020-08-26 18:22:05 -0700168 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
169 mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker),
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800170 std::move(eventThread), std::move(sfEventThread), /*callback*/ nullptr,
171 /*hasMultipleModes*/ true);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700172}
173
Ady Abraham60e42ea2020-03-09 19:17:31 -0700174namespace {
175/* ------------------------------------------------------------------------
176 * Test cases
177 */
178TEST_P(SetFrameRateTest, SetAndGet) {
179 EXPECT_CALL(*mMessageQueue, invalidate()).Times(1);
180
181 const auto& layerFactory = GetParam();
182
183 auto layer = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
184 layer->setFrameRate(FRAME_RATE_VOTE1);
185 commitTransaction();
186 EXPECT_EQ(FRAME_RATE_VOTE1, layer->getFrameRateForLayerTree());
187}
188
189TEST_P(SetFrameRateTest, SetAndGetParent) {
190 EXPECT_CALL(*mMessageQueue, invalidate()).Times(1);
191
192 const auto& layerFactory = GetParam();
193
194 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
195 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
196 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
197
198 addChild(parent, child1);
199 addChild(child1, child2);
200
201 child2->setFrameRate(FRAME_RATE_VOTE1);
202 commitTransaction();
203 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
204 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
205 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
206
207 child2->setFrameRate(FRAME_RATE_NO_VOTE);
208 commitTransaction();
209 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
210 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
211 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
212}
213
214TEST_P(SetFrameRateTest, SetAndGetParentAllVote) {
215 EXPECT_CALL(*mMessageQueue, invalidate()).Times(1);
216
217 const auto& layerFactory = GetParam();
218
219 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
220 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
221 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
222
223 addChild(parent, child1);
224 addChild(child1, child2);
225
226 child2->setFrameRate(FRAME_RATE_VOTE1);
227 child1->setFrameRate(FRAME_RATE_VOTE2);
228 parent->setFrameRate(FRAME_RATE_VOTE3);
229 commitTransaction();
230 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
231 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
232 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
233
234 child2->setFrameRate(FRAME_RATE_NO_VOTE);
235 commitTransaction();
236 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
237 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700238 EXPECT_EQ(FRAME_RATE_VOTE2, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700239
240 child1->setFrameRate(FRAME_RATE_NO_VOTE);
241 commitTransaction();
242 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700243 EXPECT_EQ(FRAME_RATE_VOTE3, child1->getFrameRateForLayerTree());
244 EXPECT_EQ(FRAME_RATE_VOTE3, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700245
246 parent->setFrameRate(FRAME_RATE_NO_VOTE);
247 commitTransaction();
248 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
249 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
250 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
251}
252
253TEST_P(SetFrameRateTest, SetAndGetChild) {
254 EXPECT_CALL(*mMessageQueue, invalidate()).Times(1);
255
256 const auto& layerFactory = GetParam();
257
258 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
259 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
260 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
261
262 addChild(parent, child1);
263 addChild(child1, child2);
264
265 parent->setFrameRate(FRAME_RATE_VOTE1);
266 commitTransaction();
267 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700268 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
269 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700270
271 parent->setFrameRate(FRAME_RATE_NO_VOTE);
272 commitTransaction();
273 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
274 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
275 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
276}
277
278TEST_P(SetFrameRateTest, SetAndGetChildAllVote) {
279 EXPECT_CALL(*mMessageQueue, invalidate()).Times(1);
280
281 const auto& layerFactory = GetParam();
282
283 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
284 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
285 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
286
287 addChild(parent, child1);
288 addChild(child1, child2);
289
290 child2->setFrameRate(FRAME_RATE_VOTE1);
291 child1->setFrameRate(FRAME_RATE_VOTE2);
292 parent->setFrameRate(FRAME_RATE_VOTE3);
293 commitTransaction();
294 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
295 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
296 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
297
298 parent->setFrameRate(FRAME_RATE_NO_VOTE);
299 commitTransaction();
300 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
301 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
302 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
303
304 child1->setFrameRate(FRAME_RATE_NO_VOTE);
305 commitTransaction();
306 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
307 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
308 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
309
310 child2->setFrameRate(FRAME_RATE_NO_VOTE);
311 commitTransaction();
312 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
313 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
314 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
315}
316
317TEST_P(SetFrameRateTest, SetAndGetChildAddAfterVote) {
318 EXPECT_CALL(*mMessageQueue, invalidate()).Times(1);
319
320 const auto& layerFactory = GetParam();
321
322 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
323 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
324 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
325
326 addChild(parent, child1);
327
328 parent->setFrameRate(FRAME_RATE_VOTE1);
329 commitTransaction();
330 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700331 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700332 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
333
334 addChild(child1, child2);
335 commitTransaction();
336 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700337 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
338 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700339
340 parent->setFrameRate(FRAME_RATE_NO_VOTE);
341 commitTransaction();
342 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
343 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
344 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
345}
346
347TEST_P(SetFrameRateTest, SetAndGetChildRemoveAfterVote) {
348 EXPECT_CALL(*mMessageQueue, invalidate()).Times(1);
349
350 const auto& layerFactory = GetParam();
351
352 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
353 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
354 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
355
356 addChild(parent, child1);
357 addChild(child1, child2);
358
359 parent->setFrameRate(FRAME_RATE_VOTE1);
360 commitTransaction();
361 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700362 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
363 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700364
365 removeChild(child1, child2);
366 commitTransaction();
367 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700368 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700369 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
370
371 parent->setFrameRate(FRAME_RATE_NO_VOTE);
372 commitTransaction();
373 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
374 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
375 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
376}
377
378TEST_P(SetFrameRateTest, SetAndGetParentNotInTree) {
379 EXPECT_CALL(*mMessageQueue, invalidate()).Times(1);
380
381 const auto& layerFactory = GetParam();
382
383 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
384 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
385 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
386 auto child2_1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
387
388 addChild(parent, child1);
389 addChild(child1, child2);
390 addChild(child1, child2_1);
391
392 child2->setFrameRate(FRAME_RATE_VOTE1);
393 commitTransaction();
394 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
395 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
396 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
397 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2_1->getFrameRateForLayerTree());
398
399 child2->setFrameRate(FRAME_RATE_NO_VOTE);
400 commitTransaction();
401 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
402 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
403 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
404 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2_1->getFrameRateForLayerTree());
405}
406
Ady Abraham60e42ea2020-03-09 19:17:31 -0700407INSTANTIATE_TEST_SUITE_P(PerLayerType, SetFrameRateTest,
Robert Carr80b1b1c2021-09-29 12:44:17 -0700408 testing::Values(std::make_shared<BufferStateLayerFactory>(),
Ady Abraham60e42ea2020-03-09 19:17:31 -0700409 std::make_shared<EffectLayerFactory>()),
410 PrintToStringParamName);
411
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800412TEST_F(SetFrameRateTest, ValidateFrameRate) {
Marin Shalamanovc5986772021-03-16 16:09:49 +0100413 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
414 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
415 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
416 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
417 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
418 ANATIVEWINDOW_CHANGE_FRAME_RATE_ALWAYS, ""));
419 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
420 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
421 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT,
422 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, "",
423 /*privileged=*/true));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800424
Marin Shalamanovc5986772021-03-16 16:09:49 +0100425 EXPECT_FALSE(ValidateFrameRate(-1, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
426 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
427 EXPECT_FALSE(ValidateFrameRate(1.0f / 0.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
428 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
429 EXPECT_FALSE(ValidateFrameRate(0.0f / 0.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
430 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800431
Marin Shalamanovc5986772021-03-16 16:09:49 +0100432 EXPECT_FALSE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT,
433 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
434
435 // Invalid compatibility
436 EXPECT_FALSE(
437 ValidateFrameRate(60.0f, -1, ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
438 EXPECT_FALSE(ValidateFrameRate(60.0f, 2, ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
439
440 // Invalid change frame rate strategy
441 EXPECT_FALSE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT, -1, ""));
442 EXPECT_FALSE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT, 2, ""));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800443}
444
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800445TEST_P(SetFrameRateTest, SetOnParentActivatesTree) {
446 const auto& layerFactory = GetParam();
447
448 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
449 if (!parent->isVisible()) {
450 // This is a hack as all the test layers except EffectLayer are not visible,
451 // but since the logic is unified in Layer, it should be fine.
452 return;
453 }
454
455 auto child = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
456 addChild(parent, child);
457
458 parent->setFrameRate(FRAME_RATE_VOTE1);
459 commitTransaction();
460
Ady Abrahambdda8f02021-04-01 16:06:11 -0700461 mFlinger.mutableScheduler()
462 .mutableLayerHistory()
463 ->record(parent.get(), 0, 0, LayerHistory::LayerUpdateType::Buffer);
464 mFlinger.mutableScheduler()
465 .mutableLayerHistory()
466 ->record(child.get(), 0, 0, LayerHistory::LayerUpdateType::Buffer);
467
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800468 const auto layerHistorySummary =
Ady Abraham3efa3942021-06-24 19:01:25 -0700469 mFlinger.mutableScheduler()
470 .mutableLayerHistory()
471 ->summarize(*mFlinger.mutableScheduler().refreshRateConfigs(), 0);
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800472 ASSERT_EQ(2u, layerHistorySummary.size());
473 EXPECT_TRUE(FRAME_RATE_VOTE1.rate.equalsWithMargin(layerHistorySummary[0].desiredRefreshRate));
474 EXPECT_TRUE(FRAME_RATE_VOTE1.rate.equalsWithMargin(layerHistorySummary[1].desiredRefreshRate));
475}
476
Ady Abrahama850c182021-08-04 13:04:37 -0700477TEST_P(SetFrameRateTest, addChildForParentWithTreeVote) {
478 EXPECT_CALL(*mMessageQueue, invalidate()).Times(1);
479
480 const auto& layerFactory = GetParam();
481
482 const auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
483 const auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
484 const auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
485 const auto childOfChild1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
486
487 addChild(parent, child1);
488 addChild(child1, childOfChild1);
489
490 childOfChild1->setFrameRate(FRAME_RATE_VOTE1);
491 commitTransaction();
492 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
493 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
494 EXPECT_EQ(FRAME_RATE_VOTE1, childOfChild1->getFrameRateForLayerTree());
495 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
496
497 addChild(parent, child2);
498 commitTransaction();
499 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
500 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
501 EXPECT_EQ(FRAME_RATE_VOTE1, childOfChild1->getFrameRateForLayerTree());
502 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
503
504 childOfChild1->setFrameRate(FRAME_RATE_NO_VOTE);
505 commitTransaction();
506 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
507 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
508 EXPECT_EQ(FRAME_RATE_NO_VOTE, childOfChild1->getFrameRateForLayerTree());
509 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
510}
511
Ady Abraham60e42ea2020-03-09 19:17:31 -0700512} // namespace
513} // namespace android