1 /*
2 * Copyright 2018 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 // TODO(b/129481165): remove the #pragma below and fix conversion issues
18 #pragma clang diagnostic push
19 #pragma clang diagnostic ignored "-Wconversion"
20 #pragma clang diagnostic ignored "-Wextra"
21
22 #undef LOG_TAG
23 #define LOG_TAG "CompositionTest"
24
25 #include <compositionengine/Display.h>
26 #include <compositionengine/mock/DisplaySurface.h>
27 #include <ftl/future.h>
28 #include <gmock/gmock.h>
29 #include <gtest/gtest.h>
30 #include <gui/IProducerListener.h>
31 #include <gui/LayerMetadata.h>
32 #include <log/log.h>
33 #include <renderengine/ExternalTexture.h>
34 #include <renderengine/mock/FakeExternalTexture.h>
35 #include <renderengine/mock/RenderEngine.h>
36 #include <system/window.h>
37 #include <utils/String8.h>
38
39 #include "DisplayRenderArea.h"
40 #include "Layer.h"
41 #include "TestableSurfaceFlinger.h"
42 #include "mock/DisplayHardware/MockComposer.h"
43 #include "mock/MockEventThread.h"
44 #include "mock/MockTimeStats.h"
45 #include "mock/MockVsyncController.h"
46 #include "mock/PowerAdvisor/MockPowerAdvisor.h"
47 #include "mock/system/window/MockNativeWindow.h"
48
49 namespace android {
50 namespace {
51
52 namespace hal = android::hardware::graphics::composer::hal;
53
54 using hal::Error;
55 using hal::IComposer;
56 using hal::IComposerClient;
57 using hal::PowerMode;
58 using hal::Transform;
59
60 using aidl::android::hardware::graphics::composer3::Capability;
61
62 using testing::_;
63 using testing::AtLeast;
64 using testing::DoAll;
65 using testing::IsNull;
66 using testing::Mock;
67 using testing::Return;
68 using testing::ReturnRef;
69 using testing::SetArgPointee;
70
71 using FakeHwcDisplayInjector = TestableSurfaceFlinger::FakeHwcDisplayInjector;
72 using FakeDisplayDeviceInjector = TestableSurfaceFlinger::FakeDisplayDeviceInjector;
73 using namespace ftl::flag_operators;
74
75 constexpr hal::HWDisplayId HWC_DISPLAY = FakeHwcDisplayInjector::DEFAULT_HWC_DISPLAY_ID;
76 constexpr hal::HWLayerId HWC_LAYER = 5000;
77 constexpr Transform DEFAULT_TRANSFORM = static_cast<Transform>(0);
78
79 constexpr PhysicalDisplayId DEFAULT_DISPLAY_ID = PhysicalDisplayId::fromPort(42u);
80 constexpr int DEFAULT_DISPLAY_WIDTH = 1920;
81 constexpr int DEFAULT_DISPLAY_HEIGHT = 1024;
82
83 constexpr int DEFAULT_TEXTURE_ID = 6000;
84 constexpr ui::LayerStack LAYER_STACK{7000u};
85
86 constexpr int DEFAULT_DISPLAY_MAX_LUMINANCE = 500;
87
88 constexpr int DEFAULT_SIDEBAND_STREAM = 51;
89
90 MATCHER(IsIdentityMatrix, "") {
91 constexpr auto kIdentity = mat4();
92 return (mat4(arg) == kIdentity);
93 }
94
95 class CompositionTest : public testing::Test {
96 public:
CompositionTest()97 CompositionTest() {
98 const ::testing::TestInfo* const test_info =
99 ::testing::UnitTest::GetInstance()->current_test_info();
100 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
101
102 mFlinger.setupMockScheduler({.displayId = DEFAULT_DISPLAY_ID});
103
104 EXPECT_CALL(*mNativeWindow, query(NATIVE_WINDOW_WIDTH, _))
105 .WillRepeatedly(DoAll(SetArgPointee<1>(DEFAULT_DISPLAY_WIDTH), Return(0)));
106 EXPECT_CALL(*mNativeWindow, query(NATIVE_WINDOW_HEIGHT, _))
107 .WillRepeatedly(DoAll(SetArgPointee<1>(DEFAULT_DISPLAY_HEIGHT), Return(0)));
108
109 mFlinger.setupRenderEngine(std::unique_ptr<renderengine::RenderEngine>(mRenderEngine));
110 mFlinger.setupTimeStats(std::shared_ptr<TimeStats>(mTimeStats));
111
112 mComposer = new Hwc2::mock::Composer();
113 mPowerAdvisor = new adpf::mock::PowerAdvisor();
114 mFlinger.setupComposer(std::unique_ptr<Hwc2::Composer>(mComposer));
115 mFlinger.setupPowerAdvisor(std::unique_ptr<adpf::PowerAdvisor>(mPowerAdvisor));
116 mFlinger.mutableMaxRenderTargetSize() = 16384;
117 }
118
~CompositionTest()119 ~CompositionTest() {
120 const ::testing::TestInfo* const test_info =
121 ::testing::UnitTest::GetInstance()->current_test_info();
122 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
123 }
124
setupForceGeometryDirty()125 void setupForceGeometryDirty() {
126 // TODO: This requires the visible region and other related
127 // state to be set, and is problematic for BufferLayers since they are
128 // not visible without a buffer (and setting up a buffer looks like a
129 // pain)
130 // mFlinger.mutableVisibleRegionsDirty() = true;
131
132 mFlinger.mutableGeometryDirty() = true;
133 }
134
135 template <typename Case>
136 void displayRefreshCompositionDirtyGeometry();
137
138 template <typename Case>
139 void displayRefreshCompositionDirtyFrame();
140
141 template <typename Case>
142 void captureScreenComposition();
143
144 std::unordered_set<Capability> mDefaultCapabilities = {Capability::SIDEBAND_STREAM};
145
146 bool mDisplayOff = false;
147 TestableSurfaceFlinger mFlinger;
148 sp<DisplayDevice> mDisplay;
149 sp<compositionengine::mock::DisplaySurface> mDisplaySurface =
150 sp<compositionengine::mock::DisplaySurface>::make();
151 sp<mock::NativeWindow> mNativeWindow = sp<mock::NativeWindow>::make();
152
153 sp<GraphicBuffer> mBuffer =
154 sp<GraphicBuffer>::make(1u, 1u, PIXEL_FORMAT_RGBA_8888,
155 GRALLOC_USAGE_SW_WRITE_OFTEN | GRALLOC_USAGE_SW_READ_OFTEN);
156 ANativeWindowBuffer* mNativeWindowBuffer = mBuffer->getNativeBuffer();
157
158 Hwc2::mock::Composer* mComposer = nullptr;
159 renderengine::mock::RenderEngine* mRenderEngine = new renderengine::mock::RenderEngine();
160 mock::TimeStats* mTimeStats = new mock::TimeStats();
161 adpf::mock::PowerAdvisor* mPowerAdvisor = nullptr;
162
163 sp<Fence> mClientTargetAcquireFence = Fence::NO_FENCE;
164
165 std::shared_ptr<renderengine::ExternalTexture> mCaptureScreenBuffer;
166 };
167
168 template <typename LayerCase>
displayRefreshCompositionDirtyGeometry()169 void CompositionTest::displayRefreshCompositionDirtyGeometry() {
170 setupForceGeometryDirty();
171 LayerCase::setupForDirtyGeometry(this);
172
173 // --------------------------------------------------------------------
174 // Invocation
175
176 mFlinger.commitAndComposite();
177
178 LayerCase::cleanup(this);
179 }
180
181 template <typename LayerCase>
displayRefreshCompositionDirtyFrame()182 void CompositionTest::displayRefreshCompositionDirtyFrame() {
183 LayerCase::setupForDirtyFrame(this);
184
185 // --------------------------------------------------------------------
186 // Invocation
187
188 mFlinger.commitAndComposite();
189
190 LayerCase::cleanup(this);
191 }
192
193 template <typename LayerCase>
captureScreenComposition()194 void CompositionTest::captureScreenComposition() {
195 LayerCase::setupForScreenCapture(this);
196 mFlinger.commit();
197
198 const Rect sourceCrop(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
199 constexpr bool regionSampling = false;
200
201 auto renderArea =
202 DisplayRenderArea::create(mDisplay, sourceCrop, sourceCrop.getSize(),
203 ui::Dataspace::V0_SRGB,
204 RenderArea::Options::CAPTURE_SECURE_LAYERS |
205 RenderArea::Options::HINT_FOR_SEAMLESS_TRANSITION);
206
207 auto getLayerSnapshotsFn = mFlinger.getLayerSnapshotsForScreenshotsFn(mDisplay->getLayerStack(),
208 CaptureArgs::UNSET_UID);
209
210 const uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
211 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
212 mCaptureScreenBuffer =
213 std::make_shared<renderengine::mock::FakeExternalTexture>(renderArea->getReqWidth(),
214 renderArea->getReqHeight(),
215 HAL_PIXEL_FORMAT_RGBA_8888, 1,
216 usage);
217
218 auto future = mFlinger.renderScreenImpl(mDisplay, std::move(renderArea), getLayerSnapshotsFn,
219 mCaptureScreenBuffer, regionSampling);
220 ASSERT_TRUE(future.valid());
221 const auto fenceResult = future.get();
222
223 EXPECT_EQ(NO_ERROR, fenceStatus(fenceResult));
224 if (fenceResult.ok()) {
225 fenceResult.value()->waitForever(LOG_TAG);
226 }
227
228 LayerCase::cleanup(this);
229 }
230
231 /* ------------------------------------------------------------------------
232 * Variants for each display configuration which can be tested
233 */
234
235 template <typename Derived>
236 struct BaseDisplayVariant {
237 static constexpr bool IS_SECURE = true;
238 static constexpr hal::PowerMode INIT_POWER_MODE = hal::PowerMode::ON;
239
setupPreconditionsandroid::__anone39d41f60111::BaseDisplayVariant240 static void setupPreconditions(CompositionTest* test) {
241 EXPECT_CALL(*test->mComposer, setPowerMode(HWC_DISPLAY, Derived::INIT_POWER_MODE))
242 .WillOnce(Return(Error::NONE));
243
244 FakeHwcDisplayInjector(DEFAULT_DISPLAY_ID, hal::DisplayType::PHYSICAL, true /* isPrimary */)
245 .setCapabilities(&test->mDefaultCapabilities)
246 .setPowerMode(Derived::INIT_POWER_MODE)
247 .inject(&test->mFlinger, test->mComposer);
248 Mock::VerifyAndClear(test->mComposer);
249
250 EXPECT_CALL(*test->mNativeWindow, query(NATIVE_WINDOW_WIDTH, _))
251 .WillRepeatedly(DoAll(SetArgPointee<1>(DEFAULT_DISPLAY_WIDTH), Return(0)));
252 EXPECT_CALL(*test->mNativeWindow, query(NATIVE_WINDOW_HEIGHT, _))
253 .WillRepeatedly(DoAll(SetArgPointee<1>(DEFAULT_DISPLAY_HEIGHT), Return(0)));
254 EXPECT_CALL(*test->mNativeWindow, perform(NATIVE_WINDOW_SET_BUFFERS_FORMAT)).Times(1);
255 EXPECT_CALL(*test->mNativeWindow, perform(NATIVE_WINDOW_API_CONNECT)).Times(1);
256 EXPECT_CALL(*test->mNativeWindow, perform(NATIVE_WINDOW_SET_USAGE64)).Times(1);
257
258 const ::testing::TestInfo* const test_info =
259 ::testing::UnitTest::GetInstance()->current_test_info();
260
261 auto ceDisplayArgs = compositionengine::DisplayCreationArgsBuilder()
262 .setId(DEFAULT_DISPLAY_ID)
263 .setPixels({DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT})
264 .setIsSecure(Derived::IS_SECURE)
265 .setPowerAdvisor(test->mPowerAdvisor)
266 .setName(std::string("Injected display for ") +
267 test_info->test_case_name() + "." + test_info->name())
268 .build();
269
270 auto compositionDisplay =
271 compositionengine::impl::createDisplay(test->mFlinger.getCompositionEngine(),
272 ceDisplayArgs);
273
274 constexpr auto kDisplayConnectionType = ui::DisplayConnectionType::Internal;
275 constexpr bool kIsPrimary = true;
276
277 test->mDisplay =
278 FakeDisplayDeviceInjector(test->mFlinger, compositionDisplay,
279 kDisplayConnectionType, HWC_DISPLAY, kIsPrimary)
280 .setDisplaySurface(test->mDisplaySurface)
281 .setNativeWindow(test->mNativeWindow)
282 .setSecure(Derived::IS_SECURE)
283 .setPowerMode(Derived::INIT_POWER_MODE)
284 .setRefreshRateSelector(test->mFlinger.scheduler()->refreshRateSelector())
285 .skipSchedulerRegistration()
286 .inject();
287 Mock::VerifyAndClear(test->mNativeWindow.get());
288
289 constexpr bool kIsInternal = kDisplayConnectionType == ui::DisplayConnectionType::Internal;
290 test->mDisplay->setLayerFilter({LAYER_STACK, kIsInternal});
291 }
292
293 template <typename Case>
setupPreconditionCallExpectationsandroid::__anone39d41f60111::BaseDisplayVariant294 static void setupPreconditionCallExpectations(CompositionTest* test) {
295 EXPECT_CALL(*test->mComposer, getDisplayCapabilities(HWC_DISPLAY, _))
296 .WillOnce(DoAll(SetArgPointee<1>(
297 std::vector<aidl::android::hardware::graphics::composer3::
298 DisplayCapability>({})),
299 Return(Error::NONE)));
300 }
301
302 template <typename Case>
setupCommonCompositionCallExpectationsandroid::__anone39d41f60111::BaseDisplayVariant303 static void setupCommonCompositionCallExpectations(CompositionTest* test) {
304 EXPECT_CALL(*test->mComposer, setColorTransform(HWC_DISPLAY, IsIdentityMatrix())).Times(1);
305 EXPECT_CALL(*test->mComposer, getDisplayRequests(HWC_DISPLAY, _, _, _)).Times(1);
306 EXPECT_CALL(*test->mComposer, acceptDisplayChanges(HWC_DISPLAY)).Times(1);
307 EXPECT_CALL(*test->mComposer, presentDisplay(HWC_DISPLAY, _)).Times(1);
308 EXPECT_CALL(*test->mComposer, getReleaseFences(HWC_DISPLAY, _, _)).Times(1);
309
310 EXPECT_CALL(*test->mDisplaySurface, onFrameCommitted()).Times(1);
311 EXPECT_CALL(*test->mDisplaySurface, advanceFrame(_)).Times(1);
312
313 Case::CompositionType::setupHwcSetCallExpectations(test);
314 Case::CompositionType::setupHwcGetCallExpectations(test);
315 }
316
317 template <typename Case>
setupCommonScreensCaptureCallExpectationsandroid::__anone39d41f60111::BaseDisplayVariant318 static void setupCommonScreensCaptureCallExpectations(CompositionTest* test) {
319 EXPECT_CALL(*test->mRenderEngine, drawLayers)
320 .WillRepeatedly([&](const renderengine::DisplaySettings& displaySettings,
321 const std::vector<renderengine::LayerSettings>&,
322 const std::shared_ptr<renderengine::ExternalTexture>&,
323 base::unique_fd&&) -> ftl::Future<FenceResult> {
324 EXPECT_EQ(DEFAULT_DISPLAY_MAX_LUMINANCE, displaySettings.maxLuminance);
325 EXPECT_EQ(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
326 displaySettings.physicalDisplay);
327 EXPECT_EQ(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
328 displaySettings.clip);
329 return ftl::yield<FenceResult>(Fence::NO_FENCE);
330 });
331 }
332
setupNonEmptyFrameCompositionCallExpectationsandroid::__anone39d41f60111::BaseDisplayVariant333 static void setupNonEmptyFrameCompositionCallExpectations(CompositionTest* test) {
334 EXPECT_CALL(*test->mDisplaySurface, beginFrame(true)).Times(1);
335 }
336
setupEmptyFrameCompositionCallExpectationsandroid::__anone39d41f60111::BaseDisplayVariant337 static void setupEmptyFrameCompositionCallExpectations(CompositionTest* test) {
338 EXPECT_CALL(*test->mDisplaySurface, beginFrame(false)).Times(1);
339 }
340
setupHwcCompositionCallExpectationsandroid::__anone39d41f60111::BaseDisplayVariant341 static void setupHwcCompositionCallExpectations(CompositionTest* test) {
342 EXPECT_CALL(*test->mComposer, presentOrValidateDisplay(HWC_DISPLAY, _, _, _, _, _, _))
343 .Times(1);
344
345 EXPECT_CALL(*test->mDisplaySurface,
346 prepareFrame(compositionengine::DisplaySurface::CompositionType::Hwc))
347 .Times(1);
348 }
349
setupHwcClientCompositionCallExpectationsandroid::__anone39d41f60111::BaseDisplayVariant350 static void setupHwcClientCompositionCallExpectations(CompositionTest* test) {
351 EXPECT_CALL(*test->mComposer, presentOrValidateDisplay(HWC_DISPLAY, _, _, _, _, _, _))
352 .Times(1);
353 }
354
setupHwcForcedClientCompositionCallExpectationsandroid::__anone39d41f60111::BaseDisplayVariant355 static void setupHwcForcedClientCompositionCallExpectations(CompositionTest* test) {
356 EXPECT_CALL(*test->mComposer, validateDisplay(HWC_DISPLAY, _, _, _, _)).Times(1);
357 }
358
setupRECompositionCallExpectationsandroid::__anone39d41f60111::BaseDisplayVariant359 static void setupRECompositionCallExpectations(CompositionTest* test) {
360 EXPECT_CALL(*test->mDisplaySurface,
361 prepareFrame(compositionengine::DisplaySurface::CompositionType::Gpu))
362 .Times(1);
363 EXPECT_CALL(*test->mDisplaySurface, getClientTargetAcquireFence())
364 .WillRepeatedly(ReturnRef(test->mClientTargetAcquireFence));
365
366 EXPECT_CALL(*test->mNativeWindow, queueBuffer(_, _)).WillOnce(Return(0));
367 EXPECT_CALL(*test->mNativeWindow, dequeueBuffer(_, _))
368 .WillOnce(DoAll(SetArgPointee<0>(test->mNativeWindowBuffer), SetArgPointee<1>(-1),
369 Return(0)));
370 EXPECT_CALL(*test->mRenderEngine, drawLayers)
371 .WillRepeatedly([&](const renderengine::DisplaySettings& displaySettings,
372 const std::vector<renderengine::LayerSettings>&,
373 const std::shared_ptr<renderengine::ExternalTexture>&,
374 base::unique_fd&&) -> ftl::Future<FenceResult> {
375 EXPECT_EQ(DEFAULT_DISPLAY_MAX_LUMINANCE, displaySettings.maxLuminance);
376 EXPECT_EQ(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
377 displaySettings.physicalDisplay);
378 EXPECT_EQ(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
379 displaySettings.clip);
380 EXPECT_EQ(ui::Dataspace::UNKNOWN, displaySettings.outputDataspace);
381 return ftl::yield<FenceResult>(Fence::NO_FENCE);
382 });
383 }
384
385 template <typename Case>
setupRELayerCompositionCallExpectationsandroid::__anone39d41f60111::BaseDisplayVariant386 static void setupRELayerCompositionCallExpectations(CompositionTest* test) {
387 Case::Layer::setupRECompositionCallExpectations(test);
388 }
389
390 template <typename Case>
setupRELayerScreenshotCompositionCallExpectationsandroid::__anone39d41f60111::BaseDisplayVariant391 static void setupRELayerScreenshotCompositionCallExpectations(CompositionTest* test) {
392 Case::Layer::setupREScreenshotCompositionCallExpectations(test);
393 }
394 };
395
396 struct DefaultDisplaySetupVariant : public BaseDisplayVariant<DefaultDisplaySetupVariant> {};
397
398 struct InsecureDisplaySetupVariant : public BaseDisplayVariant<InsecureDisplaySetupVariant> {
399 static constexpr bool IS_SECURE = false;
400
401 template <typename Case>
setupRELayerCompositionCallExpectationsandroid::__anone39d41f60111::InsecureDisplaySetupVariant402 static void setupRELayerCompositionCallExpectations(CompositionTest* test) {
403 Case::Layer::setupInsecureRECompositionCallExpectations(test);
404 }
405
406 template <typename Case>
setupRELayerScreenshotCompositionCallExpectationsandroid::__anone39d41f60111::InsecureDisplaySetupVariant407 static void setupRELayerScreenshotCompositionCallExpectations(CompositionTest* test) {
408 Case::Layer::setupInsecureREScreenshotCompositionCallExpectations(test);
409 }
410 };
411
412 struct PoweredOffDisplaySetupVariant : public BaseDisplayVariant<PoweredOffDisplaySetupVariant> {
413 static constexpr hal::PowerMode INIT_POWER_MODE = hal::PowerMode::OFF;
414
415 template <typename Case>
setupPreconditionCallExpectationsandroid::__anone39d41f60111::PoweredOffDisplaySetupVariant416 static void setupPreconditionCallExpectations(CompositionTest*) {}
417
418 template <typename Case>
setupCommonCompositionCallExpectationsandroid::__anone39d41f60111::PoweredOffDisplaySetupVariant419 static void setupCommonCompositionCallExpectations(CompositionTest* test) {
420 // TODO: This seems like an unnecessary call if display is powered off.
421 EXPECT_CALL(*test->mComposer, setColorTransform(HWC_DISPLAY, IsIdentityMatrix())).Times(1);
422
423 // TODO: This seems like an unnecessary call if display is powered off.
424 Case::CompositionType::setupHwcSetCallExpectations(test);
425 }
426
setupHwcCompositionCallExpectationsandroid::__anone39d41f60111::PoweredOffDisplaySetupVariant427 static void setupHwcCompositionCallExpectations(CompositionTest*) {}
setupHwcClientCompositionCallExpectationsandroid::__anone39d41f60111::PoweredOffDisplaySetupVariant428 static void setupHwcClientCompositionCallExpectations(CompositionTest*) {}
setupHwcForcedClientCompositionCallExpectationsandroid::__anone39d41f60111::PoweredOffDisplaySetupVariant429 static void setupHwcForcedClientCompositionCallExpectations(CompositionTest*) {}
430
setupRECompositionCallExpectationsandroid::__anone39d41f60111::PoweredOffDisplaySetupVariant431 static void setupRECompositionCallExpectations(CompositionTest* test) {
432 // TODO: This seems like an unnecessary call if display is powered off.
433 EXPECT_CALL(*test->mDisplaySurface, getClientTargetAcquireFence())
434 .WillRepeatedly(ReturnRef(test->mClientTargetAcquireFence));
435 }
436
437 template <typename Case>
setupRELayerCompositionCallExpectationsandroid::__anone39d41f60111::PoweredOffDisplaySetupVariant438 static void setupRELayerCompositionCallExpectations(CompositionTest*) {}
439 };
440
441 /* ------------------------------------------------------------------------
442 * Variants for each layer configuration which can be tested
443 */
444
445 template <typename LayerProperties>
446 struct BaseLayerProperties {
447 static constexpr uint32_t WIDTH = 100;
448 static constexpr uint32_t HEIGHT = 100;
449 static constexpr PixelFormat FORMAT = PIXEL_FORMAT_RGBA_8888;
450 static constexpr uint64_t USAGE =
451 GraphicBuffer::USAGE_SW_READ_NEVER | GraphicBuffer::USAGE_SW_WRITE_NEVER;
452 static constexpr android_dataspace DATASPACE = HAL_DATASPACE_UNKNOWN;
453 static constexpr uint32_t SCALING_MODE = 0;
454 static constexpr uint32_t TRANSFORM = 0;
455 static constexpr uint32_t LAYER_FLAGS = 0;
456 static constexpr float COLOR[] = {1.f, 1.f, 1.f, 1.f};
457 static constexpr IComposerClient::BlendMode BLENDMODE =
458 IComposerClient::BlendMode::PREMULTIPLIED;
459
setupLatchedBufferandroid::__anone39d41f60111::BaseLayerProperties460 static void setupLatchedBuffer(CompositionTest* test, frontend::RequestedLayerState& layer) {
461 Mock::VerifyAndClear(test->mRenderEngine);
462
463 const auto buffer = std::make_shared<
464 renderengine::mock::FakeExternalTexture>(LayerProperties::WIDTH,
465 LayerProperties::HEIGHT,
466 DEFAULT_TEXTURE_ID,
467 LayerProperties::FORMAT,
468 LayerProperties::USAGE |
469 GraphicBuffer::USAGE_HW_TEXTURE);
470 layer.crop = FloatRect(0, 0, LayerProperties::HEIGHT, LayerProperties::WIDTH);
471 layer.externalTexture = buffer;
472 layer.bufferData->acquireFence = Fence::NO_FENCE;
473 layer.dataspace = ui::Dataspace::UNKNOWN;
474 layer.surfaceDamageRegion = Region(Rect(LayerProperties::HEIGHT, LayerProperties::WIDTH));
475 Mock::VerifyAndClear(test->mRenderEngine);
476 }
477
setupLayerStateandroid::__anone39d41f60111::BaseLayerProperties478 static void setupLayerState(CompositionTest* test, frontend::RequestedLayerState& layer) {
479 setupLatchedBuffer(test, layer);
480 }
481
setupHwcSetGeometryCallExpectationsandroid::__anone39d41f60111::BaseLayerProperties482 static void setupHwcSetGeometryCallExpectations(CompositionTest* test) {
483 if (!test->mDisplayOff) {
484 // TODO: Coverage of other values
485 EXPECT_CALL(*test->mComposer,
486 setLayerBlendMode(HWC_DISPLAY, HWC_LAYER, LayerProperties::BLENDMODE))
487 .Times(1);
488 // TODO: Coverage of other values for origin
489 EXPECT_CALL(*test->mComposer,
490 setLayerDisplayFrame(HWC_DISPLAY, HWC_LAYER,
491 IComposerClient::Rect({0, 0, LayerProperties::WIDTH,
492 LayerProperties::HEIGHT})))
493 .Times(1);
494 EXPECT_CALL(*test->mComposer,
495 setLayerPlaneAlpha(HWC_DISPLAY, HWC_LAYER, LayerProperties::COLOR[3]))
496 .Times(1);
497 // TODO: Coverage of other values
498 EXPECT_CALL(*test->mComposer, setLayerZOrder(HWC_DISPLAY, HWC_LAYER, 0u)).Times(1);
499
500 // These expectations retire on saturation as the code path these
501 // expectations are for appears to make an extra call to them.
502 // TODO: Investigate this extra call
503 EXPECT_CALL(*test->mComposer,
504 setLayerTransform(HWC_DISPLAY, HWC_LAYER, DEFAULT_TRANSFORM))
505 .Times(AtLeast(1))
506 .RetiresOnSaturation();
507 }
508 }
509
setupHwcSetSourceCropBufferCallExpectationsandroid::__anone39d41f60111::BaseLayerProperties510 static void setupHwcSetSourceCropBufferCallExpectations(CompositionTest* test) {
511 if (!test->mDisplayOff) {
512 EXPECT_CALL(*test->mComposer,
513 setLayerSourceCrop(HWC_DISPLAY, HWC_LAYER,
514 IComposerClient::FRect({0.f, 0.f, LayerProperties::WIDTH,
515 LayerProperties::HEIGHT})))
516 .Times(1);
517 }
518 }
519
setupHwcSetSourceCropColorCallExpectationsandroid::__anone39d41f60111::BaseLayerProperties520 static void setupHwcSetSourceCropColorCallExpectations(CompositionTest* test) {
521 if (!test->mDisplayOff) {
522 EXPECT_CALL(*test->mComposer,
523 setLayerSourceCrop(HWC_DISPLAY, HWC_LAYER,
524 IComposerClient::FRect({0.f, 0.f, 0.f, 0.f})))
525 .Times(1);
526 }
527 }
528
setupHwcSetPerFrameCallExpectationsandroid::__anone39d41f60111::BaseLayerProperties529 static void setupHwcSetPerFrameCallExpectations(CompositionTest* test) {
530 if (!test->mDisplayOff) {
531 EXPECT_CALL(*test->mComposer,
532 setLayerVisibleRegion(HWC_DISPLAY, HWC_LAYER,
533 std::vector<IComposerClient::Rect>(
534 {IComposerClient::Rect(
535 {0, 0, LayerProperties::WIDTH,
536 LayerProperties::HEIGHT})})))
537 .Times(1);
538 }
539 }
540
setupHwcSetPerFrameColorCallExpectationsandroid::__anone39d41f60111::BaseLayerProperties541 static void setupHwcSetPerFrameColorCallExpectations(CompositionTest* test) {
542 if (!test->mDisplayOff) {
543 EXPECT_CALL(*test->mComposer, setLayerSurfaceDamage(HWC_DISPLAY, HWC_LAYER, _))
544 .Times(1);
545
546 // TODO: use COLOR
547 EXPECT_CALL(*test->mComposer,
548 setLayerColor(HWC_DISPLAY, HWC_LAYER,
549 aidl::android::hardware::graphics::composer3::Color(
550 {1.0f, 1.0f, 1.0f, 1.0f})))
551 .Times(1);
552 }
553 }
554
setupHwcSetPerFrameBufferCallExpectationsandroid::__anone39d41f60111::BaseLayerProperties555 static void setupHwcSetPerFrameBufferCallExpectations(CompositionTest* test) {
556 if (!test->mDisplayOff) {
557 EXPECT_CALL(*test->mComposer, setLayerSurfaceDamage(HWC_DISPLAY, HWC_LAYER, _))
558 .Times(1);
559 EXPECT_CALL(*test->mComposer, setLayerBuffer(HWC_DISPLAY, HWC_LAYER, _, _, _)).Times(1);
560 }
561 }
562
setupREBufferCompositionCommonCallExpectationsandroid::__anone39d41f60111::BaseLayerProperties563 static void setupREBufferCompositionCommonCallExpectations(CompositionTest* test) {
564 EXPECT_CALL(*test->mRenderEngine, drawLayers)
565 .WillOnce([&](const renderengine::DisplaySettings& displaySettings,
566 const std::vector<renderengine::LayerSettings>& layerSettings,
567 const std::shared_ptr<renderengine::ExternalTexture>&,
568 base::unique_fd&&) -> ftl::Future<FenceResult> {
569 EXPECT_EQ(DEFAULT_DISPLAY_MAX_LUMINANCE, displaySettings.maxLuminance);
570 EXPECT_EQ(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
571 displaySettings.physicalDisplay);
572 EXPECT_EQ(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
573 displaySettings.clip);
574 // screen capture adds an additional color layer as an alpha
575 // prefill, so gtet the back layer.
576 ftl::Future<FenceResult> resultFuture =
577 ftl::yield<FenceResult>(Fence::NO_FENCE);
578 if (layerSettings.empty()) {
579 ADD_FAILURE() << "layerSettings was not expected to be empty in "
580 "setupREBufferCompositionCommonCallExpectations "
581 "verification lambda";
582 return resultFuture;
583 }
584 const renderengine::LayerSettings layer = layerSettings.back();
585 EXPECT_THAT(layer.source.buffer.buffer, Not(IsNull()));
586 EXPECT_THAT(layer.source.buffer.fence, Not(IsNull()));
587 EXPECT_EQ(true, layer.source.buffer.usePremultipliedAlpha);
588 EXPECT_EQ(false, layer.source.buffer.isOpaque);
589 EXPECT_EQ(0.0, layer.geometry.roundedCornersRadius.x);
590 EXPECT_EQ(0.0, layer.geometry.roundedCornersRadius.y);
591 EXPECT_EQ(ui::Dataspace::V0_SRGB, layer.sourceDataspace);
592 EXPECT_EQ(LayerProperties::COLOR[3], layer.alpha);
593 return resultFuture;
594 });
595 }
596
setupREBufferCompositionCallExpectationsandroid::__anone39d41f60111::BaseLayerProperties597 static void setupREBufferCompositionCallExpectations(CompositionTest* test) {
598 LayerProperties::setupREBufferCompositionCommonCallExpectations(test);
599 }
600
setupInsecureREBufferCompositionCallExpectationsandroid::__anone39d41f60111::BaseLayerProperties601 static void setupInsecureREBufferCompositionCallExpectations(CompositionTest* test) {
602 setupREBufferCompositionCallExpectations(test);
603 }
604
setupREBufferScreenshotCompositionCallExpectationsandroid::__anone39d41f60111::BaseLayerProperties605 static void setupREBufferScreenshotCompositionCallExpectations(CompositionTest* test) {
606 LayerProperties::setupREBufferCompositionCommonCallExpectations(test);
607 }
608
setupInsecureREBufferScreenshotCompositionCallExpectationsandroid::__anone39d41f60111::BaseLayerProperties609 static void setupInsecureREBufferScreenshotCompositionCallExpectations(CompositionTest* test) {
610 LayerProperties::setupREBufferCompositionCommonCallExpectations(test);
611 }
612
setupREColorCompositionCallExpectationsandroid::__anone39d41f60111::BaseLayerProperties613 static void setupREColorCompositionCallExpectations(CompositionTest* test) {
614 EXPECT_CALL(*test->mRenderEngine, drawLayers)
615 .WillOnce([&](const renderengine::DisplaySettings& displaySettings,
616 const std::vector<renderengine::LayerSettings>& layerSettings,
617 const std::shared_ptr<renderengine::ExternalTexture>&,
618 base::unique_fd&&) -> ftl::Future<FenceResult> {
619 EXPECT_EQ(DEFAULT_DISPLAY_MAX_LUMINANCE, displaySettings.maxLuminance);
620 EXPECT_EQ(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
621 displaySettings.physicalDisplay);
622 EXPECT_EQ(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
623 displaySettings.clip);
624 // screen capture adds an additional color layer as an alpha
625 // prefill, so get the back layer.
626 ftl::Future<FenceResult> resultFuture =
627 ftl::yield<FenceResult>(Fence::NO_FENCE);
628 if (layerSettings.empty()) {
629 ADD_FAILURE()
630 << "layerSettings was not expected to be empty in "
631 "setupREColorCompositionCallExpectations verification lambda";
632 return resultFuture;
633 }
634 const renderengine::LayerSettings layer = layerSettings.back();
635 EXPECT_THAT(layer.source.buffer.buffer, IsNull());
636 EXPECT_EQ(half3(LayerProperties::COLOR[0], LayerProperties::COLOR[1],
637 LayerProperties::COLOR[2]),
638 layer.source.solidColor);
639 EXPECT_EQ(0.0, layer.geometry.roundedCornersRadius.x);
640 EXPECT_EQ(0.0, layer.geometry.roundedCornersRadius.y);
641 EXPECT_EQ(ui::Dataspace::V0_SRGB, layer.sourceDataspace);
642 EXPECT_EQ(LayerProperties::COLOR[3], layer.alpha);
643 return resultFuture;
644 });
645 }
646
setupREColorScreenshotCompositionCallExpectationsandroid::__anone39d41f60111::BaseLayerProperties647 static void setupREColorScreenshotCompositionCallExpectations(CompositionTest* test) {
648 setupREColorCompositionCallExpectations(test);
649 }
650 };
651
652 struct DefaultLayerProperties : public BaseLayerProperties<DefaultLayerProperties> {};
653
654 struct EffectLayerProperties : public BaseLayerProperties<EffectLayerProperties> {
655 static constexpr IComposerClient::BlendMode BLENDMODE = IComposerClient::BlendMode::NONE;
656 };
657
658 struct SidebandLayerProperties : public BaseLayerProperties<SidebandLayerProperties> {
659 using Base = BaseLayerProperties<SidebandLayerProperties>;
660 static constexpr IComposerClient::BlendMode BLENDMODE = IComposerClient::BlendMode::NONE;
661
setupLayerStateandroid::__anone39d41f60111::SidebandLayerProperties662 static void setupLayerState(CompositionTest* test, frontend::RequestedLayerState& layer) {
663 sp<NativeHandle> stream =
664 NativeHandle::create(reinterpret_cast<native_handle_t*>(DEFAULT_SIDEBAND_STREAM),
665 false);
666 layer.sidebandStream = stream;
667 layer.crop =
668 FloatRect(0, 0, SidebandLayerProperties::HEIGHT, SidebandLayerProperties::WIDTH);
669 }
670
setupHwcSetSourceCropBufferCallExpectationsandroid::__anone39d41f60111::SidebandLayerProperties671 static void setupHwcSetSourceCropBufferCallExpectations(CompositionTest* test) {
672 EXPECT_CALL(*test->mComposer,
673 setLayerSourceCrop(HWC_DISPLAY, HWC_LAYER,
674 IComposerClient::FRect({0.f, 0.f, -1.f, -1.f})))
675 .Times(1);
676 }
677
setupHwcSetPerFrameBufferCallExpectationsandroid::__anone39d41f60111::SidebandLayerProperties678 static void setupHwcSetPerFrameBufferCallExpectations(CompositionTest* test) {
679 EXPECT_CALL(*test->mComposer,
680 setLayerSidebandStream(HWC_DISPLAY, HWC_LAYER,
681 reinterpret_cast<native_handle_t*>(
682 DEFAULT_SIDEBAND_STREAM)))
683 .WillOnce(Return(Error::NONE));
684
685 EXPECT_CALL(*test->mComposer, setLayerSurfaceDamage(HWC_DISPLAY, HWC_LAYER, _)).Times(1);
686 }
687
setupREBufferCompositionCommonCallExpectationsandroid::__anone39d41f60111::SidebandLayerProperties688 static void setupREBufferCompositionCommonCallExpectations(CompositionTest* /*test*/) {}
689 };
690
691 template <typename LayerProperties>
692 struct CommonSecureLayerProperties : public BaseLayerProperties<LayerProperties> {
693 using Base = BaseLayerProperties<LayerProperties>;
694
setupInsecureREBufferCompositionCommonCallExpectationsandroid::__anone39d41f60111::CommonSecureLayerProperties695 static void setupInsecureREBufferCompositionCommonCallExpectations(CompositionTest* test) {
696 EXPECT_CALL(*test->mRenderEngine, drawLayers)
697 .WillOnce([&](const renderengine::DisplaySettings& displaySettings,
698 const std::vector<renderengine::LayerSettings>& layerSettings,
699 const std::shared_ptr<renderengine::ExternalTexture>&,
700 base::unique_fd&&) -> ftl::Future<FenceResult> {
701 EXPECT_EQ(DEFAULT_DISPLAY_MAX_LUMINANCE, displaySettings.maxLuminance);
702 EXPECT_EQ(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
703 displaySettings.physicalDisplay);
704 EXPECT_EQ(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
705 displaySettings.clip);
706 // screen capture adds an additional color layer as an alpha
707 // prefill, so get the back layer.
708 ftl::Future<FenceResult> resultFuture =
709 ftl::yield<FenceResult>(Fence::NO_FENCE);
710 if (layerSettings.empty()) {
711 ADD_FAILURE() << "layerSettings was not expected to be empty in "
712 "setupInsecureREBufferCompositionCommonCallExpectations "
713 "verification lambda";
714 return resultFuture;
715 }
716 const renderengine::LayerSettings layer = layerSettings.back();
717 EXPECT_THAT(layer.source.buffer.buffer, IsNull());
718 EXPECT_EQ(half3(0.0f, 0.0f, 0.0f), layer.source.solidColor);
719 EXPECT_EQ(0.0, layer.geometry.roundedCornersRadius.x);
720 EXPECT_EQ(0.0, layer.geometry.roundedCornersRadius.y);
721 EXPECT_EQ(ui::Dataspace::V0_SRGB, layer.sourceDataspace);
722 EXPECT_EQ(1.0f, layer.alpha);
723 return resultFuture;
724 });
725 }
726
setupInsecureREBufferCompositionCallExpectationsandroid::__anone39d41f60111::CommonSecureLayerProperties727 static void setupInsecureREBufferCompositionCallExpectations(CompositionTest* test) {
728 setupInsecureREBufferCompositionCommonCallExpectations(test);
729 }
730
setupInsecureREBufferScreenshotCompositionCallExpectationsandroid::__anone39d41f60111::CommonSecureLayerProperties731 static void setupInsecureREBufferScreenshotCompositionCallExpectations(CompositionTest* test) {
732 setupInsecureREBufferCompositionCommonCallExpectations(test);
733 }
734 };
735
736 struct ParentSecureLayerProperties
737 : public CommonSecureLayerProperties<ParentSecureLayerProperties> {};
738
739 struct SecureLayerProperties : public CommonSecureLayerProperties<SecureLayerProperties> {
740 static constexpr uint32_t LAYER_FLAGS = ISurfaceComposerClient::eSecure;
741 };
742
743 struct CursorLayerProperties : public BaseLayerProperties<CursorLayerProperties> {
744 using Base = BaseLayerProperties<CursorLayerProperties>;
745
setupLayerStateandroid::__anone39d41f60111::CursorLayerProperties746 static void setupLayerState(CompositionTest* test, frontend::RequestedLayerState& layer) {
747 Base::setupLayerState(test, layer);
748 layer.potentialCursor = true;
749 }
750 };
751
752 struct NoLayerVariant {
createLayerandroid::__anone39d41f60111::NoLayerVariant753 static frontend::RequestedLayerState createLayer(CompositionTest*) {
754 return {LayerCreationArgs()};
755 }
injectLayerandroid::__anone39d41f60111::NoLayerVariant756 static void injectLayer(CompositionTest*, frontend::RequestedLayerState&) {}
cleanupInjectedLayersandroid::__anone39d41f60111::NoLayerVariant757 static void cleanupInjectedLayers(CompositionTest*) {}
758
setupCallExpectationsForDirtyGeometryandroid::__anone39d41f60111::NoLayerVariant759 static void setupCallExpectationsForDirtyGeometry(CompositionTest*) {}
setupCallExpectationsForDirtyFrameandroid::__anone39d41f60111::NoLayerVariant760 static void setupCallExpectationsForDirtyFrame(CompositionTest*) {}
761 };
762
763 template <typename LayerProperties>
764 struct BaseLayerVariant {
765 template <typename L, typename F>
createLayerWithFactoryandroid::__anone39d41f60111::BaseLayerVariant766 static frontend::RequestedLayerState createLayerWithFactory(CompositionTest* test, F factory) {
767 EXPECT_CALL(*test->mFlinger.scheduler(), postMessage(_)).Times(0);
768
769 auto layer = factory();
770
771 // Layer should be registered with scheduler.
772 EXPECT_EQ(1u, test->mFlinger.scheduler()->layerHistorySize());
773
774 Mock::VerifyAndClear(test->mComposer);
775 Mock::VerifyAndClear(test->mRenderEngine);
776 Mock::VerifyAndClearExpectations(test->mFlinger.scheduler());
777
778 initLayerDrawingStateAndComputeBounds(test, layer);
779
780 return layer;
781 }
782
initLayerDrawingStateAndComputeBoundsandroid::__anone39d41f60111::BaseLayerVariant783 static void initLayerDrawingStateAndComputeBounds(CompositionTest* test,
784 frontend::RequestedLayerState& layer) {
785 layer.layerStack = LAYER_STACK;
786 layer.color = half4(LayerProperties::COLOR[0], LayerProperties::COLOR[1],
787 LayerProperties::COLOR[2], LayerProperties::COLOR[3]);
788 }
789
injectLayerandroid::__anone39d41f60111::BaseLayerVariant790 static void injectLayer(CompositionTest* test, frontend::RequestedLayerState& layer) {
791 EXPECT_CALL(*test->mComposer, createLayer(HWC_DISPLAY, _))
792 .WillOnce(DoAll(SetArgPointee<1>(HWC_LAYER), Return(Error::NONE)));
793 auto legacyLayer = test->mFlinger.getLegacyLayer(layer.id);
794 auto outputLayer = test->mDisplay->getCompositionDisplay()->injectOutputLayerForTest(
795 legacyLayer->getCompositionEngineLayerFE({.id = layer.id}));
796 outputLayer->editState().visibleRegion = Region(Rect(0, 0, 100, 100));
797 outputLayer->editState().outputSpaceVisibleRegion = Region(Rect(0, 0, 100, 100));
798
799 Mock::VerifyAndClear(test->mComposer);
800
801 auto layerCopy = std::make_unique<frontend::RequestedLayerState>(layer);
802 test->mFlinger.addLayer(layerCopy);
803 test->mFlinger.mutableVisibleRegionsDirty() = true;
804 }
805
cleanupInjectedLayersandroid::__anone39d41f60111::BaseLayerVariant806 static void cleanupInjectedLayers(CompositionTest* test) {
807 EXPECT_CALL(*test->mComposer, destroyLayer(HWC_DISPLAY, HWC_LAYER))
808 .WillOnce(Return(Error::NONE));
809
810 test->mFlinger.destroyAllLayerHandles();
811 test->mDisplay->getCompositionDisplay()->clearOutputLayers();
812 test->mFlinger.mutablePreviouslyComposedLayers().clear();
813 // Layer should be unregistered with scheduler.
814 test->mFlinger.commit();
815 EXPECT_EQ(0u, test->mFlinger.scheduler()->layerHistorySize());
816 }
817 };
818
819 template <typename LayerProperties>
820 struct EffectLayerVariant : public BaseLayerVariant<LayerProperties> {
821 using Base = BaseLayerVariant<LayerProperties>;
createLayerandroid::__anone39d41f60111::EffectLayerVariant822 static frontend::RequestedLayerState createLayer(CompositionTest* test) {
823 frontend::RequestedLayerState layer = Base::template createLayerWithFactory<
824 frontend::RequestedLayerState>(test, [test]() {
825 auto args = LayerCreationArgs(test->mFlinger.flinger(), sp<Client>(), "test-layer",
826 LayerProperties::LAYER_FLAGS, LayerMetadata());
827 auto legacyLayer = sp<Layer>::make(args);
828 test->mFlinger.injectLegacyLayer(legacyLayer);
829 return frontend::RequestedLayerState(args);
830 });
831
832 layer.crop = FloatRect(0, 0, LayerProperties::HEIGHT, LayerProperties::WIDTH);
833 return layer;
834 }
835
setupRECompositionCallExpectationsandroid::__anone39d41f60111::EffectLayerVariant836 static void setupRECompositionCallExpectations(CompositionTest* test) {
837 LayerProperties::setupREColorCompositionCallExpectations(test);
838 }
839
setupREScreenshotCompositionCallExpectationsandroid::__anone39d41f60111::EffectLayerVariant840 static void setupREScreenshotCompositionCallExpectations(CompositionTest* test) {
841 LayerProperties::setupREColorScreenshotCompositionCallExpectations(test);
842 }
843
setupCallExpectationsForDirtyGeometryandroid::__anone39d41f60111::EffectLayerVariant844 static void setupCallExpectationsForDirtyGeometry(CompositionTest* test) {
845 LayerProperties::setupHwcSetGeometryCallExpectations(test);
846 LayerProperties::setupHwcSetSourceCropColorCallExpectations(test);
847 }
848
setupCallExpectationsForDirtyFrameandroid::__anone39d41f60111::EffectLayerVariant849 static void setupCallExpectationsForDirtyFrame(CompositionTest* test) {
850 LayerProperties::setupHwcSetPerFrameCallExpectations(test);
851 LayerProperties::setupHwcSetPerFrameColorCallExpectations(test);
852 }
853 };
854
855 template <typename LayerProperties>
856 struct BufferLayerVariant : public BaseLayerVariant<LayerProperties> {
857 using Base = BaseLayerVariant<LayerProperties>;
858
createLayerandroid::__anone39d41f60111::BufferLayerVariant859 static frontend::RequestedLayerState createLayer(CompositionTest* test) {
860 frontend::RequestedLayerState layer = Base::template createLayerWithFactory<
861 frontend::RequestedLayerState>(test, [test]() {
862 LayerCreationArgs args(test->mFlinger.flinger(), sp<Client>(), "test-layer",
863 LayerProperties::LAYER_FLAGS, LayerMetadata());
864 auto legacyLayer = sp<Layer>::make(args);
865 test->mFlinger.injectLegacyLayer(legacyLayer);
866 return frontend::RequestedLayerState(args);
867 });
868
869 LayerProperties::setupLayerState(test, layer);
870
871 return layer;
872 }
873
cleanupInjectedLayersandroid::__anone39d41f60111::BufferLayerVariant874 static void cleanupInjectedLayers(CompositionTest* test) {
875 Base::cleanupInjectedLayers(test);
876 }
877
setupCallExpectationsForDirtyGeometryandroid::__anone39d41f60111::BufferLayerVariant878 static void setupCallExpectationsForDirtyGeometry(CompositionTest* test) {
879 LayerProperties::setupHwcSetGeometryCallExpectations(test);
880 LayerProperties::setupHwcSetSourceCropBufferCallExpectations(test);
881 }
882
setupCallExpectationsForDirtyFrameandroid::__anone39d41f60111::BufferLayerVariant883 static void setupCallExpectationsForDirtyFrame(CompositionTest* test) {
884 LayerProperties::setupHwcSetPerFrameCallExpectations(test);
885 LayerProperties::setupHwcSetPerFrameBufferCallExpectations(test);
886 }
887
setupRECompositionCallExpectationsandroid::__anone39d41f60111::BufferLayerVariant888 static void setupRECompositionCallExpectations(CompositionTest* test) {
889 LayerProperties::setupREBufferCompositionCallExpectations(test);
890 }
891
setupInsecureRECompositionCallExpectationsandroid::__anone39d41f60111::BufferLayerVariant892 static void setupInsecureRECompositionCallExpectations(CompositionTest* test) {
893 LayerProperties::setupInsecureREBufferCompositionCallExpectations(test);
894 }
895
setupREScreenshotCompositionCallExpectationsandroid::__anone39d41f60111::BufferLayerVariant896 static void setupREScreenshotCompositionCallExpectations(CompositionTest* test) {
897 LayerProperties::setupREBufferScreenshotCompositionCallExpectations(test);
898 }
899
setupInsecureREScreenshotCompositionCallExpectationsandroid::__anone39d41f60111::BufferLayerVariant900 static void setupInsecureREScreenshotCompositionCallExpectations(CompositionTest* test) {
901 LayerProperties::setupInsecureREBufferScreenshotCompositionCallExpectations(test);
902 }
903 };
904
905 template <typename LayerProperties>
906 struct ContainerLayerVariant : public BaseLayerVariant<LayerProperties> {
907 using Base = BaseLayerVariant<LayerProperties>;
908
createLayerandroid::__anone39d41f60111::ContainerLayerVariant909 static frontend::RequestedLayerState createLayer(CompositionTest* test) {
910 LayerCreationArgs args(test->mFlinger.flinger(), sp<Client>(), "test-container-layer",
911 LayerProperties::LAYER_FLAGS, LayerMetadata());
912 sp<Layer> legacyLayer = sp<Layer>::make(args);
913 test->mFlinger.injectLegacyLayer(legacyLayer);
914 frontend::RequestedLayerState layer(args);
915 Base::initLayerDrawingStateAndComputeBounds(test, layer);
916 return layer;
917 }
918 };
919
920 template <typename LayerVariant, typename ParentLayerVariant>
921 struct ChildLayerVariant : public LayerVariant {
922 using Base = LayerVariant;
923 using ParentBase = ParentLayerVariant;
924
createLayerandroid::__anone39d41f60111::ChildLayerVariant925 static frontend::RequestedLayerState createLayer(CompositionTest* test) {
926 // Need to create child layer first. Otherwise layer history size will be 2.
927 frontend::RequestedLayerState layer = Base::createLayer(test);
928 frontend::RequestedLayerState parentLayer = ParentBase::createLayer(test);
929 layer.parentId = parentLayer.id;
930 auto layerCopy = std::make_unique<frontend::RequestedLayerState>(parentLayer);
931 test->mFlinger.addLayer(layerCopy);
932 return layer;
933 }
934
cleanupInjectedLayersandroid::__anone39d41f60111::ChildLayerVariant935 static void cleanupInjectedLayers(CompositionTest* test) { Base::cleanupInjectedLayers(test); }
936 };
937
938 /* ------------------------------------------------------------------------
939 * Variants to control how the composition type is changed
940 */
941
942 struct NoCompositionTypeVariant {
setupHwcSetCallExpectationsandroid::__anone39d41f60111::NoCompositionTypeVariant943 static void setupHwcSetCallExpectations(CompositionTest*) {}
944
setupHwcGetCallExpectationsandroid::__anone39d41f60111::NoCompositionTypeVariant945 static void setupHwcGetCallExpectations(CompositionTest* test) {
946 EXPECT_CALL(*test->mComposer, getChangedCompositionTypes(HWC_DISPLAY, _, _)).Times(1);
947 }
948 };
949
950 template <aidl::android::hardware::graphics::composer3::Composition CompositionType>
951 struct KeepCompositionTypeVariant {
952 static constexpr aidl::android::hardware::graphics::composer3::Composition TYPE =
953 CompositionType;
954
setupHwcSetCallExpectationsandroid::__anone39d41f60111::KeepCompositionTypeVariant955 static void setupHwcSetCallExpectations(CompositionTest* test) {
956 if (!test->mDisplayOff) {
957 EXPECT_CALL(*test->mComposer,
958 setLayerCompositionType(HWC_DISPLAY, HWC_LAYER, CompositionType))
959 .Times(1);
960 }
961 }
962
setupHwcGetCallExpectationsandroid::__anone39d41f60111::KeepCompositionTypeVariant963 static void setupHwcGetCallExpectations(CompositionTest* test) {
964 EXPECT_CALL(*test->mComposer, getChangedCompositionTypes(HWC_DISPLAY, _, _)).Times(1);
965 }
966 };
967
968 template <aidl::android::hardware::graphics::composer3::Composition InitialCompositionType,
969 aidl::android::hardware::graphics::composer3::Composition FinalCompositionType>
970 struct ChangeCompositionTypeVariant {
971 static constexpr aidl::android::hardware::graphics::composer3::Composition TYPE =
972 FinalCompositionType;
973
setupHwcSetCallExpectationsandroid::__anone39d41f60111::ChangeCompositionTypeVariant974 static void setupHwcSetCallExpectations(CompositionTest* test) {
975 if (!test->mDisplayOff) {
976 EXPECT_CALL(*test->mComposer,
977 setLayerCompositionType(HWC_DISPLAY, HWC_LAYER, InitialCompositionType))
978 .Times(1);
979 }
980 }
981
setupHwcGetCallExpectationsandroid::__anone39d41f60111::ChangeCompositionTypeVariant982 static void setupHwcGetCallExpectations(CompositionTest* test) {
983 EXPECT_CALL(*test->mComposer, getChangedCompositionTypes(HWC_DISPLAY, _, _))
984 .WillOnce(DoAll(SetArgPointee<1>(std::vector<Hwc2::Layer>{
985 static_cast<Hwc2::Layer>(HWC_LAYER)}),
986 SetArgPointee<2>(
987 std::vector<aidl::android::hardware::graphics::composer3::
988 Composition>{FinalCompositionType}),
989 Return(Error::NONE)));
990 }
991 };
992
993 /* ------------------------------------------------------------------------
994 * Variants to select how the composition is expected to be handled
995 */
996
997 struct CompositionResultBaseVariant {
setupLayerStateandroid::__anone39d41f60111::CompositionResultBaseVariant998 static void setupLayerState(CompositionTest*, frontend::RequestedLayerState&) {}
999
1000 template <typename Case>
setupCallExpectationsForDirtyGeometryandroid::__anone39d41f60111::CompositionResultBaseVariant1001 static void setupCallExpectationsForDirtyGeometry(CompositionTest* test) {
1002 Case::Layer::setupCallExpectationsForDirtyGeometry(test);
1003 }
1004
1005 template <typename Case>
setupCallExpectationsForDirtyFrameandroid::__anone39d41f60111::CompositionResultBaseVariant1006 static void setupCallExpectationsForDirtyFrame(CompositionTest* test) {
1007 Case::Layer::setupCallExpectationsForDirtyFrame(test);
1008 }
1009 };
1010
1011 struct NoCompositionResultVariant : public CompositionResultBaseVariant {
1012 template <typename Case>
setupCallExpectationsandroid::__anone39d41f60111::NoCompositionResultVariant1013 static void setupCallExpectations(CompositionTest* test) {
1014 Case::Display::setupEmptyFrameCompositionCallExpectations(test);
1015 Case::Display::setupHwcCompositionCallExpectations(test);
1016 }
1017 };
1018
1019 struct HwcCompositionResultVariant : public CompositionResultBaseVariant {
1020 template <typename Case>
setupCallExpectationsandroid::__anone39d41f60111::HwcCompositionResultVariant1021 static void setupCallExpectations(CompositionTest* test) {
1022 Case::Display::setupNonEmptyFrameCompositionCallExpectations(test);
1023 Case::Display::setupHwcCompositionCallExpectations(test);
1024 }
1025 };
1026
1027 struct RECompositionResultVariant : public CompositionResultBaseVariant {
1028 template <typename Case>
setupCallExpectationsandroid::__anone39d41f60111::RECompositionResultVariant1029 static void setupCallExpectations(CompositionTest* test) {
1030 Case::Display::setupNonEmptyFrameCompositionCallExpectations(test);
1031 Case::Display::setupHwcClientCompositionCallExpectations(test);
1032 Case::Display::setupRECompositionCallExpectations(test);
1033 Case::Display::template setupRELayerCompositionCallExpectations<Case>(test);
1034 }
1035 };
1036
1037 struct ForcedClientCompositionResultVariant : public CompositionResultBaseVariant {
setupLayerStateandroid::__anone39d41f60111::ForcedClientCompositionResultVariant1038 static void setupLayerState(CompositionTest* test, frontend::RequestedLayerState& layer) {
1039 const auto outputLayer = test->mFlinger.findOutputLayerForDisplay(layer.id, test->mDisplay);
1040 LOG_FATAL_IF(!outputLayer);
1041 outputLayer->editState().forceClientComposition = true;
1042 }
1043
1044 template <typename Case>
setupCallExpectationsandroid::__anone39d41f60111::ForcedClientCompositionResultVariant1045 static void setupCallExpectations(CompositionTest* test) {
1046 Case::Display::setupNonEmptyFrameCompositionCallExpectations(test);
1047 Case::Display::setupHwcForcedClientCompositionCallExpectations(test);
1048 Case::Display::setupRECompositionCallExpectations(test);
1049 Case::Display::template setupRELayerCompositionCallExpectations<Case>(test);
1050 }
1051
1052 template <typename Case>
setupCallExpectationsForDirtyGeometryandroid::__anone39d41f60111::ForcedClientCompositionResultVariant1053 static void setupCallExpectationsForDirtyGeometry(CompositionTest*) {}
1054
1055 template <typename Case>
setupCallExpectationsForDirtyFrameandroid::__anone39d41f60111::ForcedClientCompositionResultVariant1056 static void setupCallExpectationsForDirtyFrame(CompositionTest*) {}
1057 };
1058
1059 struct ForcedClientCompositionViaDebugOptionResultVariant : public CompositionResultBaseVariant {
setupLayerStateandroid::__anone39d41f60111::ForcedClientCompositionViaDebugOptionResultVariant1060 static void setupLayerState(CompositionTest* test, frontend::RequestedLayerState&) {
1061 test->mFlinger.mutableDebugDisableHWC() = true;
1062 }
1063
1064 template <typename Case>
setupCallExpectationsandroid::__anone39d41f60111::ForcedClientCompositionViaDebugOptionResultVariant1065 static void setupCallExpectations(CompositionTest* test) {
1066 Case::Display::setupNonEmptyFrameCompositionCallExpectations(test);
1067 Case::Display::setupHwcForcedClientCompositionCallExpectations(test);
1068 Case::Display::setupRECompositionCallExpectations(test);
1069 Case::Display::template setupRELayerCompositionCallExpectations<Case>(test);
1070 }
1071
1072 template <typename Case>
setupCallExpectationsForDirtyGeometryandroid::__anone39d41f60111::ForcedClientCompositionViaDebugOptionResultVariant1073 static void setupCallExpectationsForDirtyGeometry(CompositionTest*) {}
1074
1075 template <typename Case>
setupCallExpectationsForDirtyFrameandroid::__anone39d41f60111::ForcedClientCompositionViaDebugOptionResultVariant1076 static void setupCallExpectationsForDirtyFrame(CompositionTest*) {}
1077 };
1078
1079 struct EmptyScreenshotResultVariant {
setupLayerStateandroid::__anone39d41f60111::EmptyScreenshotResultVariant1080 static void setupLayerState(CompositionTest*, frontend::RequestedLayerState&) {}
1081
1082 template <typename Case>
setupCallExpectationsandroid::__anone39d41f60111::EmptyScreenshotResultVariant1083 static void setupCallExpectations(CompositionTest*) {}
1084 };
1085
1086 struct REScreenshotResultVariant : public EmptyScreenshotResultVariant {
1087 using Base = EmptyScreenshotResultVariant;
1088
1089 template <typename Case>
setupCallExpectationsandroid::__anone39d41f60111::REScreenshotResultVariant1090 static void setupCallExpectations(CompositionTest* test) {
1091 Base::template setupCallExpectations<Case>(test);
1092 Case::Display::template setupRELayerScreenshotCompositionCallExpectations<Case>(test);
1093 }
1094 };
1095
1096 /* ------------------------------------------------------------------------
1097 * Composition test case, containing all the variants being tested
1098 */
1099
1100 template <typename DisplayCase, typename LayerCase, typename CompositionTypeCase,
1101 typename CompositionResultCase>
1102 struct CompositionCase {
1103 using ThisCase =
1104 CompositionCase<DisplayCase, LayerCase, CompositionTypeCase, CompositionResultCase>;
1105 using Display = DisplayCase;
1106 using Layer = LayerCase;
1107 using CompositionType = CompositionTypeCase;
1108 using CompositionResult = CompositionResultCase;
1109
setupCommonandroid::__anone39d41f60111::CompositionCase1110 static void setupCommon(CompositionTest* test) {
1111 Display::template setupPreconditionCallExpectations<ThisCase>(test);
1112 Display::setupPreconditions(test);
1113
1114 auto layer = Layer::createLayer(test);
1115 Layer::injectLayer(test, layer);
1116 CompositionResult::setupLayerState(test, layer);
1117 }
1118
setupForDirtyGeometryandroid::__anone39d41f60111::CompositionCase1119 static void setupForDirtyGeometry(CompositionTest* test) {
1120 setupCommon(test);
1121
1122 Display::template setupCommonCompositionCallExpectations<ThisCase>(test);
1123 CompositionResult::template setupCallExpectationsForDirtyGeometry<ThisCase>(test);
1124 CompositionResult::template setupCallExpectationsForDirtyFrame<ThisCase>(test);
1125 CompositionResult::template setupCallExpectations<ThisCase>(test);
1126 }
1127
setupForDirtyFrameandroid::__anone39d41f60111::CompositionCase1128 static void setupForDirtyFrame(CompositionTest* test) {
1129 setupCommon(test);
1130
1131 Display::template setupCommonCompositionCallExpectations<ThisCase>(test);
1132 CompositionResult::template setupCallExpectationsForDirtyFrame<ThisCase>(test);
1133 CompositionResult::template setupCallExpectations<ThisCase>(test);
1134 }
1135
setupForScreenCaptureandroid::__anone39d41f60111::CompositionCase1136 static void setupForScreenCapture(CompositionTest* test) {
1137 setupCommon(test);
1138
1139 Display::template setupCommonScreensCaptureCallExpectations<ThisCase>(test);
1140 CompositionResult::template setupCallExpectations<ThisCase>(test);
1141 }
1142
cleanupandroid::__anone39d41f60111::CompositionCase1143 static void cleanup(CompositionTest* test) {
1144 Layer::cleanupInjectedLayers(test);
1145
1146 for (auto& displayData : test->mFlinger.mutableHwcDisplayData()) {
1147 static_cast<TestableSurfaceFlinger::HWC2Display*>(displayData.second.hwcDisplay.get())
1148 ->mutableLayers()
1149 .clear();
1150 }
1151 }
1152 };
1153
1154 /* ------------------------------------------------------------------------
1155 * Composition cases to test
1156 */
1157
TEST_F(CompositionTest,noLayersDoesMinimalWorkWithDirtyGeometry)1158 TEST_F(CompositionTest, noLayersDoesMinimalWorkWithDirtyGeometry) {
1159 displayRefreshCompositionDirtyGeometry<
1160 CompositionCase<DefaultDisplaySetupVariant, NoLayerVariant, NoCompositionTypeVariant,
1161 NoCompositionResultVariant>>();
1162 }
1163
TEST_F(CompositionTest,noLayersDoesMinimalWorkWithDirtyFrame)1164 TEST_F(CompositionTest, noLayersDoesMinimalWorkWithDirtyFrame) {
1165 displayRefreshCompositionDirtyFrame<
1166 CompositionCase<DefaultDisplaySetupVariant, NoLayerVariant, NoCompositionTypeVariant,
1167 NoCompositionResultVariant>>();
1168 }
1169
TEST_F(CompositionTest,noLayersDoesMinimalWorkToCaptureScreen)1170 TEST_F(CompositionTest, noLayersDoesMinimalWorkToCaptureScreen) {
1171 captureScreenComposition<
1172 CompositionCase<DefaultDisplaySetupVariant, NoLayerVariant, NoCompositionTypeVariant,
1173 EmptyScreenshotResultVariant>>();
1174 }
1175
1176 /* ------------------------------------------------------------------------
1177 * Simple buffer layers
1178 */
1179
TEST_F(CompositionTest,HWCComposedNormalBufferLayerWithDirtyGeometry)1180 TEST_F(CompositionTest, HWCComposedNormalBufferLayerWithDirtyGeometry) {
1181 displayRefreshCompositionDirtyGeometry<CompositionCase<
1182 DefaultDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1183 KeepCompositionTypeVariant<
1184 aidl::android::hardware::graphics::composer3::Composition::DEVICE>,
1185 HwcCompositionResultVariant>>();
1186 }
1187
TEST_F(CompositionTest,HWCComposedNormalBufferLayerWithDirtyFrame)1188 TEST_F(CompositionTest, HWCComposedNormalBufferLayerWithDirtyFrame) {
1189 displayRefreshCompositionDirtyFrame<CompositionCase<
1190 DefaultDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1191 KeepCompositionTypeVariant<
1192 aidl::android::hardware::graphics::composer3::Composition::DEVICE>,
1193 HwcCompositionResultVariant>>();
1194 }
1195
TEST_F(CompositionTest,REComposedNormalBufferLayer)1196 TEST_F(CompositionTest, REComposedNormalBufferLayer) {
1197 displayRefreshCompositionDirtyFrame<CompositionCase<
1198 DefaultDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1199 ChangeCompositionTypeVariant<
1200 aidl::android::hardware::graphics::composer3::Composition::DEVICE,
1201 aidl::android::hardware::graphics::composer3::Composition::CLIENT>,
1202 RECompositionResultVariant>>();
1203 }
1204
TEST_F(CompositionTest,captureScreenNormalBufferLayer)1205 TEST_F(CompositionTest, captureScreenNormalBufferLayer) {
1206 captureScreenComposition<
1207 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1208 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1209 }
1210
1211 /* ------------------------------------------------------------------------
1212 * Single-color layers
1213 */
1214
TEST_F(CompositionTest,HWCComposedEffectLayerWithDirtyGeometry)1215 TEST_F(CompositionTest, HWCComposedEffectLayerWithDirtyGeometry) {
1216 displayRefreshCompositionDirtyGeometry<CompositionCase<
1217 DefaultDisplaySetupVariant, EffectLayerVariant<EffectLayerProperties>,
1218 KeepCompositionTypeVariant<
1219 aidl::android::hardware::graphics::composer3::Composition::SOLID_COLOR>,
1220 HwcCompositionResultVariant>>();
1221 }
1222
TEST_F(CompositionTest,HWCComposedEffectLayerWithDirtyFrame)1223 TEST_F(CompositionTest, HWCComposedEffectLayerWithDirtyFrame) {
1224 displayRefreshCompositionDirtyFrame<CompositionCase<
1225 DefaultDisplaySetupVariant, EffectLayerVariant<EffectLayerProperties>,
1226 KeepCompositionTypeVariant<
1227 aidl::android::hardware::graphics::composer3::Composition::SOLID_COLOR>,
1228 HwcCompositionResultVariant>>();
1229 }
1230
TEST_F(CompositionTest,REComposedEffectLayer)1231 TEST_F(CompositionTest, REComposedEffectLayer) {
1232 displayRefreshCompositionDirtyFrame<CompositionCase<
1233 DefaultDisplaySetupVariant, EffectLayerVariant<EffectLayerProperties>,
1234 ChangeCompositionTypeVariant<
1235 aidl::android::hardware::graphics::composer3::Composition::SOLID_COLOR,
1236 aidl::android::hardware::graphics::composer3::Composition::CLIENT>,
1237 RECompositionResultVariant>>();
1238 }
1239
TEST_F(CompositionTest,captureScreenEffectLayer)1240 TEST_F(CompositionTest, captureScreenEffectLayer) {
1241 captureScreenComposition<
1242 CompositionCase<DefaultDisplaySetupVariant, EffectLayerVariant<EffectLayerProperties>,
1243 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1244 }
1245
1246 /* ------------------------------------------------------------------------
1247 * Layers with sideband buffers
1248 */
1249
TEST_F(CompositionTest,HWCComposedSidebandBufferLayerWithDirtyGeometry)1250 TEST_F(CompositionTest, HWCComposedSidebandBufferLayerWithDirtyGeometry) {
1251 displayRefreshCompositionDirtyGeometry<CompositionCase<
1252 DefaultDisplaySetupVariant, BufferLayerVariant<SidebandLayerProperties>,
1253 KeepCompositionTypeVariant<
1254 aidl::android::hardware::graphics::composer3::Composition::SIDEBAND>,
1255 HwcCompositionResultVariant>>();
1256 }
1257
TEST_F(CompositionTest,HWCComposedSidebandBufferLayerWithDirtyFrame)1258 TEST_F(CompositionTest, HWCComposedSidebandBufferLayerWithDirtyFrame) {
1259 displayRefreshCompositionDirtyFrame<CompositionCase<
1260 DefaultDisplaySetupVariant, BufferLayerVariant<SidebandLayerProperties>,
1261 KeepCompositionTypeVariant<
1262 aidl::android::hardware::graphics::composer3::Composition::SIDEBAND>,
1263 HwcCompositionResultVariant>>();
1264 }
1265
TEST_F(CompositionTest,REComposedSidebandBufferLayer)1266 TEST_F(CompositionTest, REComposedSidebandBufferLayer) {
1267 displayRefreshCompositionDirtyFrame<CompositionCase<
1268 DefaultDisplaySetupVariant, BufferLayerVariant<SidebandLayerProperties>,
1269 ChangeCompositionTypeVariant<
1270 aidl::android::hardware::graphics::composer3::Composition::SIDEBAND,
1271 aidl::android::hardware::graphics::composer3::Composition::CLIENT>,
1272 RECompositionResultVariant>>();
1273 }
1274
TEST_F(CompositionTest,captureScreenSidebandBufferLayer)1275 TEST_F(CompositionTest, captureScreenSidebandBufferLayer) {
1276 captureScreenComposition<
1277 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<SidebandLayerProperties>,
1278 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1279 }
1280
1281 /* ------------------------------------------------------------------------
1282 * Layers with ISurfaceComposerClient::eSecure, on a secure display
1283 */
1284
TEST_F(CompositionTest,HWCComposedSecureBufferLayerWithDirtyGeometry)1285 TEST_F(CompositionTest, HWCComposedSecureBufferLayerWithDirtyGeometry) {
1286 displayRefreshCompositionDirtyGeometry<CompositionCase<
1287 DefaultDisplaySetupVariant, BufferLayerVariant<SecureLayerProperties>,
1288 KeepCompositionTypeVariant<
1289 aidl::android::hardware::graphics::composer3::Composition::DEVICE>,
1290 HwcCompositionResultVariant>>();
1291 }
1292
TEST_F(CompositionTest,HWCComposedSecureBufferLayerWithDirtyFrame)1293 TEST_F(CompositionTest, HWCComposedSecureBufferLayerWithDirtyFrame) {
1294 displayRefreshCompositionDirtyFrame<CompositionCase<
1295 DefaultDisplaySetupVariant, BufferLayerVariant<SecureLayerProperties>,
1296 KeepCompositionTypeVariant<
1297 aidl::android::hardware::graphics::composer3::Composition::DEVICE>,
1298 HwcCompositionResultVariant>>();
1299 }
1300
TEST_F(CompositionTest,REComposedSecureBufferLayer)1301 TEST_F(CompositionTest, REComposedSecureBufferLayer) {
1302 displayRefreshCompositionDirtyFrame<CompositionCase<
1303 DefaultDisplaySetupVariant, BufferLayerVariant<SecureLayerProperties>,
1304 ChangeCompositionTypeVariant<
1305 aidl::android::hardware::graphics::composer3::Composition::DEVICE,
1306 aidl::android::hardware::graphics::composer3::Composition::CLIENT>,
1307 RECompositionResultVariant>>();
1308 }
1309
TEST_F(CompositionTest,captureScreenSecureBufferLayerOnSecureDisplay)1310 TEST_F(CompositionTest, captureScreenSecureBufferLayerOnSecureDisplay) {
1311 captureScreenComposition<
1312 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<SecureLayerProperties>,
1313 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1314 }
1315
1316 /* ------------------------------------------------------------------------
1317 * Layers with ISurfaceComposerClient::eSecure, on a non-secure display
1318 */
1319
TEST_F(CompositionTest,HWCComposedSecureBufferLayerOnInsecureDisplayWithDirtyGeometry)1320 TEST_F(CompositionTest, HWCComposedSecureBufferLayerOnInsecureDisplayWithDirtyGeometry) {
1321 displayRefreshCompositionDirtyGeometry<CompositionCase<
1322 InsecureDisplaySetupVariant, BufferLayerVariant<SecureLayerProperties>,
1323 KeepCompositionTypeVariant<
1324 aidl::android::hardware::graphics::composer3::Composition::CLIENT>,
1325 ForcedClientCompositionResultVariant>>();
1326 }
1327
TEST_F(CompositionTest,HWCComposedSecureBufferLayerOnInsecureDisplayWithDirtyFrame)1328 TEST_F(CompositionTest, HWCComposedSecureBufferLayerOnInsecureDisplayWithDirtyFrame) {
1329 displayRefreshCompositionDirtyFrame<CompositionCase<
1330 InsecureDisplaySetupVariant, BufferLayerVariant<SecureLayerProperties>,
1331 KeepCompositionTypeVariant<
1332 aidl::android::hardware::graphics::composer3::Composition::CLIENT>,
1333 ForcedClientCompositionResultVariant>>();
1334 }
1335
TEST_F(CompositionTest,captureScreenSecureBufferLayerOnInsecureDisplay)1336 TEST_F(CompositionTest, captureScreenSecureBufferLayerOnInsecureDisplay) {
1337 captureScreenComposition<
1338 CompositionCase<InsecureDisplaySetupVariant, BufferLayerVariant<SecureLayerProperties>,
1339 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1340 }
1341
1342 /* ------------------------------------------------------------------------
1343 * Layers with a parent layer with ISurfaceComposerClient::eSecure, on a non-secure display
1344 */
1345
TEST_F(CompositionTest,captureScreenBufferLayerWithSecureParentLayerOnInsecureDisplay)1346 TEST_F(CompositionTest, captureScreenBufferLayerWithSecureParentLayerOnInsecureDisplay) {
1347 captureScreenComposition<
1348 CompositionCase<InsecureDisplaySetupVariant,
1349 ChildLayerVariant<BufferLayerVariant<ParentSecureLayerProperties>,
1350 ContainerLayerVariant<SecureLayerProperties>>,
1351 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1352 }
1353
1354 /* ------------------------------------------------------------------------
1355 * Cursor layers
1356 */
1357
TEST_F(CompositionTest,HWCComposedCursorLayerWithDirtyGeometry)1358 TEST_F(CompositionTest, HWCComposedCursorLayerWithDirtyGeometry) {
1359 displayRefreshCompositionDirtyGeometry<CompositionCase<
1360 DefaultDisplaySetupVariant, BufferLayerVariant<CursorLayerProperties>,
1361 KeepCompositionTypeVariant<
1362 aidl::android::hardware::graphics::composer3::Composition::CURSOR>,
1363 HwcCompositionResultVariant>>();
1364 }
1365
TEST_F(CompositionTest,HWCComposedCursorLayerWithDirtyFrame)1366 TEST_F(CompositionTest, HWCComposedCursorLayerWithDirtyFrame) {
1367 displayRefreshCompositionDirtyFrame<CompositionCase<
1368 DefaultDisplaySetupVariant, BufferLayerVariant<CursorLayerProperties>,
1369 KeepCompositionTypeVariant<
1370 aidl::android::hardware::graphics::composer3::Composition::CURSOR>,
1371 HwcCompositionResultVariant>>();
1372 }
1373
TEST_F(CompositionTest,REComposedCursorLayer)1374 TEST_F(CompositionTest, REComposedCursorLayer) {
1375 displayRefreshCompositionDirtyFrame<CompositionCase<
1376 DefaultDisplaySetupVariant, BufferLayerVariant<CursorLayerProperties>,
1377 ChangeCompositionTypeVariant<
1378 aidl::android::hardware::graphics::composer3::Composition::CURSOR,
1379 aidl::android::hardware::graphics::composer3::Composition::CLIENT>,
1380 RECompositionResultVariant>>();
1381 }
1382
TEST_F(CompositionTest,captureScreenCursorLayer)1383 TEST_F(CompositionTest, captureScreenCursorLayer) {
1384 captureScreenComposition<
1385 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<CursorLayerProperties>,
1386 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1387 }
1388
1389 /* ------------------------------------------------------------------------
1390 * Simple buffer layer on a display which is powered off.
1391 */
1392
TEST_F(CompositionTest,displayOffHWCComposedNormalBufferLayerWithDirtyGeometry)1393 TEST_F(CompositionTest, displayOffHWCComposedNormalBufferLayerWithDirtyGeometry) {
1394 mDisplayOff = true;
1395 displayRefreshCompositionDirtyGeometry<CompositionCase<
1396 PoweredOffDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1397 KeepCompositionTypeVariant<
1398 aidl::android::hardware::graphics::composer3::Composition::DEVICE>,
1399 HwcCompositionResultVariant>>();
1400 }
1401
TEST_F(CompositionTest,displayOffHWCComposedNormalBufferLayerWithDirtyFrame)1402 TEST_F(CompositionTest, displayOffHWCComposedNormalBufferLayerWithDirtyFrame) {
1403 mDisplayOff = true;
1404 displayRefreshCompositionDirtyFrame<CompositionCase<
1405 PoweredOffDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1406 KeepCompositionTypeVariant<
1407 aidl::android::hardware::graphics::composer3::Composition::DEVICE>,
1408 HwcCompositionResultVariant>>();
1409 }
1410
TEST_F(CompositionTest,displayOffREComposedNormalBufferLayer)1411 TEST_F(CompositionTest, displayOffREComposedNormalBufferLayer) {
1412 mDisplayOff = true;
1413 displayRefreshCompositionDirtyFrame<CompositionCase<
1414 PoweredOffDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1415 ChangeCompositionTypeVariant<
1416 aidl::android::hardware::graphics::composer3::Composition::DEVICE,
1417 aidl::android::hardware::graphics::composer3::Composition::CLIENT>,
1418 RECompositionResultVariant>>();
1419 }
1420
TEST_F(CompositionTest,captureScreenNormalBufferLayerOnPoweredOffDisplay)1421 TEST_F(CompositionTest, captureScreenNormalBufferLayerOnPoweredOffDisplay) {
1422 captureScreenComposition<CompositionCase<
1423 PoweredOffDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1424 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1425 }
1426
1427 /* ------------------------------------------------------------------------
1428 * Client composition forced through debug/developer settings
1429 */
1430
TEST_F(CompositionTest,DebugOptionForcingClientCompositionOfBufferLayerWithDirtyGeometry)1431 TEST_F(CompositionTest, DebugOptionForcingClientCompositionOfBufferLayerWithDirtyGeometry) {
1432 displayRefreshCompositionDirtyGeometry<CompositionCase<
1433 DefaultDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1434 KeepCompositionTypeVariant<
1435 aidl::android::hardware::graphics::composer3::Composition::CLIENT>,
1436 ForcedClientCompositionViaDebugOptionResultVariant>>();
1437 }
1438
TEST_F(CompositionTest,DebugOptionForcingClientCompositionOfBufferLayerWithDirtyFrame)1439 TEST_F(CompositionTest, DebugOptionForcingClientCompositionOfBufferLayerWithDirtyFrame) {
1440 displayRefreshCompositionDirtyFrame<CompositionCase<
1441 DefaultDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1442 KeepCompositionTypeVariant<
1443 aidl::android::hardware::graphics::composer3::Composition::CLIENT>,
1444 ForcedClientCompositionViaDebugOptionResultVariant>>();
1445 }
1446
1447 } // namespace
1448 } // namespace android
1449
1450 // TODO(b/129481165): remove the #pragma below and fix conversion issues
1451 #pragma clang diagnostic pop // ignored "-Wconversion -Wextra"
1452