blob: 378c0501b4232c6a7cf329efaa45b7f8aa704c9b [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)
179 .setPixels({DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT})
180 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
181 .setIsSecure(false)
182 .setLayerStackId(DEFAULT_LAYER_STACK)
183 .setPowerAdvisor(&mPowerAdvisor)
184 .build();
185 }
186
187 StrictMock<android::mock::HWComposer> mHwComposer;
188 StrictMock<Hwc2::mock::PowerAdvisor> mPowerAdvisor;
Lloyd Piquee9eff972020-05-05 12:36:44 -0700189 StrictMock<renderengine::mock::RenderEngine> mRenderEngine;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700190 StrictMock<mock::CompositionEngine> mCompositionEngine;
191 sp<mock::NativeWindow> mNativeWindow = new StrictMock<mock::NativeWindow>();
192};
193
194struct PartialMockDisplayTestCommon : public DisplayTestCommon {
195 using Display = DisplayTestCommon::PartialMockDisplay;
196 std::shared_ptr<Display> mDisplay =
197 createPartialMockDisplay<Display>(mCompositionEngine,
198 getDisplayCreationArgsForPhysicalHWCDisplay());
199};
200
201struct FullDisplayImplTestCommon : public DisplayTestCommon {
202 using Display = DisplayTestCommon::FullImplDisplay;
203 std::shared_ptr<Display> mDisplay =
204 createDisplay<Display>(mCompositionEngine,
205 getDisplayCreationArgsForPhysicalHWCDisplay());
206};
207
208struct DisplayWithLayersTestCommon : public FullDisplayImplTestCommon {
209 DisplayWithLayersTestCommon() {
Lloyd Pique01c77c12019-04-17 12:48:32 -0700210 mDisplay->injectOutputLayerForTest(
Lloyd Piquede196652020-01-22 17:29:58 -0800211 std::unique_ptr<compositionengine::OutputLayer>(mLayer1.outputLayer));
Lloyd Pique01c77c12019-04-17 12:48:32 -0700212 mDisplay->injectOutputLayerForTest(
Lloyd Piquede196652020-01-22 17:29:58 -0800213 std::unique_ptr<compositionengine::OutputLayer>(mLayer2.outputLayer));
Lloyd Pique01c77c12019-04-17 12:48:32 -0700214 mDisplay->injectOutputLayerForTest(
Lloyd Piquede196652020-01-22 17:29:58 -0800215 std::unique_ptr<compositionengine::OutputLayer>(mLayer3.outputLayer));
Lloyd Pique66d68602019-02-13 14:23:31 -0800216 }
Lloyd Pique45a165a2018-10-19 11:54:47 -0700217
Lloyd Piquede196652020-01-22 17:29:58 -0800218 Layer mLayer1;
219 Layer mLayer2;
220 LayerNoHWC2Layer mLayer3;
221 StrictMock<HWC2::mock::Layer> hwc2LayerUnknown;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700222 std::shared_ptr<Display> mDisplay =
223 createDisplay<Display>(mCompositionEngine,
224 getDisplayCreationArgsForPhysicalHWCDisplay());
Lloyd Pique45a165a2018-10-19 11:54:47 -0700225};
226
Lloyd Pique66d68602019-02-13 14:23:31 -0800227/*
Lloyd Pique45a165a2018-10-19 11:54:47 -0700228 * Basic construction
229 */
230
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700231struct DisplayCreationTest : public DisplayTestCommon {
232 using Display = DisplayTestCommon::FullImplDisplay;
233};
Lloyd Pique45a165a2018-10-19 11:54:47 -0700234
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700235TEST_F(DisplayCreationTest, createPhysicalInternalDisplay) {
236 auto display =
237 impl::createDisplay(mCompositionEngine, getDisplayCreationArgsForPhysicalHWCDisplay());
238 EXPECT_TRUE(display->isSecure());
239 EXPECT_FALSE(display->isVirtual());
240 EXPECT_EQ(DEFAULT_DISPLAY_ID, display->getId());
241}
Lloyd Pique45a165a2018-10-19 11:54:47 -0700242
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700243TEST_F(DisplayCreationTest, createNonHwcVirtualDisplay) {
244 auto display = impl::createDisplay(mCompositionEngine,
245 getDisplayCreationArgsForNonHWCVirtualDisplay());
246 EXPECT_FALSE(display->isSecure());
247 EXPECT_TRUE(display->isVirtual());
248 EXPECT_EQ(std::nullopt, display->getId());
249}
250
251/*
252 * Display::setConfiguration()
253 */
254
255using DisplaySetConfigurationTest = PartialMockDisplayTestCommon;
256
257TEST_F(DisplaySetConfigurationTest, configuresInternalSecurePhysicalDisplay) {
258 mDisplay->setConfiguration(
259 DisplayCreationArgsBuilder()
260 .setUseHwcVirtualDisplays(true)
261 .setPhysical({DEFAULT_DISPLAY_ID, DisplayConnectionType::Internal})
262 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
263 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
264 .setIsSecure(true)
265 .setLayerStackId(DEFAULT_LAYER_STACK)
266 .setPowerAdvisor(&mPowerAdvisor)
267 .setName(getDisplayNameFromCurrentTest())
268 .build());
269
270 EXPECT_EQ(DEFAULT_DISPLAY_ID, mDisplay->getId());
271 EXPECT_TRUE(mDisplay->isSecure());
272 EXPECT_FALSE(mDisplay->isVirtual());
273 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
274 EXPECT_TRUE(mDisplay->getState().layerStackInternal);
275 EXPECT_FALSE(mDisplay->isValid());
276}
277
278TEST_F(DisplaySetConfigurationTest, configuresExternalInsecurePhysicalDisplay) {
279 mDisplay->setConfiguration(
280 DisplayCreationArgsBuilder()
281 .setUseHwcVirtualDisplays(true)
282 .setPhysical({DEFAULT_DISPLAY_ID, DisplayConnectionType::External})
283 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
284 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
285 .setIsSecure(false)
286 .setLayerStackId(DEFAULT_LAYER_STACK)
287 .setPowerAdvisor(&mPowerAdvisor)
288 .setName(getDisplayNameFromCurrentTest())
289 .build());
290
291 EXPECT_EQ(DEFAULT_DISPLAY_ID, mDisplay->getId());
292 EXPECT_FALSE(mDisplay->isSecure());
293 EXPECT_FALSE(mDisplay->isVirtual());
294 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
295 EXPECT_FALSE(mDisplay->getState().layerStackInternal);
296 EXPECT_FALSE(mDisplay->isValid());
297}
298
299TEST_F(DisplaySetConfigurationTest, configuresHwcBackedVirtualDisplay) {
300 EXPECT_CALL(mHwComposer,
301 allocateVirtualDisplay(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH,
302 Pointee(Eq(static_cast<ui::PixelFormat>(
303 PIXEL_FORMAT_RGBA_8888)))))
304 .WillOnce(Return(VIRTUAL_DISPLAY_ID));
305
306 mDisplay->setConfiguration(
307 DisplayCreationArgsBuilder()
308 .setUseHwcVirtualDisplays(true)
309 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
310 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
311 .setIsSecure(false)
312 .setLayerStackId(DEFAULT_LAYER_STACK)
313 .setPowerAdvisor(&mPowerAdvisor)
314 .setName(getDisplayNameFromCurrentTest())
315 .build());
316
317 EXPECT_EQ(VIRTUAL_DISPLAY_ID, mDisplay->getId());
318 EXPECT_FALSE(mDisplay->isSecure());
319 EXPECT_TRUE(mDisplay->isVirtual());
320 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
321 EXPECT_FALSE(mDisplay->getState().layerStackInternal);
322 EXPECT_FALSE(mDisplay->isValid());
323}
324
325TEST_F(DisplaySetConfigurationTest, configuresNonHwcBackedVirtualDisplayIfHwcAllocationFails) {
326 EXPECT_CALL(mHwComposer,
327 allocateVirtualDisplay(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH,
328 Pointee(Eq(static_cast<ui::PixelFormat>(
329 PIXEL_FORMAT_RGBA_8888)))))
330 .WillOnce(Return(std::nullopt));
331
332 mDisplay->setConfiguration(
333 DisplayCreationArgsBuilder()
334 .setUseHwcVirtualDisplays(true)
335 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
336 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
337 .setIsSecure(false)
338 .setLayerStackId(DEFAULT_LAYER_STACK)
339 .setPowerAdvisor(&mPowerAdvisor)
340 .setName(getDisplayNameFromCurrentTest())
341 .build());
342
343 EXPECT_EQ(std::nullopt, mDisplay->getId());
344 EXPECT_FALSE(mDisplay->isSecure());
345 EXPECT_TRUE(mDisplay->isVirtual());
346 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
347 EXPECT_FALSE(mDisplay->getState().layerStackInternal);
348 EXPECT_FALSE(mDisplay->isValid());
349}
350
351TEST_F(DisplaySetConfigurationTest, configuresNonHwcBackedVirtualDisplayIfShouldNotUseHwc) {
352 mDisplay->setConfiguration(
353 DisplayCreationArgsBuilder()
354 .setUseHwcVirtualDisplays(false)
355 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
356 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
357 .setIsSecure(false)
358 .setLayerStackId(DEFAULT_LAYER_STACK)
359 .setPowerAdvisor(&mPowerAdvisor)
360 .setName(getDisplayNameFromCurrentTest())
361 .build());
362
363 EXPECT_EQ(std::nullopt, mDisplay->getId());
364 EXPECT_FALSE(mDisplay->isSecure());
365 EXPECT_TRUE(mDisplay->isVirtual());
366 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
367 EXPECT_FALSE(mDisplay->getState().layerStackInternal);
368 EXPECT_FALSE(mDisplay->isValid());
Lloyd Pique45a165a2018-10-19 11:54:47 -0700369}
370
Lloyd Pique66d68602019-02-13 14:23:31 -0800371/*
Lloyd Pique45a165a2018-10-19 11:54:47 -0700372 * Display::disconnect()
373 */
374
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700375using DisplayDisconnectTest = PartialMockDisplayTestCommon;
376
377TEST_F(DisplayDisconnectTest, disconnectsDisplay) {
Lloyd Pique45a165a2018-10-19 11:54:47 -0700378 // The first call to disconnect will disconnect the display with the HWC and
379 // set mHwcId to -1.
380 EXPECT_CALL(mHwComposer, disconnectDisplay(DEFAULT_DISPLAY_ID)).Times(1);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700381 mDisplay->disconnect();
382 EXPECT_FALSE(mDisplay->getId());
Lloyd Pique45a165a2018-10-19 11:54:47 -0700383
384 // Subsequent calls will do nothing,
385 EXPECT_CALL(mHwComposer, disconnectDisplay(DEFAULT_DISPLAY_ID)).Times(0);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700386 mDisplay->disconnect();
387 EXPECT_FALSE(mDisplay->getId());
Lloyd Pique45a165a2018-10-19 11:54:47 -0700388}
389
Lloyd Pique66d68602019-02-13 14:23:31 -0800390/*
Lloyd Pique32cbe282018-10-19 13:09:22 -0700391 * Display::setColorTransform()
392 */
393
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700394using DisplaySetColorTransformTest = PartialMockDisplayTestCommon;
395
396TEST_F(DisplaySetColorTransformTest, setsTransform) {
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800397 // No change does nothing
398 CompositionRefreshArgs refreshArgs;
399 refreshArgs.colorTransformMatrix = std::nullopt;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700400 mDisplay->setColorTransform(refreshArgs);
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800401
Lloyd Pique32cbe282018-10-19 13:09:22 -0700402 // Identity matrix sets an identity state value
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800403 const mat4 kIdentity;
Lloyd Pique32cbe282018-10-19 13:09:22 -0700404
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800405 EXPECT_CALL(mHwComposer, setColorTransform(DEFAULT_DISPLAY_ID, kIdentity)).Times(1);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700406
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800407 refreshArgs.colorTransformMatrix = kIdentity;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700408 mDisplay->setColorTransform(refreshArgs);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700409
410 // Non-identity matrix sets a non-identity state value
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800411 const mat4 kNonIdentity = mat4() * 2;
Lloyd Pique32cbe282018-10-19 13:09:22 -0700412
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800413 EXPECT_CALL(mHwComposer, setColorTransform(DEFAULT_DISPLAY_ID, kNonIdentity)).Times(1);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700414
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800415 refreshArgs.colorTransformMatrix = kNonIdentity;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700416 mDisplay->setColorTransform(refreshArgs);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700417}
418
Lloyd Pique66d68602019-02-13 14:23:31 -0800419/*
Lloyd Pique32cbe282018-10-19 13:09:22 -0700420 * Display::setColorMode()
421 */
422
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700423using DisplaySetColorModeTest = PartialMockDisplayTestCommon;
424
425TEST_F(DisplaySetColorModeTest, setsModeUnlessNoChange) {
Lloyd Pique6a3b4462019-03-07 20:58:12 -0800426 using ColorProfile = Output::ColorProfile;
427
Lloyd Pique31cb2942018-10-19 17:23:03 -0700428 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700429 mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
Lloyd Piquef5275482019-01-29 18:42:42 -0800430 mock::DisplayColorProfile* colorProfile = new StrictMock<mock::DisplayColorProfile>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700431 mDisplay->setDisplayColorProfileForTest(std::unique_ptr<DisplayColorProfile>(colorProfile));
Lloyd Pique31cb2942018-10-19 17:23:03 -0700432
Lloyd Piquef5275482019-01-29 18:42:42 -0800433 EXPECT_CALL(*colorProfile, getTargetDataspace(_, _, _))
434 .WillRepeatedly(Return(ui::Dataspace::UNKNOWN));
Lloyd Pique32cbe282018-10-19 13:09:22 -0700435
436 // These values are expected to be the initial state.
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700437 ASSERT_EQ(ui::ColorMode::NATIVE, mDisplay->getState().colorMode);
438 ASSERT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().dataspace);
439 ASSERT_EQ(ui::RenderIntent::COLORIMETRIC, mDisplay->getState().renderIntent);
440 ASSERT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().targetDataspace);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700441
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700442 // Otherwise if the values are unchanged, nothing happens
443 mDisplay->setColorProfile(ColorProfile{ui::ColorMode::NATIVE, ui::Dataspace::UNKNOWN,
444 ui::RenderIntent::COLORIMETRIC, ui::Dataspace::UNKNOWN});
Lloyd Pique32cbe282018-10-19 13:09:22 -0700445
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700446 EXPECT_EQ(ui::ColorMode::NATIVE, mDisplay->getState().colorMode);
447 EXPECT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().dataspace);
448 EXPECT_EQ(ui::RenderIntent::COLORIMETRIC, mDisplay->getState().renderIntent);
449 EXPECT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().targetDataspace);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700450
451 // Otherwise if the values are different, updates happen
Lloyd Piqueef958122019-02-05 18:00:12 -0800452 EXPECT_CALL(*renderSurface, setBufferDataspace(ui::Dataspace::DISPLAY_P3)).Times(1);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700453 EXPECT_CALL(mHwComposer,
Lloyd Piqueef958122019-02-05 18:00:12 -0800454 setActiveColorMode(DEFAULT_DISPLAY_ID, ui::ColorMode::DISPLAY_P3,
Lloyd Pique32cbe282018-10-19 13:09:22 -0700455 ui::RenderIntent::TONE_MAP_COLORIMETRIC))
456 .Times(1);
457
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700458 mDisplay->setColorProfile(ColorProfile{ui::ColorMode::DISPLAY_P3, ui::Dataspace::DISPLAY_P3,
459 ui::RenderIntent::TONE_MAP_COLORIMETRIC,
460 ui::Dataspace::UNKNOWN});
Lloyd Pique32cbe282018-10-19 13:09:22 -0700461
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700462 EXPECT_EQ(ui::ColorMode::DISPLAY_P3, mDisplay->getState().colorMode);
463 EXPECT_EQ(ui::Dataspace::DISPLAY_P3, mDisplay->getState().dataspace);
464 EXPECT_EQ(ui::RenderIntent::TONE_MAP_COLORIMETRIC, mDisplay->getState().renderIntent);
465 EXPECT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().targetDataspace);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700466}
467
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700468TEST_F(DisplaySetColorModeTest, doesNothingForVirtualDisplay) {
Lloyd Pique6a3b4462019-03-07 20:58:12 -0800469 using ColorProfile = Output::ColorProfile;
470
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700471 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
472 std::shared_ptr<impl::Display> virtualDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700473
Lloyd Piquef5275482019-01-29 18:42:42 -0800474 mock::DisplayColorProfile* colorProfile = new StrictMock<mock::DisplayColorProfile>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700475 virtualDisplay->setDisplayColorProfileForTest(
Lloyd Piquef5275482019-01-29 18:42:42 -0800476 std::unique_ptr<DisplayColorProfile>(colorProfile));
477
478 EXPECT_CALL(*colorProfile,
479 getTargetDataspace(ui::ColorMode::DISPLAY_P3, ui::Dataspace::DISPLAY_P3,
480 ui::Dataspace::UNKNOWN))
481 .WillOnce(Return(ui::Dataspace::UNKNOWN));
482
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700483 virtualDisplay->setColorProfile(
Lloyd Pique6a3b4462019-03-07 20:58:12 -0800484 ColorProfile{ui::ColorMode::DISPLAY_P3, ui::Dataspace::DISPLAY_P3,
485 ui::RenderIntent::TONE_MAP_COLORIMETRIC, ui::Dataspace::UNKNOWN});
Lloyd Pique32cbe282018-10-19 13:09:22 -0700486
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700487 EXPECT_EQ(ui::ColorMode::NATIVE, virtualDisplay->getState().colorMode);
488 EXPECT_EQ(ui::Dataspace::UNKNOWN, virtualDisplay->getState().dataspace);
489 EXPECT_EQ(ui::RenderIntent::COLORIMETRIC, virtualDisplay->getState().renderIntent);
490 EXPECT_EQ(ui::Dataspace::UNKNOWN, virtualDisplay->getState().targetDataspace);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700491}
492
Lloyd Pique66d68602019-02-13 14:23:31 -0800493/*
Lloyd Pique3d0c02e2018-10-19 18:38:12 -0700494 * Display::createDisplayColorProfile()
495 */
496
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700497using DisplayCreateColorProfileTest = PartialMockDisplayTestCommon;
498
499TEST_F(DisplayCreateColorProfileTest, setsDisplayColorProfile) {
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700500 EXPECT_TRUE(mDisplay->getDisplayColorProfile() == nullptr);
501 mDisplay->createDisplayColorProfile(
Lloyd Pique3d0c02e2018-10-19 18:38:12 -0700502 DisplayColorProfileCreationArgs{false, HdrCapabilities(), 0,
503 DisplayColorProfileCreationArgs::HwcColorModes()});
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700504 EXPECT_TRUE(mDisplay->getDisplayColorProfile() != nullptr);
Lloyd Pique3d0c02e2018-10-19 18:38:12 -0700505}
506
Lloyd Pique66d68602019-02-13 14:23:31 -0800507/*
Lloyd Pique31cb2942018-10-19 17:23:03 -0700508 * Display::createRenderSurface()
509 */
510
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700511using DisplayCreateRenderSurfaceTest = PartialMockDisplayTestCommon;
512
513TEST_F(DisplayCreateRenderSurfaceTest, setsRenderSurface) {
chaviw8beb4142019-04-11 13:09:05 -0700514 EXPECT_CALL(*mNativeWindow, disconnect(NATIVE_WINDOW_API_EGL)).WillRepeatedly(Return(NO_ERROR));
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700515 EXPECT_TRUE(mDisplay->getRenderSurface() == nullptr);
516 mDisplay->createRenderSurface(RenderSurfaceCreationArgs{640, 480, mNativeWindow, nullptr});
517 EXPECT_TRUE(mDisplay->getRenderSurface() != nullptr);
Lloyd Pique31cb2942018-10-19 17:23:03 -0700518}
519
Lloyd Pique66d68602019-02-13 14:23:31 -0800520/*
Lloyd Piquedf336d92019-03-07 21:38:42 -0800521 * Display::createOutputLayer()
522 */
523
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700524using DisplayCreateOutputLayerTest = FullDisplayImplTestCommon;
525
526TEST_F(DisplayCreateOutputLayerTest, setsHwcLayer) {
Lloyd Piquedf336d92019-03-07 21:38:42 -0800527 sp<mock::LayerFE> layerFE = new StrictMock<mock::LayerFE>();
Lloyd Piquedf336d92019-03-07 21:38:42 -0800528 StrictMock<HWC2::mock::Layer> hwcLayer;
529
530 EXPECT_CALL(mHwComposer, createLayer(DEFAULT_DISPLAY_ID)).WillOnce(Return(&hwcLayer));
531
Lloyd Piquede196652020-01-22 17:29:58 -0800532 auto outputLayer = mDisplay->createOutputLayer(layerFE);
Lloyd Piquedf336d92019-03-07 21:38:42 -0800533
534 EXPECT_EQ(&hwcLayer, outputLayer->getHwcLayer());
535
536 EXPECT_CALL(mHwComposer, destroyLayer(DEFAULT_DISPLAY_ID, &hwcLayer));
537 outputLayer.reset();
538}
539
540/*
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800541 * Display::setReleasedLayers()
542 */
543
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700544using DisplaySetReleasedLayersTest = DisplayWithLayersTestCommon;
545
546TEST_F(DisplaySetReleasedLayersTest, doesNothingIfNotHwcDisplay) {
547 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
548 std::shared_ptr<impl::Display> nonHwcDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800549
550 sp<mock::LayerFE> layerXLayerFE = new StrictMock<mock::LayerFE>();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800551
552 {
553 Output::ReleasedLayers releasedLayers;
554 releasedLayers.emplace_back(layerXLayerFE);
555 nonHwcDisplay->setReleasedLayers(std::move(releasedLayers));
556 }
557
558 CompositionRefreshArgs refreshArgs;
Lloyd Piquede196652020-01-22 17:29:58 -0800559 refreshArgs.layersWithQueuedFrames.push_back(layerXLayerFE);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800560
561 nonHwcDisplay->setReleasedLayers(refreshArgs);
562
563 const auto& releasedLayers = nonHwcDisplay->getReleasedLayersForTest();
564 ASSERT_EQ(1, releasedLayers.size());
565}
566
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700567TEST_F(DisplaySetReleasedLayersTest, doesNothingIfNoLayersWithQueuedFrames) {
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800568 sp<mock::LayerFE> layerXLayerFE = new StrictMock<mock::LayerFE>();
569
570 {
571 Output::ReleasedLayers releasedLayers;
572 releasedLayers.emplace_back(layerXLayerFE);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700573 mDisplay->setReleasedLayers(std::move(releasedLayers));
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800574 }
575
576 CompositionRefreshArgs refreshArgs;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700577 mDisplay->setReleasedLayers(refreshArgs);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800578
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700579 const auto& releasedLayers = mDisplay->getReleasedLayersForTest();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800580 ASSERT_EQ(1, releasedLayers.size());
581}
582
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700583TEST_F(DisplaySetReleasedLayersTest, setReleasedLayers) {
Lloyd Piquede196652020-01-22 17:29:58 -0800584 sp<mock::LayerFE> unknownLayer = new StrictMock<mock::LayerFE>();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800585
586 CompositionRefreshArgs refreshArgs;
Lloyd Piquede196652020-01-22 17:29:58 -0800587 refreshArgs.layersWithQueuedFrames.push_back(mLayer1.layerFE);
588 refreshArgs.layersWithQueuedFrames.push_back(mLayer2.layerFE);
589 refreshArgs.layersWithQueuedFrames.push_back(unknownLayer);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800590
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700591 mDisplay->setReleasedLayers(refreshArgs);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800592
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700593 const auto& releasedLayers = mDisplay->getReleasedLayersForTest();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800594 ASSERT_EQ(2, releasedLayers.size());
Lloyd Piquede196652020-01-22 17:29:58 -0800595 ASSERT_EQ(mLayer1.layerFE.get(), releasedLayers[0].promote().get());
596 ASSERT_EQ(mLayer2.layerFE.get(), releasedLayers[1].promote().get());
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800597}
598
599/*
Lloyd Pique66d68602019-02-13 14:23:31 -0800600 * Display::chooseCompositionStrategy()
601 */
602
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700603using DisplayChooseCompositionStrategyTest = PartialMockDisplayTestCommon;
Lloyd Pique66d68602019-02-13 14:23:31 -0800604
605TEST_F(DisplayChooseCompositionStrategyTest, takesEarlyOutIfNotAHwcDisplay) {
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700606 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
607 std::shared_ptr<Display> nonHwcDisplay =
608 createPartialMockDisplay<Display>(mCompositionEngine, args);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700609 EXPECT_FALSE(nonHwcDisplay->getId());
Lloyd Pique66d68602019-02-13 14:23:31 -0800610
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700611 nonHwcDisplay->chooseCompositionStrategy();
Lloyd Pique66d68602019-02-13 14:23:31 -0800612
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700613 auto& state = nonHwcDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800614 EXPECT_TRUE(state.usesClientComposition);
615 EXPECT_FALSE(state.usesDeviceComposition);
616}
617
618TEST_F(DisplayChooseCompositionStrategyTest, takesEarlyOutOnHwcError) {
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700619 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800620 EXPECT_CALL(mHwComposer, getDeviceCompositionChanges(DEFAULT_DISPLAY_ID, false, _))
621 .WillOnce(Return(INVALID_OPERATION));
622
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700623 mDisplay->chooseCompositionStrategy();
Lloyd Pique66d68602019-02-13 14:23:31 -0800624
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700625 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800626 EXPECT_TRUE(state.usesClientComposition);
627 EXPECT_FALSE(state.usesDeviceComposition);
628}
629
630TEST_F(DisplayChooseCompositionStrategyTest, normalOperation) {
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700631 // Since two calls are made to anyLayersRequireClientComposition with different return
632 // values, use a Sequence to control the matching so the values are returned in a known
633 // order.
Lloyd Pique66d68602019-02-13 14:23:31 -0800634 Sequence s;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700635 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
636 .InSequence(s)
637 .WillOnce(Return(true));
638 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
Lloyd Pique66d68602019-02-13 14:23:31 -0800639 .InSequence(s)
640 .WillOnce(Return(false));
641
642 EXPECT_CALL(mHwComposer, getDeviceCompositionChanges(DEFAULT_DISPLAY_ID, true, _))
643 .WillOnce(Return(NO_ERROR));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700644 EXPECT_CALL(*mDisplay, allLayersRequireClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800645
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700646 mDisplay->chooseCompositionStrategy();
Lloyd Pique66d68602019-02-13 14:23:31 -0800647
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700648 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800649 EXPECT_FALSE(state.usesClientComposition);
650 EXPECT_TRUE(state.usesDeviceComposition);
651}
652
653TEST_F(DisplayChooseCompositionStrategyTest, normalOperationWithChanges) {
654 android::HWComposer::DeviceRequestedChanges changes{
Peiyong Line9d809e2020-04-14 13:10:48 -0700655 {{nullptr, hal::Composition::CLIENT}},
656 hal::DisplayRequest::FLIP_CLIENT_TARGET,
657 {{nullptr, hal::LayerRequest::CLEAR_CLIENT_TARGET}},
Peiyong Lindfc3f7c2020-05-07 20:15:50 -0700658 {hal::PixelFormat::RGBA_8888, hal::Dataspace::UNKNOWN},
Lloyd Pique66d68602019-02-13 14:23:31 -0800659 };
660
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700661 // Since two calls are made to anyLayersRequireClientComposition with different return
662 // values, use a Sequence to control the matching so the values are returned in a known
663 // order.
Lloyd Pique66d68602019-02-13 14:23:31 -0800664 Sequence s;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700665 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
666 .InSequence(s)
667 .WillOnce(Return(true));
668 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
Lloyd Pique66d68602019-02-13 14:23:31 -0800669 .InSequence(s)
670 .WillOnce(Return(false));
671
672 EXPECT_CALL(mHwComposer, getDeviceCompositionChanges(DEFAULT_DISPLAY_ID, true, _))
673 .WillOnce(DoAll(SetArgPointee<2>(changes), Return(NO_ERROR)));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700674 EXPECT_CALL(*mDisplay, applyChangedTypesToLayers(changes.changedTypes)).Times(1);
675 EXPECT_CALL(*mDisplay, applyDisplayRequests(changes.displayRequests)).Times(1);
676 EXPECT_CALL(*mDisplay, applyLayerRequestsToLayers(changes.layerRequests)).Times(1);
677 EXPECT_CALL(*mDisplay, allLayersRequireClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800678
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700679 mDisplay->chooseCompositionStrategy();
Lloyd Pique66d68602019-02-13 14:23:31 -0800680
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700681 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800682 EXPECT_FALSE(state.usesClientComposition);
683 EXPECT_TRUE(state.usesDeviceComposition);
684}
685
686/*
Lloyd Pique688abd42019-02-15 15:42:24 -0800687 * Display::getSkipColorTransform()
688 */
689
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700690using DisplayGetSkipColorTransformTest = DisplayWithLayersTestCommon;
691
Dominik Laskowski1162e472020-04-02 19:02:47 -0700692TEST_F(DisplayGetSkipColorTransformTest, checksCapabilityIfNonHwcDisplay) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700693 EXPECT_CALL(mHwComposer, hasCapability(hal::Capability::SKIP_CLIENT_COLOR_TRANSFORM))
Dominik Laskowski1162e472020-04-02 19:02:47 -0700694 .WillOnce(Return(true));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700695 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
696 auto nonHwcDisplay{impl::createDisplay(mCompositionEngine, args)};
Dominik Laskowski1162e472020-04-02 19:02:47 -0700697 EXPECT_TRUE(nonHwcDisplay->getSkipColorTransform());
Lloyd Pique688abd42019-02-15 15:42:24 -0800698}
699
Dominik Laskowski1162e472020-04-02 19:02:47 -0700700TEST_F(DisplayGetSkipColorTransformTest, checksDisplayCapability) {
Lloyd Pique688abd42019-02-15 15:42:24 -0800701 EXPECT_CALL(mHwComposer,
Dominik Laskowski1162e472020-04-02 19:02:47 -0700702 hasDisplayCapability(DEFAULT_DISPLAY_ID,
Peiyong Line9d809e2020-04-14 13:10:48 -0700703 hal::DisplayCapability::SKIP_CLIENT_COLOR_TRANSFORM))
Lloyd Pique688abd42019-02-15 15:42:24 -0800704 .WillOnce(Return(true));
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700705 EXPECT_TRUE(mDisplay->getSkipColorTransform());
Lloyd Pique688abd42019-02-15 15:42:24 -0800706}
707
708/*
Lloyd Pique66d68602019-02-13 14:23:31 -0800709 * Display::anyLayersRequireClientComposition()
710 */
711
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700712using DisplayAnyLayersRequireClientCompositionTest = DisplayWithLayersTestCommon;
713
714TEST_F(DisplayAnyLayersRequireClientCompositionTest, returnsFalse) {
Lloyd Piquede196652020-01-22 17:29:58 -0800715 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(false));
716 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(false));
717 EXPECT_CALL(*mLayer3.outputLayer, requiresClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800718
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700719 EXPECT_FALSE(mDisplay->anyLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800720}
721
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700722TEST_F(DisplayAnyLayersRequireClientCompositionTest, returnsTrue) {
Lloyd Piquede196652020-01-22 17:29:58 -0800723 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(false));
724 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(true));
Lloyd Pique66d68602019-02-13 14:23:31 -0800725
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700726 EXPECT_TRUE(mDisplay->anyLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800727}
728
729/*
730 * Display::allLayersRequireClientComposition()
731 */
732
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700733using DisplayAllLayersRequireClientCompositionTest = DisplayWithLayersTestCommon;
734
735TEST_F(DisplayAllLayersRequireClientCompositionTest, returnsTrue) {
Lloyd Piquede196652020-01-22 17:29:58 -0800736 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(true));
737 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(true));
738 EXPECT_CALL(*mLayer3.outputLayer, requiresClientComposition()).WillOnce(Return(true));
Lloyd Pique66d68602019-02-13 14:23:31 -0800739
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700740 EXPECT_TRUE(mDisplay->allLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800741}
742
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700743TEST_F(DisplayAllLayersRequireClientCompositionTest, returnsFalse) {
Lloyd Piquede196652020-01-22 17:29:58 -0800744 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(true));
745 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800746
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700747 EXPECT_FALSE(mDisplay->allLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800748}
749
750/*
751 * Display::applyChangedTypesToLayers()
752 */
753
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700754using DisplayApplyChangedTypesToLayersTest = DisplayWithLayersTestCommon;
755
756TEST_F(DisplayApplyChangedTypesToLayersTest, takesEarlyOutIfNoChangedLayers) {
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700757 mDisplay->applyChangedTypesToLayers(impl::Display::ChangedTypes());
Lloyd Pique66d68602019-02-13 14:23:31 -0800758}
759
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700760TEST_F(DisplayApplyChangedTypesToLayersTest, appliesChanges) {
Lloyd Piquede196652020-01-22 17:29:58 -0800761 EXPECT_CALL(*mLayer1.outputLayer,
Lloyd Pique66d68602019-02-13 14:23:31 -0800762 applyDeviceCompositionTypeChange(Hwc2::IComposerClient::Composition::CLIENT))
763 .Times(1);
Lloyd Piquede196652020-01-22 17:29:58 -0800764 EXPECT_CALL(*mLayer2.outputLayer,
Lloyd Pique66d68602019-02-13 14:23:31 -0800765 applyDeviceCompositionTypeChange(Hwc2::IComposerClient::Composition::DEVICE))
766 .Times(1);
767
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700768 mDisplay->applyChangedTypesToLayers(impl::Display::ChangedTypes{
Peiyong Line9d809e2020-04-14 13:10:48 -0700769 {&mLayer1.hwc2Layer, hal::Composition::CLIENT},
770 {&mLayer2.hwc2Layer, hal::Composition::DEVICE},
771 {&hwc2LayerUnknown, hal::Composition::SOLID_COLOR},
Lloyd Pique66d68602019-02-13 14:23:31 -0800772 });
773}
774
775/*
776 * Display::applyDisplayRequests()
777 */
778
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700779using DisplayApplyDisplayRequestsTest = DisplayWithLayersTestCommon;
780
781TEST_F(DisplayApplyDisplayRequestsTest, handlesNoRequests) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700782 mDisplay->applyDisplayRequests(static_cast<hal::DisplayRequest>(0));
Lloyd Pique66d68602019-02-13 14:23:31 -0800783
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700784 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800785 EXPECT_FALSE(state.flipClientTarget);
786}
787
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700788TEST_F(DisplayApplyDisplayRequestsTest, handlesFlipClientTarget) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700789 mDisplay->applyDisplayRequests(hal::DisplayRequest::FLIP_CLIENT_TARGET);
Lloyd Pique66d68602019-02-13 14:23:31 -0800790
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700791 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800792 EXPECT_TRUE(state.flipClientTarget);
793}
794
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700795TEST_F(DisplayApplyDisplayRequestsTest, handlesWriteClientTargetToOutput) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700796 mDisplay->applyDisplayRequests(hal::DisplayRequest::WRITE_CLIENT_TARGET_TO_OUTPUT);
Lloyd Pique66d68602019-02-13 14:23:31 -0800797
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700798 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800799 EXPECT_FALSE(state.flipClientTarget);
800}
801
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700802TEST_F(DisplayApplyDisplayRequestsTest, handlesAllRequestFlagsSet) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700803 mDisplay->applyDisplayRequests(static_cast<hal::DisplayRequest>(~0));
Lloyd Pique66d68602019-02-13 14:23:31 -0800804
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700805 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800806 EXPECT_TRUE(state.flipClientTarget);
807}
808
809/*
810 * Display::applyLayerRequestsToLayers()
811 */
812
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700813using DisplayApplyLayerRequestsToLayersTest = DisplayWithLayersTestCommon;
814
815TEST_F(DisplayApplyLayerRequestsToLayersTest, preparesAllLayers) {
Lloyd Piquede196652020-01-22 17:29:58 -0800816 EXPECT_CALL(*mLayer1.outputLayer, prepareForDeviceLayerRequests()).Times(1);
817 EXPECT_CALL(*mLayer2.outputLayer, prepareForDeviceLayerRequests()).Times(1);
818 EXPECT_CALL(*mLayer3.outputLayer, prepareForDeviceLayerRequests()).Times(1);
Lloyd Pique66d68602019-02-13 14:23:31 -0800819
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700820 mDisplay->applyLayerRequestsToLayers(impl::Display::LayerRequests());
Lloyd Pique66d68602019-02-13 14:23:31 -0800821}
822
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700823TEST_F(DisplayApplyLayerRequestsToLayersTest, appliesDeviceLayerRequests) {
Lloyd Piquede196652020-01-22 17:29:58 -0800824 EXPECT_CALL(*mLayer1.outputLayer, prepareForDeviceLayerRequests()).Times(1);
825 EXPECT_CALL(*mLayer2.outputLayer, prepareForDeviceLayerRequests()).Times(1);
826 EXPECT_CALL(*mLayer3.outputLayer, prepareForDeviceLayerRequests()).Times(1);
Lloyd Pique66d68602019-02-13 14:23:31 -0800827
Lloyd Piquede196652020-01-22 17:29:58 -0800828 EXPECT_CALL(*mLayer1.outputLayer,
Lloyd Pique66d68602019-02-13 14:23:31 -0800829 applyDeviceLayerRequest(Hwc2::IComposerClient::LayerRequest::CLEAR_CLIENT_TARGET))
830 .Times(1);
831
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700832 mDisplay->applyLayerRequestsToLayers(impl::Display::LayerRequests{
Peiyong Line9d809e2020-04-14 13:10:48 -0700833 {&mLayer1.hwc2Layer, hal::LayerRequest::CLEAR_CLIENT_TARGET},
834 {&hwc2LayerUnknown, hal::LayerRequest::CLEAR_CLIENT_TARGET},
Lloyd Pique66d68602019-02-13 14:23:31 -0800835 });
836}
837
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800838/*
839 * Display::presentAndGetFrameFences()
840 */
841
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700842using DisplayPresentAndGetFrameFencesTest = DisplayWithLayersTestCommon;
843
844TEST_F(DisplayPresentAndGetFrameFencesTest, returnsNoFencesOnNonHwcDisplay) {
845 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
846 auto nonHwcDisplay{impl::createDisplay(mCompositionEngine, args)};
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800847
848 auto result = nonHwcDisplay->presentAndGetFrameFences();
849
850 ASSERT_TRUE(result.presentFence.get());
851 EXPECT_FALSE(result.presentFence->isValid());
852 EXPECT_EQ(0u, result.layerFences.size());
853}
854
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700855TEST_F(DisplayPresentAndGetFrameFencesTest, returnsPresentAndLayerFences) {
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800856 sp<Fence> presentFence = new Fence();
857 sp<Fence> layer1Fence = new Fence();
858 sp<Fence> layer2Fence = new Fence();
859
860 EXPECT_CALL(mHwComposer, presentAndGetReleaseFences(DEFAULT_DISPLAY_ID)).Times(1);
861 EXPECT_CALL(mHwComposer, getPresentFence(DEFAULT_DISPLAY_ID)).WillOnce(Return(presentFence));
Lloyd Piquede196652020-01-22 17:29:58 -0800862 EXPECT_CALL(mHwComposer, getLayerReleaseFence(DEFAULT_DISPLAY_ID, &mLayer1.hwc2Layer))
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800863 .WillOnce(Return(layer1Fence));
Lloyd Piquede196652020-01-22 17:29:58 -0800864 EXPECT_CALL(mHwComposer, getLayerReleaseFence(DEFAULT_DISPLAY_ID, &mLayer2.hwc2Layer))
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800865 .WillOnce(Return(layer2Fence));
866 EXPECT_CALL(mHwComposer, clearReleaseFences(DEFAULT_DISPLAY_ID)).Times(1);
867
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700868 auto result = mDisplay->presentAndGetFrameFences();
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800869
870 EXPECT_EQ(presentFence, result.presentFence);
871
872 EXPECT_EQ(2u, result.layerFences.size());
Lloyd Piquede196652020-01-22 17:29:58 -0800873 ASSERT_EQ(1, result.layerFences.count(&mLayer1.hwc2Layer));
874 EXPECT_EQ(layer1Fence, result.layerFences[&mLayer1.hwc2Layer]);
875 ASSERT_EQ(1, result.layerFences.count(&mLayer2.hwc2Layer));
876 EXPECT_EQ(layer2Fence, result.layerFences[&mLayer2.hwc2Layer]);
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800877}
878
Lloyd Pique688abd42019-02-15 15:42:24 -0800879/*
880 * Display::setExpensiveRenderingExpected()
881 */
882
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700883using DisplaySetExpensiveRenderingExpectedTest = DisplayWithLayersTestCommon;
884
885TEST_F(DisplaySetExpensiveRenderingExpectedTest, forwardsToPowerAdvisor) {
Lloyd Pique688abd42019-02-15 15:42:24 -0800886 EXPECT_CALL(mPowerAdvisor, setExpensiveRenderingExpected(DEFAULT_DISPLAY_ID, true)).Times(1);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700887 mDisplay->setExpensiveRenderingExpected(true);
Lloyd Pique688abd42019-02-15 15:42:24 -0800888
889 EXPECT_CALL(mPowerAdvisor, setExpensiveRenderingExpected(DEFAULT_DISPLAY_ID, false)).Times(1);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700890 mDisplay->setExpensiveRenderingExpected(false);
Lloyd Pique688abd42019-02-15 15:42:24 -0800891}
892
Lloyd Piqued3d69882019-02-28 16:03:46 -0800893/*
894 * Display::finishFrame()
895 */
896
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700897using DisplayFinishFrameTest = DisplayWithLayersTestCommon;
898
899TEST_F(DisplayFinishFrameTest, doesNotSkipCompositionIfNotDirtyOnHwcDisplay) {
Lloyd Piqued3d69882019-02-28 16:03:46 -0800900 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700901 mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
Lloyd Piqued3d69882019-02-28 16:03:46 -0800902
903 // We expect no calls to queueBuffer if composition was skipped.
904 EXPECT_CALL(*renderSurface, queueBuffer(_)).Times(1);
905
Lloyd Piquea76ce462020-01-14 13:06:37 -0800906 // Expect a call to signal no expensive rendering since there is no client composition.
907 EXPECT_CALL(mPowerAdvisor, setExpensiveRenderingExpected(DEFAULT_DISPLAY_ID, false));
908
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700909 mDisplay->editState().isEnabled = true;
910 mDisplay->editState().usesClientComposition = false;
911 mDisplay->editState().viewport = Rect(0, 0, 1, 1);
912 mDisplay->editState().dirtyRegion = Region::INVALID_REGION;
Lloyd Piqued3d69882019-02-28 16:03:46 -0800913
914 CompositionRefreshArgs refreshArgs;
915 refreshArgs.repaintEverything = false;
916
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700917 mDisplay->finishFrame(refreshArgs);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800918}
919
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700920TEST_F(DisplayFinishFrameTest, skipsCompositionIfNotDirty) {
921 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
922 std::shared_ptr<impl::Display> nonHwcDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800923
924 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
925 nonHwcDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
926
927 // We expect no calls to queueBuffer if composition was skipped.
928 EXPECT_CALL(*renderSurface, queueBuffer(_)).Times(0);
929
930 nonHwcDisplay->editState().isEnabled = true;
931 nonHwcDisplay->editState().usesClientComposition = false;
932 nonHwcDisplay->editState().viewport = Rect(0, 0, 1, 1);
933 nonHwcDisplay->editState().dirtyRegion = Region::INVALID_REGION;
934
935 CompositionRefreshArgs refreshArgs;
936 refreshArgs.repaintEverything = false;
937
938 nonHwcDisplay->finishFrame(refreshArgs);
939}
940
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700941TEST_F(DisplayFinishFrameTest, performsCompositionIfDirty) {
942 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
943 std::shared_ptr<impl::Display> nonHwcDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800944
945 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
946 nonHwcDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
947
948 // We expect a single call to queueBuffer when composition is not skipped.
949 EXPECT_CALL(*renderSurface, queueBuffer(_)).Times(1);
950
951 nonHwcDisplay->editState().isEnabled = true;
952 nonHwcDisplay->editState().usesClientComposition = false;
953 nonHwcDisplay->editState().viewport = Rect(0, 0, 1, 1);
954 nonHwcDisplay->editState().dirtyRegion = Region(Rect(0, 0, 1, 1));
955
956 CompositionRefreshArgs refreshArgs;
957 refreshArgs.repaintEverything = false;
958
959 nonHwcDisplay->finishFrame(refreshArgs);
960}
961
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700962TEST_F(DisplayFinishFrameTest, performsCompositionIfRepaintEverything) {
963 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
964 std::shared_ptr<impl::Display> nonHwcDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800965
966 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
967 nonHwcDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
968
969 // We expect a single call to queueBuffer when composition is not skipped.
970 EXPECT_CALL(*renderSurface, queueBuffer(_)).Times(1);
971
972 nonHwcDisplay->editState().isEnabled = true;
973 nonHwcDisplay->editState().usesClientComposition = false;
974 nonHwcDisplay->editState().viewport = Rect(0, 0, 1, 1);
975 nonHwcDisplay->editState().dirtyRegion = Region::INVALID_REGION;
976
977 CompositionRefreshArgs refreshArgs;
978 refreshArgs.repaintEverything = true;
979
980 nonHwcDisplay->finishFrame(refreshArgs);
981}
982
Lloyd Piquec6607552019-12-02 17:57:39 -0800983/*
984 * Display functional tests
985 */
986
987struct DisplayFunctionalTest : public testing::Test {
988 class Display : public impl::Display {
989 public:
Lloyd Piquec6607552019-12-02 17:57:39 -0800990 using impl::Display::injectOutputLayerForTest;
991 virtual void injectOutputLayerForTest(std::unique_ptr<compositionengine::OutputLayer>) = 0;
992 };
993
Lloyd Piquec6607552019-12-02 17:57:39 -0800994 DisplayFunctionalTest() {
995 EXPECT_CALL(mCompositionEngine, getHwComposer()).WillRepeatedly(ReturnRef(mHwComposer));
996
997 mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(mRenderSurface));
998 }
999
1000 NiceMock<android::mock::HWComposer> mHwComposer;
1001 NiceMock<Hwc2::mock::PowerAdvisor> mPowerAdvisor;
1002 NiceMock<mock::CompositionEngine> mCompositionEngine;
1003 sp<mock::NativeWindow> mNativeWindow = new NiceMock<mock::NativeWindow>();
1004 sp<mock::DisplaySurface> mDisplaySurface = new NiceMock<mock::DisplaySurface>();
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -07001005 std::shared_ptr<Display> mDisplay = impl::createDisplayTemplated<
1006 Display>(mCompositionEngine,
1007 DisplayCreationArgsBuilder()
1008 .setPhysical({DEFAULT_DISPLAY_ID, DisplayConnectionType::Internal})
1009 .setPixels({DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT})
1010 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
1011 .setIsSecure(true)
1012 .setLayerStackId(DEFAULT_LAYER_STACK)
1013 .setPowerAdvisor(&mPowerAdvisor)
1014 .build()
1015
1016 );
Lloyd Piquec6607552019-12-02 17:57:39 -08001017 impl::RenderSurface* mRenderSurface =
1018 new impl::RenderSurface{mCompositionEngine, *mDisplay,
1019 RenderSurfaceCreationArgs{DEFAULT_DISPLAY_WIDTH,
1020 DEFAULT_DISPLAY_HEIGHT, mNativeWindow,
1021 mDisplaySurface}};
1022};
1023
1024TEST_F(DisplayFunctionalTest, postFramebufferCriticalCallsAreOrdered) {
1025 InSequence seq;
1026
1027 mDisplay->editState().isEnabled = true;
1028
1029 EXPECT_CALL(mHwComposer, presentAndGetReleaseFences(_));
1030 EXPECT_CALL(*mDisplaySurface, onFrameCommitted());
1031
1032 mDisplay->postFramebuffer();
1033}
1034
Lloyd Pique45a165a2018-10-19 11:54:47 -07001035} // namespace
1036} // namespace android::compositionengine