blob: 1c4a661e0510f581664716e0d2abd34b44e49bff [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
Lloyd Pique542307f2018-10-19 13:24:08 -070020#include <compositionengine/mock/DisplaySurface.h>
Lloyd Piqued6b579f2018-04-06 15:29:10 -070021#include <gmock/gmock.h>
22#include <gtest/gtest.h>
Lloyd Piqued6b579f2018-04-06 15:29:10 -070023#include <gui/IProducerListener.h>
24#include <log/log.h>
Lloyd Pique3823e7b2018-10-18 16:58:10 -070025#include <renderengine/mock/Framebuffer.h>
26#include <renderengine/mock/Image.h>
27#include <renderengine/mock/RenderEngine.h>
Lloyd Piqued6b579f2018-04-06 15:29:10 -070028#include <system/window.h>
29#include <utils/String8.h>
30
31#include "BufferQueueLayer.h"
32#include "ColorLayer.h"
33#include "Layer.h"
34
35#include "TestableSurfaceFlinger.h"
36#include "mock/DisplayHardware/MockComposer.h"
Lloyd Piqued6b579f2018-04-06 15:29:10 -070037#include "mock/MockDispSync.h"
38#include "mock/MockEventControlThread.h"
39#include "mock/MockEventThread.h"
40#include "mock/MockMessageQueue.h"
Alec Mouriba013fa2018-10-16 12:43:11 -070041#include "mock/system/window/MockNativeWindow.h"
Lloyd Piqued6b579f2018-04-06 15:29:10 -070042
43namespace android {
44namespace {
45
46using testing::_;
David Sodman15094112018-10-11 09:39:37 -070047using testing::AtLeast;
Alec Mouri0f714832018-11-12 15:31:06 -080048using testing::Between;
Lloyd Piqued6b579f2018-04-06 15:29:10 -070049using testing::ByMove;
50using testing::DoAll;
Alec Mouri0f714832018-11-12 15:31:06 -080051using testing::Field;
Alec Mouri0a9c7b82018-11-16 13:05:25 -080052using testing::Invoke;
Lloyd Piqued6b579f2018-04-06 15:29:10 -070053using testing::IsNull;
54using testing::Mock;
55using testing::NotNull;
56using testing::Ref;
57using testing::Return;
58using testing::ReturnRef;
59using testing::SetArgPointee;
60
61using android::Hwc2::Error;
62using android::Hwc2::IComposer;
63using android::Hwc2::IComposerClient;
64using android::Hwc2::Transform;
65
66using FakeHwcDisplayInjector = TestableSurfaceFlinger::FakeHwcDisplayInjector;
67using FakeDisplayDeviceInjector = TestableSurfaceFlinger::FakeDisplayDeviceInjector;
68
69constexpr hwc2_display_t HWC_DISPLAY = FakeHwcDisplayInjector::DEFAULT_HWC_DISPLAY_ID;
70constexpr hwc2_layer_t HWC_LAYER = 5000;
71constexpr Transform DEFAULT_TRANSFORM = static_cast<Transform>(0);
72
Dominik Laskowski34157762018-10-31 13:07:19 -070073constexpr DisplayId DEFAULT_DISPLAY_ID = DisplayId{42};
Lloyd Piqued6b579f2018-04-06 15:29:10 -070074constexpr int DEFAULT_DISPLAY_WIDTH = 1920;
75constexpr int DEFAULT_DISPLAY_HEIGHT = 1024;
76
77constexpr int DEFAULT_CONFIG_ID = 0;
78constexpr int DEFAULT_TEXTURE_ID = 6000;
79constexpr int DEFAULT_LAYER_STACK = 7000;
80
81constexpr int DEFAULT_DISPLAY_MAX_LUMINANCE = 500;
82
83constexpr int DEFAULT_SIDEBAND_STREAM = 51;
84
85class CompositionTest : public testing::Test {
86public:
87 CompositionTest() {
88 const ::testing::TestInfo* const test_info =
89 ::testing::UnitTest::GetInstance()->current_test_info();
90 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
91
92 mFlinger.mutableEventControlThread().reset(mEventControlThread);
93 mFlinger.mutableEventThread().reset(mEventThread);
94 mFlinger.mutableEventQueue().reset(mMessageQueue);
95
96 mFlinger.mutablePrimaryDispSync().reset(mPrimaryDispSync);
97 EXPECT_CALL(*mPrimaryDispSync, computeNextRefresh(0)).WillRepeatedly(Return(0));
98 EXPECT_CALL(*mPrimaryDispSync, getPeriod())
99 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_REFRESH_RATE));
Alec Mourif6fd29e2018-11-17 04:56:41 +0000100 EXPECT_CALL(*mNativeWindow, query(NATIVE_WINDOW_WIDTH, _))
101 .WillRepeatedly(DoAll(SetArgPointee<1>(DEFAULT_DISPLAY_WIDTH), Return(0)));
102 EXPECT_CALL(*mNativeWindow, query(NATIVE_WINDOW_HEIGHT, _))
103 .WillRepeatedly(DoAll(SetArgPointee<1>(DEFAULT_DISPLAY_HEIGHT), Return(0)));
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700104
105 mFlinger.setupRenderEngine(std::unique_ptr<renderengine::RenderEngine>(mRenderEngine));
106 setupComposer(0);
107 }
108
109 ~CompositionTest() {
110 const ::testing::TestInfo* const test_info =
111 ::testing::UnitTest::GetInstance()->current_test_info();
112 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
113 }
114
115 void setupComposer(int virtualDisplayCount) {
116 mComposer = new Hwc2::mock::Composer();
117 EXPECT_CALL(*mComposer, getCapabilities())
118 .WillOnce(Return(std::vector<IComposer::Capability>()));
119 EXPECT_CALL(*mComposer, getMaxVirtualDisplayCount()).WillOnce(Return(virtualDisplayCount));
120 mFlinger.setupComposer(std::unique_ptr<Hwc2::Composer>(mComposer));
121
122 Mock::VerifyAndClear(mComposer);
123 }
124
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.mutableGeometryInvalid() = 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<HWC2::Capability> mDefaultCapabilities = {HWC2::Capability::SidebandStream};
145
146 TestableSurfaceFlinger mFlinger;
147 sp<DisplayDevice> mDisplay;
148 sp<DisplayDevice> mExternalDisplay;
Lloyd Pique542307f2018-10-19 13:24:08 -0700149 sp<compositionengine::mock::DisplaySurface> mDisplaySurface =
150 new compositionengine::mock::DisplaySurface();
Alec Mouriba013fa2018-10-16 12:43:11 -0700151 mock::NativeWindow* mNativeWindow = new mock::NativeWindow();
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700152
Alec Mouri0a9c7b82018-11-16 13:05:25 -0800153 sp<GraphicBuffer> mBuffer = new GraphicBuffer();
154 ANativeWindowBuffer* mNativeWindowBuffer = mBuffer->getNativeBuffer();
155
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700156 mock::EventThread* mEventThread = new mock::EventThread();
157 mock::EventControlThread* mEventControlThread = new mock::EventControlThread();
158
159 Hwc2::mock::Composer* mComposer = nullptr;
160 renderengine::mock::RenderEngine* mRenderEngine = new renderengine::mock::RenderEngine();
161 mock::MessageQueue* mMessageQueue = new mock::MessageQueue();
162 mock::DispSync* mPrimaryDispSync = new mock::DispSync();
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700163 renderengine::mock::Framebuffer* mReFrameBuffer = new renderengine::mock::Framebuffer();
164
165 sp<Fence> mClientTargetAcquireFence = Fence::NO_FENCE;
166
167 sp<GraphicBuffer> mCaptureScreenBuffer;
168};
169
170template <typename LayerCase>
171void CompositionTest::displayRefreshCompositionDirtyGeometry() {
172 setupForceGeometryDirty();
173 LayerCase::setupForDirtyGeometry(this);
174
175 // --------------------------------------------------------------------
176 // Invocation
177
178 mFlinger.onMessageReceived(MessageQueue::INVALIDATE);
179 mFlinger.onMessageReceived(MessageQueue::REFRESH);
180
181 LayerCase::cleanup(this);
182}
183
184template <typename LayerCase>
185void CompositionTest::displayRefreshCompositionDirtyFrame() {
186 LayerCase::setupForDirtyFrame(this);
187
188 // --------------------------------------------------------------------
189 // Invocation
190
191 mFlinger.onMessageReceived(MessageQueue::INVALIDATE);
192 mFlinger.onMessageReceived(MessageQueue::REFRESH);
193
194 LayerCase::cleanup(this);
195}
196
197template <typename LayerCase>
198void CompositionTest::captureScreenComposition() {
199 LayerCase::setupForScreenCapture(this);
200
201 const Rect sourceCrop(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700202 constexpr bool useIdentityTransform = true;
203 constexpr bool forSystem = true;
204
205 DisplayRenderArea renderArea(mDisplay, sourceCrop, DEFAULT_DISPLAY_WIDTH,
Peiyong Lin0e003c92018-09-17 11:09:51 -0700206 DEFAULT_DISPLAY_HEIGHT, ui::Dataspace::V0_SRGB,
207 ui::Transform::ROT_0);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700208
209 auto traverseLayers = [this](const LayerVector::Visitor& visitor) {
chaviw0e3479f2018-09-10 16:49:30 -0700210 return mFlinger.traverseLayersInDisplay(mDisplay, visitor);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700211 };
212
213 // TODO: Eliminate expensive/real allocation if possible.
214 const uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
215 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
216 mCaptureScreenBuffer = new GraphicBuffer(renderArea.getReqWidth(), renderArea.getReqHeight(),
217 HAL_PIXEL_FORMAT_RGBA_8888, 1, usage, "screenshot");
218
219 int fd = -1;
220 status_t result =
221 mFlinger.captureScreenImplLocked(renderArea, traverseLayers, mCaptureScreenBuffer.get(),
222 useIdentityTransform, forSystem, &fd);
223 if (fd >= 0) {
224 close(fd);
225 }
226
227 EXPECT_EQ(NO_ERROR, result);
228
229 LayerCase::cleanup(this);
230}
231
232/* ------------------------------------------------------------------------
233 * Variants for each display configuration which can be tested
234 */
235
236template <typename Derived>
237struct BaseDisplayVariant {
238 static constexpr bool IS_SECURE = true;
239 static constexpr int INIT_POWER_MODE = HWC_POWER_MODE_NORMAL;
240
241 static void setupPreconditions(CompositionTest* test) {
Alec Mouriba013fa2018-10-16 12:43:11 -0700242 EXPECT_CALL(*test->mNativeWindow, query(NATIVE_WINDOW_WIDTH, _))
243 .WillRepeatedly(DoAll(SetArgPointee<1>(DEFAULT_DISPLAY_WIDTH), Return(0)));
244 EXPECT_CALL(*test->mNativeWindow, query(NATIVE_WINDOW_HEIGHT, _))
245 .WillRepeatedly(DoAll(SetArgPointee<1>(DEFAULT_DISPLAY_HEIGHT), Return(0)));
246
Dominik Laskowski075d3172018-05-24 15:50:06 -0700247 FakeHwcDisplayInjector(DEFAULT_DISPLAY_ID, HWC2::DisplayType::Physical,
248 true /* isPrimary */)
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700249 .setCapabilities(&test->mDefaultCapabilities)
250 .inject(&test->mFlinger, test->mComposer);
251
Dominik Laskowski075d3172018-05-24 15:50:06 -0700252 test->mDisplay = FakeDisplayDeviceInjector(test->mFlinger, DEFAULT_DISPLAY_ID,
253 false /* isVirtual */, true /* isPrimary */)
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700254 .setDisplaySurface(test->mDisplaySurface)
Alec Mouriba013fa2018-10-16 12:43:11 -0700255 .setNativeWindow(test->mNativeWindow)
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700256 .setSecure(Derived::IS_SECURE)
257 .setPowerMode(Derived::INIT_POWER_MODE)
258 .inject();
259 test->mDisplay->setLayerStack(DEFAULT_LAYER_STACK);
260 }
261
262 template <typename Case>
263 static void setupCommonCompositionCallExpectations(CompositionTest* test) {
264 EXPECT_CALL(*test->mComposer,
265 setColorTransform(HWC_DISPLAY, _, Hwc2::ColorTransform::IDENTITY))
266 .Times(1);
267 EXPECT_CALL(*test->mComposer, presentOrValidateDisplay(HWC_DISPLAY, _, _, _, _)).Times(1);
268 EXPECT_CALL(*test->mComposer, getDisplayRequests(HWC_DISPLAY, _, _, _)).Times(1);
269 EXPECT_CALL(*test->mComposer, acceptDisplayChanges(HWC_DISPLAY)).Times(1);
270 EXPECT_CALL(*test->mComposer, presentDisplay(HWC_DISPLAY, _)).Times(1);
271 EXPECT_CALL(*test->mComposer, getReleaseFences(HWC_DISPLAY, _, _)).Times(1);
272
273 EXPECT_CALL(*test->mRenderEngine, useNativeFenceSync()).WillRepeatedly(Return(true));
Alec Mouri0f714832018-11-12 15:31:06 -0800274 // TODO: remove once we verify that we can just grab the fence from the
275 // FramebufferSurface.
Alec Mouri0a9c7b82018-11-16 13:05:25 -0800276 EXPECT_CALL(*test->mRenderEngine, flush()).WillRepeatedly(Invoke([]() {
Alec Mouri0f714832018-11-12 15:31:06 -0800277 return base::unique_fd();
Alec Mouri0a9c7b82018-11-16 13:05:25 -0800278 }));
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700279
280 EXPECT_CALL(*test->mDisplaySurface, onFrameCommitted()).Times(1);
281 EXPECT_CALL(*test->mDisplaySurface, advanceFrame()).Times(1);
282
283 Case::CompositionType::setupHwcSetCallExpectations(test);
284 Case::CompositionType::setupHwcGetCallExpectations(test);
285 }
286
287 template <typename Case>
288 static void setupCommonScreensCaptureCallExpectations(CompositionTest* test) {
Alec Mouri0f714832018-11-12 15:31:06 -0800289 EXPECT_CALL(*test->mRenderEngine, drawLayers)
290 .WillRepeatedly(
291 [](const renderengine::DisplaySettings& displaySettings,
292 const std::vector<renderengine::LayerSettings>& /*layerSettings*/,
293 ANativeWindowBuffer*, base::unique_fd*) -> status_t {
294 EXPECT_EQ(DEFAULT_DISPLAY_MAX_LUMINANCE, displaySettings.maxLuminance);
295 EXPECT_EQ(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
296 displaySettings.physicalDisplay);
297 EXPECT_EQ(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
298 displaySettings.clip);
299 return NO_ERROR;
300 });
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700301 }
302
303 static void setupNonEmptyFrameCompositionCallExpectations(CompositionTest* test) {
304 EXPECT_CALL(*test->mDisplaySurface, beginFrame(true)).Times(1);
305 }
306
307 static void setupEmptyFrameCompositionCallExpectations(CompositionTest* test) {
308 EXPECT_CALL(*test->mDisplaySurface, beginFrame(false)).Times(1);
309 }
310
311 static void setupHwcCompositionCallExpectations(CompositionTest* test) {
Lloyd Pique542307f2018-10-19 13:24:08 -0700312 EXPECT_CALL(*test->mDisplaySurface,
313 prepareFrame(compositionengine::DisplaySurface::COMPOSITION_HWC))
314 .Times(1);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700315 }
316
317 static void setupRECompositionCallExpectations(CompositionTest* test) {
Lloyd Pique542307f2018-10-19 13:24:08 -0700318 EXPECT_CALL(*test->mDisplaySurface,
319 prepareFrame(compositionengine::DisplaySurface::COMPOSITION_GLES))
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700320 .Times(1);
321 EXPECT_CALL(*test->mDisplaySurface, getClientTargetAcquireFence())
322 .WillRepeatedly(ReturnRef(test->mClientTargetAcquireFence));
323
Alec Mouri0a9c7b82018-11-16 13:05:25 -0800324 EXPECT_CALL(*test->mNativeWindow, queueBuffer(_, _)).WillOnce(Return(0));
325 EXPECT_CALL(*test->mNativeWindow, dequeueBuffer(_, _))
326 .WillOnce(DoAll(SetArgPointee<0>(test->mNativeWindowBuffer), SetArgPointee<1>(-1),
327 Return(0)));
Alec Mouri0f714832018-11-12 15:31:06 -0800328 EXPECT_CALL(*test->mRenderEngine, drawLayers)
329 .WillRepeatedly(
330 [](const renderengine::DisplaySettings& displaySettings,
331 const std::vector<renderengine::LayerSettings>& /*layerSettings*/,
332 ANativeWindowBuffer*, base::unique_fd*) -> status_t {
333 EXPECT_EQ(DEFAULT_DISPLAY_MAX_LUMINANCE, displaySettings.maxLuminance);
334 EXPECT_EQ(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
335 displaySettings.physicalDisplay);
336 EXPECT_EQ(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
337 displaySettings.clip);
338 EXPECT_EQ(ui::Dataspace::UNKNOWN, displaySettings.outputDataspace);
339 return NO_ERROR;
340 });
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700341 }
342
343 template <typename Case>
344 static void setupRELayerCompositionCallExpectations(CompositionTest* test) {
345 Case::Layer::setupRECompositionCallExpectations(test);
346 }
347
348 template <typename Case>
349 static void setupRELayerScreenshotCompositionCallExpectations(CompositionTest* test) {
350 Case::Layer::setupREScreenshotCompositionCallExpectations(test);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700351 }
352};
353
354struct DefaultDisplaySetupVariant : public BaseDisplayVariant<DefaultDisplaySetupVariant> {};
355
356struct InsecureDisplaySetupVariant : public BaseDisplayVariant<InsecureDisplaySetupVariant> {
357 static constexpr bool IS_SECURE = false;
358
359 template <typename Case>
360 static void setupRELayerCompositionCallExpectations(CompositionTest* test) {
361 Case::Layer::setupInsecureRECompositionCallExpectations(test);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700362 }
363
364 template <typename Case>
365 static void setupRELayerScreenshotCompositionCallExpectations(CompositionTest* test) {
366 Case::Layer::setupInsecureREScreenshotCompositionCallExpectations(test);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700367 }
368};
369
370struct PoweredOffDisplaySetupVariant : public BaseDisplayVariant<PoweredOffDisplaySetupVariant> {
371 static constexpr int INIT_POWER_MODE = HWC_POWER_MODE_OFF;
372
373 template <typename Case>
374 static void setupCommonCompositionCallExpectations(CompositionTest* test) {
375 // TODO: This seems like an unnecessary call if display is powered off.
376 EXPECT_CALL(*test->mComposer,
377 setColorTransform(HWC_DISPLAY, _, Hwc2::ColorTransform::IDENTITY))
378 .Times(1);
379
380 // TODO: This seems like an unnecessary call if display is powered off.
381 Case::CompositionType::setupHwcSetCallExpectations(test);
382 }
383
384 static void setupHwcCompositionCallExpectations(CompositionTest*) {}
385
386 static void setupRECompositionCallExpectations(CompositionTest* test) {
387 // TODO: This seems like an unnecessary call if display is powered off.
388 EXPECT_CALL(*test->mDisplaySurface, getClientTargetAcquireFence())
389 .WillRepeatedly(ReturnRef(test->mClientTargetAcquireFence));
390 }
391
392 template <typename Case>
393 static void setupRELayerCompositionCallExpectations(CompositionTest*) {}
394};
395
396/* ------------------------------------------------------------------------
397 * Variants for each layer configuration which can be tested
398 */
399
400template <typename LayerProperties>
401struct BaseLayerProperties {
402 static constexpr uint32_t WIDTH = 100;
403 static constexpr uint32_t HEIGHT = 100;
404 static constexpr PixelFormat FORMAT = PIXEL_FORMAT_RGBA_8888;
405 static constexpr uint64_t USAGE =
406 GraphicBuffer::USAGE_SW_READ_NEVER | GraphicBuffer::USAGE_SW_WRITE_NEVER;
407 static constexpr android_dataspace DATASPACE = HAL_DATASPACE_UNKNOWN;
408 static constexpr uint32_t SCALING_MODE = 0;
409 static constexpr uint32_t TRANSFORM = 0;
410 static constexpr uint32_t LAYER_FLAGS = 0;
411 static constexpr float COLOR[] = {1.f, 1.f, 1.f, 1.f};
412 static constexpr IComposerClient::BlendMode BLENDMODE =
413 IComposerClient::BlendMode::PREMULTIPLIED;
414
415 static void enqueueBuffer(CompositionTest*, sp<BufferQueueLayer> layer) {
416 auto producer = layer->getProducer();
417
418 IGraphicBufferProducer::QueueBufferOutput qbo;
419 status_t result = producer->connect(nullptr, NATIVE_WINDOW_API_EGL, false, &qbo);
420 if (result != NO_ERROR) {
421 ALOGE("Failed to connect() (%d)", result);
422 return;
423 }
424
425 int slot;
426 sp<Fence> fence;
427 result = producer->dequeueBuffer(&slot, &fence, LayerProperties::WIDTH,
428 LayerProperties::HEIGHT, LayerProperties::FORMAT,
429 LayerProperties::USAGE, nullptr, nullptr);
430 if (result != IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION) {
431 ALOGE("Failed to dequeueBuffer() (%d)", result);
432 return;
433 }
434
435 sp<GraphicBuffer> buffer;
436 result = producer->requestBuffer(slot, &buffer);
437 if (result != NO_ERROR) {
438 ALOGE("Failed to requestBuffer() (%d)", result);
439 return;
440 }
441
442 IGraphicBufferProducer::QueueBufferInput qbi(systemTime(), false /* isAutoTimestamp */,
443 LayerProperties::DATASPACE,
444 Rect(LayerProperties::WIDTH,
445 LayerProperties::HEIGHT),
446 LayerProperties::SCALING_MODE,
447 LayerProperties::TRANSFORM, Fence::NO_FENCE);
448 result = producer->queueBuffer(slot, qbi, &qbo);
449 if (result != NO_ERROR) {
450 ALOGE("Failed to queueBuffer (%d)", result);
451 return;
452 }
453 }
454
455 static void setupLatchedBuffer(CompositionTest* test, sp<BufferQueueLayer> layer) {
456 // TODO: Eliminate the complexity of actually creating a buffer
457 EXPECT_CALL(*test->mRenderEngine, getMaxTextureSize()).WillOnce(Return(16384));
458 EXPECT_CALL(*test->mRenderEngine, getMaxViewportDims()).WillOnce(Return(16384));
459 status_t err =
460 layer->setDefaultBufferProperties(LayerProperties::WIDTH, LayerProperties::HEIGHT,
461 LayerProperties::FORMAT);
462 ASSERT_EQ(NO_ERROR, err);
463 Mock::VerifyAndClear(test->mRenderEngine);
464
465 EXPECT_CALL(*test->mMessageQueue, invalidate()).Times(1);
466 enqueueBuffer(test, layer);
467 Mock::VerifyAndClear(test->mMessageQueue);
468
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700469 EXPECT_CALL(*test->mRenderEngine, useNativeFenceSync()).WillRepeatedly(Return(true));
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700470 bool ignoredRecomputeVisibleRegions;
Alec Mouri86770e52018-09-24 22:40:58 +0000471 layer->latchBuffer(ignoredRecomputeVisibleRegions, 0, Fence::NO_FENCE);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700472 Mock::VerifyAndClear(test->mRenderEngine);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700473 }
474
475 static void setupLayerState(CompositionTest* test, sp<BufferQueueLayer> layer) {
476 setupLatchedBuffer(test, layer);
477 }
478
479 static void setupBufferLayerPostFrameCallExpectations(CompositionTest* test) {
480 // BufferLayer::onPostComposition(), when there is no present fence
481 EXPECT_CALL(*test->mComposer, getActiveConfig(HWC_DISPLAY, _))
482 .WillOnce(DoAll(SetArgPointee<1>(DEFAULT_CONFIG_ID), Return(Error::NONE)));
483 }
484
485 static void setupHwcSetGeometryCallExpectations(CompositionTest* test) {
486 // TODO: Coverage of other values
487 EXPECT_CALL(*test->mComposer,
488 setLayerBlendMode(HWC_DISPLAY, HWC_LAYER, LayerProperties::BLENDMODE))
489 .Times(1);
490 // TODO: Coverage of other values for origin
491 EXPECT_CALL(*test->mComposer,
492 setLayerDisplayFrame(HWC_DISPLAY, HWC_LAYER,
493 IComposerClient::Rect({0, 0, LayerProperties::WIDTH,
494 LayerProperties::HEIGHT})))
495 .Times(1);
496 EXPECT_CALL(*test->mComposer,
497 setLayerPlaneAlpha(HWC_DISPLAY, HWC_LAYER, LayerProperties::COLOR[3]))
498 .Times(1);
499 // TODO: Coverage of other values
500 EXPECT_CALL(*test->mComposer, setLayerZOrder(HWC_DISPLAY, HWC_LAYER, 0u)).Times(1);
501 // TODO: Coverage of other values
502 EXPECT_CALL(*test->mComposer, setLayerInfo(HWC_DISPLAY, HWC_LAYER, 0u, 0u)).Times(1);
503
504 // These expectations retire on saturation as the code path these
505 // expectations are for appears to make an extra call to them.
506 // TODO: Investigate this extra call
507 EXPECT_CALL(*test->mComposer, setLayerTransform(HWC_DISPLAY, HWC_LAYER, DEFAULT_TRANSFORM))
David Sodman15094112018-10-11 09:39:37 -0700508 .Times(AtLeast(1))
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700509 .RetiresOnSaturation();
510 }
511
512 static void setupHwcSetSourceCropBufferCallExpectations(CompositionTest* test) {
513 EXPECT_CALL(*test->mComposer,
514 setLayerSourceCrop(HWC_DISPLAY, HWC_LAYER,
515 IComposerClient::FRect({0.f, 0.f, LayerProperties::WIDTH,
516 LayerProperties::HEIGHT})))
517 .Times(1);
518 }
519
520 static void setupHwcSetSourceCropColorCallExpectations(CompositionTest* test) {
521 EXPECT_CALL(*test->mComposer,
522 setLayerSourceCrop(HWC_DISPLAY, HWC_LAYER,
523 IComposerClient::FRect({0.f, 0.f, 0.f, 0.f})))
524 .Times(1);
525 }
526
527 static void setupHwcSetPerFrameCallExpectations(CompositionTest* test) {
528 EXPECT_CALL(*test->mComposer,
529 setLayerVisibleRegion(HWC_DISPLAY, HWC_LAYER,
530 std::vector<IComposerClient::Rect>({IComposerClient::Rect(
531 {0, 0, LayerProperties::WIDTH,
532 LayerProperties::HEIGHT})})))
533 .Times(1);
534 }
535
536 static void setupHwcSetPerFrameColorCallExpectations(CompositionTest* test) {
537 EXPECT_CALL(*test->mComposer, setLayerSurfaceDamage(HWC_DISPLAY, HWC_LAYER, _)).Times(1);
538
539 // TODO: use COLOR
540 EXPECT_CALL(*test->mComposer,
541 setLayerColor(HWC_DISPLAY, HWC_LAYER,
542 IComposerClient::Color({0xff, 0xff, 0xff, 0xff})))
543 .Times(1);
544
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700545 }
546
547 static void setupHwcSetPerFrameBufferCallExpectations(CompositionTest* test) {
548 EXPECT_CALL(*test->mComposer, setLayerSurfaceDamage(HWC_DISPLAY, HWC_LAYER, _)).Times(1);
549 EXPECT_CALL(*test->mComposer, setLayerBuffer(HWC_DISPLAY, HWC_LAYER, _, _, _)).Times(1);
550
551 setupBufferLayerPostFrameCallExpectations(test);
552 }
553
554 static void setupREBufferCompositionCommonCallExpectations(CompositionTest* test) {
Alec Mouri0f714832018-11-12 15:31:06 -0800555 EXPECT_CALL(*test->mRenderEngine, drawLayers)
556 .WillOnce([](const renderengine::DisplaySettings& displaySettings,
557 const std::vector<renderengine::LayerSettings>& layerSettings,
558 ANativeWindowBuffer*, base::unique_fd*) -> status_t {
559 EXPECT_EQ(DEFAULT_DISPLAY_MAX_LUMINANCE, displaySettings.maxLuminance);
560 EXPECT_EQ(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
561 displaySettings.physicalDisplay);
562 EXPECT_EQ(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
563 displaySettings.clip);
564 // screen capture adds an additional color layer as an alpha
565 // prefill, so gtet the back layer.
566 renderengine::LayerSettings layer = layerSettings.back();
567 EXPECT_THAT(layer.source.buffer.buffer, Not(IsNull()));
568 EXPECT_THAT(layer.source.buffer.fence, Not(IsNull()));
569 EXPECT_EQ(renderengine::Buffer::CachingHint::NO_CACHE,
570 layer.source.buffer.cacheHint);
571 EXPECT_EQ(DEFAULT_TEXTURE_ID, layer.source.buffer.textureName);
572 EXPECT_EQ(false, layer.source.buffer.isY410BT2020);
573 EXPECT_EQ(true, layer.source.buffer.usePremultipliedAlpha);
574 EXPECT_EQ(false, layer.source.buffer.isOpaque);
575 EXPECT_EQ(0.0, layer.geometry.roundedCornersRadius);
576 EXPECT_EQ(ui::Dataspace::UNKNOWN, layer.sourceDataspace);
577 EXPECT_EQ(LayerProperties::COLOR[3], layer.alpha);
578 return NO_ERROR;
579 });
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700580 }
581
582 static void setupREBufferCompositionCallExpectations(CompositionTest* test) {
583 LayerProperties::setupREBufferCompositionCommonCallExpectations(test);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700584 }
585
586 static void setupInsecureREBufferCompositionCallExpectations(CompositionTest* test) {
587 setupREBufferCompositionCallExpectations(test);
588 }
589
590 static void setupREBufferScreenshotCompositionCallExpectations(CompositionTest* test) {
591 LayerProperties::setupREBufferCompositionCommonCallExpectations(test);
592 }
593
594 static void setupInsecureREBufferScreenshotCompositionCallExpectations(CompositionTest* test) {
595 LayerProperties::setupREBufferCompositionCommonCallExpectations(test);
596 }
597
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700598 static void setupREColorCompositionCallExpectations(CompositionTest* test) {
Alec Mouri0f714832018-11-12 15:31:06 -0800599 EXPECT_CALL(*test->mRenderEngine, drawLayers)
600 .WillOnce([](const renderengine::DisplaySettings& displaySettings,
601 const std::vector<renderengine::LayerSettings>& layerSettings,
602 ANativeWindowBuffer*, base::unique_fd*) -> status_t {
603 EXPECT_EQ(DEFAULT_DISPLAY_MAX_LUMINANCE, displaySettings.maxLuminance);
604 EXPECT_EQ(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
605 displaySettings.physicalDisplay);
606 EXPECT_EQ(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
607 displaySettings.clip);
608 // screen capture adds an additional color layer as an alpha
609 // prefill, so get the back layer.
610 renderengine::LayerSettings layer = layerSettings.back();
611 EXPECT_THAT(layer.source.buffer.buffer, IsNull());
612 EXPECT_EQ(half3(LayerProperties::COLOR[0], LayerProperties::COLOR[1],
613 LayerProperties::COLOR[2]),
614 layer.source.solidColor);
615 EXPECT_EQ(0.0, layer.geometry.roundedCornersRadius);
616 EXPECT_EQ(ui::Dataspace::UNKNOWN, layer.sourceDataspace);
617 EXPECT_EQ(LayerProperties::COLOR[3], layer.alpha);
618 return NO_ERROR;
619 });
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700620 }
621
622 static void setupREColorScreenshotCompositionCallExpectations(CompositionTest* test) {
623 setupREColorCompositionCallExpectations(test);
624 }
625};
626
627struct DefaultLayerProperties : public BaseLayerProperties<DefaultLayerProperties> {};
628
629struct ColorLayerProperties : public BaseLayerProperties<ColorLayerProperties> {};
630
631struct SidebandLayerProperties : public BaseLayerProperties<SidebandLayerProperties> {
632 using Base = BaseLayerProperties<SidebandLayerProperties>;
633 static constexpr IComposerClient::BlendMode BLENDMODE = IComposerClient::BlendMode::NONE;
634
635 static void setupLayerState(CompositionTest* test, sp<BufferQueueLayer> layer) {
636 sp<NativeHandle> stream =
637 NativeHandle::create(reinterpret_cast<native_handle_t*>(DEFAULT_SIDEBAND_STREAM),
638 false);
639 test->mFlinger.setLayerSidebandStream(layer, stream);
640 }
641
642 static void setupHwcSetSourceCropBufferCallExpectations(CompositionTest* test) {
643 EXPECT_CALL(*test->mComposer,
644 setLayerSourceCrop(HWC_DISPLAY, HWC_LAYER,
645 IComposerClient::FRect({0.f, 0.f, -1.f, -1.f})))
646 .Times(1);
647 }
648
649 static void setupHwcSetPerFrameBufferCallExpectations(CompositionTest* test) {
650 EXPECT_CALL(*test->mComposer,
651 setLayerSidebandStream(HWC_DISPLAY, HWC_LAYER,
652 reinterpret_cast<native_handle_t*>(
653 DEFAULT_SIDEBAND_STREAM)))
654 .WillOnce(Return(Error::NONE));
655
656 EXPECT_CALL(*test->mComposer, setLayerSurfaceDamage(HWC_DISPLAY, HWC_LAYER, _)).Times(1);
657 }
658
Alec Mouri0f714832018-11-12 15:31:06 -0800659 static void setupREBufferCompositionCommonCallExpectations(CompositionTest* /*test*/) {}
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700660};
661
662struct SecureLayerProperties : public BaseLayerProperties<SecureLayerProperties> {
663 using Base = BaseLayerProperties<SecureLayerProperties>;
664
665 static constexpr uint32_t LAYER_FLAGS = ISurfaceComposerClient::eSecure;
666
667 static void setupInsecureREBufferCompositionCommonCallExpectations(CompositionTest* test) {
Alec Mouri0f714832018-11-12 15:31:06 -0800668 EXPECT_CALL(*test->mRenderEngine, drawLayers)
669 .WillOnce([](const renderengine::DisplaySettings& displaySettings,
670 const std::vector<renderengine::LayerSettings>& layerSettings,
671 ANativeWindowBuffer*, base::unique_fd*) -> status_t {
672 EXPECT_EQ(DEFAULT_DISPLAY_MAX_LUMINANCE, displaySettings.maxLuminance);
673 EXPECT_EQ(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
674 displaySettings.physicalDisplay);
675 EXPECT_EQ(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
676 displaySettings.clip);
677 // screen capture adds an additional color layer as an alpha
678 // prefill, so get the back layer.
679 renderengine::LayerSettings layer = layerSettings.back();
680 EXPECT_THAT(layer.source.buffer.buffer, IsNull());
681 EXPECT_EQ(half3(0.0f, 0.0f, 0.0f), layer.source.solidColor);
682 EXPECT_EQ(0.0, layer.geometry.roundedCornersRadius);
683 EXPECT_EQ(ui::Dataspace::UNKNOWN, layer.sourceDataspace);
684 EXPECT_EQ(1.0f, layer.alpha);
685 return NO_ERROR;
686 });
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700687 }
688
689 static void setupInsecureREBufferCompositionCallExpectations(CompositionTest* test) {
690 setupInsecureREBufferCompositionCommonCallExpectations(test);
691 Base::setupBufferLayerPostFrameCallExpectations(test);
692 }
693
694 static void setupInsecureREBufferScreenshotCompositionCallExpectations(CompositionTest* test) {
695 setupInsecureREBufferCompositionCommonCallExpectations(test);
696 }
697};
698
699struct CursorLayerProperties : public BaseLayerProperties<CursorLayerProperties> {
700 using Base = BaseLayerProperties<CursorLayerProperties>;
701
702 static void setupLayerState(CompositionTest* test, sp<BufferQueueLayer> layer) {
703 Base::setupLayerState(test, layer);
704 test->mFlinger.setLayerPotentialCursor(layer, true);
705 }
706};
707
708struct NoLayerVariant {
709 using FlingerLayerType = sp<BufferQueueLayer>;
710
711 static FlingerLayerType createLayer(CompositionTest*) { return FlingerLayerType(); }
712 static void injectLayer(CompositionTest*, FlingerLayerType) {}
713 static void cleanupInjectedLayers(CompositionTest*) {}
714
715 static void setupCallExpectationsForDirtyGeometry(CompositionTest*) {}
716 static void setupCallExpectationsForDirtyFrame(CompositionTest*) {}
717};
718
719template <typename LayerProperties>
720struct BaseLayerVariant {
721 template <typename L, typename F>
722 static sp<L> createLayerWithFactory(CompositionTest* test, F factory) {
723 EXPECT_CALL(*test->mMessageQueue, postMessage(_, 0)).Times(0);
724
725 sp<L> layer = factory();
726
727 Mock::VerifyAndClear(test->mComposer);
728 Mock::VerifyAndClear(test->mRenderEngine);
729 Mock::VerifyAndClear(test->mMessageQueue);
730
731 auto& layerDrawingState = test->mFlinger.mutableLayerDrawingState(layer);
732 layerDrawingState.layerStack = DEFAULT_LAYER_STACK;
733 layerDrawingState.active.w = 100;
734 layerDrawingState.active.h = 100;
735 layerDrawingState.color = half4(LayerProperties::COLOR[0], LayerProperties::COLOR[1],
736 LayerProperties::COLOR[2], LayerProperties::COLOR[3]);
737
738 layer->setVisibleRegion(Region(Rect(0, 0, 100, 100)));
739
740 return layer;
741 }
742
743 static void injectLayer(CompositionTest* test, sp<Layer> layer) {
744 EXPECT_CALL(*test->mComposer, createLayer(HWC_DISPLAY, _))
745 .WillOnce(DoAll(SetArgPointee<1>(HWC_LAYER), Return(Error::NONE)));
746
Dominik Laskowski075d3172018-05-24 15:50:06 -0700747 const auto displayId = test->mDisplay->getId();
748 ASSERT_TRUE(displayId);
Lloyd Pique441d5042018-10-18 16:49:51 -0700749 layer->createHwcLayer(&test->mFlinger.getHwComposer(), *displayId);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700750
751 Mock::VerifyAndClear(test->mComposer);
752
753 Vector<sp<Layer>> layers;
754 layers.add(layer);
755 test->mDisplay->setVisibleLayersSortedByZ(layers);
756 test->mFlinger.mutableDrawingState().layersSortedByZ.add(layer);
757 }
758
759 static void cleanupInjectedLayers(CompositionTest* test) {
760 EXPECT_CALL(*test->mComposer, destroyLayer(HWC_DISPLAY, HWC_LAYER))
761 .WillOnce(Return(Error::NONE));
Dominik Laskowski075d3172018-05-24 15:50:06 -0700762 const auto displayId = test->mDisplay->getId();
763 ASSERT_TRUE(displayId);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700764 for (auto layer : test->mFlinger.mutableDrawingState().layersSortedByZ) {
Dominik Laskowski075d3172018-05-24 15:50:06 -0700765 layer->destroyHwcLayer(*displayId);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700766 }
767 test->mFlinger.mutableDrawingState().layersSortedByZ.clear();
768 }
769};
770
771template <typename LayerProperties>
772struct ColorLayerVariant : public BaseLayerVariant<LayerProperties> {
773 using Base = BaseLayerVariant<LayerProperties>;
774 using FlingerLayerType = sp<ColorLayer>;
775
776 static FlingerLayerType createLayer(CompositionTest* test) {
777 FlingerLayerType layer = Base::template createLayerWithFactory<ColorLayer>(test, [test]() {
Lloyd Pique42ab75e2018-09-12 20:46:03 -0700778 return new ColorLayer(LayerCreationArgs(test->mFlinger.mFlinger.get(), sp<Client>(),
779 String8("test-layer"), LayerProperties::WIDTH,
780 LayerProperties::HEIGHT,
781 LayerProperties::LAYER_FLAGS));
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700782 });
Vishnu Nair60356342018-11-13 13:00:45 -0800783
784 auto& layerDrawingState = test->mFlinger.mutableLayerDrawingState(layer);
785 layerDrawingState.crop_legacy = Rect(0, 0, LayerProperties::HEIGHT, LayerProperties::WIDTH);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700786 return layer;
787 }
788
789 static void setupRECompositionCallExpectations(CompositionTest* test) {
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700790 LayerProperties::setupREColorCompositionCallExpectations(test);
791 }
792
793 static void setupREScreenshotCompositionCallExpectations(CompositionTest* test) {
794 LayerProperties::setupREColorScreenshotCompositionCallExpectations(test);
795 }
796
797 static void setupCallExpectationsForDirtyGeometry(CompositionTest* test) {
798 LayerProperties::setupHwcSetGeometryCallExpectations(test);
799 LayerProperties::setupHwcSetSourceCropColorCallExpectations(test);
800 }
801
802 static void setupCallExpectationsForDirtyFrame(CompositionTest* test) {
803 LayerProperties::setupHwcSetPerFrameCallExpectations(test);
804 LayerProperties::setupHwcSetPerFrameColorCallExpectations(test);
805 }
806};
807
808template <typename LayerProperties>
809struct BufferLayerVariant : public BaseLayerVariant<LayerProperties> {
810 using Base = BaseLayerVariant<LayerProperties>;
811 using FlingerLayerType = sp<BufferQueueLayer>;
812
813 static FlingerLayerType createLayer(CompositionTest* test) {
814 test->mFlinger.mutableTexturePool().push_back(DEFAULT_TEXTURE_ID);
815
816 FlingerLayerType layer =
817 Base::template createLayerWithFactory<BufferQueueLayer>(test, [test]() {
Lloyd Pique42ab75e2018-09-12 20:46:03 -0700818 return new BufferQueueLayer(
819 LayerCreationArgs(test->mFlinger.mFlinger.get(), sp<Client>(),
820 String8("test-layer"), LayerProperties::WIDTH,
821 LayerProperties::HEIGHT,
822 LayerProperties::LAYER_FLAGS));
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700823 });
824
825 LayerProperties::setupLayerState(test, layer);
826
827 return layer;
828 }
829
830 static void cleanupInjectedLayers(CompositionTest* test) {
831 EXPECT_CALL(*test->mMessageQueue, postMessage(_, 0)).Times(2);
832 Base::cleanupInjectedLayers(test);
833 }
834
835 static void setupCallExpectationsForDirtyGeometry(CompositionTest* test) {
836 LayerProperties::setupHwcSetGeometryCallExpectations(test);
837 LayerProperties::setupHwcSetSourceCropBufferCallExpectations(test);
838 }
839
840 static void setupCallExpectationsForDirtyFrame(CompositionTest* test) {
841 LayerProperties::setupHwcSetPerFrameCallExpectations(test);
842 LayerProperties::setupHwcSetPerFrameBufferCallExpectations(test);
843 }
844
845 static void setupRECompositionCallExpectations(CompositionTest* test) {
846 LayerProperties::setupREBufferCompositionCallExpectations(test);
847 }
848
849 static void setupInsecureRECompositionCallExpectations(CompositionTest* test) {
850 LayerProperties::setupInsecureREBufferCompositionCallExpectations(test);
851 }
852
853 static void setupREScreenshotCompositionCallExpectations(CompositionTest* test) {
854 LayerProperties::setupREBufferScreenshotCompositionCallExpectations(test);
855 }
856
857 static void setupInsecureREScreenshotCompositionCallExpectations(CompositionTest* test) {
858 LayerProperties::setupInsecureREBufferScreenshotCompositionCallExpectations(test);
859 }
860};
861
862/* ------------------------------------------------------------------------
863 * Variants to control how the composition type is changed
864 */
865
866struct NoCompositionTypeVariant {
867 static void setupHwcSetCallExpectations(CompositionTest*) {}
868
869 static void setupHwcGetCallExpectations(CompositionTest* test) {
870 EXPECT_CALL(*test->mComposer, getChangedCompositionTypes(HWC_DISPLAY, _, _)).Times(1);
871 }
872};
873
874template <IComposerClient::Composition CompositionType>
875struct KeepCompositionTypeVariant {
876 static constexpr HWC2::Composition TYPE = static_cast<HWC2::Composition>(CompositionType);
877
878 static void setupHwcSetCallExpectations(CompositionTest* test) {
879 EXPECT_CALL(*test->mComposer,
880 setLayerCompositionType(HWC_DISPLAY, HWC_LAYER, CompositionType))
881 .Times(1);
882 }
883
884 static void setupHwcGetCallExpectations(CompositionTest* test) {
885 EXPECT_CALL(*test->mComposer, getChangedCompositionTypes(HWC_DISPLAY, _, _)).Times(1);
886 }
887};
888
889template <IComposerClient::Composition InitialCompositionType,
890 IComposerClient::Composition FinalCompositionType>
891struct ChangeCompositionTypeVariant {
892 static constexpr HWC2::Composition TYPE = static_cast<HWC2::Composition>(FinalCompositionType);
893
894 static void setupHwcSetCallExpectations(CompositionTest* test) {
895 EXPECT_CALL(*test->mComposer,
896 setLayerCompositionType(HWC_DISPLAY, HWC_LAYER, InitialCompositionType))
897 .Times(1);
898 }
899
900 static void setupHwcGetCallExpectations(CompositionTest* test) {
901 EXPECT_CALL(*test->mComposer, getChangedCompositionTypes(HWC_DISPLAY, _, _))
902 .WillOnce(DoAll(SetArgPointee<1>(std::vector<Hwc2::Layer>{
903 static_cast<Hwc2::Layer>(HWC_LAYER)}),
904 SetArgPointee<2>(std::vector<IComposerClient::Composition>{
905 FinalCompositionType}),
906 Return(Error::NONE)));
907 }
908};
909
910/* ------------------------------------------------------------------------
911 * Variants to select how the composition is expected to be handled
912 */
913
914struct CompositionResultBaseVariant {
915 static void setupLayerState(CompositionTest*, sp<Layer>) {}
916
917 template <typename Case>
918 static void setupCallExpectationsForDirtyGeometry(CompositionTest* test) {
919 Case::Layer::setupCallExpectationsForDirtyGeometry(test);
920 }
921
922 template <typename Case>
923 static void setupCallExpectationsForDirtyFrame(CompositionTest* test) {
924 Case::Layer::setupCallExpectationsForDirtyFrame(test);
925 }
926};
927
928struct NoCompositionResultVariant : public CompositionResultBaseVariant {
929 template <typename Case>
930 static void setupCallExpectations(CompositionTest* test) {
931 Case::Display::setupEmptyFrameCompositionCallExpectations(test);
932 Case::Display::setupHwcCompositionCallExpectations(test);
933 }
934};
935
936struct HwcCompositionResultVariant : public CompositionResultBaseVariant {
937 template <typename Case>
938 static void setupCallExpectations(CompositionTest* test) {
939 Case::Display::setupNonEmptyFrameCompositionCallExpectations(test);
940 Case::Display::setupHwcCompositionCallExpectations(test);
941 }
942};
943
944struct RECompositionResultVariant : public CompositionResultBaseVariant {
945 template <typename Case>
946 static void setupCallExpectations(CompositionTest* test) {
947 Case::Display::setupNonEmptyFrameCompositionCallExpectations(test);
948 Case::Display::setupRECompositionCallExpectations(test);
949 Case::Display::template setupRELayerCompositionCallExpectations<Case>(test);
950 }
951};
952
953struct ForcedClientCompositionResultVariant : public RECompositionResultVariant {
954 static void setupLayerState(CompositionTest*, sp<Layer> layer) {
Dominik Laskowski075d3172018-05-24 15:50:06 -0700955 layer->forceClientComposition(DEFAULT_DISPLAY_ID);
Lloyd Piqued6b579f2018-04-06 15:29:10 -0700956 }
957
958 template <typename Case>
959 static void setupCallExpectationsForDirtyGeometry(CompositionTest*) {}
960
961 template <typename Case>
962 static void setupCallExpectationsForDirtyFrame(CompositionTest*) {}
963};
964
965struct EmptyScreenshotResultVariant {
966 static void setupLayerState(CompositionTest*, sp<Layer>) {}
967
968 template <typename Case>
969 static void setupCallExpectations(CompositionTest*) {}
970};
971
972struct REScreenshotResultVariant : public EmptyScreenshotResultVariant {
973 using Base = EmptyScreenshotResultVariant;
974
975 template <typename Case>
976 static void setupCallExpectations(CompositionTest* test) {
977 Base::template setupCallExpectations<Case>(test);
978 Case::Display::template setupRELayerScreenshotCompositionCallExpectations<Case>(test);
979 }
980};
981
982/* ------------------------------------------------------------------------
983 * Composition test case, containing all the variants being tested
984 */
985
986template <typename DisplayCase, typename LayerCase, typename CompositionTypeCase,
987 typename CompositionResultCase>
988struct CompositionCase {
989 using ThisCase =
990 CompositionCase<DisplayCase, LayerCase, CompositionTypeCase, CompositionResultCase>;
991 using Display = DisplayCase;
992 using Layer = LayerCase;
993 using CompositionType = CompositionTypeCase;
994 using CompositionResult = CompositionResultCase;
995
996 static void setupCommon(CompositionTest* test) {
997 Display::setupPreconditions(test);
998
999 auto layer = Layer::createLayer(test);
1000 Layer::injectLayer(test, layer);
1001 CompositionResult::setupLayerState(test, layer);
1002 }
1003
1004 static void setupForDirtyGeometry(CompositionTest* test) {
1005 setupCommon(test);
1006
1007 Display::template setupCommonCompositionCallExpectations<ThisCase>(test);
1008 CompositionResult::template setupCallExpectationsForDirtyGeometry<ThisCase>(test);
1009 CompositionResult::template setupCallExpectationsForDirtyFrame<ThisCase>(test);
1010 CompositionResult::template setupCallExpectations<ThisCase>(test);
1011 }
1012
1013 static void setupForDirtyFrame(CompositionTest* test) {
1014 setupCommon(test);
1015
1016 Display::template setupCommonCompositionCallExpectations<ThisCase>(test);
1017 CompositionResult::template setupCallExpectationsForDirtyFrame<ThisCase>(test);
1018 CompositionResult::template setupCallExpectations<ThisCase>(test);
1019 }
1020
1021 static void setupForScreenCapture(CompositionTest* test) {
1022 setupCommon(test);
1023
1024 Display::template setupCommonScreensCaptureCallExpectations<ThisCase>(test);
1025 CompositionResult::template setupCallExpectations<ThisCase>(test);
1026 }
1027
1028 static void cleanup(CompositionTest* test) {
1029 Layer::cleanupInjectedLayers(test);
1030
1031 for (auto& hwcDisplay : test->mFlinger.mFakeHwcDisplays) {
1032 hwcDisplay->mutableLayers().clear();
1033 }
1034
1035 test->mDisplay->setVisibleLayersSortedByZ(Vector<sp<android::Layer>>());
1036 }
1037};
1038
1039/* ------------------------------------------------------------------------
1040 * Composition cases to test
1041 */
1042
1043TEST_F(CompositionTest, noLayersDoesMinimalWorkWithDirtyGeometry) {
1044 displayRefreshCompositionDirtyGeometry<
1045 CompositionCase<DefaultDisplaySetupVariant, NoLayerVariant, NoCompositionTypeVariant,
1046 NoCompositionResultVariant>>();
1047}
1048
1049TEST_F(CompositionTest, noLayersDoesMinimalWorkWithDirtyFrame) {
1050 displayRefreshCompositionDirtyFrame<
1051 CompositionCase<DefaultDisplaySetupVariant, NoLayerVariant, NoCompositionTypeVariant,
1052 NoCompositionResultVariant>>();
1053}
1054
1055TEST_F(CompositionTest, noLayersDoesMinimalWorkToCaptureScreen) {
1056 captureScreenComposition<
1057 CompositionCase<DefaultDisplaySetupVariant, NoLayerVariant, NoCompositionTypeVariant,
1058 EmptyScreenshotResultVariant>>();
1059}
1060
1061/* ------------------------------------------------------------------------
1062 * Simple buffer layers
1063 */
1064
1065TEST_F(CompositionTest, HWCComposedNormalBufferLayerWithDirtyGeometry) {
1066 displayRefreshCompositionDirtyGeometry<
1067 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1068 KeepCompositionTypeVariant<IComposerClient::Composition::DEVICE>,
1069 HwcCompositionResultVariant>>();
1070}
1071
1072TEST_F(CompositionTest, HWCComposedNormalBufferLayerWithDirtyFrame) {
1073 displayRefreshCompositionDirtyFrame<
1074 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1075 KeepCompositionTypeVariant<IComposerClient::Composition::DEVICE>,
1076 HwcCompositionResultVariant>>();
1077}
1078
1079TEST_F(CompositionTest, REComposedNormalBufferLayer) {
1080 displayRefreshCompositionDirtyFrame<
1081 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1082 ChangeCompositionTypeVariant<IComposerClient::Composition::DEVICE,
1083 IComposerClient::Composition::CLIENT>,
1084 RECompositionResultVariant>>();
1085}
1086
1087TEST_F(CompositionTest, captureScreenNormalBufferLayer) {
1088 captureScreenComposition<
1089 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1090 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1091}
1092
1093/* ------------------------------------------------------------------------
1094 * Single-color layers
1095 */
1096
1097TEST_F(CompositionTest, HWCComposedColorLayerWithDirtyGeometry) {
1098 displayRefreshCompositionDirtyGeometry<
1099 CompositionCase<DefaultDisplaySetupVariant, ColorLayerVariant<ColorLayerProperties>,
1100 KeepCompositionTypeVariant<IComposerClient::Composition::SOLID_COLOR>,
1101 HwcCompositionResultVariant>>();
1102}
1103
1104TEST_F(CompositionTest, HWCComposedColorLayerWithDirtyFrame) {
1105 displayRefreshCompositionDirtyFrame<
1106 CompositionCase<DefaultDisplaySetupVariant, ColorLayerVariant<ColorLayerProperties>,
1107 KeepCompositionTypeVariant<IComposerClient::Composition::SOLID_COLOR>,
1108 HwcCompositionResultVariant>>();
1109}
1110
1111TEST_F(CompositionTest, REComposedColorLayer) {
1112 displayRefreshCompositionDirtyFrame<
1113 CompositionCase<DefaultDisplaySetupVariant, ColorLayerVariant<ColorLayerProperties>,
1114 ChangeCompositionTypeVariant<IComposerClient::Composition::SOLID_COLOR,
1115 IComposerClient::Composition::CLIENT>,
1116 RECompositionResultVariant>>();
1117}
1118
1119TEST_F(CompositionTest, captureScreenColorLayer) {
1120 captureScreenComposition<
1121 CompositionCase<DefaultDisplaySetupVariant, ColorLayerVariant<ColorLayerProperties>,
1122 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1123}
1124
1125/* ------------------------------------------------------------------------
1126 * Layers with sideband buffers
1127 */
1128
1129TEST_F(CompositionTest, HWCComposedSidebandBufferLayerWithDirtyGeometry) {
1130 displayRefreshCompositionDirtyGeometry<
1131 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<SidebandLayerProperties>,
1132 KeepCompositionTypeVariant<IComposerClient::Composition::SIDEBAND>,
1133 HwcCompositionResultVariant>>();
1134}
1135
1136TEST_F(CompositionTest, HWCComposedSidebandBufferLayerWithDirtyFrame) {
1137 displayRefreshCompositionDirtyFrame<
1138 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<SidebandLayerProperties>,
1139 KeepCompositionTypeVariant<IComposerClient::Composition::SIDEBAND>,
1140 HwcCompositionResultVariant>>();
1141}
1142
1143TEST_F(CompositionTest, REComposedSidebandBufferLayer) {
1144 displayRefreshCompositionDirtyFrame<
1145 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<SidebandLayerProperties>,
1146 ChangeCompositionTypeVariant<IComposerClient::Composition::SIDEBAND,
1147 IComposerClient::Composition::CLIENT>,
1148 RECompositionResultVariant>>();
1149}
1150
1151TEST_F(CompositionTest, captureScreenSidebandBufferLayer) {
1152 captureScreenComposition<
1153 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<SidebandLayerProperties>,
1154 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1155}
1156
1157/* ------------------------------------------------------------------------
1158 * Layers with ISurfaceComposerClient::eSecure, on a secure display
1159 */
1160
1161TEST_F(CompositionTest, HWCComposedSecureBufferLayerWithDirtyGeometry) {
1162 displayRefreshCompositionDirtyGeometry<
1163 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<SecureLayerProperties>,
1164 KeepCompositionTypeVariant<IComposerClient::Composition::DEVICE>,
1165 HwcCompositionResultVariant>>();
1166}
1167
1168TEST_F(CompositionTest, HWCComposedSecureBufferLayerWithDirtyFrame) {
1169 displayRefreshCompositionDirtyFrame<
1170 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<SecureLayerProperties>,
1171 KeepCompositionTypeVariant<IComposerClient::Composition::DEVICE>,
1172 HwcCompositionResultVariant>>();
1173}
1174
1175TEST_F(CompositionTest, REComposedSecureBufferLayer) {
1176 displayRefreshCompositionDirtyFrame<
1177 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<SecureLayerProperties>,
1178 ChangeCompositionTypeVariant<IComposerClient::Composition::DEVICE,
1179 IComposerClient::Composition::CLIENT>,
1180 RECompositionResultVariant>>();
1181}
1182
1183TEST_F(CompositionTest, captureScreenSecureBufferLayerOnSecureDisplay) {
1184 captureScreenComposition<
1185 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<SecureLayerProperties>,
1186 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1187}
1188
1189/* ------------------------------------------------------------------------
1190 * Layers with ISurfaceComposerClient::eSecure, on a non-secure display
1191 */
1192
1193TEST_F(CompositionTest, HWCComposedSecureBufferLayerOnInsecureDisplayWithDirtyGeometry) {
1194 displayRefreshCompositionDirtyGeometry<
1195 CompositionCase<InsecureDisplaySetupVariant, BufferLayerVariant<SecureLayerProperties>,
1196 KeepCompositionTypeVariant<IComposerClient::Composition::CLIENT>,
1197 ForcedClientCompositionResultVariant>>();
1198}
1199
1200TEST_F(CompositionTest, HWCComposedSecureBufferLayerOnInsecureDisplayWithDirtyFrame) {
1201 displayRefreshCompositionDirtyFrame<
1202 CompositionCase<InsecureDisplaySetupVariant, BufferLayerVariant<SecureLayerProperties>,
1203 KeepCompositionTypeVariant<IComposerClient::Composition::CLIENT>,
1204 ForcedClientCompositionResultVariant>>();
1205}
1206
1207TEST_F(CompositionTest, captureScreenSecureBufferLayerOnInsecureDisplay) {
1208 captureScreenComposition<
1209 CompositionCase<InsecureDisplaySetupVariant, BufferLayerVariant<SecureLayerProperties>,
1210 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1211}
1212
1213/* ------------------------------------------------------------------------
1214 * Cursor layers
1215 */
1216
1217TEST_F(CompositionTest, HWCComposedCursorLayerWithDirtyGeometry) {
1218 displayRefreshCompositionDirtyGeometry<
1219 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<CursorLayerProperties>,
1220 KeepCompositionTypeVariant<IComposerClient::Composition::CURSOR>,
1221 HwcCompositionResultVariant>>();
1222}
1223
1224TEST_F(CompositionTest, HWCComposedCursorLayerWithDirtyFrame) {
1225 displayRefreshCompositionDirtyFrame<
1226 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<CursorLayerProperties>,
1227 KeepCompositionTypeVariant<IComposerClient::Composition::CURSOR>,
1228 HwcCompositionResultVariant>>();
1229}
1230
1231TEST_F(CompositionTest, REComposedCursorLayer) {
1232 displayRefreshCompositionDirtyFrame<
1233 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<CursorLayerProperties>,
1234 ChangeCompositionTypeVariant<IComposerClient::Composition::CURSOR,
1235 IComposerClient::Composition::CLIENT>,
1236 RECompositionResultVariant>>();
1237}
1238
1239TEST_F(CompositionTest, captureScreenCursorLayer) {
1240 captureScreenComposition<
1241 CompositionCase<DefaultDisplaySetupVariant, BufferLayerVariant<CursorLayerProperties>,
1242 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1243}
1244
1245/* ------------------------------------------------------------------------
1246 * Simple buffer layer on a display which is powered off.
1247 */
1248
1249TEST_F(CompositionTest, displayOffHWCComposedNormalBufferLayerWithDirtyGeometry) {
1250 displayRefreshCompositionDirtyGeometry<CompositionCase<
1251 PoweredOffDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1252 KeepCompositionTypeVariant<IComposerClient::Composition::DEVICE>,
1253 HwcCompositionResultVariant>>();
1254}
1255
1256TEST_F(CompositionTest, displayOffHWCComposedNormalBufferLayerWithDirtyFrame) {
1257 displayRefreshCompositionDirtyFrame<CompositionCase<
1258 PoweredOffDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1259 KeepCompositionTypeVariant<IComposerClient::Composition::DEVICE>,
1260 HwcCompositionResultVariant>>();
1261}
1262
1263TEST_F(CompositionTest, displayOffREComposedNormalBufferLayer) {
1264 displayRefreshCompositionDirtyFrame<CompositionCase<
1265 PoweredOffDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1266 ChangeCompositionTypeVariant<IComposerClient::Composition::DEVICE,
1267 IComposerClient::Composition::CLIENT>,
1268 RECompositionResultVariant>>();
1269}
1270
1271TEST_F(CompositionTest, captureScreenNormalBufferLayerOnPoweredOffDisplay) {
1272 captureScreenComposition<CompositionCase<
1273 PoweredOffDisplaySetupVariant, BufferLayerVariant<DefaultLayerProperties>,
1274 NoCompositionTypeVariant, REScreenshotResultVariant>>();
1275}
1276
1277} // namespace
1278} // namespace android