blob: f9c68810b6af545fa7fb04448beed2ebdbf1e144 [file] [log] [blame]
Lloyd Piqued6b579f2018-04-06 15:29:10 -07001/*
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#undef LOG_TAG
18#define LOG_TAG "CompositionTest"
19
20#include <gmock/gmock.h>
21#include <gtest/gtest.h>
Lloyd Piqued6b579f2018-04-06 15:29:10 -070022#include <gui/IProducerListener.h>
23#include <log/log.h>
24#include <system/window.h>
25#include <utils/String8.h>
26
27#include "BufferQueueLayer.h"
28#include "ColorLayer.h"
29#include "Layer.h"
30
31#include "TestableSurfaceFlinger.h"
32#include "mock/DisplayHardware/MockComposer.h"
33#include "mock/DisplayHardware/MockDisplaySurface.h"
34#include "mock/MockDispSync.h"
35#include "mock/MockEventControlThread.h"
36#include "mock/MockEventThread.h"
37#include "mock/MockMessageQueue.h"
38#include "mock/RenderEngine/MockRenderEngine.h"
Alec Mouriba013fa2018-10-16 12:43:11 -070039#include "mock/system/window/MockNativeWindow.h"
Lloyd Piqued6b579f2018-04-06 15:29:10 -070040
41namespace android {
42namespace {
43
44using testing::_;
David Sodman15094112018-10-11 09:39:37 -070045using testing::AtLeast;
Lloyd Piqued6b579f2018-04-06 15:29:10 -070046using testing::ByMove;
47using testing::DoAll;
Alec Mouri0a9c7b82018-11-16 13:05:25 -080048using testing::Invoke;
Lloyd Piqued6b579f2018-04-06 15:29:10 -070049using testing::IsNull;
50using testing::Mock;
51using testing::NotNull;
52using testing::Ref;
53using testing::Return;
54using testing::ReturnRef;
55using testing::SetArgPointee;
56
57using android::Hwc2::Error;
58using android::Hwc2::IComposer;
59using android::Hwc2::IComposerClient;
60using android::Hwc2::Transform;
61
62using FakeHwcDisplayInjector = TestableSurfaceFlinger::FakeHwcDisplayInjector;
63using FakeDisplayDeviceInjector = TestableSurfaceFlinger::FakeDisplayDeviceInjector;
64
65constexpr hwc2_display_t HWC_DISPLAY = FakeHwcDisplayInjector::DEFAULT_HWC_DISPLAY_ID;
66constexpr hwc2_layer_t HWC_LAYER = 5000;
67constexpr Transform DEFAULT_TRANSFORM = static_cast<Transform>(0);
68
Dominik Laskowski34157762018-10-31 13:07:19 -070069constexpr DisplayId DEFAULT_DISPLAY_ID = DisplayId{42};
Lloyd Piqued6b579f2018-04-06 15:29:10 -070070constexpr int DEFAULT_DISPLAY_WIDTH = 1920;
71constexpr int DEFAULT_DISPLAY_HEIGHT = 1024;
72
73constexpr int DEFAULT_CONFIG_ID = 0;
74constexpr int DEFAULT_TEXTURE_ID = 6000;
75constexpr int DEFAULT_LAYER_STACK = 7000;
76
77constexpr int DEFAULT_DISPLAY_MAX_LUMINANCE = 500;
78
79constexpr int DEFAULT_SIDEBAND_STREAM = 51;
80
81class CompositionTest : public testing::Test {
82public:
83 CompositionTest() {
84 const ::testing::TestInfo* const test_info =
85 ::testing::UnitTest::GetInstance()->current_test_info();
86 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
87
88 mFlinger.mutableEventControlThread().reset(mEventControlThread);
89 mFlinger.mutableEventThread().reset(mEventThread);
90 mFlinger.mutableEventQueue().reset(mMessageQueue);
91
92 mFlinger.mutablePrimaryDispSync().reset(mPrimaryDispSync);
93 EXPECT_CALL(*mPrimaryDispSync, computeNextRefresh(0)).WillRepeatedly(Return(0));
94 EXPECT_CALL(*mPrimaryDispSync, getPeriod())
95 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_REFRESH_RATE));
Alec Mourif6fd29e2018-11-17 04:56:41 +000096 EXPECT_CALL(*mNativeWindow, query(NATIVE_WINDOW_WIDTH, _))
97 .WillRepeatedly(DoAll(SetArgPointee<1>(DEFAULT_DISPLAY_WIDTH), Return(0)));
98 EXPECT_CALL(*mNativeWindow, query(NATIVE_WINDOW_HEIGHT, _))
99 .WillRepeatedly(DoAll(SetArgPointee<1>(DEFAULT_DISPLAY_HEIGHT), Return(0)));
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700100
101 mFlinger.setupRenderEngine(std::unique_ptr<renderengine::RenderEngine>(mRenderEngine));
102 setupComposer(0);
103 }
104
105 ~CompositionTest() {
106 const ::testing::TestInfo* const test_info =
107 ::testing::UnitTest::GetInstance()->current_test_info();
108 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
109 }
110
111 void setupComposer(int virtualDisplayCount) {
112 mComposer = new Hwc2::mock::Composer();
113 EXPECT_CALL(*mComposer, getCapabilities())
114 .WillOnce(Return(std::vector<IComposer::Capability>()));
115 EXPECT_CALL(*mComposer, getMaxVirtualDisplayCount()).WillOnce(Return(virtualDisplayCount));
116 mFlinger.setupComposer(std::unique_ptr<Hwc2::Composer>(mComposer));
117
118 Mock::VerifyAndClear(mComposer);
119 }
120
121 void setupForceGeometryDirty() {
122 // TODO: This requires the visible region and other related
123 // state to be set, and is problematic for BufferLayers since they are
124 // not visible without a buffer (and setting up a buffer looks like a
125 // pain)
126 // mFlinger.mutableVisibleRegionsDirty() = true;
127
128 mFlinger.mutableGeometryInvalid() = true;
129 }
130
131 template <typename Case>
132 void displayRefreshCompositionDirtyGeometry();
133
134 template <typename Case>
135 void displayRefreshCompositionDirtyFrame();
136
137 template <typename Case>
138 void captureScreenComposition();
139
140 std::unordered_set<HWC2::Capability> mDefaultCapabilities = {HWC2::Capability::SidebandStream};
141
142 TestableSurfaceFlinger mFlinger;
143 sp<DisplayDevice> mDisplay;
144 sp<DisplayDevice> mExternalDisplay;
145 sp<mock::DisplaySurface> mDisplaySurface = new mock::DisplaySurface();
Alec Mouriba013fa2018-10-16 12:43:11 -0700146 mock::NativeWindow* mNativeWindow = new mock::NativeWindow();
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700147
Alec Mouri0a9c7b82018-11-16 13:05:25 -0800148 sp<GraphicBuffer> mBuffer = new GraphicBuffer();
149 ANativeWindowBuffer* mNativeWindowBuffer = mBuffer->getNativeBuffer();
150
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700151 mock::EventThread* mEventThread = new mock::EventThread();
152 mock::EventControlThread* mEventControlThread = new mock::EventControlThread();
153
154 Hwc2::mock::Composer* mComposer = nullptr;
155 renderengine::mock::RenderEngine* mRenderEngine = new renderengine::mock::RenderEngine();
156 mock::MessageQueue* mMessageQueue = new mock::MessageQueue();
157 mock::DispSync* mPrimaryDispSync = new mock::DispSync();
158 renderengine::mock::Image* mReImage = new renderengine::mock::Image();
159 renderengine::mock::Framebuffer* mReFrameBuffer = new renderengine::mock::Framebuffer();
160
161 sp<Fence> mClientTargetAcquireFence = Fence::NO_FENCE;
162
163 sp<GraphicBuffer> mCaptureScreenBuffer;
164};
165
166template <typename LayerCase>
167void CompositionTest::displayRefreshCompositionDirtyGeometry() {
168 setupForceGeometryDirty();
169 LayerCase::setupForDirtyGeometry(this);
170
171 // --------------------------------------------------------------------
172 // Invocation
173
174 mFlinger.onMessageReceived(MessageQueue::INVALIDATE);
175 mFlinger.onMessageReceived(MessageQueue::REFRESH);
176
177 LayerCase::cleanup(this);
178}
179
180template <typename LayerCase>
181void CompositionTest::displayRefreshCompositionDirtyFrame() {
182 LayerCase::setupForDirtyFrame(this);
183
184 // --------------------------------------------------------------------
185 // Invocation
186
187 mFlinger.onMessageReceived(MessageQueue::INVALIDATE);
188 mFlinger.onMessageReceived(MessageQueue::REFRESH);
189
190 LayerCase::cleanup(this);
191}
192
193template <typename LayerCase>
194void CompositionTest::captureScreenComposition() {
195 LayerCase::setupForScreenCapture(this);
196
197 const Rect sourceCrop(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700198 constexpr bool useIdentityTransform = true;
199 constexpr bool forSystem = true;
200
201 DisplayRenderArea renderArea(mDisplay, sourceCrop, DEFAULT_DISPLAY_WIDTH,
Peiyong Lin0e003c92018-09-17 11:09:51 -0700202 DEFAULT_DISPLAY_HEIGHT, ui::Dataspace::V0_SRGB,
203 ui::Transform::ROT_0);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700204
205 auto traverseLayers = [this](const LayerVector::Visitor& visitor) {
chaviw0e3479f2018-09-10 16:49:30 -0700206 return mFlinger.traverseLayersInDisplay(mDisplay, visitor);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700207 };
208
209 // TODO: Eliminate expensive/real allocation if possible.
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 = new GraphicBuffer(renderArea.getReqWidth(), renderArea.getReqHeight(),
213 HAL_PIXEL_FORMAT_RGBA_8888, 1, usage, "screenshot");
214
215 int fd = -1;
216 status_t result =
217 mFlinger.captureScreenImplLocked(renderArea, traverseLayers, mCaptureScreenBuffer.get(),
218 useIdentityTransform, forSystem, &fd);
219 if (fd >= 0) {
220 close(fd);
221 }
222
223 EXPECT_EQ(NO_ERROR, result);
224
225 LayerCase::cleanup(this);
226}
227
228/* ------------------------------------------------------------------------
229 * Variants for each display configuration which can be tested
230 */
231
232template <typename Derived>
233struct BaseDisplayVariant {
234 static constexpr bool IS_SECURE = true;
235 static constexpr int INIT_POWER_MODE = HWC_POWER_MODE_NORMAL;
236
237 static void setupPreconditions(CompositionTest* test) {
Alec Mouriba013fa2018-10-16 12:43:11 -0700238 EXPECT_CALL(*test->mNativeWindow, query(NATIVE_WINDOW_WIDTH, _))
239 .WillRepeatedly(DoAll(SetArgPointee<1>(DEFAULT_DISPLAY_WIDTH), Return(0)));
240 EXPECT_CALL(*test->mNativeWindow, query(NATIVE_WINDOW_HEIGHT, _))
241 .WillRepeatedly(DoAll(SetArgPointee<1>(DEFAULT_DISPLAY_HEIGHT), Return(0)));
242
Dominik Laskowski075d3172018-05-24 15:50:06 -0700243 FakeHwcDisplayInjector(DEFAULT_DISPLAY_ID, HWC2::DisplayType::Physical,
244 true /* isPrimary */)
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700245 .setCapabilities(&test->mDefaultCapabilities)
246 .inject(&test->mFlinger, test->mComposer);
247
Dominik Laskowski075d3172018-05-24 15:50:06 -0700248 test->mDisplay = FakeDisplayDeviceInjector(test->mFlinger, DEFAULT_DISPLAY_ID,
249 false /* isVirtual */, true /* isPrimary */)
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700250 .setDisplaySurface(test->mDisplaySurface)
Alec Mouriba013fa2018-10-16 12:43:11 -0700251 .setNativeWindow(test->mNativeWindow)
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700252 .setSecure(Derived::IS_SECURE)
253 .setPowerMode(Derived::INIT_POWER_MODE)
254 .inject();
255 test->mDisplay->setLayerStack(DEFAULT_LAYER_STACK);
256 }
257
258 template <typename Case>
259 static void setupCommonCompositionCallExpectations(CompositionTest* test) {
260 EXPECT_CALL(*test->mComposer,
261 setColorTransform(HWC_DISPLAY, _, Hwc2::ColorTransform::IDENTITY))
262 .Times(1);
263 EXPECT_CALL(*test->mComposer, presentOrValidateDisplay(HWC_DISPLAY, _, _, _, _)).Times(1);
264 EXPECT_CALL(*test->mComposer, getDisplayRequests(HWC_DISPLAY, _, _, _)).Times(1);
265 EXPECT_CALL(*test->mComposer, acceptDisplayChanges(HWC_DISPLAY)).Times(1);
266 EXPECT_CALL(*test->mComposer, presentDisplay(HWC_DISPLAY, _)).Times(1);
267 EXPECT_CALL(*test->mComposer, getReleaseFences(HWC_DISPLAY, _, _)).Times(1);
268
269 EXPECT_CALL(*test->mRenderEngine, useNativeFenceSync()).WillRepeatedly(Return(true));
270 EXPECT_CALL(*test->mRenderEngine, checkErrors()).WillRepeatedly(Return());
271 EXPECT_CALL(*test->mRenderEngine, isCurrent()).WillRepeatedly(Return(true));
272
Alec Mouri0a9c7b82018-11-16 13:05:25 -0800273 EXPECT_CALL(*test->mRenderEngine, flush()).WillRepeatedly(Invoke([]() {
274 return base::unique_fd(0);
275 }));
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700276
277 EXPECT_CALL(*test->mDisplaySurface, onFrameCommitted()).Times(1);
278 EXPECT_CALL(*test->mDisplaySurface, advanceFrame()).Times(1);
279
280 Case::CompositionType::setupHwcSetCallExpectations(test);
281 Case::CompositionType::setupHwcGetCallExpectations(test);
282 }
283
284 template <typename Case>
285 static void setupCommonScreensCaptureCallExpectations(CompositionTest* test) {
286 // Called once with a non-null value to set a framebuffer, and then
287 // again with nullptr to clear it.
Peiyong Linfb530cf2018-12-15 05:07:38 +0000288 EXPECT_CALL(*test->mReFrameBuffer, setNativeWindowBuffer(NotNull(), false))
289 .WillOnce(Return(true));
290 EXPECT_CALL(*test->mReFrameBuffer, setNativeWindowBuffer(IsNull(), false))
291 .WillOnce(Return(true));
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700292
293 EXPECT_CALL(*test->mRenderEngine, checkErrors()).WillRepeatedly(Return());
294 EXPECT_CALL(*test->mRenderEngine, createFramebuffer())
295 .WillOnce(Return(
296 ByMove(std::unique_ptr<renderengine::Framebuffer>(test->mReFrameBuffer))));
297 EXPECT_CALL(*test->mRenderEngine, bindFrameBuffer(test->mReFrameBuffer)).Times(1);
298 EXPECT_CALL(*test->mRenderEngine, unbindFrameBuffer(test->mReFrameBuffer)).Times(1);
299 EXPECT_CALL(*test->mRenderEngine, clearWithColor(0, 0, 0, 1)).Times(1);
300 EXPECT_CALL(*test->mRenderEngine, flush()).WillOnce(Return(ByMove(base::unique_fd())));
301 EXPECT_CALL(*test->mRenderEngine, finish()).WillOnce(Return(true));
302
Peiyong Lin0e003c92018-09-17 11:09:51 -0700303 EXPECT_CALL(*test->mRenderEngine, setOutputDataSpace(_)).Times(1);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700304 EXPECT_CALL(*test->mRenderEngine, setDisplayMaxLuminance(DEFAULT_DISPLAY_MAX_LUMINANCE))
305 .Times(1);
306 // This expectation retires on saturation as setViewportAndProjection is
307 // called an extra time for the code path this setup is for.
308 // TODO: Investigate this extra call
309 EXPECT_CALL(*test->mRenderEngine,
310 setViewportAndProjection(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT,
311 Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
312 ui::Transform::ROT_0))
313 .Times(1)
314 .RetiresOnSaturation();
315 EXPECT_CALL(*test->mRenderEngine, disableTexturing()).Times(1);
316 }
317
318 static void setupNonEmptyFrameCompositionCallExpectations(CompositionTest* test) {
319 EXPECT_CALL(*test->mDisplaySurface, beginFrame(true)).Times(1);
320 }
321
322 static void setupEmptyFrameCompositionCallExpectations(CompositionTest* test) {
323 EXPECT_CALL(*test->mDisplaySurface, beginFrame(false)).Times(1);
324 }
325
326 static void setupHwcCompositionCallExpectations(CompositionTest* test) {
327 EXPECT_CALL(*test->mDisplaySurface, prepareFrame(DisplaySurface::COMPOSITION_HWC)).Times(1);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700328 }
329
330 static void setupRECompositionCallExpectations(CompositionTest* test) {
331 EXPECT_CALL(*test->mDisplaySurface, prepareFrame(DisplaySurface::COMPOSITION_GLES))
332 .Times(1);
333 EXPECT_CALL(*test->mDisplaySurface, getClientTargetAcquireFence())
334 .WillRepeatedly(ReturnRef(test->mClientTargetAcquireFence));
335
336 EXPECT_CALL(*test->mRenderEngine, setOutputDataSpace(ui::Dataspace::UNKNOWN)).Times(1);
337 EXPECT_CALL(*test->mRenderEngine, setDisplayMaxLuminance(DEFAULT_DISPLAY_MAX_LUMINANCE))
338 .Times(1);
Peiyong Lind3788632018-09-18 16:01:31 -0700339 EXPECT_CALL(*test->mRenderEngine, setColorTransform(_)).Times(2);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700340 // These expectations retire on saturation as the code path these
341 // expectations are for appears to make an extra call to them.
342 // TODO: Investigate this extra call
343 EXPECT_CALL(*test->mRenderEngine,
344 setViewportAndProjection(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT,
345 Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
346 ui::Transform::ROT_0))
Alec Mouri0a9c7b82018-11-16 13:05:25 -0800347 .Times(1);
Peiyong Linfb530cf2018-12-15 05:07:38 +0000348 EXPECT_CALL(*test->mReFrameBuffer, setNativeWindowBuffer(NotNull(), false))
349 .WillOnce(Return(true));
350 EXPECT_CALL(*test->mReFrameBuffer, setNativeWindowBuffer(IsNull(), false))
351 .WillOnce(Return(true));
Alec Mouri0a9c7b82018-11-16 13:05:25 -0800352 EXPECT_CALL(*test->mRenderEngine, createFramebuffer())
353 .WillOnce(Return(
354 ByMove(std::unique_ptr<renderengine::Framebuffer>(test->mReFrameBuffer))));
355 EXPECT_CALL(*test->mRenderEngine, bindFrameBuffer(test->mReFrameBuffer)).Times(1);
356 EXPECT_CALL(*test->mRenderEngine, unbindFrameBuffer(test->mReFrameBuffer)).Times(1);
357 EXPECT_CALL(*test->mNativeWindow, queueBuffer(_, _)).WillOnce(Return(0));
358 EXPECT_CALL(*test->mNativeWindow, dequeueBuffer(_, _))
359 .WillOnce(DoAll(SetArgPointee<0>(test->mNativeWindowBuffer), SetArgPointee<1>(-1),
360 Return(0)));
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700361 }
362
363 template <typename Case>
364 static void setupRELayerCompositionCallExpectations(CompositionTest* test) {
365 Case::Layer::setupRECompositionCallExpectations(test);
366 }
367
368 template <typename Case>
369 static void setupRELayerScreenshotCompositionCallExpectations(CompositionTest* test) {
370 Case::Layer::setupREScreenshotCompositionCallExpectations(test);
371
372 EXPECT_CALL(*test->mRenderEngine, isCurrent()).WillRepeatedly(Return(true));
373 }
374};
375
376struct DefaultDisplaySetupVariant : public BaseDisplayVariant<DefaultDisplaySetupVariant> {};
377
378struct InsecureDisplaySetupVariant : public BaseDisplayVariant<InsecureDisplaySetupVariant> {
379 static constexpr bool IS_SECURE = false;
380
381 template <typename Case>
382 static void setupRELayerCompositionCallExpectations(CompositionTest* test) {
383 Case::Layer::setupInsecureRECompositionCallExpectations(test);
384
385 // TODO: Investigate this extra call
386 EXPECT_CALL(*test->mRenderEngine, disableScissor()).Times(1);
387 }
388
389 template <typename Case>
390 static void setupRELayerScreenshotCompositionCallExpectations(CompositionTest* test) {
391 Case::Layer::setupInsecureREScreenshotCompositionCallExpectations(test);
392
393 EXPECT_CALL(*test->mRenderEngine, isCurrent()).WillRepeatedly(Return(true));
394 }
395};
396
397struct PoweredOffDisplaySetupVariant : public BaseDisplayVariant<PoweredOffDisplaySetupVariant> {
398 static constexpr int INIT_POWER_MODE = HWC_POWER_MODE_OFF;
399
400 template <typename Case>
401 static void setupCommonCompositionCallExpectations(CompositionTest* test) {
402 // TODO: This seems like an unnecessary call if display is powered off.
403 EXPECT_CALL(*test->mComposer,
404 setColorTransform(HWC_DISPLAY, _, Hwc2::ColorTransform::IDENTITY))
405 .Times(1);
406
407 // TODO: This seems like an unnecessary call if display is powered off.
408 Case::CompositionType::setupHwcSetCallExpectations(test);
409 }
410
411 static void setupHwcCompositionCallExpectations(CompositionTest*) {}
412
413 static void setupRECompositionCallExpectations(CompositionTest* test) {
414 // TODO: This seems like an unnecessary call if display is powered off.
415 EXPECT_CALL(*test->mDisplaySurface, getClientTargetAcquireFence())
416 .WillRepeatedly(ReturnRef(test->mClientTargetAcquireFence));
417 }
418
419 template <typename Case>
420 static void setupRELayerCompositionCallExpectations(CompositionTest*) {}
421};
422
423/* ------------------------------------------------------------------------
424 * Variants for each layer configuration which can be tested
425 */
426
427template <typename LayerProperties>
428struct BaseLayerProperties {
429 static constexpr uint32_t WIDTH = 100;
430 static constexpr uint32_t HEIGHT = 100;
431 static constexpr PixelFormat FORMAT = PIXEL_FORMAT_RGBA_8888;
432 static constexpr uint64_t USAGE =
433 GraphicBuffer::USAGE_SW_READ_NEVER | GraphicBuffer::USAGE_SW_WRITE_NEVER;
434 static constexpr android_dataspace DATASPACE = HAL_DATASPACE_UNKNOWN;
435 static constexpr uint32_t SCALING_MODE = 0;
436 static constexpr uint32_t TRANSFORM = 0;
437 static constexpr uint32_t LAYER_FLAGS = 0;
438 static constexpr float COLOR[] = {1.f, 1.f, 1.f, 1.f};
439 static constexpr IComposerClient::BlendMode BLENDMODE =
440 IComposerClient::BlendMode::PREMULTIPLIED;
441
442 static void enqueueBuffer(CompositionTest*, sp<BufferQueueLayer> layer) {
443 auto producer = layer->getProducer();
444
445 IGraphicBufferProducer::QueueBufferOutput qbo;
446 status_t result = producer->connect(nullptr, NATIVE_WINDOW_API_EGL, false, &qbo);
447 if (result != NO_ERROR) {
448 ALOGE("Failed to connect() (%d)", result);
449 return;
450 }
451
452 int slot;
453 sp<Fence> fence;
454 result = producer->dequeueBuffer(&slot, &fence, LayerProperties::WIDTH,
455 LayerProperties::HEIGHT, LayerProperties::FORMAT,
456 LayerProperties::USAGE, nullptr, nullptr);
457 if (result != IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION) {
458 ALOGE("Failed to dequeueBuffer() (%d)", result);
459 return;
460 }
461
462 sp<GraphicBuffer> buffer;
463 result = producer->requestBuffer(slot, &buffer);
464 if (result != NO_ERROR) {
465 ALOGE("Failed to requestBuffer() (%d)", result);
466 return;
467 }
468
469 IGraphicBufferProducer::QueueBufferInput qbi(systemTime(), false /* isAutoTimestamp */,
470 LayerProperties::DATASPACE,
471 Rect(LayerProperties::WIDTH,
472 LayerProperties::HEIGHT),
473 LayerProperties::SCALING_MODE,
474 LayerProperties::TRANSFORM, Fence::NO_FENCE);
475 result = producer->queueBuffer(slot, qbi, &qbo);
476 if (result != NO_ERROR) {
477 ALOGE("Failed to queueBuffer (%d)", result);
478 return;
479 }
480 }
481
482 static void setupLatchedBuffer(CompositionTest* test, sp<BufferQueueLayer> layer) {
483 // TODO: Eliminate the complexity of actually creating a buffer
484 EXPECT_CALL(*test->mRenderEngine, getMaxTextureSize()).WillOnce(Return(16384));
485 EXPECT_CALL(*test->mRenderEngine, getMaxViewportDims()).WillOnce(Return(16384));
486 status_t err =
487 layer->setDefaultBufferProperties(LayerProperties::WIDTH, LayerProperties::HEIGHT,
488 LayerProperties::FORMAT);
489 ASSERT_EQ(NO_ERROR, err);
490 Mock::VerifyAndClear(test->mRenderEngine);
491
492 EXPECT_CALL(*test->mMessageQueue, invalidate()).Times(1);
493 enqueueBuffer(test, layer);
494 Mock::VerifyAndClear(test->mMessageQueue);
495
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700496 EXPECT_CALL(*test->mRenderEngine, useNativeFenceSync()).WillRepeatedly(Return(true));
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700497 bool ignoredRecomputeVisibleRegions;
Alec Mouri86770e52018-09-24 22:40:58 +0000498 layer->latchBuffer(ignoredRecomputeVisibleRegions, 0, Fence::NO_FENCE);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700499 Mock::VerifyAndClear(test->mRenderEngine);
500 Mock::VerifyAndClear(test->mReImage);
501 }
502
503 static void setupLayerState(CompositionTest* test, sp<BufferQueueLayer> layer) {
504 setupLatchedBuffer(test, layer);
505 }
506
507 static void setupBufferLayerPostFrameCallExpectations(CompositionTest* test) {
508 // BufferLayer::onPostComposition(), when there is no present fence
509 EXPECT_CALL(*test->mComposer, getActiveConfig(HWC_DISPLAY, _))
510 .WillOnce(DoAll(SetArgPointee<1>(DEFAULT_CONFIG_ID), Return(Error::NONE)));
511 }
512
513 static void setupHwcSetGeometryCallExpectations(CompositionTest* test) {
514 // TODO: Coverage of other values
515 EXPECT_CALL(*test->mComposer,
516 setLayerBlendMode(HWC_DISPLAY, HWC_LAYER, LayerProperties::BLENDMODE))
517 .Times(1);
518 // TODO: Coverage of other values for origin
519 EXPECT_CALL(*test->mComposer,
520 setLayerDisplayFrame(HWC_DISPLAY, HWC_LAYER,
521 IComposerClient::Rect({0, 0, LayerProperties::WIDTH,
522 LayerProperties::HEIGHT})))
523 .Times(1);
524 EXPECT_CALL(*test->mComposer,
525 setLayerPlaneAlpha(HWC_DISPLAY, HWC_LAYER, LayerProperties::COLOR[3]))
526 .Times(1);
527 // TODO: Coverage of other values
528 EXPECT_CALL(*test->mComposer, setLayerZOrder(HWC_DISPLAY, HWC_LAYER, 0u)).Times(1);
529 // TODO: Coverage of other values
530 EXPECT_CALL(*test->mComposer, setLayerInfo(HWC_DISPLAY, HWC_LAYER, 0u, 0u)).Times(1);
531
532 // These expectations retire on saturation as the code path these
533 // expectations are for appears to make an extra call to them.
534 // TODO: Investigate this extra call
535 EXPECT_CALL(*test->mComposer, setLayerTransform(HWC_DISPLAY, HWC_LAYER, DEFAULT_TRANSFORM))
David Sodman15094112018-10-11 09:39:37 -0700536 .Times(AtLeast(1))
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700537 .RetiresOnSaturation();
538 }
539
540 static void setupHwcSetSourceCropBufferCallExpectations(CompositionTest* test) {
541 EXPECT_CALL(*test->mComposer,
542 setLayerSourceCrop(HWC_DISPLAY, HWC_LAYER,
543 IComposerClient::FRect({0.f, 0.f, LayerProperties::WIDTH,
544 LayerProperties::HEIGHT})))
545 .Times(1);
546 }
547
548 static void setupHwcSetSourceCropColorCallExpectations(CompositionTest* test) {
549 EXPECT_CALL(*test->mComposer,
550 setLayerSourceCrop(HWC_DISPLAY, HWC_LAYER,
551 IComposerClient::FRect({0.f, 0.f, 0.f, 0.f})))
552 .Times(1);
553 }
554
555 static void setupHwcSetPerFrameCallExpectations(CompositionTest* test) {
556 EXPECT_CALL(*test->mComposer,
557 setLayerVisibleRegion(HWC_DISPLAY, HWC_LAYER,
558 std::vector<IComposerClient::Rect>({IComposerClient::Rect(
559 {0, 0, LayerProperties::WIDTH,
560 LayerProperties::HEIGHT})})))
561 .Times(1);
562 }
563
564 static void setupHwcSetPerFrameColorCallExpectations(CompositionTest* test) {
565 EXPECT_CALL(*test->mComposer, setLayerSurfaceDamage(HWC_DISPLAY, HWC_LAYER, _)).Times(1);
566
567 // TODO: use COLOR
568 EXPECT_CALL(*test->mComposer,
569 setLayerColor(HWC_DISPLAY, HWC_LAYER,
570 IComposerClient::Color({0xff, 0xff, 0xff, 0xff})))
571 .Times(1);
572
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700573 }
574
575 static void setupHwcSetPerFrameBufferCallExpectations(CompositionTest* test) {
576 EXPECT_CALL(*test->mComposer, setLayerSurfaceDamage(HWC_DISPLAY, HWC_LAYER, _)).Times(1);
577 EXPECT_CALL(*test->mComposer, setLayerBuffer(HWC_DISPLAY, HWC_LAYER, _, _, _)).Times(1);
578
579 setupBufferLayerPostFrameCallExpectations(test);
580 }
581
582 static void setupREBufferCompositionCommonCallExpectations(CompositionTest* test) {
583 EXPECT_CALL(*test->mRenderEngine,
584 setupLayerBlending(true, false, false,
585 half4(LayerProperties::COLOR[0], LayerProperties::COLOR[1],
Lucas Dupin1b6531c2018-07-05 17:18:21 -0700586 LayerProperties::COLOR[2], LayerProperties::COLOR[3]),
587 0.0f))
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700588 .Times(1);
589
Alec Mouri39801c02018-10-10 10:44:47 -0700590 EXPECT_CALL(*test->mRenderEngine, createImage())
591 .WillOnce(Return(ByMove(std::unique_ptr<renderengine::Image>(test->mReImage))));
592 EXPECT_CALL(*test->mReImage, setNativeWindowBuffer(_, _)).WillOnce(Return(true));
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700593 EXPECT_CALL(*test->mRenderEngine, bindExternalTextureImage(DEFAULT_TEXTURE_ID, _)).Times(1);
594 EXPECT_CALL(*test->mRenderEngine, setupLayerTexturing(_)).Times(1);
595 EXPECT_CALL(*test->mRenderEngine, setSourceDataSpace(ui::Dataspace::UNKNOWN)).Times(1);
596 EXPECT_CALL(*test->mRenderEngine, drawMesh(_)).Times(1);
597 EXPECT_CALL(*test->mRenderEngine, disableBlending()).Times(1);
598 EXPECT_CALL(*test->mRenderEngine, setSourceY410BT2020(false)).Times(1);
599 // This call retires on saturation as the code that renders a texture disables the state,
600 // along with a top-level disable to ensure it is disabled for non-buffer layers.
601 EXPECT_CALL(*test->mRenderEngine, disableTexturing()).Times(1).RetiresOnSaturation();
602 }
603
604 static void setupREBufferCompositionCallExpectations(CompositionTest* test) {
605 LayerProperties::setupREBufferCompositionCommonCallExpectations(test);
606
607 // TODO - Investigate and eliminate these differences between display
608 // composition and screenshot composition.
609 EXPECT_CALL(*test->mRenderEngine, disableScissor()).Times(1);
610 }
611
612 static void setupInsecureREBufferCompositionCallExpectations(CompositionTest* test) {
613 setupREBufferCompositionCallExpectations(test);
614 }
615
616 static void setupREBufferScreenshotCompositionCallExpectations(CompositionTest* test) {
617 LayerProperties::setupREBufferCompositionCommonCallExpectations(test);
618 }
619
620 static void setupInsecureREBufferScreenshotCompositionCallExpectations(CompositionTest* test) {
621 LayerProperties::setupREBufferCompositionCommonCallExpectations(test);
622 }
623
624 static void setupREColorCompositionCommonCallExpectations(CompositionTest* test) {
625 EXPECT_CALL(*test->mRenderEngine, disableScissor()).Times(1);
626 }
627
628 static void setupREColorCompositionCallExpectations(CompositionTest* test) {
629 EXPECT_CALL(*test->mRenderEngine, setSourceDataSpace(ui::Dataspace::UNKNOWN)).Times(1);
630 EXPECT_CALL(*test->mRenderEngine,
631 setupLayerBlending(true, false, true,
632 half4(LayerProperties::COLOR[0], LayerProperties::COLOR[1],
Lucas Dupin1b6531c2018-07-05 17:18:21 -0700633 LayerProperties::COLOR[2], LayerProperties::COLOR[3]),
634 0.0f))
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700635 .Times(1);
636 EXPECT_CALL(*test->mRenderEngine, drawMesh(_)).Times(1);
637 EXPECT_CALL(*test->mRenderEngine, disableBlending()).Times(1);
638 }
639
640 static void setupREColorScreenshotCompositionCallExpectations(CompositionTest* test) {
641 setupREColorCompositionCallExpectations(test);
642 }
643};
644
645struct DefaultLayerProperties : public BaseLayerProperties<DefaultLayerProperties> {};
646
647struct ColorLayerProperties : public BaseLayerProperties<ColorLayerProperties> {};
648
649struct SidebandLayerProperties : public BaseLayerProperties<SidebandLayerProperties> {
650 using Base = BaseLayerProperties<SidebandLayerProperties>;
651 static constexpr IComposerClient::BlendMode BLENDMODE = IComposerClient::BlendMode::NONE;
652
653 static void setupLayerState(CompositionTest* test, sp<BufferQueueLayer> layer) {
654 sp<NativeHandle> stream =
655 NativeHandle::create(reinterpret_cast<native_handle_t*>(DEFAULT_SIDEBAND_STREAM),
656 false);
657 test->mFlinger.setLayerSidebandStream(layer, stream);
658 }
659
660 static void setupHwcSetSourceCropBufferCallExpectations(CompositionTest* test) {
661 EXPECT_CALL(*test->mComposer,
662 setLayerSourceCrop(HWC_DISPLAY, HWC_LAYER,
663 IComposerClient::FRect({0.f, 0.f, -1.f, -1.f})))
664 .Times(1);
665 }
666
667 static void setupHwcSetPerFrameBufferCallExpectations(CompositionTest* test) {
668 EXPECT_CALL(*test->mComposer,
669 setLayerSidebandStream(HWC_DISPLAY, HWC_LAYER,
670 reinterpret_cast<native_handle_t*>(
671 DEFAULT_SIDEBAND_STREAM)))
672 .WillOnce(Return(Error::NONE));
673
674 EXPECT_CALL(*test->mComposer, setLayerSurfaceDamage(HWC_DISPLAY, HWC_LAYER, _)).Times(1);
675 }
676
677 static void setupREBufferCompositionCommonCallExpectations(CompositionTest* test) {
678 EXPECT_CALL(*test->mRenderEngine, setupFillWithColor(0, 0, 0, 1)).Times(1);
679 EXPECT_CALL(*test->mRenderEngine, drawMesh(_)).Times(1);
680 }
681};
682
683struct SecureLayerProperties : public BaseLayerProperties<SecureLayerProperties> {
684 using Base = BaseLayerProperties<SecureLayerProperties>;
685
686 static constexpr uint32_t LAYER_FLAGS = ISurfaceComposerClient::eSecure;
687
688 static void setupInsecureREBufferCompositionCommonCallExpectations(CompositionTest* test) {
Alec Mouri39801c02018-10-10 10:44:47 -0700689 EXPECT_CALL(*test->mRenderEngine, createImage())
690 .WillOnce(Return(ByMove(std::unique_ptr<renderengine::Image>(test->mReImage))));
691 EXPECT_CALL(*test->mReImage, setNativeWindowBuffer(_, _)).WillOnce(Return(true));
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700692 EXPECT_CALL(*test->mRenderEngine, bindExternalTextureImage(DEFAULT_TEXTURE_ID, _)).Times(1);
693 EXPECT_CALL(*test->mRenderEngine, setupLayerBlackedOut()).Times(1);
694
695 EXPECT_CALL(*test->mRenderEngine,
696 setupLayerBlending(true, false, false,
697 half4(Base::COLOR[0], Base::COLOR[1], Base::COLOR[2],
Lucas Dupin1b6531c2018-07-05 17:18:21 -0700698 Base::COLOR[3]), 0.0f))
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700699 .Times(1);
700 EXPECT_CALL(*test->mRenderEngine, setSourceDataSpace(ui::Dataspace::UNKNOWN)).Times(1);
701 EXPECT_CALL(*test->mRenderEngine, drawMesh(_)).Times(1);
702 EXPECT_CALL(*test->mRenderEngine, disableBlending()).Times(1);
703 EXPECT_CALL(*test->mRenderEngine, setSourceY410BT2020(false)).Times(1);
704 // This call retires on saturation as the code that renders a texture disables the state,
705 // along with a top-level disable to ensure it is disabled for non-buffer layers.
706 EXPECT_CALL(*test->mRenderEngine, disableTexturing()).Times(1).RetiresOnSaturation();
707 }
708
709 static void setupInsecureREBufferCompositionCallExpectations(CompositionTest* test) {
710 setupInsecureREBufferCompositionCommonCallExpectations(test);
711 Base::setupBufferLayerPostFrameCallExpectations(test);
712 }
713
714 static void setupInsecureREBufferScreenshotCompositionCallExpectations(CompositionTest* test) {
715 setupInsecureREBufferCompositionCommonCallExpectations(test);
716 }
717};
718
719struct CursorLayerProperties : public BaseLayerProperties<CursorLayerProperties> {
720 using Base = BaseLayerProperties<CursorLayerProperties>;
721
722 static void setupLayerState(CompositionTest* test, sp<BufferQueueLayer> layer) {
723 Base::setupLayerState(test, layer);
724 test->mFlinger.setLayerPotentialCursor(layer, true);
725 }
726};
727
728struct NoLayerVariant {
729 using FlingerLayerType = sp<BufferQueueLayer>;
730
731 static FlingerLayerType createLayer(CompositionTest*) { return FlingerLayerType(); }
732 static void injectLayer(CompositionTest*, FlingerLayerType) {}
733 static void cleanupInjectedLayers(CompositionTest*) {}
734
735 static void setupCallExpectationsForDirtyGeometry(CompositionTest*) {}
736 static void setupCallExpectationsForDirtyFrame(CompositionTest*) {}
737};
738
739template <typename LayerProperties>
740struct BaseLayerVariant {
741 template <typename L, typename F>
742 static sp<L> createLayerWithFactory(CompositionTest* test, F factory) {
743 EXPECT_CALL(*test->mMessageQueue, postMessage(_, 0)).Times(0);
744
745 sp<L> layer = factory();
746
747 Mock::VerifyAndClear(test->mComposer);
748 Mock::VerifyAndClear(test->mRenderEngine);
749 Mock::VerifyAndClear(test->mMessageQueue);
750
751 auto& layerDrawingState = test->mFlinger.mutableLayerDrawingState(layer);
752 layerDrawingState.layerStack = DEFAULT_LAYER_STACK;
753 layerDrawingState.active.w = 100;
754 layerDrawingState.active.h = 100;
755 layerDrawingState.color = half4(LayerProperties::COLOR[0], LayerProperties::COLOR[1],
756 LayerProperties::COLOR[2], LayerProperties::COLOR[3]);
757
758 layer->setVisibleRegion(Region(Rect(0, 0, 100, 100)));
759
760 return layer;
761 }
762
763 static void injectLayer(CompositionTest* test, sp<Layer> layer) {
764 EXPECT_CALL(*test->mComposer, createLayer(HWC_DISPLAY, _))
765 .WillOnce(DoAll(SetArgPointee<1>(HWC_LAYER), Return(Error::NONE)));
766
Dominik Laskowski075d3172018-05-24 15:50:06 -0700767 const auto displayId = test->mDisplay->getId();
768 ASSERT_TRUE(displayId);
Lloyd Pique441d5042018-10-18 16:49:51 -0700769 layer->createHwcLayer(&test->mFlinger.getHwComposer(), *displayId);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700770
771 Mock::VerifyAndClear(test->mComposer);
772
773 Vector<sp<Layer>> layers;
774 layers.add(layer);
775 test->mDisplay->setVisibleLayersSortedByZ(layers);
776 test->mFlinger.mutableDrawingState().layersSortedByZ.add(layer);
777 }
778
779 static void cleanupInjectedLayers(CompositionTest* test) {
780 EXPECT_CALL(*test->mComposer, destroyLayer(HWC_DISPLAY, HWC_LAYER))
781 .WillOnce(Return(Error::NONE));
Dominik Laskowski075d3172018-05-24 15:50:06 -0700782 const auto displayId = test->mDisplay->getId();
783 ASSERT_TRUE(displayId);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700784 for (auto layer : test->mFlinger.mutableDrawingState().layersSortedByZ) {
Dominik Laskowski075d3172018-05-24 15:50:06 -0700785 layer->destroyHwcLayer(*displayId);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700786 }
787 test->mFlinger.mutableDrawingState().layersSortedByZ.clear();
788 }
789};
790
791template <typename LayerProperties>
792struct ColorLayerVariant : public BaseLayerVariant<LayerProperties> {
793 using Base = BaseLayerVariant<LayerProperties>;
794 using FlingerLayerType = sp<ColorLayer>;
795
796 static FlingerLayerType createLayer(CompositionTest* test) {
797 FlingerLayerType layer = Base::template createLayerWithFactory<ColorLayer>(test, [test]() {
Lloyd Pique42ab75e2018-09-12 20:46:03 -0700798 return new ColorLayer(LayerCreationArgs(test->mFlinger.mFlinger.get(), sp<Client>(),
799 String8("test-layer"), LayerProperties::WIDTH,
800 LayerProperties::HEIGHT,
801 LayerProperties::LAYER_FLAGS));
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700802 });
Vishnu Nair60356342018-11-13 13:00:45 -0800803
804 auto& layerDrawingState = test->mFlinger.mutableLayerDrawingState(layer);
805 layerDrawingState.crop_legacy = Rect(0, 0, LayerProperties::HEIGHT, LayerProperties::WIDTH);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700806 return layer;
807 }
808
809 static void setupRECompositionCallExpectations(CompositionTest* test) {
810 LayerProperties::setupREColorCompositionCommonCallExpectations(test);
811 LayerProperties::setupREColorCompositionCallExpectations(test);
812 }
813
814 static void setupREScreenshotCompositionCallExpectations(CompositionTest* test) {
815 LayerProperties::setupREColorScreenshotCompositionCallExpectations(test);
816 }
817
818 static void setupCallExpectationsForDirtyGeometry(CompositionTest* test) {
819 LayerProperties::setupHwcSetGeometryCallExpectations(test);
820 LayerProperties::setupHwcSetSourceCropColorCallExpectations(test);
821 }
822
823 static void setupCallExpectationsForDirtyFrame(CompositionTest* test) {
824 LayerProperties::setupHwcSetPerFrameCallExpectations(test);
825 LayerProperties::setupHwcSetPerFrameColorCallExpectations(test);
826 }
827};
828
829template <typename LayerProperties>
830struct BufferLayerVariant : public BaseLayerVariant<LayerProperties> {
831 using Base = BaseLayerVariant<LayerProperties>;
832 using FlingerLayerType = sp<BufferQueueLayer>;
833
834 static FlingerLayerType createLayer(CompositionTest* test) {
835 test->mFlinger.mutableTexturePool().push_back(DEFAULT_TEXTURE_ID);
836
837 FlingerLayerType layer =
838 Base::template createLayerWithFactory<BufferQueueLayer>(test, [test]() {
Lloyd Pique42ab75e2018-09-12 20:46:03 -0700839 return new BufferQueueLayer(
840 LayerCreationArgs(test->mFlinger.mFlinger.get(), sp<Client>(),
841 String8("test-layer"), LayerProperties::WIDTH,
842 LayerProperties::HEIGHT,
843 LayerProperties::LAYER_FLAGS));
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700844 });
845
846 LayerProperties::setupLayerState(test, layer);
847
848 return layer;
849 }
850
851 static void cleanupInjectedLayers(CompositionTest* test) {
852 EXPECT_CALL(*test->mMessageQueue, postMessage(_, 0)).Times(2);
853 Base::cleanupInjectedLayers(test);
854 }
855
856 static void setupCallExpectationsForDirtyGeometry(CompositionTest* test) {
857 LayerProperties::setupHwcSetGeometryCallExpectations(test);
858 LayerProperties::setupHwcSetSourceCropBufferCallExpectations(test);
859 }
860
861 static void setupCallExpectationsForDirtyFrame(CompositionTest* test) {
862 LayerProperties::setupHwcSetPerFrameCallExpectations(test);
863 LayerProperties::setupHwcSetPerFrameBufferCallExpectations(test);
864 }
865
866 static void setupRECompositionCallExpectations(CompositionTest* test) {
867 LayerProperties::setupREBufferCompositionCallExpectations(test);
868 }
869
870 static void setupInsecureRECompositionCallExpectations(CompositionTest* test) {
871 LayerProperties::setupInsecureREBufferCompositionCallExpectations(test);
872 }
873
874 static void setupREScreenshotCompositionCallExpectations(CompositionTest* test) {
875 LayerProperties::setupREBufferScreenshotCompositionCallExpectations(test);
876 }
877
878 static void setupInsecureREScreenshotCompositionCallExpectations(CompositionTest* test) {
879 LayerProperties::setupInsecureREBufferScreenshotCompositionCallExpectations(test);
880 }
881};
882
883/* ------------------------------------------------------------------------
884 * Variants to control how the composition type is changed
885 */
886
887struct NoCompositionTypeVariant {
888 static void setupHwcSetCallExpectations(CompositionTest*) {}
889
890 static void setupHwcGetCallExpectations(CompositionTest* test) {
891 EXPECT_CALL(*test->mComposer, getChangedCompositionTypes(HWC_DISPLAY, _, _)).Times(1);
892 }
893};
894
895template <IComposerClient::Composition CompositionType>
896struct KeepCompositionTypeVariant {
897 static constexpr HWC2::Composition TYPE = static_cast<HWC2::Composition>(CompositionType);
898
899 static void setupHwcSetCallExpectations(CompositionTest* test) {
900 EXPECT_CALL(*test->mComposer,
901 setLayerCompositionType(HWC_DISPLAY, HWC_LAYER, CompositionType))
902 .Times(1);
903 }
904
905 static void setupHwcGetCallExpectations(CompositionTest* test) {
906 EXPECT_CALL(*test->mComposer, getChangedCompositionTypes(HWC_DISPLAY, _, _)).Times(1);
907 }
908};
909
910template <IComposerClient::Composition InitialCompositionType,
911 IComposerClient::Composition FinalCompositionType>
912struct ChangeCompositionTypeVariant {
913 static constexpr HWC2::Composition TYPE = static_cast<HWC2::Composition>(FinalCompositionType);
914
915 static void setupHwcSetCallExpectations(CompositionTest* test) {
916 EXPECT_CALL(*test->mComposer,
917 setLayerCompositionType(HWC_DISPLAY, HWC_LAYER, InitialCompositionType))
918 .Times(1);
919 }
920
921 static void setupHwcGetCallExpectations(CompositionTest* test) {
922 EXPECT_CALL(*test->mComposer, getChangedCompositionTypes(HWC_DISPLAY, _, _))
923 .WillOnce(DoAll(SetArgPointee<1>(std::vector<Hwc2::Layer>{
924 static_cast<Hwc2::Layer>(HWC_LAYER)}),
925 SetArgPointee<2>(std::vector<IComposerClient::Composition>{
926 FinalCompositionType}),
927 Return(Error::NONE)));
928 }
929};
930
931/* ------------------------------------------------------------------------
932 * Variants to select how the composition is expected to be handled
933 */
934
935struct CompositionResultBaseVariant {
936 static void setupLayerState(CompositionTest*, sp<Layer>) {}
937
938 template <typename Case>
939 static void setupCallExpectationsForDirtyGeometry(CompositionTest* test) {
940 Case::Layer::setupCallExpectationsForDirtyGeometry(test);
941 }
942
943 template <typename Case>
944 static void setupCallExpectationsForDirtyFrame(CompositionTest* test) {
945 Case::Layer::setupCallExpectationsForDirtyFrame(test);
946 }
947};
948
949struct NoCompositionResultVariant : public CompositionResultBaseVariant {
950 template <typename Case>
951 static void setupCallExpectations(CompositionTest* test) {
952 Case::Display::setupEmptyFrameCompositionCallExpectations(test);
953 Case::Display::setupHwcCompositionCallExpectations(test);
954 }
955};
956
957struct HwcCompositionResultVariant : public CompositionResultBaseVariant {
958 template <typename Case>
959 static void setupCallExpectations(CompositionTest* test) {
960 Case::Display::setupNonEmptyFrameCompositionCallExpectations(test);
961 Case::Display::setupHwcCompositionCallExpectations(test);
962 }
963};
964
965struct RECompositionResultVariant : public CompositionResultBaseVariant {
966 template <typename Case>
967 static void setupCallExpectations(CompositionTest* test) {
968 Case::Display::setupNonEmptyFrameCompositionCallExpectations(test);
969 Case::Display::setupRECompositionCallExpectations(test);
970 Case::Display::template setupRELayerCompositionCallExpectations<Case>(test);
971 }
972};
973
974struct ForcedClientCompositionResultVariant : public RECompositionResultVariant {
975 static void setupLayerState(CompositionTest*, sp<Layer> layer) {
Dominik Laskowski075d3172018-05-24 15:50:06 -0700976 layer->forceClientComposition(DEFAULT_DISPLAY_ID);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700977 }
978
979 template <typename Case>
980 static void setupCallExpectationsForDirtyGeometry(CompositionTest*) {}
981
982 template <typename Case>
983 static void setupCallExpectationsForDirtyFrame(CompositionTest*) {}
984};
985
986struct EmptyScreenshotResultVariant {
987 static void setupLayerState(CompositionTest*, sp<Layer>) {}
988
989 template <typename Case>
990 static void setupCallExpectations(CompositionTest*) {}
991};
992
993struct REScreenshotResultVariant : public EmptyScreenshotResultVariant {
994 using Base = EmptyScreenshotResultVariant;
995
996 template <typename Case>
997 static void setupCallExpectations(CompositionTest* test) {
998 Base::template setupCallExpectations<Case>(test);
999 Case::Display::template setupRELayerScreenshotCompositionCallExpectations<Case>(test);
1000 }
1001};
1002
1003/* ------------------------------------------------------------------------
1004 * Composition test case, containing all the variants being tested
1005 */
1006
1007template <typename DisplayCase, typename LayerCase, typename CompositionTypeCase,
1008 typename CompositionResultCase>
1009struct CompositionCase {
1010 using ThisCase =
1011 CompositionCase<DisplayCase, LayerCase, CompositionTypeCase, CompositionResultCase>;
1012 using Display = DisplayCase;
1013 using Layer = LayerCase;
1014 using CompositionType = CompositionTypeCase;
1015 using CompositionResult = CompositionResultCase;
1016
1017 static void setupCommon(CompositionTest* test) {
1018 Display::setupPreconditions(test);
1019
1020 auto layer = Layer::createLayer(test);
1021 Layer::injectLayer(test, layer);
1022 CompositionResult::setupLayerState(test, layer);
1023 }
1024
1025 static void setupForDirtyGeometry(CompositionTest* test) {
1026 setupCommon(test);
1027
1028 Display::template setupCommonCompositionCallExpectations<ThisCase>(test);
1029 CompositionResult::template setupCallExpectationsForDirtyGeometry<ThisCase>(test);
1030 CompositionResult::template setupCallExpectationsForDirtyFrame<ThisCase>(test);
1031 CompositionResult::template setupCallExpectations<ThisCase>(test);
1032 }
1033
1034 static void setupForDirtyFrame(CompositionTest* test) {
1035 setupCommon(test);
1036
1037 Display::template setupCommonCompositionCallExpectations<ThisCase>(test);
1038 CompositionResult::template setupCallExpectationsForDirtyFrame<ThisCase>(test);
1039 CompositionResult::template setupCallExpectations<ThisCase>(test);
1040 }
1041
1042 static void setupForScreenCapture(CompositionTest* test) {
1043 setupCommon(test);
1044
1045 Display::template setupCommonScreensCaptureCallExpectations<ThisCase>(test);
1046 CompositionResult::template setupCallExpectations<ThisCase>(test);
1047 }
1048
1049 static void cleanup(CompositionTest* test) {
1050 Layer::cleanupInjectedLayers(test);
1051
1052 for (auto& hwcDisplay : test->mFlinger.mFakeHwcDisplays) {
1053 hwcDisplay->mutableLayers().clear();
1054 }
1055
1056 test->mDisplay->setVisibleLayersSortedByZ(Vector<sp<android::Layer>>());
1057 }
1058};
1059
1060/* ------------------------------------------------------------------------
1061 * Composition cases to test
1062 */
1063
1064TEST_F(CompositionTest, noLayersDoesMinimalWorkWithDirtyGeometry) {
1065 displayRefreshCompositionDirtyGeometry<
1066 CompositionCase<DefaultDisplaySetupVariant, NoLayerVariant, NoCompositionTypeVariant,
1067 NoCompositionResultVariant>>();
1068}
1069
1070TEST_F(CompositionTest, noLayersDoesMinimalWorkWithDirtyFrame) {
1071 displayRefreshCompositionDirtyFrame<
1072 CompositionCase<DefaultDisplaySetupVariant, NoLayerVariant, NoCompositionTypeVariant,
1073 NoCompositionResultVariant>>();
1074}
1075
1076TEST_F(CompositionTest, noLayersDoesMinimalWorkToCaptureScreen) {
1077 captureScreenComposition<
1078 CompositionCase<DefaultDisplaySetupVariant, NoLayerVariant, NoCompositionTypeVariant,
1079 EmptyScreenshotResultVariant>>();
1080}
1081
1082/* ------------------------------------------------------------------------
1083 * Simple buffer layers
1084 */
1085
1086TEST_F(CompositionTest, HWCComposedNormalBufferLayerWithDirtyGeometry) {
1087 displayRefreshCompositionDirtyGeometry<
1088 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1089 KeepCompositionTypeVariant<IComposerClient::Composition::DEVICE>,
1090 HwcCompositionResultVariant>>();
1091}
1092
1093TEST_F(CompositionTest, HWCComposedNormalBufferLayerWithDirtyFrame) {
1094 displayRefreshCompositionDirtyFrame<
1095 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1096 KeepCompositionTypeVariant<IComposerClient::Composition::DEVICE>,
1097 HwcCompositionResultVariant>>();
1098}
1099
1100TEST_F(CompositionTest, REComposedNormalBufferLayer) {
1101 displayRefreshCompositionDirtyFrame<
1102 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1103 ChangeCompositionTypeVariant<IComposerClient::Composition::DEVICE,
1104 IComposerClient::Composition::CLIENT>,
1105 RECompositionResultVariant>>();
1106}
1107
1108TEST_F(CompositionTest, captureScreenNormalBufferLayer) {
1109 captureScreenComposition<
1110 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1111 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1112}
1113
1114/* ------------------------------------------------------------------------
1115 * Single-color layers
1116 */
1117
1118TEST_F(CompositionTest, HWCComposedColorLayerWithDirtyGeometry) {
1119 displayRefreshCompositionDirtyGeometry<
1120 CompositionCase<DefaultDisplaySetupVariant, ColorLayerVariant<ColorLayerProperties>,
1121 KeepCompositionTypeVariant<IComposerClient::Composition::SOLID_COLOR>,
1122 HwcCompositionResultVariant>>();
1123}
1124
1125TEST_F(CompositionTest, HWCComposedColorLayerWithDirtyFrame) {
1126 displayRefreshCompositionDirtyFrame<
1127 CompositionCase<DefaultDisplaySetupVariant, ColorLayerVariant<ColorLayerProperties>,
1128 KeepCompositionTypeVariant<IComposerClient::Composition::SOLID_COLOR>,
1129 HwcCompositionResultVariant>>();
1130}
1131
1132TEST_F(CompositionTest, REComposedColorLayer) {
1133 displayRefreshCompositionDirtyFrame<
1134 CompositionCase<DefaultDisplaySetupVariant, ColorLayerVariant<ColorLayerProperties>,
1135 ChangeCompositionTypeVariant<IComposerClient::Composition::SOLID_COLOR,
1136 IComposerClient::Composition::CLIENT>,
1137 RECompositionResultVariant>>();
1138}
1139
1140TEST_F(CompositionTest, captureScreenColorLayer) {
1141 captureScreenComposition<
1142 CompositionCase<DefaultDisplaySetupVariant, ColorLayerVariant<ColorLayerProperties>,
1143 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1144}
1145
1146/* ------------------------------------------------------------------------
1147 * Layers with sideband buffers
1148 */
1149
1150TEST_F(CompositionTest, HWCComposedSidebandBufferLayerWithDirtyGeometry) {
1151 displayRefreshCompositionDirtyGeometry<
1152 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<SidebandLayerProperties>,
1153 KeepCompositionTypeVariant<IComposerClient::Composition::SIDEBAND>,
1154 HwcCompositionResultVariant>>();
1155}
1156
1157TEST_F(CompositionTest, HWCComposedSidebandBufferLayerWithDirtyFrame) {
1158 displayRefreshCompositionDirtyFrame<
1159 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<SidebandLayerProperties>,
1160 KeepCompositionTypeVariant<IComposerClient::Composition::SIDEBAND>,
1161 HwcCompositionResultVariant>>();
1162}
1163
1164TEST_F(CompositionTest, REComposedSidebandBufferLayer) {
1165 displayRefreshCompositionDirtyFrame<
1166 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<SidebandLayerProperties>,
1167 ChangeCompositionTypeVariant<IComposerClient::Composition::SIDEBAND,
1168 IComposerClient::Composition::CLIENT>,
1169 RECompositionResultVariant>>();
1170}
1171
1172TEST_F(CompositionTest, captureScreenSidebandBufferLayer) {
1173 captureScreenComposition<
1174 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<SidebandLayerProperties>,
1175 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1176}
1177
1178/* ------------------------------------------------------------------------
1179 * Layers with ISurfaceComposerClient::eSecure, on a secure display
1180 */
1181
1182TEST_F(CompositionTest, HWCComposedSecureBufferLayerWithDirtyGeometry) {
1183 displayRefreshCompositionDirtyGeometry<
1184 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<SecureLayerProperties>,
1185 KeepCompositionTypeVariant<IComposerClient::Composition::DEVICE>,
1186 HwcCompositionResultVariant>>();
1187}
1188
1189TEST_F(CompositionTest, HWCComposedSecureBufferLayerWithDirtyFrame) {
1190 displayRefreshCompositionDirtyFrame<
1191 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<SecureLayerProperties>,
1192 KeepCompositionTypeVariant<IComposerClient::Composition::DEVICE>,
1193 HwcCompositionResultVariant>>();
1194}
1195
1196TEST_F(CompositionTest, REComposedSecureBufferLayer) {
1197 displayRefreshCompositionDirtyFrame<
1198 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<SecureLayerProperties>,
1199 ChangeCompositionTypeVariant<IComposerClient::Composition::DEVICE,
1200 IComposerClient::Composition::CLIENT>,
1201 RECompositionResultVariant>>();
1202}
1203
1204TEST_F(CompositionTest, captureScreenSecureBufferLayerOnSecureDisplay) {
1205 captureScreenComposition<
1206 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<SecureLayerProperties>,
1207 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1208}
1209
1210/* ------------------------------------------------------------------------
1211 * Layers with ISurfaceComposerClient::eSecure, on a non-secure display
1212 */
1213
1214TEST_F(CompositionTest, HWCComposedSecureBufferLayerOnInsecureDisplayWithDirtyGeometry) {
1215 displayRefreshCompositionDirtyGeometry<
1216 CompositionCase<InsecureDisplaySetupVariant, BufferLayerVariant<SecureLayerProperties>,
1217 KeepCompositionTypeVariant<IComposerClient::Composition::CLIENT>,
1218 ForcedClientCompositionResultVariant>>();
1219}
1220
1221TEST_F(CompositionTest, HWCComposedSecureBufferLayerOnInsecureDisplayWithDirtyFrame) {
1222 displayRefreshCompositionDirtyFrame<
1223 CompositionCase<InsecureDisplaySetupVariant, BufferLayerVariant<SecureLayerProperties>,
1224 KeepCompositionTypeVariant<IComposerClient::Composition::CLIENT>,
1225 ForcedClientCompositionResultVariant>>();
1226}
1227
1228TEST_F(CompositionTest, captureScreenSecureBufferLayerOnInsecureDisplay) {
1229 captureScreenComposition<
1230 CompositionCase<InsecureDisplaySetupVariant, BufferLayerVariant<SecureLayerProperties>,
1231 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1232}
1233
1234/* ------------------------------------------------------------------------
1235 * Cursor layers
1236 */
1237
1238TEST_F(CompositionTest, HWCComposedCursorLayerWithDirtyGeometry) {
1239 displayRefreshCompositionDirtyGeometry<
1240 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<CursorLayerProperties>,
1241 KeepCompositionTypeVariant<IComposerClient::Composition::CURSOR>,
1242 HwcCompositionResultVariant>>();
1243}
1244
1245TEST_F(CompositionTest, HWCComposedCursorLayerWithDirtyFrame) {
1246 displayRefreshCompositionDirtyFrame<
1247 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<CursorLayerProperties>,
1248 KeepCompositionTypeVariant<IComposerClient::Composition::CURSOR>,
1249 HwcCompositionResultVariant>>();
1250}
1251
1252TEST_F(CompositionTest, REComposedCursorLayer) {
1253 displayRefreshCompositionDirtyFrame<
1254 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<CursorLayerProperties>,
1255 ChangeCompositionTypeVariant<IComposerClient::Composition::CURSOR,
1256 IComposerClient::Composition::CLIENT>,
1257 RECompositionResultVariant>>();
1258}
1259
1260TEST_F(CompositionTest, captureScreenCursorLayer) {
1261 captureScreenComposition<
1262 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<CursorLayerProperties>,
1263 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1264}
1265
1266/* ------------------------------------------------------------------------
1267 * Simple buffer layer on a display which is powered off.
1268 */
1269
1270TEST_F(CompositionTest, displayOffHWCComposedNormalBufferLayerWithDirtyGeometry) {
1271 displayRefreshCompositionDirtyGeometry<CompositionCase<
1272 PoweredOffDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1273 KeepCompositionTypeVariant<IComposerClient::Composition::DEVICE>,
1274 HwcCompositionResultVariant>>();
1275}
1276
1277TEST_F(CompositionTest, displayOffHWCComposedNormalBufferLayerWithDirtyFrame) {
1278 displayRefreshCompositionDirtyFrame<CompositionCase<
1279 PoweredOffDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1280 KeepCompositionTypeVariant<IComposerClient::Composition::DEVICE>,
1281 HwcCompositionResultVariant>>();
1282}
1283
1284TEST_F(CompositionTest, displayOffREComposedNormalBufferLayer) {
1285 displayRefreshCompositionDirtyFrame<CompositionCase<
1286 PoweredOffDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1287 ChangeCompositionTypeVariant<IComposerClient::Composition::DEVICE,
1288 IComposerClient::Composition::CLIENT>,
1289 RECompositionResultVariant>>();
1290}
1291
1292TEST_F(CompositionTest, captureScreenNormalBufferLayerOnPoweredOffDisplay) {
1293 captureScreenComposition<CompositionCase<
1294 PoweredOffDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1295 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1296}
1297
1298} // namespace
1299} // namespace android