blob: 09f37fba18e02ab6da042520bcff4645bf5b1e5a [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
59constexpr DisplayId DEFAULT_DISPLAY_ID = DisplayId{42};
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070060constexpr DisplayId VIRTUAL_DISPLAY_ID = DisplayId{43};
Lloyd Piquec6607552019-12-02 17:57:39 -080061constexpr int32_t DEFAULT_DISPLAY_WIDTH = 1920;
62constexpr int32_t DEFAULT_DISPLAY_HEIGHT = 1080;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070063constexpr int32_t DEFAULT_LAYER_STACK = 123;
Lloyd Pique45a165a2018-10-19 11:54:47 -070064
Lloyd Piquede196652020-01-22 17:29:58 -080065struct Layer {
66 Layer() {
67 EXPECT_CALL(*outputLayer, getLayerFE()).WillRepeatedly(ReturnRef(*layerFE));
68 EXPECT_CALL(*outputLayer, getHwcLayer()).WillRepeatedly(Return(&hwc2Layer));
69 }
70
71 sp<mock::LayerFE> layerFE = new StrictMock<mock::LayerFE>();
72 StrictMock<mock::OutputLayer>* outputLayer = new StrictMock<mock::OutputLayer>();
73 StrictMock<HWC2::mock::Layer> hwc2Layer;
74};
75
76struct LayerNoHWC2Layer {
77 LayerNoHWC2Layer() {
78 EXPECT_CALL(*outputLayer, getLayerFE()).WillRepeatedly(ReturnRef(*layerFE));
79 EXPECT_CALL(*outputLayer, getHwcLayer()).WillRepeatedly(Return(nullptr));
80 }
81
82 sp<mock::LayerFE> layerFE = new StrictMock<mock::LayerFE>();
83 StrictMock<mock::OutputLayer>* outputLayer = new StrictMock<mock::OutputLayer>();
84};
85
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070086struct DisplayTestCommon : public testing::Test {
87 // Uses the full implementation of a display
88 class FullImplDisplay : public impl::Display {
Lloyd Pique01c77c12019-04-17 12:48:32 -070089 public:
Lloyd Pique01c77c12019-04-17 12:48:32 -070090 using impl::Display::injectOutputLayerForTest;
91 virtual void injectOutputLayerForTest(std::unique_ptr<compositionengine::OutputLayer>) = 0;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070092
93 using impl::Display::maybeAllocateDisplayIdForVirtualDisplay;
Lloyd Pique01c77c12019-04-17 12:48:32 -070094 };
95
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070096 // Uses a special implementation with key internal member functions set up
97 // as mock implementations, to allow for easier testing.
98 struct PartialMockDisplay : public impl::Display {
99 PartialMockDisplay(const compositionengine::CompositionEngine& compositionEngine)
100 : mCompositionEngine(compositionEngine) {}
101
102 // compositionengine::Output overrides
103 const OutputCompositionState& getState() const override { return mState; }
104 OutputCompositionState& editState() override { return mState; }
105
106 // compositionengine::impl::Output overrides
107 const CompositionEngine& getCompositionEngine() const override {
108 return mCompositionEngine;
109 };
110
111 // Mock implementation overrides
112 MOCK_CONST_METHOD0(getOutputLayerCount, size_t());
113 MOCK_CONST_METHOD1(getOutputLayerOrderedByZByIndex,
114 compositionengine::OutputLayer*(size_t));
115 MOCK_METHOD2(ensureOutputLayer,
116 compositionengine::OutputLayer*(std::optional<size_t>, const sp<LayerFE>&));
117 MOCK_METHOD0(finalizePendingOutputLayers, void());
118 MOCK_METHOD0(clearOutputLayers, void());
119 MOCK_CONST_METHOD1(dumpState, void(std::string&));
120 MOCK_METHOD1(injectOutputLayerForTest, compositionengine::OutputLayer*(const sp<LayerFE>&));
121 MOCK_METHOD1(injectOutputLayerForTest, void(std::unique_ptr<OutputLayer>));
122 MOCK_CONST_METHOD0(anyLayersRequireClientComposition, bool());
123 MOCK_CONST_METHOD0(allLayersRequireClientComposition, bool());
124 MOCK_METHOD1(applyChangedTypesToLayers, void(const impl::Display::ChangedTypes&));
125 MOCK_METHOD1(applyDisplayRequests, void(const impl::Display::DisplayRequests&));
126 MOCK_METHOD1(applyLayerRequestsToLayers, void(const impl::Display::LayerRequests&));
127
128 const compositionengine::CompositionEngine& mCompositionEngine;
129 impl::OutputCompositionState mState;
130 };
131
132 static std::string getDisplayNameFromCurrentTest() {
133 const ::testing::TestInfo* const test_info =
134 ::testing::UnitTest::GetInstance()->current_test_info();
135 return std::string("display for ") + test_info->test_case_name() + "." + test_info->name();
136 }
137
138 template <typename Display>
Lloyd Pique01c77c12019-04-17 12:48:32 -0700139 static std::shared_ptr<Display> createDisplay(
140 const compositionengine::CompositionEngine& compositionEngine,
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700141 compositionengine::DisplayCreationArgs args) {
142 args.name = getDisplayNameFromCurrentTest();
Lloyd Pique01c77c12019-04-17 12:48:32 -0700143 return impl::createDisplayTemplated<Display>(compositionEngine, args);
144 }
145
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700146 template <typename Display>
147 static std::shared_ptr<StrictMock<Display>> createPartialMockDisplay(
148 const compositionengine::CompositionEngine& compositionEngine,
149 compositionengine::DisplayCreationArgs args) {
150 args.name = getDisplayNameFromCurrentTest();
151 auto display = std::make_shared<StrictMock<Display>>(compositionEngine);
Lloyd Pique66d68602019-02-13 14:23:31 -0800152
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700153 display->setConfiguration(args);
154
155 return display;
156 }
157
158 DisplayTestCommon() {
159 EXPECT_CALL(mCompositionEngine, getHwComposer()).WillRepeatedly(ReturnRef(mHwComposer));
Lloyd Piquee9eff972020-05-05 12:36:44 -0700160 EXPECT_CALL(mCompositionEngine, getRenderEngine()).WillRepeatedly(ReturnRef(mRenderEngine));
161 EXPECT_CALL(mRenderEngine, supportsProtectedContent()).WillRepeatedly(Return(false));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700162 }
163
164 DisplayCreationArgs getDisplayCreationArgsForPhysicalHWCDisplay() {
165 return DisplayCreationArgsBuilder()
166 .setPhysical({DEFAULT_DISPLAY_ID, DisplayConnectionType::Internal})
167 .setPixels({DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT})
168 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
169 .setIsSecure(true)
170 .setLayerStackId(DEFAULT_LAYER_STACK)
171 .setPowerAdvisor(&mPowerAdvisor)
172 .build();
173 }
174
175 DisplayCreationArgs getDisplayCreationArgsForNonHWCVirtualDisplay() {
176 return DisplayCreationArgsBuilder()
177 .setUseHwcVirtualDisplays(false)
178 .setPixels({DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT})
179 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
180 .setIsSecure(false)
181 .setLayerStackId(DEFAULT_LAYER_STACK)
182 .setPowerAdvisor(&mPowerAdvisor)
183 .build();
184 }
185
186 StrictMock<android::mock::HWComposer> mHwComposer;
187 StrictMock<Hwc2::mock::PowerAdvisor> mPowerAdvisor;
Lloyd Piquee9eff972020-05-05 12:36:44 -0700188 StrictMock<renderengine::mock::RenderEngine> mRenderEngine;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700189 StrictMock<mock::CompositionEngine> mCompositionEngine;
190 sp<mock::NativeWindow> mNativeWindow = new StrictMock<mock::NativeWindow>();
191};
192
193struct PartialMockDisplayTestCommon : public DisplayTestCommon {
194 using Display = DisplayTestCommon::PartialMockDisplay;
195 std::shared_ptr<Display> mDisplay =
196 createPartialMockDisplay<Display>(mCompositionEngine,
197 getDisplayCreationArgsForPhysicalHWCDisplay());
198};
199
200struct FullDisplayImplTestCommon : public DisplayTestCommon {
201 using Display = DisplayTestCommon::FullImplDisplay;
202 std::shared_ptr<Display> mDisplay =
203 createDisplay<Display>(mCompositionEngine,
204 getDisplayCreationArgsForPhysicalHWCDisplay());
205};
206
207struct DisplayWithLayersTestCommon : public FullDisplayImplTestCommon {
208 DisplayWithLayersTestCommon() {
Lloyd Pique01c77c12019-04-17 12:48:32 -0700209 mDisplay->injectOutputLayerForTest(
Lloyd Piquede196652020-01-22 17:29:58 -0800210 std::unique_ptr<compositionengine::OutputLayer>(mLayer1.outputLayer));
Lloyd Pique01c77c12019-04-17 12:48:32 -0700211 mDisplay->injectOutputLayerForTest(
Lloyd Piquede196652020-01-22 17:29:58 -0800212 std::unique_ptr<compositionengine::OutputLayer>(mLayer2.outputLayer));
Lloyd Pique01c77c12019-04-17 12:48:32 -0700213 mDisplay->injectOutputLayerForTest(
Lloyd Piquede196652020-01-22 17:29:58 -0800214 std::unique_ptr<compositionengine::OutputLayer>(mLayer3.outputLayer));
Lloyd Pique66d68602019-02-13 14:23:31 -0800215 }
Lloyd Pique45a165a2018-10-19 11:54:47 -0700216
Lloyd Piquede196652020-01-22 17:29:58 -0800217 Layer mLayer1;
218 Layer mLayer2;
219 LayerNoHWC2Layer mLayer3;
220 StrictMock<HWC2::mock::Layer> hwc2LayerUnknown;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700221 std::shared_ptr<Display> mDisplay =
222 createDisplay<Display>(mCompositionEngine,
223 getDisplayCreationArgsForPhysicalHWCDisplay());
Lloyd Pique45a165a2018-10-19 11:54:47 -0700224};
225
Lloyd Pique66d68602019-02-13 14:23:31 -0800226/*
Lloyd Pique45a165a2018-10-19 11:54:47 -0700227 * Basic construction
228 */
229
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700230struct DisplayCreationTest : public DisplayTestCommon {
231 using Display = DisplayTestCommon::FullImplDisplay;
232};
Lloyd Pique45a165a2018-10-19 11:54:47 -0700233
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700234TEST_F(DisplayCreationTest, createPhysicalInternalDisplay) {
235 auto display =
236 impl::createDisplay(mCompositionEngine, getDisplayCreationArgsForPhysicalHWCDisplay());
237 EXPECT_TRUE(display->isSecure());
238 EXPECT_FALSE(display->isVirtual());
239 EXPECT_EQ(DEFAULT_DISPLAY_ID, display->getId());
240}
Lloyd Pique45a165a2018-10-19 11:54:47 -0700241
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700242TEST_F(DisplayCreationTest, createNonHwcVirtualDisplay) {
243 auto display = impl::createDisplay(mCompositionEngine,
244 getDisplayCreationArgsForNonHWCVirtualDisplay());
245 EXPECT_FALSE(display->isSecure());
246 EXPECT_TRUE(display->isVirtual());
247 EXPECT_EQ(std::nullopt, display->getId());
248}
249
250/*
251 * Display::setConfiguration()
252 */
253
254using DisplaySetConfigurationTest = PartialMockDisplayTestCommon;
255
256TEST_F(DisplaySetConfigurationTest, configuresInternalSecurePhysicalDisplay) {
257 mDisplay->setConfiguration(
258 DisplayCreationArgsBuilder()
259 .setUseHwcVirtualDisplays(true)
260 .setPhysical({DEFAULT_DISPLAY_ID, DisplayConnectionType::Internal})
261 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
262 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
263 .setIsSecure(true)
264 .setLayerStackId(DEFAULT_LAYER_STACK)
265 .setPowerAdvisor(&mPowerAdvisor)
266 .setName(getDisplayNameFromCurrentTest())
267 .build());
268
269 EXPECT_EQ(DEFAULT_DISPLAY_ID, mDisplay->getId());
270 EXPECT_TRUE(mDisplay->isSecure());
271 EXPECT_FALSE(mDisplay->isVirtual());
272 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
273 EXPECT_TRUE(mDisplay->getState().layerStackInternal);
274 EXPECT_FALSE(mDisplay->isValid());
275}
276
277TEST_F(DisplaySetConfigurationTest, configuresExternalInsecurePhysicalDisplay) {
278 mDisplay->setConfiguration(
279 DisplayCreationArgsBuilder()
280 .setUseHwcVirtualDisplays(true)
281 .setPhysical({DEFAULT_DISPLAY_ID, DisplayConnectionType::External})
282 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
283 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
284 .setIsSecure(false)
285 .setLayerStackId(DEFAULT_LAYER_STACK)
286 .setPowerAdvisor(&mPowerAdvisor)
287 .setName(getDisplayNameFromCurrentTest())
288 .build());
289
290 EXPECT_EQ(DEFAULT_DISPLAY_ID, mDisplay->getId());
291 EXPECT_FALSE(mDisplay->isSecure());
292 EXPECT_FALSE(mDisplay->isVirtual());
293 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
294 EXPECT_FALSE(mDisplay->getState().layerStackInternal);
295 EXPECT_FALSE(mDisplay->isValid());
296}
297
298TEST_F(DisplaySetConfigurationTest, configuresHwcBackedVirtualDisplay) {
299 EXPECT_CALL(mHwComposer,
300 allocateVirtualDisplay(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH,
301 Pointee(Eq(static_cast<ui::PixelFormat>(
302 PIXEL_FORMAT_RGBA_8888)))))
303 .WillOnce(Return(VIRTUAL_DISPLAY_ID));
304
305 mDisplay->setConfiguration(
306 DisplayCreationArgsBuilder()
307 .setUseHwcVirtualDisplays(true)
308 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
309 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
310 .setIsSecure(false)
311 .setLayerStackId(DEFAULT_LAYER_STACK)
312 .setPowerAdvisor(&mPowerAdvisor)
313 .setName(getDisplayNameFromCurrentTest())
314 .build());
315
316 EXPECT_EQ(VIRTUAL_DISPLAY_ID, mDisplay->getId());
317 EXPECT_FALSE(mDisplay->isSecure());
318 EXPECT_TRUE(mDisplay->isVirtual());
319 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
320 EXPECT_FALSE(mDisplay->getState().layerStackInternal);
321 EXPECT_FALSE(mDisplay->isValid());
322}
323
324TEST_F(DisplaySetConfigurationTest, configuresNonHwcBackedVirtualDisplayIfHwcAllocationFails) {
325 EXPECT_CALL(mHwComposer,
326 allocateVirtualDisplay(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH,
327 Pointee(Eq(static_cast<ui::PixelFormat>(
328 PIXEL_FORMAT_RGBA_8888)))))
329 .WillOnce(Return(std::nullopt));
330
331 mDisplay->setConfiguration(
332 DisplayCreationArgsBuilder()
333 .setUseHwcVirtualDisplays(true)
334 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
335 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
336 .setIsSecure(false)
337 .setLayerStackId(DEFAULT_LAYER_STACK)
338 .setPowerAdvisor(&mPowerAdvisor)
339 .setName(getDisplayNameFromCurrentTest())
340 .build());
341
342 EXPECT_EQ(std::nullopt, mDisplay->getId());
343 EXPECT_FALSE(mDisplay->isSecure());
344 EXPECT_TRUE(mDisplay->isVirtual());
345 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
346 EXPECT_FALSE(mDisplay->getState().layerStackInternal);
347 EXPECT_FALSE(mDisplay->isValid());
348}
349
350TEST_F(DisplaySetConfigurationTest, configuresNonHwcBackedVirtualDisplayIfShouldNotUseHwc) {
351 mDisplay->setConfiguration(
352 DisplayCreationArgsBuilder()
353 .setUseHwcVirtualDisplays(false)
354 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
355 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
356 .setIsSecure(false)
357 .setLayerStackId(DEFAULT_LAYER_STACK)
358 .setPowerAdvisor(&mPowerAdvisor)
359 .setName(getDisplayNameFromCurrentTest())
360 .build());
361
362 EXPECT_EQ(std::nullopt, mDisplay->getId());
363 EXPECT_FALSE(mDisplay->isSecure());
364 EXPECT_TRUE(mDisplay->isVirtual());
365 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
366 EXPECT_FALSE(mDisplay->getState().layerStackInternal);
367 EXPECT_FALSE(mDisplay->isValid());
Lloyd Pique45a165a2018-10-19 11:54:47 -0700368}
369
Lloyd Pique66d68602019-02-13 14:23:31 -0800370/*
Lloyd Pique45a165a2018-10-19 11:54:47 -0700371 * Display::disconnect()
372 */
373
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700374using DisplayDisconnectTest = PartialMockDisplayTestCommon;
375
376TEST_F(DisplayDisconnectTest, disconnectsDisplay) {
Lloyd Pique45a165a2018-10-19 11:54:47 -0700377 // The first call to disconnect will disconnect the display with the HWC and
378 // set mHwcId to -1.
379 EXPECT_CALL(mHwComposer, disconnectDisplay(DEFAULT_DISPLAY_ID)).Times(1);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700380 mDisplay->disconnect();
381 EXPECT_FALSE(mDisplay->getId());
Lloyd Pique45a165a2018-10-19 11:54:47 -0700382
383 // Subsequent calls will do nothing,
384 EXPECT_CALL(mHwComposer, disconnectDisplay(DEFAULT_DISPLAY_ID)).Times(0);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700385 mDisplay->disconnect();
386 EXPECT_FALSE(mDisplay->getId());
Lloyd Pique45a165a2018-10-19 11:54:47 -0700387}
388
Lloyd Pique66d68602019-02-13 14:23:31 -0800389/*
Lloyd Pique32cbe282018-10-19 13:09:22 -0700390 * Display::setColorTransform()
391 */
392
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700393using DisplaySetColorTransformTest = PartialMockDisplayTestCommon;
394
395TEST_F(DisplaySetColorTransformTest, setsTransform) {
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800396 // No change does nothing
397 CompositionRefreshArgs refreshArgs;
398 refreshArgs.colorTransformMatrix = std::nullopt;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700399 mDisplay->setColorTransform(refreshArgs);
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800400
Lloyd Pique32cbe282018-10-19 13:09:22 -0700401 // Identity matrix sets an identity state value
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800402 const mat4 kIdentity;
Lloyd Pique32cbe282018-10-19 13:09:22 -0700403
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800404 EXPECT_CALL(mHwComposer, setColorTransform(DEFAULT_DISPLAY_ID, kIdentity)).Times(1);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700405
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800406 refreshArgs.colorTransformMatrix = kIdentity;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700407 mDisplay->setColorTransform(refreshArgs);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700408
409 // Non-identity matrix sets a non-identity state value
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800410 const mat4 kNonIdentity = mat4() * 2;
Lloyd Pique32cbe282018-10-19 13:09:22 -0700411
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800412 EXPECT_CALL(mHwComposer, setColorTransform(DEFAULT_DISPLAY_ID, kNonIdentity)).Times(1);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700413
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800414 refreshArgs.colorTransformMatrix = kNonIdentity;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700415 mDisplay->setColorTransform(refreshArgs);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700416}
417
Lloyd Pique66d68602019-02-13 14:23:31 -0800418/*
Lloyd Pique32cbe282018-10-19 13:09:22 -0700419 * Display::setColorMode()
420 */
421
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700422using DisplaySetColorModeTest = PartialMockDisplayTestCommon;
423
424TEST_F(DisplaySetColorModeTest, setsModeUnlessNoChange) {
Lloyd Pique6a3b4462019-03-07 20:58:12 -0800425 using ColorProfile = Output::ColorProfile;
426
Lloyd Pique31cb2942018-10-19 17:23:03 -0700427 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700428 mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
Lloyd Piquef5275482019-01-29 18:42:42 -0800429 mock::DisplayColorProfile* colorProfile = new StrictMock<mock::DisplayColorProfile>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700430 mDisplay->setDisplayColorProfileForTest(std::unique_ptr<DisplayColorProfile>(colorProfile));
Lloyd Pique31cb2942018-10-19 17:23:03 -0700431
Lloyd Piquef5275482019-01-29 18:42:42 -0800432 EXPECT_CALL(*colorProfile, getTargetDataspace(_, _, _))
433 .WillRepeatedly(Return(ui::Dataspace::UNKNOWN));
Lloyd Pique32cbe282018-10-19 13:09:22 -0700434
435 // These values are expected to be the initial state.
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700436 ASSERT_EQ(ui::ColorMode::NATIVE, mDisplay->getState().colorMode);
437 ASSERT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().dataspace);
438 ASSERT_EQ(ui::RenderIntent::COLORIMETRIC, mDisplay->getState().renderIntent);
439 ASSERT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().targetDataspace);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700440
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700441 // Otherwise if the values are unchanged, nothing happens
442 mDisplay->setColorProfile(ColorProfile{ui::ColorMode::NATIVE, ui::Dataspace::UNKNOWN,
443 ui::RenderIntent::COLORIMETRIC, ui::Dataspace::UNKNOWN});
Lloyd Pique32cbe282018-10-19 13:09:22 -0700444
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700445 EXPECT_EQ(ui::ColorMode::NATIVE, mDisplay->getState().colorMode);
446 EXPECT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().dataspace);
447 EXPECT_EQ(ui::RenderIntent::COLORIMETRIC, mDisplay->getState().renderIntent);
448 EXPECT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().targetDataspace);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700449
450 // Otherwise if the values are different, updates happen
Lloyd Piqueef958122019-02-05 18:00:12 -0800451 EXPECT_CALL(*renderSurface, setBufferDataspace(ui::Dataspace::DISPLAY_P3)).Times(1);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700452 EXPECT_CALL(mHwComposer,
Lloyd Piqueef958122019-02-05 18:00:12 -0800453 setActiveColorMode(DEFAULT_DISPLAY_ID, ui::ColorMode::DISPLAY_P3,
Lloyd Pique32cbe282018-10-19 13:09:22 -0700454 ui::RenderIntent::TONE_MAP_COLORIMETRIC))
455 .Times(1);
456
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700457 mDisplay->setColorProfile(ColorProfile{ui::ColorMode::DISPLAY_P3, ui::Dataspace::DISPLAY_P3,
458 ui::RenderIntent::TONE_MAP_COLORIMETRIC,
459 ui::Dataspace::UNKNOWN});
Lloyd Pique32cbe282018-10-19 13:09:22 -0700460
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700461 EXPECT_EQ(ui::ColorMode::DISPLAY_P3, mDisplay->getState().colorMode);
462 EXPECT_EQ(ui::Dataspace::DISPLAY_P3, mDisplay->getState().dataspace);
463 EXPECT_EQ(ui::RenderIntent::TONE_MAP_COLORIMETRIC, mDisplay->getState().renderIntent);
464 EXPECT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().targetDataspace);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700465}
466
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700467TEST_F(DisplaySetColorModeTest, doesNothingForVirtualDisplay) {
Lloyd Pique6a3b4462019-03-07 20:58:12 -0800468 using ColorProfile = Output::ColorProfile;
469
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700470 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
471 std::shared_ptr<impl::Display> virtualDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700472
Lloyd Piquef5275482019-01-29 18:42:42 -0800473 mock::DisplayColorProfile* colorProfile = new StrictMock<mock::DisplayColorProfile>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700474 virtualDisplay->setDisplayColorProfileForTest(
Lloyd Piquef5275482019-01-29 18:42:42 -0800475 std::unique_ptr<DisplayColorProfile>(colorProfile));
476
477 EXPECT_CALL(*colorProfile,
478 getTargetDataspace(ui::ColorMode::DISPLAY_P3, ui::Dataspace::DISPLAY_P3,
479 ui::Dataspace::UNKNOWN))
480 .WillOnce(Return(ui::Dataspace::UNKNOWN));
481
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700482 virtualDisplay->setColorProfile(
Lloyd Pique6a3b4462019-03-07 20:58:12 -0800483 ColorProfile{ui::ColorMode::DISPLAY_P3, ui::Dataspace::DISPLAY_P3,
484 ui::RenderIntent::TONE_MAP_COLORIMETRIC, ui::Dataspace::UNKNOWN});
Lloyd Pique32cbe282018-10-19 13:09:22 -0700485
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700486 EXPECT_EQ(ui::ColorMode::NATIVE, virtualDisplay->getState().colorMode);
487 EXPECT_EQ(ui::Dataspace::UNKNOWN, virtualDisplay->getState().dataspace);
488 EXPECT_EQ(ui::RenderIntent::COLORIMETRIC, virtualDisplay->getState().renderIntent);
489 EXPECT_EQ(ui::Dataspace::UNKNOWN, virtualDisplay->getState().targetDataspace);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700490}
491
Lloyd Pique66d68602019-02-13 14:23:31 -0800492/*
Lloyd Pique3d0c02e2018-10-19 18:38:12 -0700493 * Display::createDisplayColorProfile()
494 */
495
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700496using DisplayCreateColorProfileTest = PartialMockDisplayTestCommon;
497
498TEST_F(DisplayCreateColorProfileTest, setsDisplayColorProfile) {
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700499 EXPECT_TRUE(mDisplay->getDisplayColorProfile() == nullptr);
500 mDisplay->createDisplayColorProfile(
Lloyd Pique3d0c02e2018-10-19 18:38:12 -0700501 DisplayColorProfileCreationArgs{false, HdrCapabilities(), 0,
502 DisplayColorProfileCreationArgs::HwcColorModes()});
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700503 EXPECT_TRUE(mDisplay->getDisplayColorProfile() != nullptr);
Lloyd Pique3d0c02e2018-10-19 18:38:12 -0700504}
505
Lloyd Pique66d68602019-02-13 14:23:31 -0800506/*
Lloyd Pique31cb2942018-10-19 17:23:03 -0700507 * Display::createRenderSurface()
508 */
509
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700510using DisplayCreateRenderSurfaceTest = PartialMockDisplayTestCommon;
511
512TEST_F(DisplayCreateRenderSurfaceTest, setsRenderSurface) {
chaviw8beb4142019-04-11 13:09:05 -0700513 EXPECT_CALL(*mNativeWindow, disconnect(NATIVE_WINDOW_API_EGL)).WillRepeatedly(Return(NO_ERROR));
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700514 EXPECT_TRUE(mDisplay->getRenderSurface() == nullptr);
515 mDisplay->createRenderSurface(RenderSurfaceCreationArgs{640, 480, mNativeWindow, nullptr});
516 EXPECT_TRUE(mDisplay->getRenderSurface() != nullptr);
Lloyd Pique31cb2942018-10-19 17:23:03 -0700517}
518
Lloyd Pique66d68602019-02-13 14:23:31 -0800519/*
Lloyd Piquedf336d92019-03-07 21:38:42 -0800520 * Display::createOutputLayer()
521 */
522
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700523using DisplayCreateOutputLayerTest = FullDisplayImplTestCommon;
524
525TEST_F(DisplayCreateOutputLayerTest, setsHwcLayer) {
Lloyd Piquedf336d92019-03-07 21:38:42 -0800526 sp<mock::LayerFE> layerFE = new StrictMock<mock::LayerFE>();
Lloyd Piquedf336d92019-03-07 21:38:42 -0800527 StrictMock<HWC2::mock::Layer> hwcLayer;
528
529 EXPECT_CALL(mHwComposer, createLayer(DEFAULT_DISPLAY_ID)).WillOnce(Return(&hwcLayer));
530
Lloyd Piquede196652020-01-22 17:29:58 -0800531 auto outputLayer = mDisplay->createOutputLayer(layerFE);
Lloyd Piquedf336d92019-03-07 21:38:42 -0800532
533 EXPECT_EQ(&hwcLayer, outputLayer->getHwcLayer());
534
535 EXPECT_CALL(mHwComposer, destroyLayer(DEFAULT_DISPLAY_ID, &hwcLayer));
536 outputLayer.reset();
537}
538
539/*
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800540 * Display::setReleasedLayers()
541 */
542
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700543using DisplaySetReleasedLayersTest = DisplayWithLayersTestCommon;
544
545TEST_F(DisplaySetReleasedLayersTest, doesNothingIfNotHwcDisplay) {
546 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
547 std::shared_ptr<impl::Display> nonHwcDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800548
549 sp<mock::LayerFE> layerXLayerFE = new StrictMock<mock::LayerFE>();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800550
551 {
552 Output::ReleasedLayers releasedLayers;
553 releasedLayers.emplace_back(layerXLayerFE);
554 nonHwcDisplay->setReleasedLayers(std::move(releasedLayers));
555 }
556
557 CompositionRefreshArgs refreshArgs;
Lloyd Piquede196652020-01-22 17:29:58 -0800558 refreshArgs.layersWithQueuedFrames.push_back(layerXLayerFE);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800559
560 nonHwcDisplay->setReleasedLayers(refreshArgs);
561
562 const auto& releasedLayers = nonHwcDisplay->getReleasedLayersForTest();
563 ASSERT_EQ(1, releasedLayers.size());
564}
565
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700566TEST_F(DisplaySetReleasedLayersTest, doesNothingIfNoLayersWithQueuedFrames) {
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800567 sp<mock::LayerFE> layerXLayerFE = new StrictMock<mock::LayerFE>();
568
569 {
570 Output::ReleasedLayers releasedLayers;
571 releasedLayers.emplace_back(layerXLayerFE);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700572 mDisplay->setReleasedLayers(std::move(releasedLayers));
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800573 }
574
575 CompositionRefreshArgs refreshArgs;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700576 mDisplay->setReleasedLayers(refreshArgs);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800577
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700578 const auto& releasedLayers = mDisplay->getReleasedLayersForTest();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800579 ASSERT_EQ(1, releasedLayers.size());
580}
581
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700582TEST_F(DisplaySetReleasedLayersTest, setReleasedLayers) {
Lloyd Piquede196652020-01-22 17:29:58 -0800583 sp<mock::LayerFE> unknownLayer = new StrictMock<mock::LayerFE>();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800584
585 CompositionRefreshArgs refreshArgs;
Lloyd Piquede196652020-01-22 17:29:58 -0800586 refreshArgs.layersWithQueuedFrames.push_back(mLayer1.layerFE);
587 refreshArgs.layersWithQueuedFrames.push_back(mLayer2.layerFE);
588 refreshArgs.layersWithQueuedFrames.push_back(unknownLayer);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800589
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700590 mDisplay->setReleasedLayers(refreshArgs);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800591
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700592 const auto& releasedLayers = mDisplay->getReleasedLayersForTest();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800593 ASSERT_EQ(2, releasedLayers.size());
Lloyd Piquede196652020-01-22 17:29:58 -0800594 ASSERT_EQ(mLayer1.layerFE.get(), releasedLayers[0].promote().get());
595 ASSERT_EQ(mLayer2.layerFE.get(), releasedLayers[1].promote().get());
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800596}
597
598/*
Lloyd Pique66d68602019-02-13 14:23:31 -0800599 * Display::chooseCompositionStrategy()
600 */
601
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700602using DisplayChooseCompositionStrategyTest = PartialMockDisplayTestCommon;
Lloyd Pique66d68602019-02-13 14:23:31 -0800603
604TEST_F(DisplayChooseCompositionStrategyTest, takesEarlyOutIfNotAHwcDisplay) {
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700605 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
606 std::shared_ptr<Display> nonHwcDisplay =
607 createPartialMockDisplay<Display>(mCompositionEngine, args);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700608 EXPECT_FALSE(nonHwcDisplay->getId());
Lloyd Pique66d68602019-02-13 14:23:31 -0800609
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700610 nonHwcDisplay->chooseCompositionStrategy();
Lloyd Pique66d68602019-02-13 14:23:31 -0800611
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700612 auto& state = nonHwcDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800613 EXPECT_TRUE(state.usesClientComposition);
614 EXPECT_FALSE(state.usesDeviceComposition);
615}
616
617TEST_F(DisplayChooseCompositionStrategyTest, takesEarlyOutOnHwcError) {
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700618 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800619 EXPECT_CALL(mHwComposer, getDeviceCompositionChanges(DEFAULT_DISPLAY_ID, false, _))
620 .WillOnce(Return(INVALID_OPERATION));
621
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700622 mDisplay->chooseCompositionStrategy();
Lloyd Pique66d68602019-02-13 14:23:31 -0800623
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700624 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800625 EXPECT_TRUE(state.usesClientComposition);
626 EXPECT_FALSE(state.usesDeviceComposition);
627}
628
629TEST_F(DisplayChooseCompositionStrategyTest, normalOperation) {
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700630 // Since two calls are made to anyLayersRequireClientComposition with different return
631 // values, use a Sequence to control the matching so the values are returned in a known
632 // order.
Lloyd Pique66d68602019-02-13 14:23:31 -0800633 Sequence s;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700634 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
635 .InSequence(s)
636 .WillOnce(Return(true));
637 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
Lloyd Pique66d68602019-02-13 14:23:31 -0800638 .InSequence(s)
639 .WillOnce(Return(false));
640
641 EXPECT_CALL(mHwComposer, getDeviceCompositionChanges(DEFAULT_DISPLAY_ID, true, _))
642 .WillOnce(Return(NO_ERROR));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700643 EXPECT_CALL(*mDisplay, allLayersRequireClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800644
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700645 mDisplay->chooseCompositionStrategy();
Lloyd Pique66d68602019-02-13 14:23:31 -0800646
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700647 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800648 EXPECT_FALSE(state.usesClientComposition);
649 EXPECT_TRUE(state.usesDeviceComposition);
650}
651
652TEST_F(DisplayChooseCompositionStrategyTest, normalOperationWithChanges) {
653 android::HWComposer::DeviceRequestedChanges changes{
Peiyong Line9d809e2020-04-14 13:10:48 -0700654 {{nullptr, hal::Composition::CLIENT}},
655 hal::DisplayRequest::FLIP_CLIENT_TARGET,
656 {{nullptr, hal::LayerRequest::CLEAR_CLIENT_TARGET}},
Peiyong Lindfc3f7c2020-05-07 20:15:50 -0700657 {hal::PixelFormat::RGBA_8888, hal::Dataspace::UNKNOWN},
Lloyd Pique66d68602019-02-13 14:23:31 -0800658 };
659
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700660 // Since two calls are made to anyLayersRequireClientComposition with different return
661 // values, use a Sequence to control the matching so the values are returned in a known
662 // order.
Lloyd Pique66d68602019-02-13 14:23:31 -0800663 Sequence s;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700664 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
665 .InSequence(s)
666 .WillOnce(Return(true));
667 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
Lloyd Pique66d68602019-02-13 14:23:31 -0800668 .InSequence(s)
669 .WillOnce(Return(false));
670
671 EXPECT_CALL(mHwComposer, getDeviceCompositionChanges(DEFAULT_DISPLAY_ID, true, _))
672 .WillOnce(DoAll(SetArgPointee<2>(changes), Return(NO_ERROR)));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700673 EXPECT_CALL(*mDisplay, applyChangedTypesToLayers(changes.changedTypes)).Times(1);
674 EXPECT_CALL(*mDisplay, applyDisplayRequests(changes.displayRequests)).Times(1);
675 EXPECT_CALL(*mDisplay, applyLayerRequestsToLayers(changes.layerRequests)).Times(1);
676 EXPECT_CALL(*mDisplay, allLayersRequireClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800677
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700678 mDisplay->chooseCompositionStrategy();
Lloyd Pique66d68602019-02-13 14:23:31 -0800679
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700680 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800681 EXPECT_FALSE(state.usesClientComposition);
682 EXPECT_TRUE(state.usesDeviceComposition);
683}
684
685/*
Lloyd Pique688abd42019-02-15 15:42:24 -0800686 * Display::getSkipColorTransform()
687 */
688
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700689using DisplayGetSkipColorTransformTest = DisplayWithLayersTestCommon;
690
Dominik Laskowski1162e472020-04-02 19:02:47 -0700691TEST_F(DisplayGetSkipColorTransformTest, checksCapabilityIfNonHwcDisplay) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700692 EXPECT_CALL(mHwComposer, hasCapability(hal::Capability::SKIP_CLIENT_COLOR_TRANSFORM))
Dominik Laskowski1162e472020-04-02 19:02:47 -0700693 .WillOnce(Return(true));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700694 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
695 auto nonHwcDisplay{impl::createDisplay(mCompositionEngine, args)};
Dominik Laskowski1162e472020-04-02 19:02:47 -0700696 EXPECT_TRUE(nonHwcDisplay->getSkipColorTransform());
Lloyd Pique688abd42019-02-15 15:42:24 -0800697}
698
Dominik Laskowski1162e472020-04-02 19:02:47 -0700699TEST_F(DisplayGetSkipColorTransformTest, checksDisplayCapability) {
Lloyd Pique688abd42019-02-15 15:42:24 -0800700 EXPECT_CALL(mHwComposer,
Dominik Laskowski1162e472020-04-02 19:02:47 -0700701 hasDisplayCapability(DEFAULT_DISPLAY_ID,
Peiyong Line9d809e2020-04-14 13:10:48 -0700702 hal::DisplayCapability::SKIP_CLIENT_COLOR_TRANSFORM))
Lloyd Pique688abd42019-02-15 15:42:24 -0800703 .WillOnce(Return(true));
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700704 EXPECT_TRUE(mDisplay->getSkipColorTransform());
Lloyd Pique688abd42019-02-15 15:42:24 -0800705}
706
707/*
Lloyd Pique66d68602019-02-13 14:23:31 -0800708 * Display::anyLayersRequireClientComposition()
709 */
710
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700711using DisplayAnyLayersRequireClientCompositionTest = DisplayWithLayersTestCommon;
712
713TEST_F(DisplayAnyLayersRequireClientCompositionTest, returnsFalse) {
Lloyd Piquede196652020-01-22 17:29:58 -0800714 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(false));
715 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(false));
716 EXPECT_CALL(*mLayer3.outputLayer, requiresClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800717
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700718 EXPECT_FALSE(mDisplay->anyLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800719}
720
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700721TEST_F(DisplayAnyLayersRequireClientCompositionTest, returnsTrue) {
Lloyd Piquede196652020-01-22 17:29:58 -0800722 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(false));
723 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(true));
Lloyd Pique66d68602019-02-13 14:23:31 -0800724
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700725 EXPECT_TRUE(mDisplay->anyLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800726}
727
728/*
729 * Display::allLayersRequireClientComposition()
730 */
731
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700732using DisplayAllLayersRequireClientCompositionTest = DisplayWithLayersTestCommon;
733
734TEST_F(DisplayAllLayersRequireClientCompositionTest, returnsTrue) {
Lloyd Piquede196652020-01-22 17:29:58 -0800735 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(true));
736 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(true));
737 EXPECT_CALL(*mLayer3.outputLayer, requiresClientComposition()).WillOnce(Return(true));
Lloyd Pique66d68602019-02-13 14:23:31 -0800738
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700739 EXPECT_TRUE(mDisplay->allLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800740}
741
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700742TEST_F(DisplayAllLayersRequireClientCompositionTest, returnsFalse) {
Lloyd Piquede196652020-01-22 17:29:58 -0800743 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(true));
744 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800745
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700746 EXPECT_FALSE(mDisplay->allLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800747}
748
749/*
750 * Display::applyChangedTypesToLayers()
751 */
752
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700753using DisplayApplyChangedTypesToLayersTest = DisplayWithLayersTestCommon;
754
755TEST_F(DisplayApplyChangedTypesToLayersTest, takesEarlyOutIfNoChangedLayers) {
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700756 mDisplay->applyChangedTypesToLayers(impl::Display::ChangedTypes());
Lloyd Pique66d68602019-02-13 14:23:31 -0800757}
758
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700759TEST_F(DisplayApplyChangedTypesToLayersTest, appliesChanges) {
Lloyd Piquede196652020-01-22 17:29:58 -0800760 EXPECT_CALL(*mLayer1.outputLayer,
Lloyd Pique66d68602019-02-13 14:23:31 -0800761 applyDeviceCompositionTypeChange(Hwc2::IComposerClient::Composition::CLIENT))
762 .Times(1);
Lloyd Piquede196652020-01-22 17:29:58 -0800763 EXPECT_CALL(*mLayer2.outputLayer,
Lloyd Pique66d68602019-02-13 14:23:31 -0800764 applyDeviceCompositionTypeChange(Hwc2::IComposerClient::Composition::DEVICE))
765 .Times(1);
766
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700767 mDisplay->applyChangedTypesToLayers(impl::Display::ChangedTypes{
Peiyong Line9d809e2020-04-14 13:10:48 -0700768 {&mLayer1.hwc2Layer, hal::Composition::CLIENT},
769 {&mLayer2.hwc2Layer, hal::Composition::DEVICE},
770 {&hwc2LayerUnknown, hal::Composition::SOLID_COLOR},
Lloyd Pique66d68602019-02-13 14:23:31 -0800771 });
772}
773
774/*
775 * Display::applyDisplayRequests()
776 */
777
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700778using DisplayApplyDisplayRequestsTest = DisplayWithLayersTestCommon;
779
780TEST_F(DisplayApplyDisplayRequestsTest, handlesNoRequests) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700781 mDisplay->applyDisplayRequests(static_cast<hal::DisplayRequest>(0));
Lloyd Pique66d68602019-02-13 14:23:31 -0800782
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700783 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800784 EXPECT_FALSE(state.flipClientTarget);
785}
786
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700787TEST_F(DisplayApplyDisplayRequestsTest, handlesFlipClientTarget) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700788 mDisplay->applyDisplayRequests(hal::DisplayRequest::FLIP_CLIENT_TARGET);
Lloyd Pique66d68602019-02-13 14:23:31 -0800789
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700790 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800791 EXPECT_TRUE(state.flipClientTarget);
792}
793
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700794TEST_F(DisplayApplyDisplayRequestsTest, handlesWriteClientTargetToOutput) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700795 mDisplay->applyDisplayRequests(hal::DisplayRequest::WRITE_CLIENT_TARGET_TO_OUTPUT);
Lloyd Pique66d68602019-02-13 14:23:31 -0800796
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700797 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800798 EXPECT_FALSE(state.flipClientTarget);
799}
800
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700801TEST_F(DisplayApplyDisplayRequestsTest, handlesAllRequestFlagsSet) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700802 mDisplay->applyDisplayRequests(static_cast<hal::DisplayRequest>(~0));
Lloyd Pique66d68602019-02-13 14:23:31 -0800803
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700804 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800805 EXPECT_TRUE(state.flipClientTarget);
806}
807
808/*
809 * Display::applyLayerRequestsToLayers()
810 */
811
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700812using DisplayApplyLayerRequestsToLayersTest = DisplayWithLayersTestCommon;
813
814TEST_F(DisplayApplyLayerRequestsToLayersTest, preparesAllLayers) {
Lloyd Piquede196652020-01-22 17:29:58 -0800815 EXPECT_CALL(*mLayer1.outputLayer, prepareForDeviceLayerRequests()).Times(1);
816 EXPECT_CALL(*mLayer2.outputLayer, prepareForDeviceLayerRequests()).Times(1);
817 EXPECT_CALL(*mLayer3.outputLayer, prepareForDeviceLayerRequests()).Times(1);
Lloyd Pique66d68602019-02-13 14:23:31 -0800818
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700819 mDisplay->applyLayerRequestsToLayers(impl::Display::LayerRequests());
Lloyd Pique66d68602019-02-13 14:23:31 -0800820}
821
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700822TEST_F(DisplayApplyLayerRequestsToLayersTest, appliesDeviceLayerRequests) {
Lloyd Piquede196652020-01-22 17:29:58 -0800823 EXPECT_CALL(*mLayer1.outputLayer, prepareForDeviceLayerRequests()).Times(1);
824 EXPECT_CALL(*mLayer2.outputLayer, prepareForDeviceLayerRequests()).Times(1);
825 EXPECT_CALL(*mLayer3.outputLayer, prepareForDeviceLayerRequests()).Times(1);
Lloyd Pique66d68602019-02-13 14:23:31 -0800826
Lloyd Piquede196652020-01-22 17:29:58 -0800827 EXPECT_CALL(*mLayer1.outputLayer,
Lloyd Pique66d68602019-02-13 14:23:31 -0800828 applyDeviceLayerRequest(Hwc2::IComposerClient::LayerRequest::CLEAR_CLIENT_TARGET))
829 .Times(1);
830
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700831 mDisplay->applyLayerRequestsToLayers(impl::Display::LayerRequests{
Peiyong Line9d809e2020-04-14 13:10:48 -0700832 {&mLayer1.hwc2Layer, hal::LayerRequest::CLEAR_CLIENT_TARGET},
833 {&hwc2LayerUnknown, hal::LayerRequest::CLEAR_CLIENT_TARGET},
Lloyd Pique66d68602019-02-13 14:23:31 -0800834 });
835}
836
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800837/*
838 * Display::presentAndGetFrameFences()
839 */
840
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700841using DisplayPresentAndGetFrameFencesTest = DisplayWithLayersTestCommon;
842
843TEST_F(DisplayPresentAndGetFrameFencesTest, returnsNoFencesOnNonHwcDisplay) {
844 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
845 auto nonHwcDisplay{impl::createDisplay(mCompositionEngine, args)};
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800846
847 auto result = nonHwcDisplay->presentAndGetFrameFences();
848
849 ASSERT_TRUE(result.presentFence.get());
850 EXPECT_FALSE(result.presentFence->isValid());
851 EXPECT_EQ(0u, result.layerFences.size());
852}
853
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700854TEST_F(DisplayPresentAndGetFrameFencesTest, returnsPresentAndLayerFences) {
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800855 sp<Fence> presentFence = new Fence();
856 sp<Fence> layer1Fence = new Fence();
857 sp<Fence> layer2Fence = new Fence();
858
859 EXPECT_CALL(mHwComposer, presentAndGetReleaseFences(DEFAULT_DISPLAY_ID)).Times(1);
860 EXPECT_CALL(mHwComposer, getPresentFence(DEFAULT_DISPLAY_ID)).WillOnce(Return(presentFence));
Lloyd Piquede196652020-01-22 17:29:58 -0800861 EXPECT_CALL(mHwComposer, getLayerReleaseFence(DEFAULT_DISPLAY_ID, &mLayer1.hwc2Layer))
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800862 .WillOnce(Return(layer1Fence));
Lloyd Piquede196652020-01-22 17:29:58 -0800863 EXPECT_CALL(mHwComposer, getLayerReleaseFence(DEFAULT_DISPLAY_ID, &mLayer2.hwc2Layer))
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800864 .WillOnce(Return(layer2Fence));
865 EXPECT_CALL(mHwComposer, clearReleaseFences(DEFAULT_DISPLAY_ID)).Times(1);
866
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700867 auto result = mDisplay->presentAndGetFrameFences();
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800868
869 EXPECT_EQ(presentFence, result.presentFence);
870
871 EXPECT_EQ(2u, result.layerFences.size());
Lloyd Piquede196652020-01-22 17:29:58 -0800872 ASSERT_EQ(1, result.layerFences.count(&mLayer1.hwc2Layer));
873 EXPECT_EQ(layer1Fence, result.layerFences[&mLayer1.hwc2Layer]);
874 ASSERT_EQ(1, result.layerFences.count(&mLayer2.hwc2Layer));
875 EXPECT_EQ(layer2Fence, result.layerFences[&mLayer2.hwc2Layer]);
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800876}
877
Lloyd Pique688abd42019-02-15 15:42:24 -0800878/*
879 * Display::setExpensiveRenderingExpected()
880 */
881
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700882using DisplaySetExpensiveRenderingExpectedTest = DisplayWithLayersTestCommon;
883
884TEST_F(DisplaySetExpensiveRenderingExpectedTest, forwardsToPowerAdvisor) {
Lloyd Pique688abd42019-02-15 15:42:24 -0800885 EXPECT_CALL(mPowerAdvisor, setExpensiveRenderingExpected(DEFAULT_DISPLAY_ID, true)).Times(1);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700886 mDisplay->setExpensiveRenderingExpected(true);
Lloyd Pique688abd42019-02-15 15:42:24 -0800887
888 EXPECT_CALL(mPowerAdvisor, setExpensiveRenderingExpected(DEFAULT_DISPLAY_ID, false)).Times(1);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700889 mDisplay->setExpensiveRenderingExpected(false);
Lloyd Pique688abd42019-02-15 15:42:24 -0800890}
891
Lloyd Piqued3d69882019-02-28 16:03:46 -0800892/*
893 * Display::finishFrame()
894 */
895
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700896using DisplayFinishFrameTest = DisplayWithLayersTestCommon;
897
898TEST_F(DisplayFinishFrameTest, doesNotSkipCompositionIfNotDirtyOnHwcDisplay) {
Lloyd Piqued3d69882019-02-28 16:03:46 -0800899 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700900 mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
Lloyd Piqued3d69882019-02-28 16:03:46 -0800901
902 // We expect no calls to queueBuffer if composition was skipped.
903 EXPECT_CALL(*renderSurface, queueBuffer(_)).Times(1);
904
Lloyd Piquea76ce462020-01-14 13:06:37 -0800905 // Expect a call to signal no expensive rendering since there is no client composition.
906 EXPECT_CALL(mPowerAdvisor, setExpensiveRenderingExpected(DEFAULT_DISPLAY_ID, false));
907
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700908 mDisplay->editState().isEnabled = true;
909 mDisplay->editState().usesClientComposition = false;
910 mDisplay->editState().viewport = Rect(0, 0, 1, 1);
911 mDisplay->editState().dirtyRegion = Region::INVALID_REGION;
Lloyd Piqued3d69882019-02-28 16:03:46 -0800912
913 CompositionRefreshArgs refreshArgs;
914 refreshArgs.repaintEverything = false;
915
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700916 mDisplay->finishFrame(refreshArgs);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800917}
918
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700919TEST_F(DisplayFinishFrameTest, skipsCompositionIfNotDirty) {
920 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
921 std::shared_ptr<impl::Display> nonHwcDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800922
923 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
924 nonHwcDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
925
926 // We expect no calls to queueBuffer if composition was skipped.
927 EXPECT_CALL(*renderSurface, queueBuffer(_)).Times(0);
928
929 nonHwcDisplay->editState().isEnabled = true;
930 nonHwcDisplay->editState().usesClientComposition = false;
931 nonHwcDisplay->editState().viewport = Rect(0, 0, 1, 1);
932 nonHwcDisplay->editState().dirtyRegion = Region::INVALID_REGION;
933
934 CompositionRefreshArgs refreshArgs;
935 refreshArgs.repaintEverything = false;
936
937 nonHwcDisplay->finishFrame(refreshArgs);
938}
939
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700940TEST_F(DisplayFinishFrameTest, performsCompositionIfDirty) {
941 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
942 std::shared_ptr<impl::Display> nonHwcDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800943
944 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
945 nonHwcDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
946
947 // We expect a single call to queueBuffer when composition is not skipped.
948 EXPECT_CALL(*renderSurface, queueBuffer(_)).Times(1);
949
950 nonHwcDisplay->editState().isEnabled = true;
951 nonHwcDisplay->editState().usesClientComposition = false;
952 nonHwcDisplay->editState().viewport = Rect(0, 0, 1, 1);
953 nonHwcDisplay->editState().dirtyRegion = Region(Rect(0, 0, 1, 1));
954
955 CompositionRefreshArgs refreshArgs;
956 refreshArgs.repaintEverything = false;
957
958 nonHwcDisplay->finishFrame(refreshArgs);
959}
960
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700961TEST_F(DisplayFinishFrameTest, performsCompositionIfRepaintEverything) {
962 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
963 std::shared_ptr<impl::Display> nonHwcDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800964
965 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
966 nonHwcDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
967
968 // We expect a single call to queueBuffer when composition is not skipped.
969 EXPECT_CALL(*renderSurface, queueBuffer(_)).Times(1);
970
971 nonHwcDisplay->editState().isEnabled = true;
972 nonHwcDisplay->editState().usesClientComposition = false;
973 nonHwcDisplay->editState().viewport = Rect(0, 0, 1, 1);
974 nonHwcDisplay->editState().dirtyRegion = Region::INVALID_REGION;
975
976 CompositionRefreshArgs refreshArgs;
977 refreshArgs.repaintEverything = true;
978
979 nonHwcDisplay->finishFrame(refreshArgs);
980}
981
Lloyd Piquec6607552019-12-02 17:57:39 -0800982/*
983 * Display functional tests
984 */
985
986struct DisplayFunctionalTest : public testing::Test {
987 class Display : public impl::Display {
988 public:
Lloyd Piquec6607552019-12-02 17:57:39 -0800989 using impl::Display::injectOutputLayerForTest;
990 virtual void injectOutputLayerForTest(std::unique_ptr<compositionengine::OutputLayer>) = 0;
991 };
992
Lloyd Piquec6607552019-12-02 17:57:39 -0800993 DisplayFunctionalTest() {
994 EXPECT_CALL(mCompositionEngine, getHwComposer()).WillRepeatedly(ReturnRef(mHwComposer));
995
996 mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(mRenderSurface));
997 }
998
999 NiceMock<android::mock::HWComposer> mHwComposer;
1000 NiceMock<Hwc2::mock::PowerAdvisor> mPowerAdvisor;
1001 NiceMock<mock::CompositionEngine> mCompositionEngine;
1002 sp<mock::NativeWindow> mNativeWindow = new NiceMock<mock::NativeWindow>();
1003 sp<mock::DisplaySurface> mDisplaySurface = new NiceMock<mock::DisplaySurface>();
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -07001004 std::shared_ptr<Display> mDisplay = impl::createDisplayTemplated<
1005 Display>(mCompositionEngine,
1006 DisplayCreationArgsBuilder()
1007 .setPhysical({DEFAULT_DISPLAY_ID, DisplayConnectionType::Internal})
1008 .setPixels({DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT})
1009 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
1010 .setIsSecure(true)
1011 .setLayerStackId(DEFAULT_LAYER_STACK)
1012 .setPowerAdvisor(&mPowerAdvisor)
1013 .build()
1014
1015 );
Lloyd Piquec6607552019-12-02 17:57:39 -08001016 impl::RenderSurface* mRenderSurface =
1017 new impl::RenderSurface{mCompositionEngine, *mDisplay,
1018 RenderSurfaceCreationArgs{DEFAULT_DISPLAY_WIDTH,
1019 DEFAULT_DISPLAY_HEIGHT, mNativeWindow,
1020 mDisplaySurface}};
1021};
1022
1023TEST_F(DisplayFunctionalTest, postFramebufferCriticalCallsAreOrdered) {
1024 InSequence seq;
1025
1026 mDisplay->editState().isEnabled = true;
1027
1028 EXPECT_CALL(mHwComposer, presentAndGetReleaseFences(_));
1029 EXPECT_CALL(*mDisplaySurface, onFrameCommitted());
1030
1031 mDisplay->postFramebuffer();
1032}
1033
Lloyd Pique45a165a2018-10-19 11:54:47 -07001034} // namespace
1035} // namespace android::compositionengine