blob: 42096f3fdb4d9e51c0cc2a3e4cf81dd8f9fed6ef [file] [log] [blame]
Ady Abrahamb7db4102021-03-04 12:19:26 -08001/*
2 * Copyright 2021 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
Huihong Luoa5825112021-03-24 12:28:29 -070017#include <compositionengine/impl/OutputCompositionState.h>
Ady Abrahamb7db4102021-03-04 12:19:26 -080018#include <compositionengine/impl/planner/CachedSet.h>
19#include <compositionengine/impl/planner/Flattener.h>
20#include <compositionengine/impl/planner/LayerState.h>
Ady Abrahamb7db4102021-03-04 12:19:26 -080021#include <compositionengine/mock/LayerFE.h>
22#include <compositionengine/mock/OutputLayer.h>
23#include <gtest/gtest.h>
Leon Scroggins III2e74a4c2021-04-09 13:41:14 -040024#include <renderengine/ExternalTexture.h>
25#include <renderengine/LayerSettings.h>
Ady Abrahamb7db4102021-03-04 12:19:26 -080026#include <renderengine/mock/RenderEngine.h>
27
28namespace android::compositionengine {
29using namespace std::chrono_literals;
30using impl::planner::Flattener;
31using impl::planner::LayerState;
32using impl::planner::NonBufferHash;
Ady Abrahamb7db4102021-03-04 12:19:26 -080033
34using testing::_;
35using testing::ByMove;
36using testing::ByRef;
37using testing::DoAll;
38using testing::Invoke;
39using testing::Return;
40using testing::ReturnRef;
41using testing::Sequence;
42using testing::SetArgPointee;
43
44namespace {
45
46class FlattenerTest : public testing::Test {
47public:
Alec Mouri08b6b202021-05-10 14:01:41 -070048 FlattenerTest() : mFlattener(std::make_unique<Flattener>(true)) {}
Ady Abrahamb7db4102021-03-04 12:19:26 -080049 void SetUp() override;
50
51protected:
52 void initializeOverrideBuffer(const std::vector<const LayerState*>& layers);
53 void initializeFlattener(const std::vector<const LayerState*>& layers);
54 void expectAllLayersFlattened(const std::vector<const LayerState*>& layers);
55
Alec Mouri49da70d2021-03-10 21:11:25 -080056 // mRenderEngine may be held as a pointer to mFlattener, so mFlattener must be destroyed first.
Ady Abrahamb7db4102021-03-04 12:19:26 -080057 renderengine::mock::RenderEngine mRenderEngine;
Alec Mouri49da70d2021-03-10 21:11:25 -080058 std::unique_ptr<Flattener> mFlattener;
Ady Abrahamb7db4102021-03-04 12:19:26 -080059
60 const std::chrono::steady_clock::time_point kStartTime = std::chrono::steady_clock::now();
61 std::chrono::steady_clock::time_point mTime = kStartTime;
62
63 struct TestLayer {
64 std::string name;
65 mock::OutputLayer outputLayer;
66 impl::OutputLayerCompositionState outputLayerCompositionState;
67 // LayerFE inherits from RefBase and must be held by an sp<>
68 sp<mock::LayerFE> layerFE;
69 LayerFECompositionState layerFECompositionState;
70
71 std::unique_ptr<LayerState> layerState;
72 };
73
74 static constexpr size_t kNumLayers = 5;
75 std::vector<std::unique_ptr<TestLayer>> mTestLayers;
Huihong Luoa5825112021-03-24 12:28:29 -070076 impl::OutputCompositionState mOutputState;
Ady Abrahamb7db4102021-03-04 12:19:26 -080077};
78
79void FlattenerTest::SetUp() {
80 for (size_t i = 0; i < kNumLayers; i++) {
81 auto testLayer = std::make_unique<TestLayer>();
82 auto pos = static_cast<int32_t>(i);
83 std::stringstream ss;
84 ss << "testLayer" << i;
85 testLayer->name = ss.str();
86
87 testLayer->outputLayerCompositionState.displayFrame = Rect(pos, pos, pos + 1, pos + 1);
Alec Mouri464352b2021-03-24 16:33:21 -070088 testLayer->outputLayerCompositionState.visibleRegion =
89 Region(Rect(pos + 1, pos + 1, pos + 2, pos + 2));
Ady Abrahamb7db4102021-03-04 12:19:26 -080090
91 testLayer->layerFECompositionState.buffer =
92 new GraphicBuffer(100, 100, HAL_PIXEL_FORMAT_RGBA_8888, 1,
93 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
94 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE,
95 "output");
96
97 testLayer->layerFE = sp<mock::LayerFE>::make();
98
99 EXPECT_CALL(*testLayer->layerFE, getSequence)
100 .WillRepeatedly(Return(static_cast<int32_t>(i)));
101 EXPECT_CALL(*testLayer->layerFE, getDebugName)
102 .WillRepeatedly(Return(testLayer->name.c_str()));
103 EXPECT_CALL(*testLayer->layerFE, getCompositionState)
104 .WillRepeatedly(Return(&testLayer->layerFECompositionState));
105
106 std::vector<LayerFE::LayerSettings> clientCompositionList = {
107 LayerFE::LayerSettings{},
108 };
109
110 EXPECT_CALL(*testLayer->layerFE, prepareClientCompositionList)
111 .WillRepeatedly(Return(clientCompositionList));
112 EXPECT_CALL(testLayer->outputLayer, getLayerFE)
113 .WillRepeatedly(ReturnRef(*testLayer->layerFE));
114 EXPECT_CALL(testLayer->outputLayer, getState)
115 .WillRepeatedly(ReturnRef(testLayer->outputLayerCompositionState));
116 EXPECT_CALL(testLayer->outputLayer, editState)
117 .WillRepeatedly(ReturnRef(testLayer->outputLayerCompositionState));
118
119 testLayer->layerState = std::make_unique<LayerState>(&testLayer->outputLayer);
120 testLayer->layerState->incrementFramesSinceBufferUpdate();
121
122 mTestLayers.emplace_back(std::move(testLayer));
Huihong Luoa5825112021-03-24 12:28:29 -0700123
124 // set up minimium params needed for rendering
125 mOutputState.dataspace = ui::Dataspace::SRGB;
Alec Mouri7be6c0a2021-03-19 15:22:01 -0700126 mOutputState.framebufferSpace = ProjectionSpace(ui::Size(10, 20), Rect(10, 5));
127 mOutputState.framebufferSpace.orientation = ui::ROTATION_90;
Ady Abrahamb7db4102021-03-04 12:19:26 -0800128 }
129}
130
131void FlattenerTest::initializeOverrideBuffer(const std::vector<const LayerState*>& layers) {
132 for (const auto layer : layers) {
133 layer->getOutputLayer()->editState().overrideInfo = {};
134 }
135}
136
137void FlattenerTest::initializeFlattener(const std::vector<const LayerState*>& layers) {
138 // layer stack is unknown, reset current geomentry
139 initializeOverrideBuffer(layers);
140 EXPECT_EQ(getNonBufferHash(layers),
141 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
Huihong Luoa5825112021-03-24 12:28:29 -0700142 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
Ady Abrahamb7db4102021-03-04 12:19:26 -0800143
144 // same geometry, update the internal layer stack
145 initializeOverrideBuffer(layers);
146 EXPECT_EQ(getNonBufferHash(layers),
147 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
Huihong Luoa5825112021-03-24 12:28:29 -0700148 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
Ady Abrahamb7db4102021-03-04 12:19:26 -0800149}
150
151void FlattenerTest::expectAllLayersFlattened(const std::vector<const LayerState*>& layers) {
152 // layers would be flattened but the buffer would not be overridden
153 EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).WillOnce(Return(NO_ERROR));
154
155 initializeOverrideBuffer(layers);
156 EXPECT_EQ(getNonBufferHash(layers),
157 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
Huihong Luoa5825112021-03-24 12:28:29 -0700158 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
Ady Abrahamb7db4102021-03-04 12:19:26 -0800159
160 for (const auto layer : layers) {
161 EXPECT_EQ(nullptr, layer->getOutputLayer()->getState().overrideInfo.buffer);
162 }
163
164 // the new flattened layer is replaced
165 initializeOverrideBuffer(layers);
166 EXPECT_NE(getNonBufferHash(layers),
167 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
Huihong Luoa5825112021-03-24 12:28:29 -0700168 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
Ady Abrahamb7db4102021-03-04 12:19:26 -0800169
170 const auto buffer = layers[0]->getOutputLayer()->getState().overrideInfo.buffer;
171 EXPECT_NE(nullptr, buffer);
172 for (const auto layer : layers) {
173 EXPECT_EQ(buffer, layer->getOutputLayer()->getState().overrideInfo.buffer);
174 }
175}
176
177TEST_F(FlattenerTest, flattenLayers_NewLayerStack) {
178 auto& layerState1 = mTestLayers[0]->layerState;
179 auto& layerState2 = mTestLayers[1]->layerState;
180
181 const std::vector<const LayerState*> layers = {
182 layerState1.get(),
183 layerState2.get(),
184 };
185 initializeFlattener(layers);
186}
187
188TEST_F(FlattenerTest, flattenLayers_ActiveLayersAreNotFlattened) {
189 auto& layerState1 = mTestLayers[0]->layerState;
190 auto& layerState2 = mTestLayers[1]->layerState;
191
192 const std::vector<const LayerState*> layers = {
193 layerState1.get(),
194 layerState2.get(),
195 };
196
197 initializeFlattener(layers);
198
199 // layers cannot be flattened yet, since they are still active
200 initializeOverrideBuffer(layers);
201 EXPECT_EQ(getNonBufferHash(layers),
202 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
Huihong Luoa5825112021-03-24 12:28:29 -0700203 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
Ady Abrahamb7db4102021-03-04 12:19:26 -0800204}
205
206TEST_F(FlattenerTest, flattenLayers_basicFlatten) {
207 auto& layerState1 = mTestLayers[0]->layerState;
208 auto& layerState2 = mTestLayers[1]->layerState;
209 auto& layerState3 = mTestLayers[2]->layerState;
210
211 const std::vector<const LayerState*> layers = {
212 layerState1.get(),
213 layerState2.get(),
214 layerState3.get(),
215 };
216
217 initializeFlattener(layers);
218
219 // make all layers inactive
220 mTime += 200ms;
221 expectAllLayersFlattened(layers);
222}
223
224TEST_F(FlattenerTest, flattenLayers_FlattenedLayersStayFlattenWhenNoUpdate) {
225 auto& layerState1 = mTestLayers[0]->layerState;
226 const auto& overrideBuffer1 = layerState1->getOutputLayer()->getState().overrideInfo.buffer;
227
228 auto& layerState2 = mTestLayers[1]->layerState;
229 const auto& overrideBuffer2 = layerState2->getOutputLayer()->getState().overrideInfo.buffer;
230
231 auto& layerState3 = mTestLayers[2]->layerState;
232 const auto& overrideBuffer3 = layerState3->getOutputLayer()->getState().overrideInfo.buffer;
233
234 const std::vector<const LayerState*> layers = {
235 layerState1.get(),
236 layerState2.get(),
237 layerState3.get(),
238 };
239
240 initializeFlattener(layers);
241
242 // make all layers inactive
243 mTime += 200ms;
244 expectAllLayersFlattened(layers);
245
246 initializeOverrideBuffer(layers);
247 EXPECT_NE(getNonBufferHash(layers),
248 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
Huihong Luoa5825112021-03-24 12:28:29 -0700249 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
Ady Abrahamb7db4102021-03-04 12:19:26 -0800250
251 EXPECT_NE(nullptr, overrideBuffer1);
252 EXPECT_EQ(overrideBuffer1, overrideBuffer2);
253 EXPECT_EQ(overrideBuffer2, overrideBuffer3);
254}
255
Alec Mouri7be6c0a2021-03-19 15:22:01 -0700256TEST_F(FlattenerTest, flattenLayers_FlattenedLayersSetsProjectionSpace) {
257 auto& layerState1 = mTestLayers[0]->layerState;
258 const auto& overrideDisplaySpace =
259 layerState1->getOutputLayer()->getState().overrideInfo.displaySpace;
260
261 auto& layerState2 = mTestLayers[1]->layerState;
262
263 const std::vector<const LayerState*> layers = {
264 layerState1.get(),
265 layerState2.get(),
266 };
267
268 initializeFlattener(layers);
269
270 // make all layers inactive
271 mTime += 200ms;
272 expectAllLayersFlattened(layers);
Alec Mouri464352b2021-03-24 16:33:21 -0700273
Alec Mouri73e09c32021-04-26 15:02:16 -0700274 EXPECT_EQ(overrideDisplaySpace, mOutputState.framebufferSpace);
Alec Mouri7be6c0a2021-03-19 15:22:01 -0700275}
276
Alec Mouri464352b2021-03-24 16:33:21 -0700277TEST_F(FlattenerTest, flattenLayers_FlattenedLayersSetsDamageRegions) {
278 auto& layerState1 = mTestLayers[0]->layerState;
279 const auto& overrideDamageRegion =
280 layerState1->getOutputLayer()->getState().overrideInfo.damageRegion;
281
282 auto& layerState2 = mTestLayers[1]->layerState;
283
284 const std::vector<const LayerState*> layers = {
285 layerState1.get(),
286 layerState2.get(),
287 };
288
289 initializeFlattener(layers);
290
291 // make all layers inactive
292 mTime += 200ms;
293 expectAllLayersFlattened(layers);
294 EXPECT_TRUE(overrideDamageRegion.isRect() &&
295 overrideDamageRegion.bounds() == Rect::INVALID_RECT);
296
297 initializeOverrideBuffer(layers);
298 EXPECT_NE(getNonBufferHash(layers),
299 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
300 EXPECT_TRUE(overrideDamageRegion.isRect() && overrideDamageRegion.bounds() == Rect::EMPTY_RECT);
301}
302
303TEST_F(FlattenerTest, flattenLayers_FlattenedLayersSetsVisibleRegion) {
304 auto& layerState1 = mTestLayers[0]->layerState;
305 const auto& overrideVisibleRegion =
306 layerState1->getOutputLayer()->getState().overrideInfo.visibleRegion;
307
308 auto& layerState2 = mTestLayers[1]->layerState;
309
310 const std::vector<const LayerState*> layers = {
311 layerState1.get(),
312 layerState2.get(),
313 };
314
315 initializeFlattener(layers);
316
317 // make all layers inactive
318 mTime += 200ms;
319 expectAllLayersFlattened(layers);
320 Region expectedRegion;
321 expectedRegion.orSelf(Rect(1, 1, 2, 2));
322 expectedRegion.orSelf(Rect(2, 2, 3, 3));
323 EXPECT_TRUE(overrideVisibleRegion.hasSameRects(expectedRegion));
324}
325
Ady Abrahamb7db4102021-03-04 12:19:26 -0800326TEST_F(FlattenerTest, flattenLayers_addLayerToFlattenedCauseReset) {
327 auto& layerState1 = mTestLayers[0]->layerState;
328 const auto& overrideBuffer1 = layerState1->getOutputLayer()->getState().overrideInfo.buffer;
329
330 auto& layerState2 = mTestLayers[1]->layerState;
331 const auto& overrideBuffer2 = layerState2->getOutputLayer()->getState().overrideInfo.buffer;
332
333 auto& layerState3 = mTestLayers[2]->layerState;
334 const auto& overrideBuffer3 = layerState3->getOutputLayer()->getState().overrideInfo.buffer;
335
336 std::vector<const LayerState*> layers = {
337 layerState1.get(),
338 layerState2.get(),
339 };
340
341 initializeFlattener(layers);
342 // make all layers inactive
343 mTime += 200ms;
344
345 initializeOverrideBuffer(layers);
346 expectAllLayersFlattened(layers);
347
348 // add a new layer to the stack, this will cause all the flatenner to reset
349 layers.push_back(layerState3.get());
350
351 initializeOverrideBuffer(layers);
352 EXPECT_EQ(getNonBufferHash(layers),
353 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
Huihong Luoa5825112021-03-24 12:28:29 -0700354 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
Ady Abrahamb7db4102021-03-04 12:19:26 -0800355
356 EXPECT_EQ(nullptr, overrideBuffer1);
357 EXPECT_EQ(nullptr, overrideBuffer2);
358 EXPECT_EQ(nullptr, overrideBuffer3);
359}
360
361TEST_F(FlattenerTest, flattenLayers_BufferUpdateToFlatten) {
362 auto& layerState1 = mTestLayers[0]->layerState;
363 const auto& overrideBuffer1 = layerState1->getOutputLayer()->getState().overrideInfo.buffer;
364
365 auto& layerState2 = mTestLayers[1]->layerState;
366 const auto& overrideBuffer2 = layerState2->getOutputLayer()->getState().overrideInfo.buffer;
367
368 auto& layerState3 = mTestLayers[2]->layerState;
369 const auto& overrideBuffer3 = layerState3->getOutputLayer()->getState().overrideInfo.buffer;
370
371 const std::vector<const LayerState*> layers = {
372 layerState1.get(),
373 layerState2.get(),
374 layerState3.get(),
375 };
376
377 initializeFlattener(layers);
378
379 // make all layers inactive
380 mTime += 200ms;
381 expectAllLayersFlattened(layers);
382
383 // Layer 1 posted a buffer update, layers would be decomposed, and a new drawFrame would be
384 // caleed for Layer2 and Layer3
385 layerState1->resetFramesSinceBufferUpdate();
386
387 EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).WillOnce(Return(NO_ERROR));
388 initializeOverrideBuffer(layers);
389 EXPECT_EQ(getNonBufferHash(layers),
390 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
Huihong Luoa5825112021-03-24 12:28:29 -0700391 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
Ady Abrahamb7db4102021-03-04 12:19:26 -0800392
393 EXPECT_EQ(nullptr, overrideBuffer1);
394 EXPECT_EQ(nullptr, overrideBuffer2);
395 EXPECT_EQ(nullptr, overrideBuffer3);
396
397 initializeOverrideBuffer(layers);
398 EXPECT_NE(getNonBufferHash(layers),
399 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
Huihong Luoa5825112021-03-24 12:28:29 -0700400 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
Ady Abrahamb7db4102021-03-04 12:19:26 -0800401
402 EXPECT_EQ(nullptr, overrideBuffer1);
403 EXPECT_NE(nullptr, overrideBuffer2);
404 EXPECT_EQ(overrideBuffer2, overrideBuffer3);
405
406 layerState1->incrementFramesSinceBufferUpdate();
407 mTime += 200ms;
408
409 EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).WillOnce(Return(NO_ERROR));
410 initializeOverrideBuffer(layers);
411 EXPECT_NE(getNonBufferHash(layers),
412 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
Huihong Luoa5825112021-03-24 12:28:29 -0700413 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
Ady Abrahamb7db4102021-03-04 12:19:26 -0800414
415 EXPECT_EQ(nullptr, overrideBuffer1);
416 EXPECT_NE(nullptr, overrideBuffer2);
417 EXPECT_EQ(overrideBuffer2, overrideBuffer3);
418
419 initializeOverrideBuffer(layers);
420 EXPECT_NE(getNonBufferHash(layers),
421 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
Huihong Luoa5825112021-03-24 12:28:29 -0700422 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
Ady Abrahamb7db4102021-03-04 12:19:26 -0800423
424 EXPECT_NE(nullptr, overrideBuffer1);
425 EXPECT_EQ(overrideBuffer1, overrideBuffer2);
426 EXPECT_EQ(overrideBuffer2, overrideBuffer3);
427}
428
429TEST_F(FlattenerTest, flattenLayers_BufferUpdateForMiddleLayer) {
430 auto& layerState1 = mTestLayers[0]->layerState;
431 const auto& overrideBuffer1 = layerState1->getOutputLayer()->getState().overrideInfo.buffer;
432
433 auto& layerState2 = mTestLayers[1]->layerState;
434 const auto& overrideBuffer2 = layerState2->getOutputLayer()->getState().overrideInfo.buffer;
435
436 auto& layerState3 = mTestLayers[2]->layerState;
437 const auto& overrideBuffer3 = layerState3->getOutputLayer()->getState().overrideInfo.buffer;
438
439 auto& layerState4 = mTestLayers[3]->layerState;
440 const auto& overrideBuffer4 = layerState4->getOutputLayer()->getState().overrideInfo.buffer;
441
442 auto& layerState5 = mTestLayers[4]->layerState;
443 const auto& overrideBuffer5 = layerState5->getOutputLayer()->getState().overrideInfo.buffer;
444
445 const std::vector<const LayerState*> layers = {
446 layerState1.get(), layerState2.get(), layerState3.get(),
447 layerState4.get(), layerState5.get(),
448 };
449
450 initializeFlattener(layers);
451
452 // make all layers inactive
453 mTime += 200ms;
454 expectAllLayersFlattened(layers);
455
456 // Layer 3 posted a buffer update, layers would be decomposed, and a new drawFrame would be
457 // called for Layer1 and Layer2
458 layerState3->resetFramesSinceBufferUpdate();
459
460 EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).WillOnce(Return(NO_ERROR));
461 initializeOverrideBuffer(layers);
462 EXPECT_EQ(getNonBufferHash(layers),
463 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
Huihong Luoa5825112021-03-24 12:28:29 -0700464 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
Ady Abrahamb7db4102021-03-04 12:19:26 -0800465
466 EXPECT_EQ(nullptr, overrideBuffer1);
467 EXPECT_EQ(nullptr, overrideBuffer2);
468 EXPECT_EQ(nullptr, overrideBuffer3);
469 EXPECT_EQ(nullptr, overrideBuffer4);
470 EXPECT_EQ(nullptr, overrideBuffer5);
471
472 // Layers 1 and 2 will be flattened a new drawFrame would be called for Layer4 and Layer5
473 EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).WillOnce(Return(NO_ERROR));
474 initializeOverrideBuffer(layers);
475 EXPECT_NE(getNonBufferHash(layers),
476 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
Alec Mouri7be6c0a2021-03-19 15:22:01 -0700477 mOutputState.framebufferSpace.orientation = ui::ROTATION_90;
Huihong Luoa5825112021-03-24 12:28:29 -0700478 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
Ady Abrahamb7db4102021-03-04 12:19:26 -0800479
480 EXPECT_NE(nullptr, overrideBuffer1);
481 EXPECT_EQ(overrideBuffer1, overrideBuffer2);
482 EXPECT_EQ(nullptr, overrideBuffer3);
483 EXPECT_EQ(nullptr, overrideBuffer4);
484 EXPECT_EQ(nullptr, overrideBuffer5);
485
486 // Layers 4 and 5 will be flattened
487 initializeOverrideBuffer(layers);
488 EXPECT_NE(getNonBufferHash(layers),
489 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
Alec Mouri7be6c0a2021-03-19 15:22:01 -0700490 mOutputState.framebufferSpace.orientation = ui::ROTATION_180;
Huihong Luoa5825112021-03-24 12:28:29 -0700491 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
Ady Abrahamb7db4102021-03-04 12:19:26 -0800492
493 EXPECT_NE(nullptr, overrideBuffer1);
494 EXPECT_EQ(overrideBuffer1, overrideBuffer2);
495 EXPECT_EQ(nullptr, overrideBuffer3);
496 EXPECT_NE(nullptr, overrideBuffer4);
497 EXPECT_EQ(overrideBuffer4, overrideBuffer5);
498
499 layerState3->incrementFramesSinceBufferUpdate();
500 mTime += 200ms;
501
502 EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).WillOnce(Return(NO_ERROR));
503 initializeOverrideBuffer(layers);
504 EXPECT_NE(getNonBufferHash(layers),
505 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
Huihong Luoa5825112021-03-24 12:28:29 -0700506 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
Ady Abrahamb7db4102021-03-04 12:19:26 -0800507
508 EXPECT_NE(nullptr, overrideBuffer1);
509 EXPECT_EQ(overrideBuffer1, overrideBuffer2);
510 EXPECT_EQ(nullptr, overrideBuffer3);
511 EXPECT_NE(nullptr, overrideBuffer4);
512 EXPECT_EQ(overrideBuffer4, overrideBuffer5);
513
514 initializeOverrideBuffer(layers);
515 EXPECT_NE(getNonBufferHash(layers),
516 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
Alec Mouri7be6c0a2021-03-19 15:22:01 -0700517 mOutputState.framebufferSpace.orientation = ui::ROTATION_270;
Huihong Luoa5825112021-03-24 12:28:29 -0700518 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
Ady Abrahamb7db4102021-03-04 12:19:26 -0800519
520 EXPECT_NE(nullptr, overrideBuffer1);
521 EXPECT_EQ(overrideBuffer1, overrideBuffer2);
522 EXPECT_EQ(overrideBuffer2, overrideBuffer3);
523 EXPECT_EQ(overrideBuffer3, overrideBuffer4);
524 EXPECT_EQ(overrideBuffer4, overrideBuffer5);
525}
526
Leon Scroggins III2e74a4c2021-04-09 13:41:14 -0400527// Tests for a PIP
528TEST_F(FlattenerTest, flattenLayers_pipRequiresRoundedCorners) {
529 auto& layerState1 = mTestLayers[0]->layerState;
530 const auto& overrideBuffer1 = layerState1->getOutputLayer()->getState().overrideInfo.buffer;
531
532 auto& layerState2 = mTestLayers[1]->layerState;
533 const auto& overrideBuffer2 = layerState2->getOutputLayer()->getState().overrideInfo.buffer;
534
535 auto& layerState3 = mTestLayers[2]->layerState;
536 const auto& overrideBuffer3 = layerState3->getOutputLayer()->getState().overrideInfo.buffer;
537
538 const std::vector<const LayerState*> layers = {
539 layerState1.get(),
540 layerState2.get(),
541 layerState3.get(),
542 };
543
544 initializeFlattener(layers);
545
546 // 3 has a buffer update, so it will not be merged, but it has no round
547 // corners, so it is not a PIP.
548 mTime += 200ms;
549 layerState3->resetFramesSinceBufferUpdate();
550
551 initializeOverrideBuffer(layers);
552 EXPECT_EQ(getNonBufferHash(layers),
553 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
554
555 // This will render a CachedSet.
556 EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).WillOnce(Return(NO_ERROR));
557 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
558
559 // We've rendered a CachedSet, but we haven't merged it in.
560 EXPECT_EQ(nullptr, overrideBuffer1);
561 EXPECT_EQ(nullptr, overrideBuffer2);
562 EXPECT_EQ(nullptr, overrideBuffer3);
563
564 // This time we merge the CachedSet in, so we have a new hash, and we should
565 // only have two sets.
566 EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).Times(0);
567 initializeOverrideBuffer(layers);
568 EXPECT_NE(getNonBufferHash(layers),
569 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
570 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
571
572 EXPECT_NE(nullptr, overrideBuffer1);
573 EXPECT_EQ(overrideBuffer1, overrideBuffer2);
574 EXPECT_EQ(nullptr, overrideBuffer3);
575}
576
577TEST_F(FlattenerTest, flattenLayers_pip) {
578 mTestLayers[0]->outputLayerCompositionState.displayFrame = Rect(0, 0, 5, 5);
579 auto& layerState1 = mTestLayers[0]->layerState;
580 const auto& overrideBuffer1 = layerState1->getOutputLayer()->getState().overrideInfo.buffer;
581
582 auto& layerState2 = mTestLayers[1]->layerState;
583 const auto& overrideBuffer2 = layerState2->getOutputLayer()->getState().overrideInfo.buffer;
584
585 auto& layerState3 = mTestLayers[2]->layerState;
586 const auto& overrideBuffer3 = layerState3->getOutputLayer()->getState().overrideInfo.buffer;
587
588 EXPECT_CALL(*mTestLayers[2]->layerFE, hasRoundedCorners()).WillRepeatedly(Return(true));
589
590 std::vector<LayerFE::LayerSettings> clientCompositionList = {
591 LayerFE::LayerSettings{},
592 };
593 clientCompositionList[0].source.buffer.buffer = std::make_shared<
594 renderengine::ExternalTexture>(mTestLayers[2]->layerFECompositionState.buffer,
595 mRenderEngine,
596 renderengine::ExternalTexture::Usage::READABLE);
597 EXPECT_CALL(*mTestLayers[2]->layerFE, prepareClientCompositionList(_))
598 .WillOnce(Return(clientCompositionList));
599
600 const std::vector<const LayerState*> layers = {
601 layerState1.get(),
602 layerState2.get(),
603 layerState3.get(),
604 };
605
606 initializeFlattener(layers);
607
608 // 3 has a buffer update, so it will not be merged, and it has round
609 // corners, so it is a PIP.
610 mTime += 200ms;
611 layerState3->resetFramesSinceBufferUpdate();
612
613 initializeOverrideBuffer(layers);
614 EXPECT_EQ(getNonBufferHash(layers),
615 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
616
617 // This will render a CachedSet.
618 EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).WillOnce(Return(NO_ERROR));
619 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
620
621 // We've rendered a CachedSet, but we haven't merged it in.
622 EXPECT_EQ(nullptr, overrideBuffer1);
623 EXPECT_EQ(nullptr, overrideBuffer2);
624 EXPECT_EQ(nullptr, overrideBuffer3);
625
626 // This time we merge the CachedSet in, so we have a new hash, and we should
627 // only have two sets.
628 EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).Times(0);
629 initializeOverrideBuffer(layers);
630 EXPECT_NE(getNonBufferHash(layers),
631 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
632 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
633
634 EXPECT_NE(nullptr, overrideBuffer1);
635 EXPECT_EQ(overrideBuffer1, overrideBuffer2);
636 EXPECT_EQ(nullptr, overrideBuffer3);
637
638 const auto* peekThroughLayer1 =
639 layerState1->getOutputLayer()->getState().overrideInfo.peekThroughLayer;
640 const auto* peekThroughLayer2 =
641 layerState2->getOutputLayer()->getState().overrideInfo.peekThroughLayer;
642 EXPECT_EQ(&mTestLayers[2]->outputLayer, peekThroughLayer1);
643 EXPECT_EQ(peekThroughLayer1, peekThroughLayer2);
644}
Alec Mouri97486062021-05-07 15:26:03 -0700645
646TEST_F(FlattenerTest, flattenLayers_flattensBlurBehindRunIfFirstRun) {
647 auto& layerState1 = mTestLayers[0]->layerState;
648
649 auto& layerState2 = mTestLayers[1]->layerState;
650 mTestLayers[1]->layerFECompositionState.backgroundBlurRadius = 1;
651 layerState2->update(&mTestLayers[1]->outputLayer);
652
653 auto& layerState3 = mTestLayers[2]->layerState;
654 const auto& overrideBuffer1 = layerState1->getOutputLayer()->getState().overrideInfo.buffer;
655 const auto& overrideBuffer2 = layerState2->getOutputLayer()->getState().overrideInfo.buffer;
656 const auto& overrideBuffer3 = layerState3->getOutputLayer()->getState().overrideInfo.buffer;
657
658 const std::vector<const LayerState*> layers = {
659 layerState1.get(),
660 layerState2.get(),
661 layerState3.get(),
662 };
663
664 initializeFlattener(layers);
665
666 // Mark the first two layers inactive, which contain the blur behind
667 mTime += 200ms;
668 layerState3->resetFramesSinceBufferUpdate();
669
670 // layers would be flattened but the buffer would not be overridden
671 EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).WillOnce(Return(NO_ERROR));
672
673 initializeOverrideBuffer(layers);
674 EXPECT_EQ(getNonBufferHash(layers),
675 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
676 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
677
678 for (const auto layer : layers) {
679 EXPECT_EQ(nullptr, layer->getOutputLayer()->getState().overrideInfo.buffer);
680 }
681
682 // the new flattened layer is replaced
683 initializeOverrideBuffer(layers);
684 EXPECT_NE(getNonBufferHash(layers),
685 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
686 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
687 EXPECT_NE(nullptr, overrideBuffer1);
688 EXPECT_EQ(overrideBuffer1, overrideBuffer2);
689 EXPECT_EQ(nullptr, overrideBuffer3);
690}
691
692TEST_F(FlattenerTest, flattenLayers_doesNotFlattenBlurBehindRun) {
693 auto& layerState1 = mTestLayers[0]->layerState;
694
695 auto& layerState2 = mTestLayers[1]->layerState;
696 mTestLayers[1]->layerFECompositionState.backgroundBlurRadius = 1;
697 layerState2->update(&mTestLayers[1]->outputLayer);
698
699 auto& layerState3 = mTestLayers[2]->layerState;
700
701 const std::vector<const LayerState*> layers = {
702 layerState1.get(),
703 layerState2.get(),
704 layerState3.get(),
705 };
706
707 initializeFlattener(layers);
708
709 // Mark the last two layers inactive, which contains the blur layer, but does not contain the
710 // first layer
711 mTime += 200ms;
712 layerState1->resetFramesSinceBufferUpdate();
713
714 // layers would be flattened but the buffer would not be overridden
715 EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).WillRepeatedly(Return(NO_ERROR));
716
717 initializeOverrideBuffer(layers);
718 EXPECT_EQ(getNonBufferHash(layers),
719 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
720 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
721
722 for (const auto layer : layers) {
723 EXPECT_EQ(nullptr, layer->getOutputLayer()->getState().overrideInfo.buffer);
724 }
725
726 // nothing is flattened because the last two frames cannot be cached due to containing a blur
727 // layer
728 initializeOverrideBuffer(layers);
729 EXPECT_EQ(getNonBufferHash(layers),
730 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
731 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
732 for (const auto layer : layers) {
733 EXPECT_EQ(nullptr, layer->getOutputLayer()->getState().overrideInfo.buffer);
734 }
735}
736
737TEST_F(FlattenerTest, flattenLayers_flattenSkipsLayerWithBlurBehind) {
738 auto& layerState1 = mTestLayers[0]->layerState;
739
740 auto& layerStateWithBlurBehind = mTestLayers[1]->layerState;
741 mTestLayers[1]->layerFECompositionState.backgroundBlurRadius = 1;
742 layerStateWithBlurBehind->update(&mTestLayers[1]->outputLayer);
743
744 auto& layerState3 = mTestLayers[2]->layerState;
745 auto& layerState4 = mTestLayers[3]->layerState;
746 const auto& overrideBuffer1 = layerState1->getOutputLayer()->getState().overrideInfo.buffer;
747 const auto& blurOverrideBuffer =
748 layerStateWithBlurBehind->getOutputLayer()->getState().overrideInfo.buffer;
749 const auto& overrideBuffer3 = layerState3->getOutputLayer()->getState().overrideInfo.buffer;
750 const auto& overrideBuffer4 = layerState4->getOutputLayer()->getState().overrideInfo.buffer;
751
752 const std::vector<const LayerState*> layers = {
753 layerState1.get(),
754 layerStateWithBlurBehind.get(),
755 layerState3.get(),
756 layerState4.get(),
757 };
758
759 initializeFlattener(layers);
760
761 // Mark the last three layers inactive, which contains the blur layer, but does not contain the
762 // first layer
763 mTime += 200ms;
764 layerState1->resetFramesSinceBufferUpdate();
765
766 // layers would be flattened but the buffer would not be overridden
767 EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).WillOnce(Return(NO_ERROR));
768
769 initializeOverrideBuffer(layers);
770 EXPECT_EQ(getNonBufferHash(layers),
771 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
772 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
773
774 for (const auto layer : layers) {
775 EXPECT_EQ(nullptr, layer->getOutputLayer()->getState().overrideInfo.buffer);
776 }
777
778 // the new flattened layer is replaced
779 initializeOverrideBuffer(layers);
780 EXPECT_NE(getNonBufferHash(layers),
781 mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime));
782 mFlattener->renderCachedSets(mRenderEngine, mOutputState);
783 EXPECT_EQ(nullptr, overrideBuffer1);
784 EXPECT_EQ(nullptr, blurOverrideBuffer);
785 EXPECT_NE(nullptr, overrideBuffer3);
786 EXPECT_EQ(overrideBuffer3, overrideBuffer4);
787}
788
Ady Abrahamb7db4102021-03-04 12:19:26 -0800789} // namespace
790} // namespace android::compositionengine