blob: d4591fc4f242b169c53f791ef5ef799651ceed7a [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"
27#include "BufferQueueLayer.h"
28#include "BufferStateLayer.h"
29#include "EffectLayer.h"
30#include "Layer.h"
31// TODO(b/129481165): remove the #pragma below and fix conversion issues
32#pragma clang diagnostic pop // ignored "-Wconversion"
33#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
68class BufferQueueLayerFactory : public LayerFactory {
69public:
70 std::string name() override { return "BufferQueueLayer"; }
71 sp<Layer> createLayer(TestableSurfaceFlinger& flinger) override {
72 sp<Client> client;
73 LayerCreationArgs args(flinger.flinger(), client, "buffer-queue-layer", WIDTH, HEIGHT,
74 LAYER_FLAGS, LayerMetadata());
75 return new BufferQueueLayer(args);
76 }
77};
78
79class BufferStateLayerFactory : public LayerFactory {
80public:
81 std::string name() override { return "BufferStateLayer"; }
82 sp<Layer> createLayer(TestableSurfaceFlinger& flinger) override {
83 sp<Client> client;
84 LayerCreationArgs args(flinger.flinger(), client, "buffer-queue-layer", WIDTH, HEIGHT,
85 LAYER_FLAGS, LayerMetadata());
86 return new BufferStateLayer(args);
87 }
88};
89
90class EffectLayerFactory : public LayerFactory {
91public:
92 std::string name() override { return "EffectLayer"; }
93 sp<Layer> createLayer(TestableSurfaceFlinger& flinger) override {
94 sp<Client> client;
95 LayerCreationArgs args(flinger.flinger(), client, "color-layer", WIDTH, HEIGHT, LAYER_FLAGS,
96 LayerMetadata());
97 return new EffectLayer(args);
98 }
99};
100
101std::string PrintToStringParamName(
102 const ::testing::TestParamInfo<std::shared_ptr<LayerFactory>>& info) {
103 return info.param->name();
104}
105
106/**
107 * This class tests the behaviour of Layer::SetFrameRate and Layer::GetFrameRate
108 */
109class SetFrameRateTest : public ::testing::TestWithParam<std::shared_ptr<LayerFactory>> {
110protected:
111 const FrameRate FRAME_RATE_VOTE1 = FrameRate(67.f, FrameRateCompatibility::Default);
112 const FrameRate FRAME_RATE_VOTE2 = FrameRate(14.f, FrameRateCompatibility::ExactOrMultiple);
113 const FrameRate FRAME_RATE_VOTE3 = FrameRate(99.f, FrameRateCompatibility::NoVote);
114 const FrameRate FRAME_RATE_TREE = FrameRate(0, FrameRateCompatibility::NoVote);
115 const FrameRate FRAME_RATE_NO_VOTE = FrameRate(0, FrameRateCompatibility::Default);
116
117 SetFrameRateTest();
118
119 void setupScheduler();
120 void setupComposer(uint32_t virtualDisplayCount);
121
122 void addChild(sp<Layer> layer, sp<Layer> child);
123 void removeChild(sp<Layer> layer, sp<Layer> child);
124 void reparentChildren(sp<Layer> layer, sp<Layer> child);
125 void commitTransaction();
126
127 TestableSurfaceFlinger mFlinger;
128 Hwc2::mock::Composer* mComposer = nullptr;
129 mock::MessageQueue* mMessageQueue = new mock::MessageQueue();
130
131 std::vector<sp<Layer>> mLayers;
132};
133
134SetFrameRateTest::SetFrameRateTest() {
135 const ::testing::TestInfo* const test_info =
136 ::testing::UnitTest::GetInstance()->current_test_info();
137 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
138
139 mFlinger.mutableUseFrameRateApi() = true;
140
141 setupScheduler();
142 setupComposer(0);
143
144 mFlinger.mutableEventQueue().reset(mMessageQueue);
145}
146void SetFrameRateTest::addChild(sp<Layer> layer, sp<Layer> child) {
147 layer.get()->addChild(child.get());
148}
149
150void SetFrameRateTest::removeChild(sp<Layer> layer, sp<Layer> child) {
151 layer.get()->removeChild(child.get());
152}
153
154void SetFrameRateTest::reparentChildren(sp<Layer> parent, sp<Layer> newParent) {
155 parent.get()->reparentChildren(newParent);
156}
157
158void SetFrameRateTest::commitTransaction() {
159 for (auto layer : mLayers) {
160 layer.get()->commitTransaction(layer.get()->getCurrentState());
161 }
162}
163
164void SetFrameRateTest::setupScheduler() {
165 auto eventThread = std::make_unique<mock::EventThread>();
166 auto sfEventThread = std::make_unique<mock::EventThread>();
167
168 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
169 EXPECT_CALL(*eventThread, createEventConnection(_, _))
170 .WillOnce(Return(new EventThreadConnection(eventThread.get(), ResyncCallback(),
171 ISurfaceComposer::eConfigChangedSuppress)));
172
173 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
174 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
175 .WillOnce(Return(new EventThreadConnection(sfEventThread.get(), ResyncCallback(),
176 ISurfaceComposer::eConfigChangedSuppress)));
177
Ady Abraham8cb21882020-08-26 18:22:05 -0700178 auto vsyncController = std::make_unique<mock::VsyncController>();
179 auto vsyncTracker = std::make_unique<mock::VSyncTracker>();
Ady Abraham60e42ea2020-03-09 19:17:31 -0700180
Ady Abraham8cb21882020-08-26 18:22:05 -0700181 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
182 EXPECT_CALL(*vsyncTracker, currentPeriod())
Ady Abraham60e42ea2020-03-09 19:17:31 -0700183 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_REFRESH_RATE));
Ady Abraham8cb21882020-08-26 18:22:05 -0700184 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
185 mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker),
186 std::move(eventThread), std::move(sfEventThread));
Ady Abraham60e42ea2020-03-09 19:17:31 -0700187}
188
189void SetFrameRateTest::setupComposer(uint32_t virtualDisplayCount) {
190 mComposer = new Hwc2::mock::Composer();
191 EXPECT_CALL(*mComposer, getMaxVirtualDisplayCount()).WillOnce(Return(virtualDisplayCount));
192 mFlinger.setupComposer(std::unique_ptr<Hwc2::Composer>(mComposer));
193
194 Mock::VerifyAndClear(mComposer);
195}
196
197namespace {
198/* ------------------------------------------------------------------------
199 * Test cases
200 */
201TEST_P(SetFrameRateTest, SetAndGet) {
202 EXPECT_CALL(*mMessageQueue, invalidate()).Times(1);
203
204 const auto& layerFactory = GetParam();
205
206 auto layer = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
207 layer->setFrameRate(FRAME_RATE_VOTE1);
208 commitTransaction();
209 EXPECT_EQ(FRAME_RATE_VOTE1, layer->getFrameRateForLayerTree());
210}
211
212TEST_P(SetFrameRateTest, SetAndGetParent) {
213 EXPECT_CALL(*mMessageQueue, invalidate()).Times(1);
214
215 const auto& layerFactory = GetParam();
216
217 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
218 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
219 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
220
221 addChild(parent, child1);
222 addChild(child1, child2);
223
224 child2->setFrameRate(FRAME_RATE_VOTE1);
225 commitTransaction();
226 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
227 EXPECT_EQ(FRAME_RATE_TREE, 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_NO_VOTE, parent->getFrameRateForLayerTree());
233 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
234 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
235}
236
237TEST_P(SetFrameRateTest, SetAndGetParentAllVote) {
238 EXPECT_CALL(*mMessageQueue, invalidate()).Times(1);
239
240 const auto& layerFactory = GetParam();
241
242 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
243 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
244 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
245
246 addChild(parent, child1);
247 addChild(child1, child2);
248
249 child2->setFrameRate(FRAME_RATE_VOTE1);
250 child1->setFrameRate(FRAME_RATE_VOTE2);
251 parent->setFrameRate(FRAME_RATE_VOTE3);
252 commitTransaction();
253 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
254 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
255 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
256
257 child2->setFrameRate(FRAME_RATE_NO_VOTE);
258 commitTransaction();
259 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
260 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
261 EXPECT_EQ(FRAME_RATE_TREE, child2->getFrameRateForLayerTree());
262
263 child1->setFrameRate(FRAME_RATE_NO_VOTE);
264 commitTransaction();
265 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
266 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
267 EXPECT_EQ(FRAME_RATE_TREE, child2->getFrameRateForLayerTree());
268
269 parent->setFrameRate(FRAME_RATE_NO_VOTE);
270 commitTransaction();
271 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
272 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
273 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
274}
275
276TEST_P(SetFrameRateTest, SetAndGetChild) {
277 EXPECT_CALL(*mMessageQueue, invalidate()).Times(1);
278
279 const auto& layerFactory = GetParam();
280
281 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
282 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
283 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
284
285 addChild(parent, child1);
286 addChild(child1, child2);
287
288 parent->setFrameRate(FRAME_RATE_VOTE1);
289 commitTransaction();
290 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
291 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
292 EXPECT_EQ(FRAME_RATE_TREE, child2->getFrameRateForLayerTree());
293
294 parent->setFrameRate(FRAME_RATE_NO_VOTE);
295 commitTransaction();
296 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
297 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
298 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
299}
300
301TEST_P(SetFrameRateTest, SetAndGetChildAllVote) {
302 EXPECT_CALL(*mMessageQueue, invalidate()).Times(1);
303
304 const auto& layerFactory = GetParam();
305
306 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
307 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
308 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
309
310 addChild(parent, child1);
311 addChild(child1, child2);
312
313 child2->setFrameRate(FRAME_RATE_VOTE1);
314 child1->setFrameRate(FRAME_RATE_VOTE2);
315 parent->setFrameRate(FRAME_RATE_VOTE3);
316 commitTransaction();
317 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
318 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
319 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
320
321 parent->setFrameRate(FRAME_RATE_NO_VOTE);
322 commitTransaction();
323 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
324 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
325 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
326
327 child1->setFrameRate(FRAME_RATE_NO_VOTE);
328 commitTransaction();
329 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
330 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
331 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
332
333 child2->setFrameRate(FRAME_RATE_NO_VOTE);
334 commitTransaction();
335 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
336 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
337 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
338}
339
340TEST_P(SetFrameRateTest, SetAndGetChildAddAfterVote) {
341 EXPECT_CALL(*mMessageQueue, invalidate()).Times(1);
342
343 const auto& layerFactory = GetParam();
344
345 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
346 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
347 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
348
349 addChild(parent, child1);
350
351 parent->setFrameRate(FRAME_RATE_VOTE1);
352 commitTransaction();
353 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
354 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
355 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
356
357 addChild(child1, child2);
358 commitTransaction();
359 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
360 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
361 EXPECT_EQ(FRAME_RATE_TREE, child2->getFrameRateForLayerTree());
362
363 parent->setFrameRate(FRAME_RATE_NO_VOTE);
364 commitTransaction();
365 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
366 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
367 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
368}
369
370TEST_P(SetFrameRateTest, SetAndGetChildRemoveAfterVote) {
371 EXPECT_CALL(*mMessageQueue, invalidate()).Times(1);
372
373 const auto& layerFactory = GetParam();
374
375 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
376 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
377 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
378
379 addChild(parent, child1);
380 addChild(child1, child2);
381
382 parent->setFrameRate(FRAME_RATE_VOTE1);
383 commitTransaction();
384 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
385 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
386 EXPECT_EQ(FRAME_RATE_TREE, child2->getFrameRateForLayerTree());
387
388 removeChild(child1, child2);
389 commitTransaction();
390 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
391 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
392 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
393
394 parent->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}
400
401TEST_P(SetFrameRateTest, SetAndGetParentNotInTree) {
402 EXPECT_CALL(*mMessageQueue, invalidate()).Times(1);
403
404 const auto& layerFactory = GetParam();
405
406 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
407 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
408 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
409 auto child2_1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
410
411 addChild(parent, child1);
412 addChild(child1, child2);
413 addChild(child1, child2_1);
414
415 child2->setFrameRate(FRAME_RATE_VOTE1);
416 commitTransaction();
417 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
418 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
419 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
420 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2_1->getFrameRateForLayerTree());
421
422 child2->setFrameRate(FRAME_RATE_NO_VOTE);
423 commitTransaction();
424 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
425 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
426 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
427 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2_1->getFrameRateForLayerTree());
428}
429
430TEST_P(SetFrameRateTest, SetAndGetRearentChildren) {
431 EXPECT_CALL(*mMessageQueue, invalidate()).Times(1);
432
433 const auto& layerFactory = GetParam();
434
435 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
436 auto parent2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
437 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
438 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
439
440 addChild(parent, child1);
441 addChild(child1, child2);
442
443 child2->setFrameRate(FRAME_RATE_VOTE1);
444 commitTransaction();
445 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
446 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent2->getFrameRateForLayerTree());
447 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
448 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
449
450 reparentChildren(parent, parent2);
451 commitTransaction();
452 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
453 EXPECT_EQ(FRAME_RATE_TREE, parent2->getFrameRateForLayerTree());
454 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
455 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
456
457 child2->setFrameRate(FRAME_RATE_NO_VOTE);
458 commitTransaction();
459 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
460 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent2->getFrameRateForLayerTree());
461 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
462 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
463}
464
465INSTANTIATE_TEST_SUITE_P(PerLayerType, SetFrameRateTest,
466 testing::Values(std::make_shared<BufferQueueLayerFactory>(),
467 std::make_shared<BufferStateLayerFactory>(),
468 std::make_shared<EffectLayerFactory>()),
469 PrintToStringParamName);
470
471} // namespace
472} // namespace android