blob: 6d01bf195b330c7fbcb3e246b32f136d698997ae [file] [log] [blame]
Lloyd Pique45a165a2018-10-19 11:54:47 -07001/*
2 * Copyright 2019 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
Lloyd Pique45a165a2018-10-19 11:54:47 -070017#include <cmath>
18
Lloyd Pique3d0c02e2018-10-19 18:38:12 -070019#include <compositionengine/DisplayColorProfileCreationArgs.h>
Lloyd Pique45a165a2018-10-19 11:54:47 -070020#include <compositionengine/DisplayCreationArgs.h>
Lloyd Pique31cb2942018-10-19 17:23:03 -070021#include <compositionengine/DisplaySurface.h>
22#include <compositionengine/RenderSurfaceCreationArgs.h>
Lloyd Pique45a165a2018-10-19 11:54:47 -070023#include <compositionengine/impl/Display.h>
Lloyd Piquec6607552019-12-02 17:57:39 -080024#include <compositionengine/impl/RenderSurface.h>
Lloyd Pique45a165a2018-10-19 11:54:47 -070025#include <compositionengine/mock/CompositionEngine.h>
Lloyd Piquef5275482019-01-29 18:42:42 -080026#include <compositionengine/mock/DisplayColorProfile.h>
Lloyd Piquec6607552019-12-02 17:57:39 -080027#include <compositionengine/mock/DisplaySurface.h>
Lloyd Piquedf336d92019-03-07 21:38:42 -080028#include <compositionengine/mock/LayerFE.h>
chaviw8beb4142019-04-11 13:09:05 -070029#include <compositionengine/mock/NativeWindow.h>
Lloyd Pique66d68602019-02-13 14:23:31 -080030#include <compositionengine/mock/OutputLayer.h>
Lloyd Pique31cb2942018-10-19 17:23:03 -070031#include <compositionengine/mock/RenderSurface.h>
Lloyd Pique32cbe282018-10-19 13:09:22 -070032#include <gtest/gtest.h>
Lloyd Piquee9eff972020-05-05 12:36:44 -070033#include <renderengine/mock/RenderEngine.h>
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070034#include <ui/DisplayInfo.h>
35#include <ui/Rect.h>
Lloyd Pique45a165a2018-10-19 11:54:47 -070036
Lloyd Pique66d68602019-02-13 14:23:31 -080037#include "MockHWC2.h"
Lloyd Pique45a165a2018-10-19 11:54:47 -070038#include "MockHWComposer.h"
Lloyd Pique688abd42019-02-15 15:42:24 -080039#include "MockPowerAdvisor.h"
Lloyd Pique45a165a2018-10-19 11:54:47 -070040
41namespace android::compositionengine {
42namespace {
43
Peiyong Line9d809e2020-04-14 13:10:48 -070044namespace hal = android::hardware::graphics::composer::hal;
45
Lloyd Piquef5275482019-01-29 18:42:42 -080046using testing::_;
Lloyd Pique66d68602019-02-13 14:23:31 -080047using testing::DoAll;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070048using testing::Eq;
Lloyd Piquec6607552019-12-02 17:57:39 -080049using testing::InSequence;
50using testing::NiceMock;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070051using testing::Pointee;
52using testing::Ref;
Lloyd Pique31cb2942018-10-19 17:23:03 -070053using testing::Return;
Lloyd Pique45a165a2018-10-19 11:54:47 -070054using testing::ReturnRef;
Lloyd Pique66d68602019-02-13 14:23:31 -080055using testing::Sequence;
56using testing::SetArgPointee;
Lloyd Pique45a165a2018-10-19 11:54:47 -070057using testing::StrictMock;
58
Marin Shalamanova524a092020-07-27 21:39:55 +020059constexpr PhysicalDisplayId DEFAULT_DISPLAY_ID = PhysicalDisplayId{42};
60// TODO(b/160679868) Use VirtualDisplayId
61constexpr PhysicalDisplayId VIRTUAL_DISPLAY_ID = PhysicalDisplayId{43};
Lloyd Piquec6607552019-12-02 17:57:39 -080062constexpr int32_t DEFAULT_DISPLAY_WIDTH = 1920;
63constexpr int32_t DEFAULT_DISPLAY_HEIGHT = 1080;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070064constexpr int32_t DEFAULT_LAYER_STACK = 123;
Lloyd Pique45a165a2018-10-19 11:54:47 -070065
Lloyd Piquede196652020-01-22 17:29:58 -080066struct Layer {
67 Layer() {
68 EXPECT_CALL(*outputLayer, getLayerFE()).WillRepeatedly(ReturnRef(*layerFE));
69 EXPECT_CALL(*outputLayer, getHwcLayer()).WillRepeatedly(Return(&hwc2Layer));
70 }
71
72 sp<mock::LayerFE> layerFE = new StrictMock<mock::LayerFE>();
73 StrictMock<mock::OutputLayer>* outputLayer = new StrictMock<mock::OutputLayer>();
74 StrictMock<HWC2::mock::Layer> hwc2Layer;
75};
76
77struct LayerNoHWC2Layer {
78 LayerNoHWC2Layer() {
79 EXPECT_CALL(*outputLayer, getLayerFE()).WillRepeatedly(ReturnRef(*layerFE));
80 EXPECT_CALL(*outputLayer, getHwcLayer()).WillRepeatedly(Return(nullptr));
81 }
82
83 sp<mock::LayerFE> layerFE = new StrictMock<mock::LayerFE>();
84 StrictMock<mock::OutputLayer>* outputLayer = new StrictMock<mock::OutputLayer>();
85};
86
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070087struct DisplayTestCommon : public testing::Test {
88 // Uses the full implementation of a display
89 class FullImplDisplay : public impl::Display {
Lloyd Pique01c77c12019-04-17 12:48:32 -070090 public:
Lloyd Pique01c77c12019-04-17 12:48:32 -070091 using impl::Display::injectOutputLayerForTest;
92 virtual void injectOutputLayerForTest(std::unique_ptr<compositionengine::OutputLayer>) = 0;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070093
94 using impl::Display::maybeAllocateDisplayIdForVirtualDisplay;
Lloyd Pique01c77c12019-04-17 12:48:32 -070095 };
96
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070097 // Uses a special implementation with key internal member functions set up
98 // as mock implementations, to allow for easier testing.
99 struct PartialMockDisplay : public impl::Display {
100 PartialMockDisplay(const compositionengine::CompositionEngine& compositionEngine)
101 : mCompositionEngine(compositionEngine) {}
102
103 // compositionengine::Output overrides
104 const OutputCompositionState& getState() const override { return mState; }
105 OutputCompositionState& editState() override { return mState; }
106
107 // compositionengine::impl::Output overrides
108 const CompositionEngine& getCompositionEngine() const override {
109 return mCompositionEngine;
110 };
111
112 // Mock implementation overrides
113 MOCK_CONST_METHOD0(getOutputLayerCount, size_t());
114 MOCK_CONST_METHOD1(getOutputLayerOrderedByZByIndex,
115 compositionengine::OutputLayer*(size_t));
116 MOCK_METHOD2(ensureOutputLayer,
117 compositionengine::OutputLayer*(std::optional<size_t>, const sp<LayerFE>&));
118 MOCK_METHOD0(finalizePendingOutputLayers, void());
119 MOCK_METHOD0(clearOutputLayers, void());
120 MOCK_CONST_METHOD1(dumpState, void(std::string&));
121 MOCK_METHOD1(injectOutputLayerForTest, compositionengine::OutputLayer*(const sp<LayerFE>&));
122 MOCK_METHOD1(injectOutputLayerForTest, void(std::unique_ptr<OutputLayer>));
123 MOCK_CONST_METHOD0(anyLayersRequireClientComposition, bool());
124 MOCK_CONST_METHOD0(allLayersRequireClientComposition, bool());
125 MOCK_METHOD1(applyChangedTypesToLayers, void(const impl::Display::ChangedTypes&));
126 MOCK_METHOD1(applyDisplayRequests, void(const impl::Display::DisplayRequests&));
127 MOCK_METHOD1(applyLayerRequestsToLayers, void(const impl::Display::LayerRequests&));
128
129 const compositionengine::CompositionEngine& mCompositionEngine;
130 impl::OutputCompositionState mState;
131 };
132
133 static std::string getDisplayNameFromCurrentTest() {
134 const ::testing::TestInfo* const test_info =
135 ::testing::UnitTest::GetInstance()->current_test_info();
136 return std::string("display for ") + test_info->test_case_name() + "." + test_info->name();
137 }
138
139 template <typename Display>
Lloyd Pique01c77c12019-04-17 12:48:32 -0700140 static std::shared_ptr<Display> createDisplay(
141 const compositionengine::CompositionEngine& compositionEngine,
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700142 compositionengine::DisplayCreationArgs args) {
143 args.name = getDisplayNameFromCurrentTest();
Lloyd Pique01c77c12019-04-17 12:48:32 -0700144 return impl::createDisplayTemplated<Display>(compositionEngine, args);
145 }
146
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700147 template <typename Display>
148 static std::shared_ptr<StrictMock<Display>> createPartialMockDisplay(
149 const compositionengine::CompositionEngine& compositionEngine,
150 compositionengine::DisplayCreationArgs args) {
151 args.name = getDisplayNameFromCurrentTest();
152 auto display = std::make_shared<StrictMock<Display>>(compositionEngine);
Lloyd Pique66d68602019-02-13 14:23:31 -0800153
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700154 display->setConfiguration(args);
155
156 return display;
157 }
158
159 DisplayTestCommon() {
160 EXPECT_CALL(mCompositionEngine, getHwComposer()).WillRepeatedly(ReturnRef(mHwComposer));
Lloyd Piquee9eff972020-05-05 12:36:44 -0700161 EXPECT_CALL(mCompositionEngine, getRenderEngine()).WillRepeatedly(ReturnRef(mRenderEngine));
162 EXPECT_CALL(mRenderEngine, supportsProtectedContent()).WillRepeatedly(Return(false));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700163 }
164
165 DisplayCreationArgs getDisplayCreationArgsForPhysicalHWCDisplay() {
166 return DisplayCreationArgsBuilder()
167 .setPhysical({DEFAULT_DISPLAY_ID, DisplayConnectionType::Internal})
168 .setPixels({DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT})
169 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
170 .setIsSecure(true)
171 .setLayerStackId(DEFAULT_LAYER_STACK)
172 .setPowerAdvisor(&mPowerAdvisor)
173 .build();
174 }
175
176 DisplayCreationArgs getDisplayCreationArgsForNonHWCVirtualDisplay() {
177 return DisplayCreationArgsBuilder()
178 .setUseHwcVirtualDisplays(false)
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200179 .setGpuVirtualDisplayIdGenerator(mGpuDisplayIdGenerator)
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700180 .setPixels({DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT})
181 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
182 .setIsSecure(false)
183 .setLayerStackId(DEFAULT_LAYER_STACK)
184 .setPowerAdvisor(&mPowerAdvisor)
185 .build();
186 }
187
188 StrictMock<android::mock::HWComposer> mHwComposer;
189 StrictMock<Hwc2::mock::PowerAdvisor> mPowerAdvisor;
Lloyd Piquee9eff972020-05-05 12:36:44 -0700190 StrictMock<renderengine::mock::RenderEngine> mRenderEngine;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700191 StrictMock<mock::CompositionEngine> mCompositionEngine;
192 sp<mock::NativeWindow> mNativeWindow = new StrictMock<mock::NativeWindow>();
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200193 RandomDisplayIdGenerator<GpuVirtualDisplayId> mGpuDisplayIdGenerator;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700194};
195
196struct PartialMockDisplayTestCommon : public DisplayTestCommon {
197 using Display = DisplayTestCommon::PartialMockDisplay;
198 std::shared_ptr<Display> mDisplay =
199 createPartialMockDisplay<Display>(mCompositionEngine,
200 getDisplayCreationArgsForPhysicalHWCDisplay());
201};
202
203struct FullDisplayImplTestCommon : public DisplayTestCommon {
204 using Display = DisplayTestCommon::FullImplDisplay;
205 std::shared_ptr<Display> mDisplay =
206 createDisplay<Display>(mCompositionEngine,
207 getDisplayCreationArgsForPhysicalHWCDisplay());
208};
209
210struct DisplayWithLayersTestCommon : public FullDisplayImplTestCommon {
211 DisplayWithLayersTestCommon() {
Lloyd Pique01c77c12019-04-17 12:48:32 -0700212 mDisplay->injectOutputLayerForTest(
Lloyd Piquede196652020-01-22 17:29:58 -0800213 std::unique_ptr<compositionengine::OutputLayer>(mLayer1.outputLayer));
Lloyd Pique01c77c12019-04-17 12:48:32 -0700214 mDisplay->injectOutputLayerForTest(
Lloyd Piquede196652020-01-22 17:29:58 -0800215 std::unique_ptr<compositionengine::OutputLayer>(mLayer2.outputLayer));
Lloyd Pique01c77c12019-04-17 12:48:32 -0700216 mDisplay->injectOutputLayerForTest(
Lloyd Piquede196652020-01-22 17:29:58 -0800217 std::unique_ptr<compositionengine::OutputLayer>(mLayer3.outputLayer));
Lloyd Pique66d68602019-02-13 14:23:31 -0800218 }
Lloyd Pique45a165a2018-10-19 11:54:47 -0700219
Lloyd Piquede196652020-01-22 17:29:58 -0800220 Layer mLayer1;
221 Layer mLayer2;
222 LayerNoHWC2Layer mLayer3;
223 StrictMock<HWC2::mock::Layer> hwc2LayerUnknown;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700224 std::shared_ptr<Display> mDisplay =
225 createDisplay<Display>(mCompositionEngine,
226 getDisplayCreationArgsForPhysicalHWCDisplay());
Lloyd Pique45a165a2018-10-19 11:54:47 -0700227};
228
Lloyd Pique66d68602019-02-13 14:23:31 -0800229/*
Lloyd Pique45a165a2018-10-19 11:54:47 -0700230 * Basic construction
231 */
232
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700233struct DisplayCreationTest : public DisplayTestCommon {
234 using Display = DisplayTestCommon::FullImplDisplay;
235};
Lloyd Pique45a165a2018-10-19 11:54:47 -0700236
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700237TEST_F(DisplayCreationTest, createPhysicalInternalDisplay) {
238 auto display =
239 impl::createDisplay(mCompositionEngine, getDisplayCreationArgsForPhysicalHWCDisplay());
240 EXPECT_TRUE(display->isSecure());
241 EXPECT_FALSE(display->isVirtual());
242 EXPECT_EQ(DEFAULT_DISPLAY_ID, display->getId());
243}
Lloyd Pique45a165a2018-10-19 11:54:47 -0700244
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700245TEST_F(DisplayCreationTest, createNonHwcVirtualDisplay) {
246 auto display = impl::createDisplay(mCompositionEngine,
247 getDisplayCreationArgsForNonHWCVirtualDisplay());
248 EXPECT_FALSE(display->isSecure());
249 EXPECT_TRUE(display->isVirtual());
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200250 EXPECT_TRUE(GpuVirtualDisplayId::tryCast(display->getId()));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700251}
252
253/*
254 * Display::setConfiguration()
255 */
256
257using DisplaySetConfigurationTest = PartialMockDisplayTestCommon;
258
259TEST_F(DisplaySetConfigurationTest, configuresInternalSecurePhysicalDisplay) {
260 mDisplay->setConfiguration(
261 DisplayCreationArgsBuilder()
262 .setUseHwcVirtualDisplays(true)
263 .setPhysical({DEFAULT_DISPLAY_ID, DisplayConnectionType::Internal})
264 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
265 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
266 .setIsSecure(true)
267 .setLayerStackId(DEFAULT_LAYER_STACK)
268 .setPowerAdvisor(&mPowerAdvisor)
269 .setName(getDisplayNameFromCurrentTest())
270 .build());
271
272 EXPECT_EQ(DEFAULT_DISPLAY_ID, mDisplay->getId());
273 EXPECT_TRUE(mDisplay->isSecure());
274 EXPECT_FALSE(mDisplay->isVirtual());
275 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
276 EXPECT_TRUE(mDisplay->getState().layerStackInternal);
277 EXPECT_FALSE(mDisplay->isValid());
278}
279
280TEST_F(DisplaySetConfigurationTest, configuresExternalInsecurePhysicalDisplay) {
281 mDisplay->setConfiguration(
282 DisplayCreationArgsBuilder()
283 .setUseHwcVirtualDisplays(true)
284 .setPhysical({DEFAULT_DISPLAY_ID, DisplayConnectionType::External})
285 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
286 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
287 .setIsSecure(false)
288 .setLayerStackId(DEFAULT_LAYER_STACK)
289 .setPowerAdvisor(&mPowerAdvisor)
290 .setName(getDisplayNameFromCurrentTest())
291 .build());
292
293 EXPECT_EQ(DEFAULT_DISPLAY_ID, mDisplay->getId());
294 EXPECT_FALSE(mDisplay->isSecure());
295 EXPECT_FALSE(mDisplay->isVirtual());
296 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
297 EXPECT_FALSE(mDisplay->getState().layerStackInternal);
298 EXPECT_FALSE(mDisplay->isValid());
299}
300
301TEST_F(DisplaySetConfigurationTest, configuresHwcBackedVirtualDisplay) {
302 EXPECT_CALL(mHwComposer,
303 allocateVirtualDisplay(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH,
304 Pointee(Eq(static_cast<ui::PixelFormat>(
305 PIXEL_FORMAT_RGBA_8888)))))
306 .WillOnce(Return(VIRTUAL_DISPLAY_ID));
307
308 mDisplay->setConfiguration(
309 DisplayCreationArgsBuilder()
310 .setUseHwcVirtualDisplays(true)
311 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
312 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
313 .setIsSecure(false)
314 .setLayerStackId(DEFAULT_LAYER_STACK)
315 .setPowerAdvisor(&mPowerAdvisor)
316 .setName(getDisplayNameFromCurrentTest())
317 .build());
318
319 EXPECT_EQ(VIRTUAL_DISPLAY_ID, mDisplay->getId());
320 EXPECT_FALSE(mDisplay->isSecure());
321 EXPECT_TRUE(mDisplay->isVirtual());
322 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
323 EXPECT_FALSE(mDisplay->getState().layerStackInternal);
324 EXPECT_FALSE(mDisplay->isValid());
325}
326
327TEST_F(DisplaySetConfigurationTest, configuresNonHwcBackedVirtualDisplayIfHwcAllocationFails) {
328 EXPECT_CALL(mHwComposer,
329 allocateVirtualDisplay(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH,
330 Pointee(Eq(static_cast<ui::PixelFormat>(
331 PIXEL_FORMAT_RGBA_8888)))))
332 .WillOnce(Return(std::nullopt));
333
334 mDisplay->setConfiguration(
335 DisplayCreationArgsBuilder()
336 .setUseHwcVirtualDisplays(true)
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200337 .setGpuVirtualDisplayIdGenerator(mGpuDisplayIdGenerator)
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700338 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
339 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
340 .setIsSecure(false)
341 .setLayerStackId(DEFAULT_LAYER_STACK)
342 .setPowerAdvisor(&mPowerAdvisor)
343 .setName(getDisplayNameFromCurrentTest())
344 .build());
345
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200346 EXPECT_TRUE(GpuVirtualDisplayId::tryCast(mDisplay->getId()));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700347 EXPECT_FALSE(mDisplay->isSecure());
348 EXPECT_TRUE(mDisplay->isVirtual());
349 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
350 EXPECT_FALSE(mDisplay->getState().layerStackInternal);
351 EXPECT_FALSE(mDisplay->isValid());
352}
353
354TEST_F(DisplaySetConfigurationTest, configuresNonHwcBackedVirtualDisplayIfShouldNotUseHwc) {
355 mDisplay->setConfiguration(
356 DisplayCreationArgsBuilder()
357 .setUseHwcVirtualDisplays(false)
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200358 .setGpuVirtualDisplayIdGenerator(mGpuDisplayIdGenerator)
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700359 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
360 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
361 .setIsSecure(false)
362 .setLayerStackId(DEFAULT_LAYER_STACK)
363 .setPowerAdvisor(&mPowerAdvisor)
364 .setName(getDisplayNameFromCurrentTest())
365 .build());
366
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200367 EXPECT_TRUE(GpuVirtualDisplayId::tryCast(mDisplay->getId()));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700368 EXPECT_FALSE(mDisplay->isSecure());
369 EXPECT_TRUE(mDisplay->isVirtual());
370 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
371 EXPECT_FALSE(mDisplay->getState().layerStackInternal);
372 EXPECT_FALSE(mDisplay->isValid());
Lloyd Pique45a165a2018-10-19 11:54:47 -0700373}
374
Lloyd Pique66d68602019-02-13 14:23:31 -0800375/*
Lloyd Pique45a165a2018-10-19 11:54:47 -0700376 * Display::disconnect()
377 */
378
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700379using DisplayDisconnectTest = PartialMockDisplayTestCommon;
380
381TEST_F(DisplayDisconnectTest, disconnectsDisplay) {
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200382 // The first call to disconnect will disconnect the display with the HWC.
383 EXPECT_CALL(mHwComposer, disconnectDisplay(HalDisplayId(DEFAULT_DISPLAY_ID))).Times(1);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700384 mDisplay->disconnect();
Lloyd Pique45a165a2018-10-19 11:54:47 -0700385
386 // Subsequent calls will do nothing,
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200387 EXPECT_CALL(mHwComposer, disconnectDisplay(HalDisplayId(DEFAULT_DISPLAY_ID))).Times(0);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700388 mDisplay->disconnect();
Lloyd Pique45a165a2018-10-19 11:54:47 -0700389}
390
Lloyd Pique66d68602019-02-13 14:23:31 -0800391/*
Lloyd Pique32cbe282018-10-19 13:09:22 -0700392 * Display::setColorTransform()
393 */
394
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700395using DisplaySetColorTransformTest = PartialMockDisplayTestCommon;
396
397TEST_F(DisplaySetColorTransformTest, setsTransform) {
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800398 // No change does nothing
399 CompositionRefreshArgs refreshArgs;
400 refreshArgs.colorTransformMatrix = std::nullopt;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700401 mDisplay->setColorTransform(refreshArgs);
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800402
Lloyd Pique32cbe282018-10-19 13:09:22 -0700403 // Identity matrix sets an identity state value
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800404 const mat4 kIdentity;
Lloyd Pique32cbe282018-10-19 13:09:22 -0700405
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200406 EXPECT_CALL(mHwComposer, setColorTransform(HalDisplayId(DEFAULT_DISPLAY_ID), kIdentity))
407 .Times(1);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700408
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800409 refreshArgs.colorTransformMatrix = kIdentity;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700410 mDisplay->setColorTransform(refreshArgs);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700411
412 // Non-identity matrix sets a non-identity state value
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800413 const mat4 kNonIdentity = mat4() * 2;
Lloyd Pique32cbe282018-10-19 13:09:22 -0700414
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200415 EXPECT_CALL(mHwComposer, setColorTransform(HalDisplayId(DEFAULT_DISPLAY_ID), kNonIdentity))
416 .Times(1);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700417
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800418 refreshArgs.colorTransformMatrix = kNonIdentity;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700419 mDisplay->setColorTransform(refreshArgs);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700420}
421
Lloyd Pique66d68602019-02-13 14:23:31 -0800422/*
Lloyd Pique32cbe282018-10-19 13:09:22 -0700423 * Display::setColorMode()
424 */
425
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700426using DisplaySetColorModeTest = PartialMockDisplayTestCommon;
427
428TEST_F(DisplaySetColorModeTest, setsModeUnlessNoChange) {
Lloyd Pique6a3b4462019-03-07 20:58:12 -0800429 using ColorProfile = Output::ColorProfile;
430
Lloyd Pique31cb2942018-10-19 17:23:03 -0700431 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700432 mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
Lloyd Piquef5275482019-01-29 18:42:42 -0800433 mock::DisplayColorProfile* colorProfile = new StrictMock<mock::DisplayColorProfile>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700434 mDisplay->setDisplayColorProfileForTest(std::unique_ptr<DisplayColorProfile>(colorProfile));
Lloyd Pique31cb2942018-10-19 17:23:03 -0700435
Lloyd Piquef5275482019-01-29 18:42:42 -0800436 EXPECT_CALL(*colorProfile, getTargetDataspace(_, _, _))
437 .WillRepeatedly(Return(ui::Dataspace::UNKNOWN));
Lloyd Pique32cbe282018-10-19 13:09:22 -0700438
439 // These values are expected to be the initial state.
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700440 ASSERT_EQ(ui::ColorMode::NATIVE, mDisplay->getState().colorMode);
441 ASSERT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().dataspace);
442 ASSERT_EQ(ui::RenderIntent::COLORIMETRIC, mDisplay->getState().renderIntent);
443 ASSERT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().targetDataspace);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700444
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700445 // Otherwise if the values are unchanged, nothing happens
446 mDisplay->setColorProfile(ColorProfile{ui::ColorMode::NATIVE, ui::Dataspace::UNKNOWN,
447 ui::RenderIntent::COLORIMETRIC, ui::Dataspace::UNKNOWN});
Lloyd Pique32cbe282018-10-19 13:09:22 -0700448
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700449 EXPECT_EQ(ui::ColorMode::NATIVE, mDisplay->getState().colorMode);
450 EXPECT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().dataspace);
451 EXPECT_EQ(ui::RenderIntent::COLORIMETRIC, mDisplay->getState().renderIntent);
452 EXPECT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().targetDataspace);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700453
454 // Otherwise if the values are different, updates happen
Lloyd Piqueef958122019-02-05 18:00:12 -0800455 EXPECT_CALL(*renderSurface, setBufferDataspace(ui::Dataspace::DISPLAY_P3)).Times(1);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700456 EXPECT_CALL(mHwComposer,
Lloyd Piqueef958122019-02-05 18:00:12 -0800457 setActiveColorMode(DEFAULT_DISPLAY_ID, ui::ColorMode::DISPLAY_P3,
Lloyd Pique32cbe282018-10-19 13:09:22 -0700458 ui::RenderIntent::TONE_MAP_COLORIMETRIC))
459 .Times(1);
460
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700461 mDisplay->setColorProfile(ColorProfile{ui::ColorMode::DISPLAY_P3, ui::Dataspace::DISPLAY_P3,
462 ui::RenderIntent::TONE_MAP_COLORIMETRIC,
463 ui::Dataspace::UNKNOWN});
Lloyd Pique32cbe282018-10-19 13:09:22 -0700464
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700465 EXPECT_EQ(ui::ColorMode::DISPLAY_P3, mDisplay->getState().colorMode);
466 EXPECT_EQ(ui::Dataspace::DISPLAY_P3, mDisplay->getState().dataspace);
467 EXPECT_EQ(ui::RenderIntent::TONE_MAP_COLORIMETRIC, mDisplay->getState().renderIntent);
468 EXPECT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().targetDataspace);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700469}
470
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700471TEST_F(DisplaySetColorModeTest, doesNothingForVirtualDisplay) {
Lloyd Pique6a3b4462019-03-07 20:58:12 -0800472 using ColorProfile = Output::ColorProfile;
473
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700474 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
475 std::shared_ptr<impl::Display> virtualDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700476
Lloyd Piquef5275482019-01-29 18:42:42 -0800477 mock::DisplayColorProfile* colorProfile = new StrictMock<mock::DisplayColorProfile>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700478 virtualDisplay->setDisplayColorProfileForTest(
Lloyd Piquef5275482019-01-29 18:42:42 -0800479 std::unique_ptr<DisplayColorProfile>(colorProfile));
480
481 EXPECT_CALL(*colorProfile,
482 getTargetDataspace(ui::ColorMode::DISPLAY_P3, ui::Dataspace::DISPLAY_P3,
483 ui::Dataspace::UNKNOWN))
484 .WillOnce(Return(ui::Dataspace::UNKNOWN));
485
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700486 virtualDisplay->setColorProfile(
Lloyd Pique6a3b4462019-03-07 20:58:12 -0800487 ColorProfile{ui::ColorMode::DISPLAY_P3, ui::Dataspace::DISPLAY_P3,
488 ui::RenderIntent::TONE_MAP_COLORIMETRIC, ui::Dataspace::UNKNOWN});
Lloyd Pique32cbe282018-10-19 13:09:22 -0700489
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700490 EXPECT_EQ(ui::ColorMode::NATIVE, virtualDisplay->getState().colorMode);
491 EXPECT_EQ(ui::Dataspace::UNKNOWN, virtualDisplay->getState().dataspace);
492 EXPECT_EQ(ui::RenderIntent::COLORIMETRIC, virtualDisplay->getState().renderIntent);
493 EXPECT_EQ(ui::Dataspace::UNKNOWN, virtualDisplay->getState().targetDataspace);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700494}
495
Lloyd Pique66d68602019-02-13 14:23:31 -0800496/*
Lloyd Pique3d0c02e2018-10-19 18:38:12 -0700497 * Display::createDisplayColorProfile()
498 */
499
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700500using DisplayCreateColorProfileTest = PartialMockDisplayTestCommon;
501
502TEST_F(DisplayCreateColorProfileTest, setsDisplayColorProfile) {
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700503 EXPECT_TRUE(mDisplay->getDisplayColorProfile() == nullptr);
504 mDisplay->createDisplayColorProfile(
Lloyd Pique3d0c02e2018-10-19 18:38:12 -0700505 DisplayColorProfileCreationArgs{false, HdrCapabilities(), 0,
506 DisplayColorProfileCreationArgs::HwcColorModes()});
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700507 EXPECT_TRUE(mDisplay->getDisplayColorProfile() != nullptr);
Lloyd Pique3d0c02e2018-10-19 18:38:12 -0700508}
509
Lloyd Pique66d68602019-02-13 14:23:31 -0800510/*
Lloyd Pique31cb2942018-10-19 17:23:03 -0700511 * Display::createRenderSurface()
512 */
513
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700514using DisplayCreateRenderSurfaceTest = PartialMockDisplayTestCommon;
515
516TEST_F(DisplayCreateRenderSurfaceTest, setsRenderSurface) {
chaviw8beb4142019-04-11 13:09:05 -0700517 EXPECT_CALL(*mNativeWindow, disconnect(NATIVE_WINDOW_API_EGL)).WillRepeatedly(Return(NO_ERROR));
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700518 EXPECT_TRUE(mDisplay->getRenderSurface() == nullptr);
519 mDisplay->createRenderSurface(RenderSurfaceCreationArgs{640, 480, mNativeWindow, nullptr});
520 EXPECT_TRUE(mDisplay->getRenderSurface() != nullptr);
Lloyd Pique31cb2942018-10-19 17:23:03 -0700521}
522
Lloyd Pique66d68602019-02-13 14:23:31 -0800523/*
Lloyd Piquedf336d92019-03-07 21:38:42 -0800524 * Display::createOutputLayer()
525 */
526
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700527using DisplayCreateOutputLayerTest = FullDisplayImplTestCommon;
528
529TEST_F(DisplayCreateOutputLayerTest, setsHwcLayer) {
Lloyd Piquedf336d92019-03-07 21:38:42 -0800530 sp<mock::LayerFE> layerFE = new StrictMock<mock::LayerFE>();
Lloyd Piquedf336d92019-03-07 21:38:42 -0800531 StrictMock<HWC2::mock::Layer> hwcLayer;
532
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200533 EXPECT_CALL(mHwComposer, createLayer(HalDisplayId(DEFAULT_DISPLAY_ID)))
534 .WillOnce(Return(&hwcLayer));
Lloyd Piquedf336d92019-03-07 21:38:42 -0800535
Lloyd Piquede196652020-01-22 17:29:58 -0800536 auto outputLayer = mDisplay->createOutputLayer(layerFE);
Lloyd Piquedf336d92019-03-07 21:38:42 -0800537
538 EXPECT_EQ(&hwcLayer, outputLayer->getHwcLayer());
539
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200540 EXPECT_CALL(mHwComposer, destroyLayer(HalDisplayId(DEFAULT_DISPLAY_ID), &hwcLayer));
Lloyd Piquedf336d92019-03-07 21:38:42 -0800541 outputLayer.reset();
542}
543
544/*
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800545 * Display::setReleasedLayers()
546 */
547
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700548using DisplaySetReleasedLayersTest = DisplayWithLayersTestCommon;
549
550TEST_F(DisplaySetReleasedLayersTest, doesNothingIfNotHwcDisplay) {
551 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
552 std::shared_ptr<impl::Display> nonHwcDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800553
554 sp<mock::LayerFE> layerXLayerFE = new StrictMock<mock::LayerFE>();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800555
556 {
557 Output::ReleasedLayers releasedLayers;
558 releasedLayers.emplace_back(layerXLayerFE);
559 nonHwcDisplay->setReleasedLayers(std::move(releasedLayers));
560 }
561
562 CompositionRefreshArgs refreshArgs;
Lloyd Piquede196652020-01-22 17:29:58 -0800563 refreshArgs.layersWithQueuedFrames.push_back(layerXLayerFE);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800564
565 nonHwcDisplay->setReleasedLayers(refreshArgs);
566
567 const auto& releasedLayers = nonHwcDisplay->getReleasedLayersForTest();
568 ASSERT_EQ(1, releasedLayers.size());
569}
570
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700571TEST_F(DisplaySetReleasedLayersTest, doesNothingIfNoLayersWithQueuedFrames) {
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800572 sp<mock::LayerFE> layerXLayerFE = new StrictMock<mock::LayerFE>();
573
574 {
575 Output::ReleasedLayers releasedLayers;
576 releasedLayers.emplace_back(layerXLayerFE);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700577 mDisplay->setReleasedLayers(std::move(releasedLayers));
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800578 }
579
580 CompositionRefreshArgs refreshArgs;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700581 mDisplay->setReleasedLayers(refreshArgs);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800582
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700583 const auto& releasedLayers = mDisplay->getReleasedLayersForTest();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800584 ASSERT_EQ(1, releasedLayers.size());
585}
586
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700587TEST_F(DisplaySetReleasedLayersTest, setReleasedLayers) {
Lloyd Piquede196652020-01-22 17:29:58 -0800588 sp<mock::LayerFE> unknownLayer = new StrictMock<mock::LayerFE>();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800589
590 CompositionRefreshArgs refreshArgs;
Lloyd Piquede196652020-01-22 17:29:58 -0800591 refreshArgs.layersWithQueuedFrames.push_back(mLayer1.layerFE);
592 refreshArgs.layersWithQueuedFrames.push_back(mLayer2.layerFE);
593 refreshArgs.layersWithQueuedFrames.push_back(unknownLayer);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800594
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700595 mDisplay->setReleasedLayers(refreshArgs);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800596
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700597 const auto& releasedLayers = mDisplay->getReleasedLayersForTest();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800598 ASSERT_EQ(2, releasedLayers.size());
Lloyd Piquede196652020-01-22 17:29:58 -0800599 ASSERT_EQ(mLayer1.layerFE.get(), releasedLayers[0].promote().get());
600 ASSERT_EQ(mLayer2.layerFE.get(), releasedLayers[1].promote().get());
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800601}
602
603/*
Lloyd Pique66d68602019-02-13 14:23:31 -0800604 * Display::chooseCompositionStrategy()
605 */
606
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700607using DisplayChooseCompositionStrategyTest = PartialMockDisplayTestCommon;
Lloyd Pique66d68602019-02-13 14:23:31 -0800608
609TEST_F(DisplayChooseCompositionStrategyTest, takesEarlyOutIfNotAHwcDisplay) {
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700610 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
611 std::shared_ptr<Display> nonHwcDisplay =
612 createPartialMockDisplay<Display>(mCompositionEngine, args);
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200613 EXPECT_TRUE(GpuVirtualDisplayId::tryCast(nonHwcDisplay->getId()));
Lloyd Pique66d68602019-02-13 14:23:31 -0800614
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700615 nonHwcDisplay->chooseCompositionStrategy();
Lloyd Pique66d68602019-02-13 14:23:31 -0800616
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700617 auto& state = nonHwcDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800618 EXPECT_TRUE(state.usesClientComposition);
619 EXPECT_FALSE(state.usesDeviceComposition);
620}
621
622TEST_F(DisplayChooseCompositionStrategyTest, takesEarlyOutOnHwcError) {
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700623 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition()).WillOnce(Return(false));
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200624 EXPECT_CALL(mHwComposer,
625 getDeviceCompositionChanges(HalDisplayId(DEFAULT_DISPLAY_ID), false, _))
Lloyd Pique66d68602019-02-13 14:23:31 -0800626 .WillOnce(Return(INVALID_OPERATION));
627
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700628 mDisplay->chooseCompositionStrategy();
Lloyd Pique66d68602019-02-13 14:23:31 -0800629
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700630 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800631 EXPECT_TRUE(state.usesClientComposition);
632 EXPECT_FALSE(state.usesDeviceComposition);
633}
634
635TEST_F(DisplayChooseCompositionStrategyTest, normalOperation) {
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700636 // Since two calls are made to anyLayersRequireClientComposition with different return
637 // values, use a Sequence to control the matching so the values are returned in a known
638 // order.
Lloyd Pique66d68602019-02-13 14:23:31 -0800639 Sequence s;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700640 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
641 .InSequence(s)
642 .WillOnce(Return(true));
643 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
Lloyd Pique66d68602019-02-13 14:23:31 -0800644 .InSequence(s)
645 .WillOnce(Return(false));
646
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200647 EXPECT_CALL(mHwComposer, getDeviceCompositionChanges(HalDisplayId(DEFAULT_DISPLAY_ID), true, _))
Lloyd Pique66d68602019-02-13 14:23:31 -0800648 .WillOnce(Return(NO_ERROR));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700649 EXPECT_CALL(*mDisplay, allLayersRequireClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800650
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700651 mDisplay->chooseCompositionStrategy();
Lloyd Pique66d68602019-02-13 14:23:31 -0800652
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700653 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800654 EXPECT_FALSE(state.usesClientComposition);
655 EXPECT_TRUE(state.usesDeviceComposition);
656}
657
658TEST_F(DisplayChooseCompositionStrategyTest, normalOperationWithChanges) {
659 android::HWComposer::DeviceRequestedChanges changes{
Peiyong Line9d809e2020-04-14 13:10:48 -0700660 {{nullptr, hal::Composition::CLIENT}},
661 hal::DisplayRequest::FLIP_CLIENT_TARGET,
662 {{nullptr, hal::LayerRequest::CLEAR_CLIENT_TARGET}},
Peiyong Lindfc3f7c2020-05-07 20:15:50 -0700663 {hal::PixelFormat::RGBA_8888, hal::Dataspace::UNKNOWN},
Lloyd Pique66d68602019-02-13 14:23:31 -0800664 };
665
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700666 // Since two calls are made to anyLayersRequireClientComposition with different return
667 // values, use a Sequence to control the matching so the values are returned in a known
668 // order.
Lloyd Pique66d68602019-02-13 14:23:31 -0800669 Sequence s;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700670 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
671 .InSequence(s)
672 .WillOnce(Return(true));
673 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
Lloyd Pique66d68602019-02-13 14:23:31 -0800674 .InSequence(s)
675 .WillOnce(Return(false));
676
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200677 EXPECT_CALL(mHwComposer, getDeviceCompositionChanges(HalDisplayId(DEFAULT_DISPLAY_ID), true, _))
Lloyd Pique66d68602019-02-13 14:23:31 -0800678 .WillOnce(DoAll(SetArgPointee<2>(changes), Return(NO_ERROR)));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700679 EXPECT_CALL(*mDisplay, applyChangedTypesToLayers(changes.changedTypes)).Times(1);
680 EXPECT_CALL(*mDisplay, applyDisplayRequests(changes.displayRequests)).Times(1);
681 EXPECT_CALL(*mDisplay, applyLayerRequestsToLayers(changes.layerRequests)).Times(1);
682 EXPECT_CALL(*mDisplay, allLayersRequireClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800683
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700684 mDisplay->chooseCompositionStrategy();
Lloyd Pique66d68602019-02-13 14:23:31 -0800685
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700686 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800687 EXPECT_FALSE(state.usesClientComposition);
688 EXPECT_TRUE(state.usesDeviceComposition);
689}
690
691/*
Lloyd Pique688abd42019-02-15 15:42:24 -0800692 * Display::getSkipColorTransform()
693 */
694
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700695using DisplayGetSkipColorTransformTest = DisplayWithLayersTestCommon;
696
Dominik Laskowski1162e472020-04-02 19:02:47 -0700697TEST_F(DisplayGetSkipColorTransformTest, checksCapabilityIfNonHwcDisplay) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700698 EXPECT_CALL(mHwComposer, hasCapability(hal::Capability::SKIP_CLIENT_COLOR_TRANSFORM))
Dominik Laskowski1162e472020-04-02 19:02:47 -0700699 .WillOnce(Return(true));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700700 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
701 auto nonHwcDisplay{impl::createDisplay(mCompositionEngine, args)};
Dominik Laskowski1162e472020-04-02 19:02:47 -0700702 EXPECT_TRUE(nonHwcDisplay->getSkipColorTransform());
Lloyd Pique688abd42019-02-15 15:42:24 -0800703}
704
Dominik Laskowski1162e472020-04-02 19:02:47 -0700705TEST_F(DisplayGetSkipColorTransformTest, checksDisplayCapability) {
Lloyd Pique688abd42019-02-15 15:42:24 -0800706 EXPECT_CALL(mHwComposer,
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200707 hasDisplayCapability(HalDisplayId(DEFAULT_DISPLAY_ID),
Peiyong Line9d809e2020-04-14 13:10:48 -0700708 hal::DisplayCapability::SKIP_CLIENT_COLOR_TRANSFORM))
Lloyd Pique688abd42019-02-15 15:42:24 -0800709 .WillOnce(Return(true));
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700710 EXPECT_TRUE(mDisplay->getSkipColorTransform());
Lloyd Pique688abd42019-02-15 15:42:24 -0800711}
712
713/*
Lloyd Pique66d68602019-02-13 14:23:31 -0800714 * Display::anyLayersRequireClientComposition()
715 */
716
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700717using DisplayAnyLayersRequireClientCompositionTest = DisplayWithLayersTestCommon;
718
719TEST_F(DisplayAnyLayersRequireClientCompositionTest, returnsFalse) {
Lloyd Piquede196652020-01-22 17:29:58 -0800720 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(false));
721 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(false));
722 EXPECT_CALL(*mLayer3.outputLayer, requiresClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800723
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700724 EXPECT_FALSE(mDisplay->anyLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800725}
726
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700727TEST_F(DisplayAnyLayersRequireClientCompositionTest, returnsTrue) {
Lloyd Piquede196652020-01-22 17:29:58 -0800728 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(false));
729 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(true));
Lloyd Pique66d68602019-02-13 14:23:31 -0800730
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700731 EXPECT_TRUE(mDisplay->anyLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800732}
733
734/*
735 * Display::allLayersRequireClientComposition()
736 */
737
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700738using DisplayAllLayersRequireClientCompositionTest = DisplayWithLayersTestCommon;
739
740TEST_F(DisplayAllLayersRequireClientCompositionTest, returnsTrue) {
Lloyd Piquede196652020-01-22 17:29:58 -0800741 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(true));
742 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(true));
743 EXPECT_CALL(*mLayer3.outputLayer, requiresClientComposition()).WillOnce(Return(true));
Lloyd Pique66d68602019-02-13 14:23:31 -0800744
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700745 EXPECT_TRUE(mDisplay->allLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800746}
747
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700748TEST_F(DisplayAllLayersRequireClientCompositionTest, returnsFalse) {
Lloyd Piquede196652020-01-22 17:29:58 -0800749 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(true));
750 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800751
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700752 EXPECT_FALSE(mDisplay->allLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800753}
754
755/*
756 * Display::applyChangedTypesToLayers()
757 */
758
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700759using DisplayApplyChangedTypesToLayersTest = DisplayWithLayersTestCommon;
760
761TEST_F(DisplayApplyChangedTypesToLayersTest, takesEarlyOutIfNoChangedLayers) {
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700762 mDisplay->applyChangedTypesToLayers(impl::Display::ChangedTypes());
Lloyd Pique66d68602019-02-13 14:23:31 -0800763}
764
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700765TEST_F(DisplayApplyChangedTypesToLayersTest, appliesChanges) {
Lloyd Piquede196652020-01-22 17:29:58 -0800766 EXPECT_CALL(*mLayer1.outputLayer,
Lloyd Pique66d68602019-02-13 14:23:31 -0800767 applyDeviceCompositionTypeChange(Hwc2::IComposerClient::Composition::CLIENT))
768 .Times(1);
Lloyd Piquede196652020-01-22 17:29:58 -0800769 EXPECT_CALL(*mLayer2.outputLayer,
Lloyd Pique66d68602019-02-13 14:23:31 -0800770 applyDeviceCompositionTypeChange(Hwc2::IComposerClient::Composition::DEVICE))
771 .Times(1);
772
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700773 mDisplay->applyChangedTypesToLayers(impl::Display::ChangedTypes{
Peiyong Line9d809e2020-04-14 13:10:48 -0700774 {&mLayer1.hwc2Layer, hal::Composition::CLIENT},
775 {&mLayer2.hwc2Layer, hal::Composition::DEVICE},
776 {&hwc2LayerUnknown, hal::Composition::SOLID_COLOR},
Lloyd Pique66d68602019-02-13 14:23:31 -0800777 });
778}
779
780/*
781 * Display::applyDisplayRequests()
782 */
783
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700784using DisplayApplyDisplayRequestsTest = DisplayWithLayersTestCommon;
785
786TEST_F(DisplayApplyDisplayRequestsTest, handlesNoRequests) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700787 mDisplay->applyDisplayRequests(static_cast<hal::DisplayRequest>(0));
Lloyd Pique66d68602019-02-13 14:23:31 -0800788
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700789 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800790 EXPECT_FALSE(state.flipClientTarget);
791}
792
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700793TEST_F(DisplayApplyDisplayRequestsTest, handlesFlipClientTarget) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700794 mDisplay->applyDisplayRequests(hal::DisplayRequest::FLIP_CLIENT_TARGET);
Lloyd Pique66d68602019-02-13 14:23:31 -0800795
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700796 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800797 EXPECT_TRUE(state.flipClientTarget);
798}
799
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700800TEST_F(DisplayApplyDisplayRequestsTest, handlesWriteClientTargetToOutput) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700801 mDisplay->applyDisplayRequests(hal::DisplayRequest::WRITE_CLIENT_TARGET_TO_OUTPUT);
Lloyd Pique66d68602019-02-13 14:23:31 -0800802
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700803 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800804 EXPECT_FALSE(state.flipClientTarget);
805}
806
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700807TEST_F(DisplayApplyDisplayRequestsTest, handlesAllRequestFlagsSet) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700808 mDisplay->applyDisplayRequests(static_cast<hal::DisplayRequest>(~0));
Lloyd Pique66d68602019-02-13 14:23:31 -0800809
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700810 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800811 EXPECT_TRUE(state.flipClientTarget);
812}
813
814/*
815 * Display::applyLayerRequestsToLayers()
816 */
817
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700818using DisplayApplyLayerRequestsToLayersTest = DisplayWithLayersTestCommon;
819
820TEST_F(DisplayApplyLayerRequestsToLayersTest, preparesAllLayers) {
Lloyd Piquede196652020-01-22 17:29:58 -0800821 EXPECT_CALL(*mLayer1.outputLayer, prepareForDeviceLayerRequests()).Times(1);
822 EXPECT_CALL(*mLayer2.outputLayer, prepareForDeviceLayerRequests()).Times(1);
823 EXPECT_CALL(*mLayer3.outputLayer, prepareForDeviceLayerRequests()).Times(1);
Lloyd Pique66d68602019-02-13 14:23:31 -0800824
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700825 mDisplay->applyLayerRequestsToLayers(impl::Display::LayerRequests());
Lloyd Pique66d68602019-02-13 14:23:31 -0800826}
827
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700828TEST_F(DisplayApplyLayerRequestsToLayersTest, appliesDeviceLayerRequests) {
Lloyd Piquede196652020-01-22 17:29:58 -0800829 EXPECT_CALL(*mLayer1.outputLayer, prepareForDeviceLayerRequests()).Times(1);
830 EXPECT_CALL(*mLayer2.outputLayer, prepareForDeviceLayerRequests()).Times(1);
831 EXPECT_CALL(*mLayer3.outputLayer, prepareForDeviceLayerRequests()).Times(1);
Lloyd Pique66d68602019-02-13 14:23:31 -0800832
Lloyd Piquede196652020-01-22 17:29:58 -0800833 EXPECT_CALL(*mLayer1.outputLayer,
Lloyd Pique66d68602019-02-13 14:23:31 -0800834 applyDeviceLayerRequest(Hwc2::IComposerClient::LayerRequest::CLEAR_CLIENT_TARGET))
835 .Times(1);
836
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700837 mDisplay->applyLayerRequestsToLayers(impl::Display::LayerRequests{
Peiyong Line9d809e2020-04-14 13:10:48 -0700838 {&mLayer1.hwc2Layer, hal::LayerRequest::CLEAR_CLIENT_TARGET},
839 {&hwc2LayerUnknown, hal::LayerRequest::CLEAR_CLIENT_TARGET},
Lloyd Pique66d68602019-02-13 14:23:31 -0800840 });
841}
842
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800843/*
844 * Display::presentAndGetFrameFences()
845 */
846
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700847using DisplayPresentAndGetFrameFencesTest = DisplayWithLayersTestCommon;
848
849TEST_F(DisplayPresentAndGetFrameFencesTest, returnsNoFencesOnNonHwcDisplay) {
850 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
851 auto nonHwcDisplay{impl::createDisplay(mCompositionEngine, args)};
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800852
853 auto result = nonHwcDisplay->presentAndGetFrameFences();
854
855 ASSERT_TRUE(result.presentFence.get());
856 EXPECT_FALSE(result.presentFence->isValid());
857 EXPECT_EQ(0u, result.layerFences.size());
858}
859
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700860TEST_F(DisplayPresentAndGetFrameFencesTest, returnsPresentAndLayerFences) {
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800861 sp<Fence> presentFence = new Fence();
862 sp<Fence> layer1Fence = new Fence();
863 sp<Fence> layer2Fence = new Fence();
864
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200865 EXPECT_CALL(mHwComposer, presentAndGetReleaseFences(HalDisplayId(DEFAULT_DISPLAY_ID))).Times(1);
866 EXPECT_CALL(mHwComposer, getPresentFence(HalDisplayId(DEFAULT_DISPLAY_ID)))
867 .WillOnce(Return(presentFence));
868 EXPECT_CALL(mHwComposer,
869 getLayerReleaseFence(HalDisplayId(DEFAULT_DISPLAY_ID), &mLayer1.hwc2Layer))
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800870 .WillOnce(Return(layer1Fence));
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200871 EXPECT_CALL(mHwComposer,
872 getLayerReleaseFence(HalDisplayId(DEFAULT_DISPLAY_ID), &mLayer2.hwc2Layer))
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800873 .WillOnce(Return(layer2Fence));
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200874 EXPECT_CALL(mHwComposer, clearReleaseFences(HalDisplayId(DEFAULT_DISPLAY_ID))).Times(1);
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800875
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700876 auto result = mDisplay->presentAndGetFrameFences();
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800877
878 EXPECT_EQ(presentFence, result.presentFence);
879
880 EXPECT_EQ(2u, result.layerFences.size());
Lloyd Piquede196652020-01-22 17:29:58 -0800881 ASSERT_EQ(1, result.layerFences.count(&mLayer1.hwc2Layer));
882 EXPECT_EQ(layer1Fence, result.layerFences[&mLayer1.hwc2Layer]);
883 ASSERT_EQ(1, result.layerFences.count(&mLayer2.hwc2Layer));
884 EXPECT_EQ(layer2Fence, result.layerFences[&mLayer2.hwc2Layer]);
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800885}
886
Lloyd Pique688abd42019-02-15 15:42:24 -0800887/*
888 * Display::setExpensiveRenderingExpected()
889 */
890
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700891using DisplaySetExpensiveRenderingExpectedTest = DisplayWithLayersTestCommon;
892
893TEST_F(DisplaySetExpensiveRenderingExpectedTest, forwardsToPowerAdvisor) {
Lloyd Pique688abd42019-02-15 15:42:24 -0800894 EXPECT_CALL(mPowerAdvisor, setExpensiveRenderingExpected(DEFAULT_DISPLAY_ID, true)).Times(1);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700895 mDisplay->setExpensiveRenderingExpected(true);
Lloyd Pique688abd42019-02-15 15:42:24 -0800896
897 EXPECT_CALL(mPowerAdvisor, setExpensiveRenderingExpected(DEFAULT_DISPLAY_ID, false)).Times(1);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700898 mDisplay->setExpensiveRenderingExpected(false);
Lloyd Pique688abd42019-02-15 15:42:24 -0800899}
900
Lloyd Piqued3d69882019-02-28 16:03:46 -0800901/*
902 * Display::finishFrame()
903 */
904
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700905using DisplayFinishFrameTest = DisplayWithLayersTestCommon;
906
907TEST_F(DisplayFinishFrameTest, doesNotSkipCompositionIfNotDirtyOnHwcDisplay) {
Lloyd Piqued3d69882019-02-28 16:03:46 -0800908 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700909 mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
Lloyd Piqued3d69882019-02-28 16:03:46 -0800910
911 // We expect no calls to queueBuffer if composition was skipped.
912 EXPECT_CALL(*renderSurface, queueBuffer(_)).Times(1);
913
Lloyd Piquea76ce462020-01-14 13:06:37 -0800914 // Expect a call to signal no expensive rendering since there is no client composition.
915 EXPECT_CALL(mPowerAdvisor, setExpensiveRenderingExpected(DEFAULT_DISPLAY_ID, false));
916
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700917 mDisplay->editState().isEnabled = true;
918 mDisplay->editState().usesClientComposition = false;
Marin Shalamanov6ad317c2020-07-29 23:34:07 +0200919 mDisplay->editState().layerStackSpace.content = Rect(0, 0, 1, 1);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700920 mDisplay->editState().dirtyRegion = Region::INVALID_REGION;
Lloyd Piqued3d69882019-02-28 16:03:46 -0800921
922 CompositionRefreshArgs refreshArgs;
923 refreshArgs.repaintEverything = false;
924
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700925 mDisplay->finishFrame(refreshArgs);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800926}
927
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700928TEST_F(DisplayFinishFrameTest, skipsCompositionIfNotDirty) {
929 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
930 std::shared_ptr<impl::Display> nonHwcDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800931
932 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
933 nonHwcDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
934
935 // We expect no calls to queueBuffer if composition was skipped.
936 EXPECT_CALL(*renderSurface, queueBuffer(_)).Times(0);
937
938 nonHwcDisplay->editState().isEnabled = true;
939 nonHwcDisplay->editState().usesClientComposition = false;
Marin Shalamanov6ad317c2020-07-29 23:34:07 +0200940 nonHwcDisplay->editState().layerStackSpace.content = Rect(0, 0, 1, 1);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800941 nonHwcDisplay->editState().dirtyRegion = Region::INVALID_REGION;
942
943 CompositionRefreshArgs refreshArgs;
944 refreshArgs.repaintEverything = false;
945
946 nonHwcDisplay->finishFrame(refreshArgs);
947}
948
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700949TEST_F(DisplayFinishFrameTest, performsCompositionIfDirty) {
950 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
951 std::shared_ptr<impl::Display> nonHwcDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800952
953 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
954 nonHwcDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
955
956 // We expect a single call to queueBuffer when composition is not skipped.
957 EXPECT_CALL(*renderSurface, queueBuffer(_)).Times(1);
958
959 nonHwcDisplay->editState().isEnabled = true;
960 nonHwcDisplay->editState().usesClientComposition = false;
Marin Shalamanov6ad317c2020-07-29 23:34:07 +0200961 nonHwcDisplay->editState().layerStackSpace.content = Rect(0, 0, 1, 1);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800962 nonHwcDisplay->editState().dirtyRegion = Region(Rect(0, 0, 1, 1));
963
964 CompositionRefreshArgs refreshArgs;
965 refreshArgs.repaintEverything = false;
966
967 nonHwcDisplay->finishFrame(refreshArgs);
968}
969
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700970TEST_F(DisplayFinishFrameTest, performsCompositionIfRepaintEverything) {
971 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
972 std::shared_ptr<impl::Display> nonHwcDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800973
974 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
975 nonHwcDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
976
977 // We expect a single call to queueBuffer when composition is not skipped.
978 EXPECT_CALL(*renderSurface, queueBuffer(_)).Times(1);
979
980 nonHwcDisplay->editState().isEnabled = true;
981 nonHwcDisplay->editState().usesClientComposition = false;
Marin Shalamanov6ad317c2020-07-29 23:34:07 +0200982 nonHwcDisplay->editState().layerStackSpace.content = Rect(0, 0, 1, 1);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800983 nonHwcDisplay->editState().dirtyRegion = Region::INVALID_REGION;
984
985 CompositionRefreshArgs refreshArgs;
986 refreshArgs.repaintEverything = true;
987
988 nonHwcDisplay->finishFrame(refreshArgs);
989}
990
Lloyd Piquec6607552019-12-02 17:57:39 -0800991/*
992 * Display functional tests
993 */
994
995struct DisplayFunctionalTest : public testing::Test {
996 class Display : public impl::Display {
997 public:
Lloyd Piquec6607552019-12-02 17:57:39 -0800998 using impl::Display::injectOutputLayerForTest;
999 virtual void injectOutputLayerForTest(std::unique_ptr<compositionengine::OutputLayer>) = 0;
1000 };
1001
Lloyd Piquec6607552019-12-02 17:57:39 -08001002 DisplayFunctionalTest() {
1003 EXPECT_CALL(mCompositionEngine, getHwComposer()).WillRepeatedly(ReturnRef(mHwComposer));
1004
1005 mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(mRenderSurface));
1006 }
1007
1008 NiceMock<android::mock::HWComposer> mHwComposer;
1009 NiceMock<Hwc2::mock::PowerAdvisor> mPowerAdvisor;
1010 NiceMock<mock::CompositionEngine> mCompositionEngine;
1011 sp<mock::NativeWindow> mNativeWindow = new NiceMock<mock::NativeWindow>();
1012 sp<mock::DisplaySurface> mDisplaySurface = new NiceMock<mock::DisplaySurface>();
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -07001013 std::shared_ptr<Display> mDisplay = impl::createDisplayTemplated<
1014 Display>(mCompositionEngine,
1015 DisplayCreationArgsBuilder()
1016 .setPhysical({DEFAULT_DISPLAY_ID, DisplayConnectionType::Internal})
1017 .setPixels({DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT})
1018 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
1019 .setIsSecure(true)
1020 .setLayerStackId(DEFAULT_LAYER_STACK)
1021 .setPowerAdvisor(&mPowerAdvisor)
1022 .build()
1023
1024 );
Lloyd Piquec6607552019-12-02 17:57:39 -08001025 impl::RenderSurface* mRenderSurface =
1026 new impl::RenderSurface{mCompositionEngine, *mDisplay,
1027 RenderSurfaceCreationArgs{DEFAULT_DISPLAY_WIDTH,
1028 DEFAULT_DISPLAY_HEIGHT, mNativeWindow,
1029 mDisplaySurface}};
1030};
1031
1032TEST_F(DisplayFunctionalTest, postFramebufferCriticalCallsAreOrdered) {
1033 InSequence seq;
1034
1035 mDisplay->editState().isEnabled = true;
1036
1037 EXPECT_CALL(mHwComposer, presentAndGetReleaseFences(_));
1038 EXPECT_CALL(*mDisplaySurface, onFrameCommitted());
1039
1040 mDisplay->postFramebuffer();
1041}
1042
Lloyd Pique45a165a2018-10-19 11:54:47 -07001043} // namespace
1044} // namespace android::compositionengine