blob: 6b9c883f381e17ffea70b473ca7835e5dcc91009 [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 Piqueaad4ebf2019-10-03 17:58:30 -070033#include <ui/DisplayInfo.h>
34#include <ui/Rect.h>
Lloyd Pique45a165a2018-10-19 11:54:47 -070035
Lloyd Pique66d68602019-02-13 14:23:31 -080036#include "MockHWC2.h"
Lloyd Pique45a165a2018-10-19 11:54:47 -070037#include "MockHWComposer.h"
Lloyd Pique688abd42019-02-15 15:42:24 -080038#include "MockPowerAdvisor.h"
Lloyd Pique45a165a2018-10-19 11:54:47 -070039
40namespace android::compositionengine {
41namespace {
42
Peiyong Line9d809e2020-04-14 13:10:48 -070043namespace hal = android::hardware::graphics::composer::hal;
44
Lloyd Piquef5275482019-01-29 18:42:42 -080045using testing::_;
Lloyd Pique66d68602019-02-13 14:23:31 -080046using testing::DoAll;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070047using testing::Eq;
Lloyd Piquec6607552019-12-02 17:57:39 -080048using testing::InSequence;
49using testing::NiceMock;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070050using testing::Pointee;
51using testing::Ref;
Lloyd Pique31cb2942018-10-19 17:23:03 -070052using testing::Return;
Lloyd Pique45a165a2018-10-19 11:54:47 -070053using testing::ReturnRef;
Lloyd Pique66d68602019-02-13 14:23:31 -080054using testing::Sequence;
55using testing::SetArgPointee;
Lloyd Pique45a165a2018-10-19 11:54:47 -070056using testing::StrictMock;
57
58constexpr DisplayId DEFAULT_DISPLAY_ID = DisplayId{42};
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070059constexpr DisplayId VIRTUAL_DISPLAY_ID = DisplayId{43};
Lloyd Piquec6607552019-12-02 17:57:39 -080060constexpr int32_t DEFAULT_DISPLAY_WIDTH = 1920;
61constexpr int32_t DEFAULT_DISPLAY_HEIGHT = 1080;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070062constexpr int32_t DEFAULT_LAYER_STACK = 123;
Lloyd Pique45a165a2018-10-19 11:54:47 -070063
Lloyd Piquede196652020-01-22 17:29:58 -080064struct Layer {
65 Layer() {
66 EXPECT_CALL(*outputLayer, getLayerFE()).WillRepeatedly(ReturnRef(*layerFE));
67 EXPECT_CALL(*outputLayer, getHwcLayer()).WillRepeatedly(Return(&hwc2Layer));
68 }
69
70 sp<mock::LayerFE> layerFE = new StrictMock<mock::LayerFE>();
71 StrictMock<mock::OutputLayer>* outputLayer = new StrictMock<mock::OutputLayer>();
72 StrictMock<HWC2::mock::Layer> hwc2Layer;
73};
74
75struct LayerNoHWC2Layer {
76 LayerNoHWC2Layer() {
77 EXPECT_CALL(*outputLayer, getLayerFE()).WillRepeatedly(ReturnRef(*layerFE));
78 EXPECT_CALL(*outputLayer, getHwcLayer()).WillRepeatedly(Return(nullptr));
79 }
80
81 sp<mock::LayerFE> layerFE = new StrictMock<mock::LayerFE>();
82 StrictMock<mock::OutputLayer>* outputLayer = new StrictMock<mock::OutputLayer>();
83};
84
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070085struct DisplayTestCommon : public testing::Test {
86 // Uses the full implementation of a display
87 class FullImplDisplay : public impl::Display {
Lloyd Pique01c77c12019-04-17 12:48:32 -070088 public:
Lloyd Pique01c77c12019-04-17 12:48:32 -070089 using impl::Display::injectOutputLayerForTest;
90 virtual void injectOutputLayerForTest(std::unique_ptr<compositionengine::OutputLayer>) = 0;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070091
92 using impl::Display::maybeAllocateDisplayIdForVirtualDisplay;
Lloyd Pique01c77c12019-04-17 12:48:32 -070093 };
94
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070095 // Uses a special implementation with key internal member functions set up
96 // as mock implementations, to allow for easier testing.
97 struct PartialMockDisplay : public impl::Display {
98 PartialMockDisplay(const compositionengine::CompositionEngine& compositionEngine)
99 : mCompositionEngine(compositionEngine) {}
100
101 // compositionengine::Output overrides
102 const OutputCompositionState& getState() const override { return mState; }
103 OutputCompositionState& editState() override { return mState; }
104
105 // compositionengine::impl::Output overrides
106 const CompositionEngine& getCompositionEngine() const override {
107 return mCompositionEngine;
108 };
109
110 // Mock implementation overrides
111 MOCK_CONST_METHOD0(getOutputLayerCount, size_t());
112 MOCK_CONST_METHOD1(getOutputLayerOrderedByZByIndex,
113 compositionengine::OutputLayer*(size_t));
114 MOCK_METHOD2(ensureOutputLayer,
115 compositionengine::OutputLayer*(std::optional<size_t>, const sp<LayerFE>&));
116 MOCK_METHOD0(finalizePendingOutputLayers, void());
117 MOCK_METHOD0(clearOutputLayers, void());
118 MOCK_CONST_METHOD1(dumpState, void(std::string&));
119 MOCK_METHOD1(injectOutputLayerForTest, compositionengine::OutputLayer*(const sp<LayerFE>&));
120 MOCK_METHOD1(injectOutputLayerForTest, void(std::unique_ptr<OutputLayer>));
121 MOCK_CONST_METHOD0(anyLayersRequireClientComposition, bool());
122 MOCK_CONST_METHOD0(allLayersRequireClientComposition, bool());
123 MOCK_METHOD1(applyChangedTypesToLayers, void(const impl::Display::ChangedTypes&));
124 MOCK_METHOD1(applyDisplayRequests, void(const impl::Display::DisplayRequests&));
125 MOCK_METHOD1(applyLayerRequestsToLayers, void(const impl::Display::LayerRequests&));
126
127 const compositionengine::CompositionEngine& mCompositionEngine;
128 impl::OutputCompositionState mState;
129 };
130
131 static std::string getDisplayNameFromCurrentTest() {
132 const ::testing::TestInfo* const test_info =
133 ::testing::UnitTest::GetInstance()->current_test_info();
134 return std::string("display for ") + test_info->test_case_name() + "." + test_info->name();
135 }
136
137 template <typename Display>
Lloyd Pique01c77c12019-04-17 12:48:32 -0700138 static std::shared_ptr<Display> createDisplay(
139 const compositionengine::CompositionEngine& compositionEngine,
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700140 compositionengine::DisplayCreationArgs args) {
141 args.name = getDisplayNameFromCurrentTest();
Lloyd Pique01c77c12019-04-17 12:48:32 -0700142 return impl::createDisplayTemplated<Display>(compositionEngine, args);
143 }
144
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700145 template <typename Display>
146 static std::shared_ptr<StrictMock<Display>> createPartialMockDisplay(
147 const compositionengine::CompositionEngine& compositionEngine,
148 compositionengine::DisplayCreationArgs args) {
149 args.name = getDisplayNameFromCurrentTest();
150 auto display = std::make_shared<StrictMock<Display>>(compositionEngine);
Lloyd Pique66d68602019-02-13 14:23:31 -0800151
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700152 display->setConfiguration(args);
153
154 return display;
155 }
156
157 DisplayTestCommon() {
158 EXPECT_CALL(mCompositionEngine, getHwComposer()).WillRepeatedly(ReturnRef(mHwComposer));
159 }
160
161 DisplayCreationArgs getDisplayCreationArgsForPhysicalHWCDisplay() {
162 return DisplayCreationArgsBuilder()
163 .setPhysical({DEFAULT_DISPLAY_ID, DisplayConnectionType::Internal})
164 .setPixels({DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT})
165 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
166 .setIsSecure(true)
167 .setLayerStackId(DEFAULT_LAYER_STACK)
168 .setPowerAdvisor(&mPowerAdvisor)
169 .build();
170 }
171
172 DisplayCreationArgs getDisplayCreationArgsForNonHWCVirtualDisplay() {
173 return DisplayCreationArgsBuilder()
174 .setUseHwcVirtualDisplays(false)
175 .setPixels({DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT})
176 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
177 .setIsSecure(false)
178 .setLayerStackId(DEFAULT_LAYER_STACK)
179 .setPowerAdvisor(&mPowerAdvisor)
180 .build();
181 }
182
183 StrictMock<android::mock::HWComposer> mHwComposer;
184 StrictMock<Hwc2::mock::PowerAdvisor> mPowerAdvisor;
185 StrictMock<mock::CompositionEngine> mCompositionEngine;
186 sp<mock::NativeWindow> mNativeWindow = new StrictMock<mock::NativeWindow>();
187};
188
189struct PartialMockDisplayTestCommon : public DisplayTestCommon {
190 using Display = DisplayTestCommon::PartialMockDisplay;
191 std::shared_ptr<Display> mDisplay =
192 createPartialMockDisplay<Display>(mCompositionEngine,
193 getDisplayCreationArgsForPhysicalHWCDisplay());
194};
195
196struct FullDisplayImplTestCommon : public DisplayTestCommon {
197 using Display = DisplayTestCommon::FullImplDisplay;
198 std::shared_ptr<Display> mDisplay =
199 createDisplay<Display>(mCompositionEngine,
200 getDisplayCreationArgsForPhysicalHWCDisplay());
201};
202
203struct DisplayWithLayersTestCommon : public FullDisplayImplTestCommon {
204 DisplayWithLayersTestCommon() {
Lloyd Pique01c77c12019-04-17 12:48:32 -0700205 mDisplay->injectOutputLayerForTest(
Lloyd Piquede196652020-01-22 17:29:58 -0800206 std::unique_ptr<compositionengine::OutputLayer>(mLayer1.outputLayer));
Lloyd Pique01c77c12019-04-17 12:48:32 -0700207 mDisplay->injectOutputLayerForTest(
Lloyd Piquede196652020-01-22 17:29:58 -0800208 std::unique_ptr<compositionengine::OutputLayer>(mLayer2.outputLayer));
Lloyd Pique01c77c12019-04-17 12:48:32 -0700209 mDisplay->injectOutputLayerForTest(
Lloyd Piquede196652020-01-22 17:29:58 -0800210 std::unique_ptr<compositionengine::OutputLayer>(mLayer3.outputLayer));
Lloyd Pique66d68602019-02-13 14:23:31 -0800211 }
Lloyd Pique45a165a2018-10-19 11:54:47 -0700212
Lloyd Piquede196652020-01-22 17:29:58 -0800213 Layer mLayer1;
214 Layer mLayer2;
215 LayerNoHWC2Layer mLayer3;
216 StrictMock<HWC2::mock::Layer> hwc2LayerUnknown;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700217 std::shared_ptr<Display> mDisplay =
218 createDisplay<Display>(mCompositionEngine,
219 getDisplayCreationArgsForPhysicalHWCDisplay());
Lloyd Pique45a165a2018-10-19 11:54:47 -0700220};
221
Lloyd Pique66d68602019-02-13 14:23:31 -0800222/*
Lloyd Pique45a165a2018-10-19 11:54:47 -0700223 * Basic construction
224 */
225
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700226struct DisplayCreationTest : public DisplayTestCommon {
227 using Display = DisplayTestCommon::FullImplDisplay;
228};
Lloyd Pique45a165a2018-10-19 11:54:47 -0700229
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700230TEST_F(DisplayCreationTest, createPhysicalInternalDisplay) {
231 auto display =
232 impl::createDisplay(mCompositionEngine, getDisplayCreationArgsForPhysicalHWCDisplay());
233 EXPECT_TRUE(display->isSecure());
234 EXPECT_FALSE(display->isVirtual());
235 EXPECT_EQ(DEFAULT_DISPLAY_ID, display->getId());
236}
Lloyd Pique45a165a2018-10-19 11:54:47 -0700237
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700238TEST_F(DisplayCreationTest, createNonHwcVirtualDisplay) {
239 auto display = impl::createDisplay(mCompositionEngine,
240 getDisplayCreationArgsForNonHWCVirtualDisplay());
241 EXPECT_FALSE(display->isSecure());
242 EXPECT_TRUE(display->isVirtual());
243 EXPECT_EQ(std::nullopt, display->getId());
244}
245
246/*
247 * Display::setConfiguration()
248 */
249
250using DisplaySetConfigurationTest = PartialMockDisplayTestCommon;
251
252TEST_F(DisplaySetConfigurationTest, configuresInternalSecurePhysicalDisplay) {
253 mDisplay->setConfiguration(
254 DisplayCreationArgsBuilder()
255 .setUseHwcVirtualDisplays(true)
256 .setPhysical({DEFAULT_DISPLAY_ID, DisplayConnectionType::Internal})
257 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
258 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
259 .setIsSecure(true)
260 .setLayerStackId(DEFAULT_LAYER_STACK)
261 .setPowerAdvisor(&mPowerAdvisor)
262 .setName(getDisplayNameFromCurrentTest())
263 .build());
264
265 EXPECT_EQ(DEFAULT_DISPLAY_ID, mDisplay->getId());
266 EXPECT_TRUE(mDisplay->isSecure());
267 EXPECT_FALSE(mDisplay->isVirtual());
268 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
269 EXPECT_TRUE(mDisplay->getState().layerStackInternal);
270 EXPECT_FALSE(mDisplay->isValid());
271}
272
273TEST_F(DisplaySetConfigurationTest, configuresExternalInsecurePhysicalDisplay) {
274 mDisplay->setConfiguration(
275 DisplayCreationArgsBuilder()
276 .setUseHwcVirtualDisplays(true)
277 .setPhysical({DEFAULT_DISPLAY_ID, DisplayConnectionType::External})
278 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
279 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
280 .setIsSecure(false)
281 .setLayerStackId(DEFAULT_LAYER_STACK)
282 .setPowerAdvisor(&mPowerAdvisor)
283 .setName(getDisplayNameFromCurrentTest())
284 .build());
285
286 EXPECT_EQ(DEFAULT_DISPLAY_ID, mDisplay->getId());
287 EXPECT_FALSE(mDisplay->isSecure());
288 EXPECT_FALSE(mDisplay->isVirtual());
289 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
290 EXPECT_FALSE(mDisplay->getState().layerStackInternal);
291 EXPECT_FALSE(mDisplay->isValid());
292}
293
294TEST_F(DisplaySetConfigurationTest, configuresHwcBackedVirtualDisplay) {
295 EXPECT_CALL(mHwComposer,
296 allocateVirtualDisplay(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH,
297 Pointee(Eq(static_cast<ui::PixelFormat>(
298 PIXEL_FORMAT_RGBA_8888)))))
299 .WillOnce(Return(VIRTUAL_DISPLAY_ID));
300
301 mDisplay->setConfiguration(
302 DisplayCreationArgsBuilder()
303 .setUseHwcVirtualDisplays(true)
304 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
305 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
306 .setIsSecure(false)
307 .setLayerStackId(DEFAULT_LAYER_STACK)
308 .setPowerAdvisor(&mPowerAdvisor)
309 .setName(getDisplayNameFromCurrentTest())
310 .build());
311
312 EXPECT_EQ(VIRTUAL_DISPLAY_ID, mDisplay->getId());
313 EXPECT_FALSE(mDisplay->isSecure());
314 EXPECT_TRUE(mDisplay->isVirtual());
315 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
316 EXPECT_FALSE(mDisplay->getState().layerStackInternal);
317 EXPECT_FALSE(mDisplay->isValid());
318}
319
320TEST_F(DisplaySetConfigurationTest, configuresNonHwcBackedVirtualDisplayIfHwcAllocationFails) {
321 EXPECT_CALL(mHwComposer,
322 allocateVirtualDisplay(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH,
323 Pointee(Eq(static_cast<ui::PixelFormat>(
324 PIXEL_FORMAT_RGBA_8888)))))
325 .WillOnce(Return(std::nullopt));
326
327 mDisplay->setConfiguration(
328 DisplayCreationArgsBuilder()
329 .setUseHwcVirtualDisplays(true)
330 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
331 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
332 .setIsSecure(false)
333 .setLayerStackId(DEFAULT_LAYER_STACK)
334 .setPowerAdvisor(&mPowerAdvisor)
335 .setName(getDisplayNameFromCurrentTest())
336 .build());
337
338 EXPECT_EQ(std::nullopt, mDisplay->getId());
339 EXPECT_FALSE(mDisplay->isSecure());
340 EXPECT_TRUE(mDisplay->isVirtual());
341 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
342 EXPECT_FALSE(mDisplay->getState().layerStackInternal);
343 EXPECT_FALSE(mDisplay->isValid());
344}
345
346TEST_F(DisplaySetConfigurationTest, configuresNonHwcBackedVirtualDisplayIfShouldNotUseHwc) {
347 mDisplay->setConfiguration(
348 DisplayCreationArgsBuilder()
349 .setUseHwcVirtualDisplays(false)
350 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
351 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
352 .setIsSecure(false)
353 .setLayerStackId(DEFAULT_LAYER_STACK)
354 .setPowerAdvisor(&mPowerAdvisor)
355 .setName(getDisplayNameFromCurrentTest())
356 .build());
357
358 EXPECT_EQ(std::nullopt, mDisplay->getId());
359 EXPECT_FALSE(mDisplay->isSecure());
360 EXPECT_TRUE(mDisplay->isVirtual());
361 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
362 EXPECT_FALSE(mDisplay->getState().layerStackInternal);
363 EXPECT_FALSE(mDisplay->isValid());
Lloyd Pique45a165a2018-10-19 11:54:47 -0700364}
365
Lloyd Pique66d68602019-02-13 14:23:31 -0800366/*
Lloyd Pique45a165a2018-10-19 11:54:47 -0700367 * Display::disconnect()
368 */
369
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700370using DisplayDisconnectTest = PartialMockDisplayTestCommon;
371
372TEST_F(DisplayDisconnectTest, disconnectsDisplay) {
Lloyd Pique45a165a2018-10-19 11:54:47 -0700373 // The first call to disconnect will disconnect the display with the HWC and
374 // set mHwcId to -1.
375 EXPECT_CALL(mHwComposer, disconnectDisplay(DEFAULT_DISPLAY_ID)).Times(1);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700376 mDisplay->disconnect();
377 EXPECT_FALSE(mDisplay->getId());
Lloyd Pique45a165a2018-10-19 11:54:47 -0700378
379 // Subsequent calls will do nothing,
380 EXPECT_CALL(mHwComposer, disconnectDisplay(DEFAULT_DISPLAY_ID)).Times(0);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700381 mDisplay->disconnect();
382 EXPECT_FALSE(mDisplay->getId());
Lloyd Pique45a165a2018-10-19 11:54:47 -0700383}
384
Lloyd Pique66d68602019-02-13 14:23:31 -0800385/*
Lloyd Pique32cbe282018-10-19 13:09:22 -0700386 * Display::setColorTransform()
387 */
388
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700389using DisplaySetColorTransformTest = PartialMockDisplayTestCommon;
390
391TEST_F(DisplaySetColorTransformTest, setsTransform) {
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800392 // No change does nothing
393 CompositionRefreshArgs refreshArgs;
394 refreshArgs.colorTransformMatrix = std::nullopt;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700395 mDisplay->setColorTransform(refreshArgs);
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800396
Lloyd Pique32cbe282018-10-19 13:09:22 -0700397 // Identity matrix sets an identity state value
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800398 const mat4 kIdentity;
Lloyd Pique32cbe282018-10-19 13:09:22 -0700399
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800400 EXPECT_CALL(mHwComposer, setColorTransform(DEFAULT_DISPLAY_ID, kIdentity)).Times(1);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700401
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800402 refreshArgs.colorTransformMatrix = kIdentity;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700403 mDisplay->setColorTransform(refreshArgs);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700404
405 // Non-identity matrix sets a non-identity state value
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800406 const mat4 kNonIdentity = mat4() * 2;
Lloyd Pique32cbe282018-10-19 13:09:22 -0700407
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800408 EXPECT_CALL(mHwComposer, setColorTransform(DEFAULT_DISPLAY_ID, kNonIdentity)).Times(1);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700409
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800410 refreshArgs.colorTransformMatrix = kNonIdentity;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700411 mDisplay->setColorTransform(refreshArgs);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700412}
413
Lloyd Pique66d68602019-02-13 14:23:31 -0800414/*
Lloyd Pique32cbe282018-10-19 13:09:22 -0700415 * Display::setColorMode()
416 */
417
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700418using DisplaySetColorModeTest = PartialMockDisplayTestCommon;
419
420TEST_F(DisplaySetColorModeTest, setsModeUnlessNoChange) {
Lloyd Pique6a3b4462019-03-07 20:58:12 -0800421 using ColorProfile = Output::ColorProfile;
422
Lloyd Pique31cb2942018-10-19 17:23:03 -0700423 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700424 mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
Lloyd Piquef5275482019-01-29 18:42:42 -0800425 mock::DisplayColorProfile* colorProfile = new StrictMock<mock::DisplayColorProfile>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700426 mDisplay->setDisplayColorProfileForTest(std::unique_ptr<DisplayColorProfile>(colorProfile));
Lloyd Pique31cb2942018-10-19 17:23:03 -0700427
Lloyd Piquef5275482019-01-29 18:42:42 -0800428 EXPECT_CALL(*colorProfile, getTargetDataspace(_, _, _))
429 .WillRepeatedly(Return(ui::Dataspace::UNKNOWN));
Lloyd Pique32cbe282018-10-19 13:09:22 -0700430
431 // These values are expected to be the initial state.
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700432 ASSERT_EQ(ui::ColorMode::NATIVE, mDisplay->getState().colorMode);
433 ASSERT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().dataspace);
434 ASSERT_EQ(ui::RenderIntent::COLORIMETRIC, mDisplay->getState().renderIntent);
435 ASSERT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().targetDataspace);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700436
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700437 // Otherwise if the values are unchanged, nothing happens
438 mDisplay->setColorProfile(ColorProfile{ui::ColorMode::NATIVE, ui::Dataspace::UNKNOWN,
439 ui::RenderIntent::COLORIMETRIC, ui::Dataspace::UNKNOWN});
Lloyd Pique32cbe282018-10-19 13:09:22 -0700440
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700441 EXPECT_EQ(ui::ColorMode::NATIVE, mDisplay->getState().colorMode);
442 EXPECT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().dataspace);
443 EXPECT_EQ(ui::RenderIntent::COLORIMETRIC, mDisplay->getState().renderIntent);
444 EXPECT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().targetDataspace);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700445
446 // Otherwise if the values are different, updates happen
Lloyd Piqueef958122019-02-05 18:00:12 -0800447 EXPECT_CALL(*renderSurface, setBufferDataspace(ui::Dataspace::DISPLAY_P3)).Times(1);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700448 EXPECT_CALL(mHwComposer,
Lloyd Piqueef958122019-02-05 18:00:12 -0800449 setActiveColorMode(DEFAULT_DISPLAY_ID, ui::ColorMode::DISPLAY_P3,
Lloyd Pique32cbe282018-10-19 13:09:22 -0700450 ui::RenderIntent::TONE_MAP_COLORIMETRIC))
451 .Times(1);
452
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700453 mDisplay->setColorProfile(ColorProfile{ui::ColorMode::DISPLAY_P3, ui::Dataspace::DISPLAY_P3,
454 ui::RenderIntent::TONE_MAP_COLORIMETRIC,
455 ui::Dataspace::UNKNOWN});
Lloyd Pique32cbe282018-10-19 13:09:22 -0700456
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700457 EXPECT_EQ(ui::ColorMode::DISPLAY_P3, mDisplay->getState().colorMode);
458 EXPECT_EQ(ui::Dataspace::DISPLAY_P3, mDisplay->getState().dataspace);
459 EXPECT_EQ(ui::RenderIntent::TONE_MAP_COLORIMETRIC, mDisplay->getState().renderIntent);
460 EXPECT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().targetDataspace);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700461}
462
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700463TEST_F(DisplaySetColorModeTest, doesNothingForVirtualDisplay) {
Lloyd Pique6a3b4462019-03-07 20:58:12 -0800464 using ColorProfile = Output::ColorProfile;
465
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700466 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
467 std::shared_ptr<impl::Display> virtualDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700468
Lloyd Piquef5275482019-01-29 18:42:42 -0800469 mock::DisplayColorProfile* colorProfile = new StrictMock<mock::DisplayColorProfile>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700470 virtualDisplay->setDisplayColorProfileForTest(
Lloyd Piquef5275482019-01-29 18:42:42 -0800471 std::unique_ptr<DisplayColorProfile>(colorProfile));
472
473 EXPECT_CALL(*colorProfile,
474 getTargetDataspace(ui::ColorMode::DISPLAY_P3, ui::Dataspace::DISPLAY_P3,
475 ui::Dataspace::UNKNOWN))
476 .WillOnce(Return(ui::Dataspace::UNKNOWN));
477
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700478 virtualDisplay->setColorProfile(
Lloyd Pique6a3b4462019-03-07 20:58:12 -0800479 ColorProfile{ui::ColorMode::DISPLAY_P3, ui::Dataspace::DISPLAY_P3,
480 ui::RenderIntent::TONE_MAP_COLORIMETRIC, ui::Dataspace::UNKNOWN});
Lloyd Pique32cbe282018-10-19 13:09:22 -0700481
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700482 EXPECT_EQ(ui::ColorMode::NATIVE, virtualDisplay->getState().colorMode);
483 EXPECT_EQ(ui::Dataspace::UNKNOWN, virtualDisplay->getState().dataspace);
484 EXPECT_EQ(ui::RenderIntent::COLORIMETRIC, virtualDisplay->getState().renderIntent);
485 EXPECT_EQ(ui::Dataspace::UNKNOWN, virtualDisplay->getState().targetDataspace);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700486}
487
Lloyd Pique66d68602019-02-13 14:23:31 -0800488/*
Lloyd Pique3d0c02e2018-10-19 18:38:12 -0700489 * Display::createDisplayColorProfile()
490 */
491
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700492using DisplayCreateColorProfileTest = PartialMockDisplayTestCommon;
493
494TEST_F(DisplayCreateColorProfileTest, setsDisplayColorProfile) {
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700495 EXPECT_TRUE(mDisplay->getDisplayColorProfile() == nullptr);
496 mDisplay->createDisplayColorProfile(
Lloyd Pique3d0c02e2018-10-19 18:38:12 -0700497 DisplayColorProfileCreationArgs{false, HdrCapabilities(), 0,
498 DisplayColorProfileCreationArgs::HwcColorModes()});
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700499 EXPECT_TRUE(mDisplay->getDisplayColorProfile() != nullptr);
Lloyd Pique3d0c02e2018-10-19 18:38:12 -0700500}
501
Lloyd Pique66d68602019-02-13 14:23:31 -0800502/*
Lloyd Pique31cb2942018-10-19 17:23:03 -0700503 * Display::createRenderSurface()
504 */
505
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700506using DisplayCreateRenderSurfaceTest = PartialMockDisplayTestCommon;
507
508TEST_F(DisplayCreateRenderSurfaceTest, setsRenderSurface) {
chaviw8beb4142019-04-11 13:09:05 -0700509 EXPECT_CALL(*mNativeWindow, disconnect(NATIVE_WINDOW_API_EGL)).WillRepeatedly(Return(NO_ERROR));
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700510 EXPECT_TRUE(mDisplay->getRenderSurface() == nullptr);
511 mDisplay->createRenderSurface(RenderSurfaceCreationArgs{640, 480, mNativeWindow, nullptr});
512 EXPECT_TRUE(mDisplay->getRenderSurface() != nullptr);
Lloyd Pique31cb2942018-10-19 17:23:03 -0700513}
514
Lloyd Pique66d68602019-02-13 14:23:31 -0800515/*
Lloyd Piquedf336d92019-03-07 21:38:42 -0800516 * Display::createOutputLayer()
517 */
518
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700519using DisplayCreateOutputLayerTest = FullDisplayImplTestCommon;
520
521TEST_F(DisplayCreateOutputLayerTest, setsHwcLayer) {
Lloyd Piquedf336d92019-03-07 21:38:42 -0800522 sp<mock::LayerFE> layerFE = new StrictMock<mock::LayerFE>();
Lloyd Piquedf336d92019-03-07 21:38:42 -0800523 StrictMock<HWC2::mock::Layer> hwcLayer;
524
525 EXPECT_CALL(mHwComposer, createLayer(DEFAULT_DISPLAY_ID)).WillOnce(Return(&hwcLayer));
526
Lloyd Piquede196652020-01-22 17:29:58 -0800527 auto outputLayer = mDisplay->createOutputLayer(layerFE);
Lloyd Piquedf336d92019-03-07 21:38:42 -0800528
529 EXPECT_EQ(&hwcLayer, outputLayer->getHwcLayer());
530
531 EXPECT_CALL(mHwComposer, destroyLayer(DEFAULT_DISPLAY_ID, &hwcLayer));
532 outputLayer.reset();
533}
534
535/*
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800536 * Display::setReleasedLayers()
537 */
538
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700539using DisplaySetReleasedLayersTest = DisplayWithLayersTestCommon;
540
541TEST_F(DisplaySetReleasedLayersTest, doesNothingIfNotHwcDisplay) {
542 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
543 std::shared_ptr<impl::Display> nonHwcDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800544
545 sp<mock::LayerFE> layerXLayerFE = new StrictMock<mock::LayerFE>();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800546
547 {
548 Output::ReleasedLayers releasedLayers;
549 releasedLayers.emplace_back(layerXLayerFE);
550 nonHwcDisplay->setReleasedLayers(std::move(releasedLayers));
551 }
552
553 CompositionRefreshArgs refreshArgs;
Lloyd Piquede196652020-01-22 17:29:58 -0800554 refreshArgs.layersWithQueuedFrames.push_back(layerXLayerFE);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800555
556 nonHwcDisplay->setReleasedLayers(refreshArgs);
557
558 const auto& releasedLayers = nonHwcDisplay->getReleasedLayersForTest();
559 ASSERT_EQ(1, releasedLayers.size());
560}
561
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700562TEST_F(DisplaySetReleasedLayersTest, doesNothingIfNoLayersWithQueuedFrames) {
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800563 sp<mock::LayerFE> layerXLayerFE = new StrictMock<mock::LayerFE>();
564
565 {
566 Output::ReleasedLayers releasedLayers;
567 releasedLayers.emplace_back(layerXLayerFE);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700568 mDisplay->setReleasedLayers(std::move(releasedLayers));
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800569 }
570
571 CompositionRefreshArgs refreshArgs;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700572 mDisplay->setReleasedLayers(refreshArgs);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800573
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700574 const auto& releasedLayers = mDisplay->getReleasedLayersForTest();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800575 ASSERT_EQ(1, releasedLayers.size());
576}
577
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700578TEST_F(DisplaySetReleasedLayersTest, setReleasedLayers) {
Lloyd Piquede196652020-01-22 17:29:58 -0800579 sp<mock::LayerFE> unknownLayer = new StrictMock<mock::LayerFE>();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800580
581 CompositionRefreshArgs refreshArgs;
Lloyd Piquede196652020-01-22 17:29:58 -0800582 refreshArgs.layersWithQueuedFrames.push_back(mLayer1.layerFE);
583 refreshArgs.layersWithQueuedFrames.push_back(mLayer2.layerFE);
584 refreshArgs.layersWithQueuedFrames.push_back(unknownLayer);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800585
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700586 mDisplay->setReleasedLayers(refreshArgs);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800587
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700588 const auto& releasedLayers = mDisplay->getReleasedLayersForTest();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800589 ASSERT_EQ(2, releasedLayers.size());
Lloyd Piquede196652020-01-22 17:29:58 -0800590 ASSERT_EQ(mLayer1.layerFE.get(), releasedLayers[0].promote().get());
591 ASSERT_EQ(mLayer2.layerFE.get(), releasedLayers[1].promote().get());
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800592}
593
594/*
Lloyd Pique66d68602019-02-13 14:23:31 -0800595 * Display::chooseCompositionStrategy()
596 */
597
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700598using DisplayChooseCompositionStrategyTest = PartialMockDisplayTestCommon;
Lloyd Pique66d68602019-02-13 14:23:31 -0800599
600TEST_F(DisplayChooseCompositionStrategyTest, takesEarlyOutIfNotAHwcDisplay) {
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700601 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
602 std::shared_ptr<Display> nonHwcDisplay =
603 createPartialMockDisplay<Display>(mCompositionEngine, args);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700604 EXPECT_FALSE(nonHwcDisplay->getId());
Lloyd Pique66d68602019-02-13 14:23:31 -0800605
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700606 nonHwcDisplay->chooseCompositionStrategy();
Lloyd Pique66d68602019-02-13 14:23:31 -0800607
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700608 auto& state = nonHwcDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800609 EXPECT_TRUE(state.usesClientComposition);
610 EXPECT_FALSE(state.usesDeviceComposition);
611}
612
613TEST_F(DisplayChooseCompositionStrategyTest, takesEarlyOutOnHwcError) {
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700614 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800615 EXPECT_CALL(mHwComposer, getDeviceCompositionChanges(DEFAULT_DISPLAY_ID, false, _))
616 .WillOnce(Return(INVALID_OPERATION));
617
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700618 mDisplay->chooseCompositionStrategy();
Lloyd Pique66d68602019-02-13 14:23:31 -0800619
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700620 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800621 EXPECT_TRUE(state.usesClientComposition);
622 EXPECT_FALSE(state.usesDeviceComposition);
623}
624
625TEST_F(DisplayChooseCompositionStrategyTest, normalOperation) {
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700626 // Since two calls are made to anyLayersRequireClientComposition with different return
627 // values, use a Sequence to control the matching so the values are returned in a known
628 // order.
Lloyd Pique66d68602019-02-13 14:23:31 -0800629 Sequence s;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700630 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
631 .InSequence(s)
632 .WillOnce(Return(true));
633 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
Lloyd Pique66d68602019-02-13 14:23:31 -0800634 .InSequence(s)
635 .WillOnce(Return(false));
636
637 EXPECT_CALL(mHwComposer, getDeviceCompositionChanges(DEFAULT_DISPLAY_ID, true, _))
638 .WillOnce(Return(NO_ERROR));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700639 EXPECT_CALL(*mDisplay, allLayersRequireClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800640
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700641 mDisplay->chooseCompositionStrategy();
Lloyd Pique66d68602019-02-13 14:23:31 -0800642
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700643 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800644 EXPECT_FALSE(state.usesClientComposition);
645 EXPECT_TRUE(state.usesDeviceComposition);
646}
647
648TEST_F(DisplayChooseCompositionStrategyTest, normalOperationWithChanges) {
649 android::HWComposer::DeviceRequestedChanges changes{
Peiyong Line9d809e2020-04-14 13:10:48 -0700650 {{nullptr, hal::Composition::CLIENT}},
651 hal::DisplayRequest::FLIP_CLIENT_TARGET,
652 {{nullptr, hal::LayerRequest::CLEAR_CLIENT_TARGET}},
Peiyong Lindfc3f7c2020-05-07 20:15:50 -0700653 {hal::PixelFormat::RGBA_8888, hal::Dataspace::UNKNOWN},
Lloyd Pique66d68602019-02-13 14:23:31 -0800654 };
655
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700656 // Since two calls are made to anyLayersRequireClientComposition with different return
657 // values, use a Sequence to control the matching so the values are returned in a known
658 // order.
Lloyd Pique66d68602019-02-13 14:23:31 -0800659 Sequence s;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700660 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
661 .InSequence(s)
662 .WillOnce(Return(true));
663 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
Lloyd Pique66d68602019-02-13 14:23:31 -0800664 .InSequence(s)
665 .WillOnce(Return(false));
666
667 EXPECT_CALL(mHwComposer, getDeviceCompositionChanges(DEFAULT_DISPLAY_ID, true, _))
668 .WillOnce(DoAll(SetArgPointee<2>(changes), Return(NO_ERROR)));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700669 EXPECT_CALL(*mDisplay, applyChangedTypesToLayers(changes.changedTypes)).Times(1);
670 EXPECT_CALL(*mDisplay, applyDisplayRequests(changes.displayRequests)).Times(1);
671 EXPECT_CALL(*mDisplay, applyLayerRequestsToLayers(changes.layerRequests)).Times(1);
672 EXPECT_CALL(*mDisplay, allLayersRequireClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800673
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700674 mDisplay->chooseCompositionStrategy();
Lloyd Pique66d68602019-02-13 14:23:31 -0800675
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700676 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800677 EXPECT_FALSE(state.usesClientComposition);
678 EXPECT_TRUE(state.usesDeviceComposition);
679}
680
681/*
Lloyd Pique688abd42019-02-15 15:42:24 -0800682 * Display::getSkipColorTransform()
683 */
684
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700685using DisplayGetSkipColorTransformTest = DisplayWithLayersTestCommon;
686
Dominik Laskowski1162e472020-04-02 19:02:47 -0700687TEST_F(DisplayGetSkipColorTransformTest, checksCapabilityIfNonHwcDisplay) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700688 EXPECT_CALL(mHwComposer, hasCapability(hal::Capability::SKIP_CLIENT_COLOR_TRANSFORM))
Dominik Laskowski1162e472020-04-02 19:02:47 -0700689 .WillOnce(Return(true));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700690 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
691 auto nonHwcDisplay{impl::createDisplay(mCompositionEngine, args)};
Dominik Laskowski1162e472020-04-02 19:02:47 -0700692 EXPECT_TRUE(nonHwcDisplay->getSkipColorTransform());
Lloyd Pique688abd42019-02-15 15:42:24 -0800693}
694
Dominik Laskowski1162e472020-04-02 19:02:47 -0700695TEST_F(DisplayGetSkipColorTransformTest, checksDisplayCapability) {
Lloyd Pique688abd42019-02-15 15:42:24 -0800696 EXPECT_CALL(mHwComposer,
Dominik Laskowski1162e472020-04-02 19:02:47 -0700697 hasDisplayCapability(DEFAULT_DISPLAY_ID,
Peiyong Line9d809e2020-04-14 13:10:48 -0700698 hal::DisplayCapability::SKIP_CLIENT_COLOR_TRANSFORM))
Lloyd Pique688abd42019-02-15 15:42:24 -0800699 .WillOnce(Return(true));
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700700 EXPECT_TRUE(mDisplay->getSkipColorTransform());
Lloyd Pique688abd42019-02-15 15:42:24 -0800701}
702
703/*
Lloyd Pique66d68602019-02-13 14:23:31 -0800704 * Display::anyLayersRequireClientComposition()
705 */
706
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700707using DisplayAnyLayersRequireClientCompositionTest = DisplayWithLayersTestCommon;
708
709TEST_F(DisplayAnyLayersRequireClientCompositionTest, returnsFalse) {
Lloyd Piquede196652020-01-22 17:29:58 -0800710 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(false));
711 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(false));
712 EXPECT_CALL(*mLayer3.outputLayer, requiresClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800713
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700714 EXPECT_FALSE(mDisplay->anyLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800715}
716
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700717TEST_F(DisplayAnyLayersRequireClientCompositionTest, returnsTrue) {
Lloyd Piquede196652020-01-22 17:29:58 -0800718 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(false));
719 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(true));
Lloyd Pique66d68602019-02-13 14:23:31 -0800720
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700721 EXPECT_TRUE(mDisplay->anyLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800722}
723
724/*
725 * Display::allLayersRequireClientComposition()
726 */
727
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700728using DisplayAllLayersRequireClientCompositionTest = DisplayWithLayersTestCommon;
729
730TEST_F(DisplayAllLayersRequireClientCompositionTest, returnsTrue) {
Lloyd Piquede196652020-01-22 17:29:58 -0800731 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(true));
732 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(true));
733 EXPECT_CALL(*mLayer3.outputLayer, requiresClientComposition()).WillOnce(Return(true));
Lloyd Pique66d68602019-02-13 14:23:31 -0800734
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700735 EXPECT_TRUE(mDisplay->allLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800736}
737
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700738TEST_F(DisplayAllLayersRequireClientCompositionTest, returnsFalse) {
Lloyd Piquede196652020-01-22 17:29:58 -0800739 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(true));
740 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800741
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700742 EXPECT_FALSE(mDisplay->allLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800743}
744
745/*
746 * Display::applyChangedTypesToLayers()
747 */
748
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700749using DisplayApplyChangedTypesToLayersTest = DisplayWithLayersTestCommon;
750
751TEST_F(DisplayApplyChangedTypesToLayersTest, takesEarlyOutIfNoChangedLayers) {
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700752 mDisplay->applyChangedTypesToLayers(impl::Display::ChangedTypes());
Lloyd Pique66d68602019-02-13 14:23:31 -0800753}
754
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700755TEST_F(DisplayApplyChangedTypesToLayersTest, appliesChanges) {
Lloyd Piquede196652020-01-22 17:29:58 -0800756 EXPECT_CALL(*mLayer1.outputLayer,
Lloyd Pique66d68602019-02-13 14:23:31 -0800757 applyDeviceCompositionTypeChange(Hwc2::IComposerClient::Composition::CLIENT))
758 .Times(1);
Lloyd Piquede196652020-01-22 17:29:58 -0800759 EXPECT_CALL(*mLayer2.outputLayer,
Lloyd Pique66d68602019-02-13 14:23:31 -0800760 applyDeviceCompositionTypeChange(Hwc2::IComposerClient::Composition::DEVICE))
761 .Times(1);
762
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700763 mDisplay->applyChangedTypesToLayers(impl::Display::ChangedTypes{
Peiyong Line9d809e2020-04-14 13:10:48 -0700764 {&mLayer1.hwc2Layer, hal::Composition::CLIENT},
765 {&mLayer2.hwc2Layer, hal::Composition::DEVICE},
766 {&hwc2LayerUnknown, hal::Composition::SOLID_COLOR},
Lloyd Pique66d68602019-02-13 14:23:31 -0800767 });
768}
769
770/*
771 * Display::applyDisplayRequests()
772 */
773
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700774using DisplayApplyDisplayRequestsTest = DisplayWithLayersTestCommon;
775
776TEST_F(DisplayApplyDisplayRequestsTest, handlesNoRequests) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700777 mDisplay->applyDisplayRequests(static_cast<hal::DisplayRequest>(0));
Lloyd Pique66d68602019-02-13 14:23:31 -0800778
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700779 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800780 EXPECT_FALSE(state.flipClientTarget);
781}
782
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700783TEST_F(DisplayApplyDisplayRequestsTest, handlesFlipClientTarget) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700784 mDisplay->applyDisplayRequests(hal::DisplayRequest::FLIP_CLIENT_TARGET);
Lloyd Pique66d68602019-02-13 14:23:31 -0800785
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700786 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800787 EXPECT_TRUE(state.flipClientTarget);
788}
789
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700790TEST_F(DisplayApplyDisplayRequestsTest, handlesWriteClientTargetToOutput) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700791 mDisplay->applyDisplayRequests(hal::DisplayRequest::WRITE_CLIENT_TARGET_TO_OUTPUT);
Lloyd Pique66d68602019-02-13 14:23:31 -0800792
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700793 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800794 EXPECT_FALSE(state.flipClientTarget);
795}
796
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700797TEST_F(DisplayApplyDisplayRequestsTest, handlesAllRequestFlagsSet) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700798 mDisplay->applyDisplayRequests(static_cast<hal::DisplayRequest>(~0));
Lloyd Pique66d68602019-02-13 14:23:31 -0800799
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700800 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800801 EXPECT_TRUE(state.flipClientTarget);
802}
803
804/*
805 * Display::applyLayerRequestsToLayers()
806 */
807
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700808using DisplayApplyLayerRequestsToLayersTest = DisplayWithLayersTestCommon;
809
810TEST_F(DisplayApplyLayerRequestsToLayersTest, preparesAllLayers) {
Lloyd Piquede196652020-01-22 17:29:58 -0800811 EXPECT_CALL(*mLayer1.outputLayer, prepareForDeviceLayerRequests()).Times(1);
812 EXPECT_CALL(*mLayer2.outputLayer, prepareForDeviceLayerRequests()).Times(1);
813 EXPECT_CALL(*mLayer3.outputLayer, prepareForDeviceLayerRequests()).Times(1);
Lloyd Pique66d68602019-02-13 14:23:31 -0800814
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700815 mDisplay->applyLayerRequestsToLayers(impl::Display::LayerRequests());
Lloyd Pique66d68602019-02-13 14:23:31 -0800816}
817
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700818TEST_F(DisplayApplyLayerRequestsToLayersTest, appliesDeviceLayerRequests) {
Lloyd Piquede196652020-01-22 17:29:58 -0800819 EXPECT_CALL(*mLayer1.outputLayer, prepareForDeviceLayerRequests()).Times(1);
820 EXPECT_CALL(*mLayer2.outputLayer, prepareForDeviceLayerRequests()).Times(1);
821 EXPECT_CALL(*mLayer3.outputLayer, prepareForDeviceLayerRequests()).Times(1);
Lloyd Pique66d68602019-02-13 14:23:31 -0800822
Lloyd Piquede196652020-01-22 17:29:58 -0800823 EXPECT_CALL(*mLayer1.outputLayer,
Lloyd Pique66d68602019-02-13 14:23:31 -0800824 applyDeviceLayerRequest(Hwc2::IComposerClient::LayerRequest::CLEAR_CLIENT_TARGET))
825 .Times(1);
826
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700827 mDisplay->applyLayerRequestsToLayers(impl::Display::LayerRequests{
Peiyong Line9d809e2020-04-14 13:10:48 -0700828 {&mLayer1.hwc2Layer, hal::LayerRequest::CLEAR_CLIENT_TARGET},
829 {&hwc2LayerUnknown, hal::LayerRequest::CLEAR_CLIENT_TARGET},
Lloyd Pique66d68602019-02-13 14:23:31 -0800830 });
831}
832
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800833/*
834 * Display::presentAndGetFrameFences()
835 */
836
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700837using DisplayPresentAndGetFrameFencesTest = DisplayWithLayersTestCommon;
838
839TEST_F(DisplayPresentAndGetFrameFencesTest, returnsNoFencesOnNonHwcDisplay) {
840 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
841 auto nonHwcDisplay{impl::createDisplay(mCompositionEngine, args)};
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800842
843 auto result = nonHwcDisplay->presentAndGetFrameFences();
844
845 ASSERT_TRUE(result.presentFence.get());
846 EXPECT_FALSE(result.presentFence->isValid());
847 EXPECT_EQ(0u, result.layerFences.size());
848}
849
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700850TEST_F(DisplayPresentAndGetFrameFencesTest, returnsPresentAndLayerFences) {
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800851 sp<Fence> presentFence = new Fence();
852 sp<Fence> layer1Fence = new Fence();
853 sp<Fence> layer2Fence = new Fence();
854
855 EXPECT_CALL(mHwComposer, presentAndGetReleaseFences(DEFAULT_DISPLAY_ID)).Times(1);
856 EXPECT_CALL(mHwComposer, getPresentFence(DEFAULT_DISPLAY_ID)).WillOnce(Return(presentFence));
Lloyd Piquede196652020-01-22 17:29:58 -0800857 EXPECT_CALL(mHwComposer, getLayerReleaseFence(DEFAULT_DISPLAY_ID, &mLayer1.hwc2Layer))
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800858 .WillOnce(Return(layer1Fence));
Lloyd Piquede196652020-01-22 17:29:58 -0800859 EXPECT_CALL(mHwComposer, getLayerReleaseFence(DEFAULT_DISPLAY_ID, &mLayer2.hwc2Layer))
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800860 .WillOnce(Return(layer2Fence));
861 EXPECT_CALL(mHwComposer, clearReleaseFences(DEFAULT_DISPLAY_ID)).Times(1);
862
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700863 auto result = mDisplay->presentAndGetFrameFences();
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800864
865 EXPECT_EQ(presentFence, result.presentFence);
866
867 EXPECT_EQ(2u, result.layerFences.size());
Lloyd Piquede196652020-01-22 17:29:58 -0800868 ASSERT_EQ(1, result.layerFences.count(&mLayer1.hwc2Layer));
869 EXPECT_EQ(layer1Fence, result.layerFences[&mLayer1.hwc2Layer]);
870 ASSERT_EQ(1, result.layerFences.count(&mLayer2.hwc2Layer));
871 EXPECT_EQ(layer2Fence, result.layerFences[&mLayer2.hwc2Layer]);
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800872}
873
Lloyd Pique688abd42019-02-15 15:42:24 -0800874/*
875 * Display::setExpensiveRenderingExpected()
876 */
877
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700878using DisplaySetExpensiveRenderingExpectedTest = DisplayWithLayersTestCommon;
879
880TEST_F(DisplaySetExpensiveRenderingExpectedTest, forwardsToPowerAdvisor) {
Lloyd Pique688abd42019-02-15 15:42:24 -0800881 EXPECT_CALL(mPowerAdvisor, setExpensiveRenderingExpected(DEFAULT_DISPLAY_ID, true)).Times(1);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700882 mDisplay->setExpensiveRenderingExpected(true);
Lloyd Pique688abd42019-02-15 15:42:24 -0800883
884 EXPECT_CALL(mPowerAdvisor, setExpensiveRenderingExpected(DEFAULT_DISPLAY_ID, false)).Times(1);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700885 mDisplay->setExpensiveRenderingExpected(false);
Lloyd Pique688abd42019-02-15 15:42:24 -0800886}
887
Lloyd Piqued3d69882019-02-28 16:03:46 -0800888/*
889 * Display::finishFrame()
890 */
891
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700892using DisplayFinishFrameTest = DisplayWithLayersTestCommon;
893
894TEST_F(DisplayFinishFrameTest, doesNotSkipCompositionIfNotDirtyOnHwcDisplay) {
Lloyd Piqued3d69882019-02-28 16:03:46 -0800895 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700896 mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
Lloyd Piqued3d69882019-02-28 16:03:46 -0800897
898 // We expect no calls to queueBuffer if composition was skipped.
899 EXPECT_CALL(*renderSurface, queueBuffer(_)).Times(1);
900
Lloyd Piquea76ce462020-01-14 13:06:37 -0800901 // Expect a call to signal no expensive rendering since there is no client composition.
902 EXPECT_CALL(mPowerAdvisor, setExpensiveRenderingExpected(DEFAULT_DISPLAY_ID, false));
903
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700904 mDisplay->editState().isEnabled = true;
905 mDisplay->editState().usesClientComposition = false;
906 mDisplay->editState().viewport = Rect(0, 0, 1, 1);
907 mDisplay->editState().dirtyRegion = Region::INVALID_REGION;
Lloyd Piqued3d69882019-02-28 16:03:46 -0800908
909 CompositionRefreshArgs refreshArgs;
910 refreshArgs.repaintEverything = false;
911
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700912 mDisplay->finishFrame(refreshArgs);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800913}
914
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700915TEST_F(DisplayFinishFrameTest, skipsCompositionIfNotDirty) {
916 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
917 std::shared_ptr<impl::Display> nonHwcDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800918
919 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
920 nonHwcDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
921
922 // We expect no calls to queueBuffer if composition was skipped.
923 EXPECT_CALL(*renderSurface, queueBuffer(_)).Times(0);
924
925 nonHwcDisplay->editState().isEnabled = true;
926 nonHwcDisplay->editState().usesClientComposition = false;
927 nonHwcDisplay->editState().viewport = Rect(0, 0, 1, 1);
928 nonHwcDisplay->editState().dirtyRegion = Region::INVALID_REGION;
929
930 CompositionRefreshArgs refreshArgs;
931 refreshArgs.repaintEverything = false;
932
933 nonHwcDisplay->finishFrame(refreshArgs);
934}
935
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700936TEST_F(DisplayFinishFrameTest, performsCompositionIfDirty) {
937 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
938 std::shared_ptr<impl::Display> nonHwcDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800939
940 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
941 nonHwcDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
942
943 // We expect a single call to queueBuffer when composition is not skipped.
944 EXPECT_CALL(*renderSurface, queueBuffer(_)).Times(1);
945
946 nonHwcDisplay->editState().isEnabled = true;
947 nonHwcDisplay->editState().usesClientComposition = false;
948 nonHwcDisplay->editState().viewport = Rect(0, 0, 1, 1);
949 nonHwcDisplay->editState().dirtyRegion = Region(Rect(0, 0, 1, 1));
950
951 CompositionRefreshArgs refreshArgs;
952 refreshArgs.repaintEverything = false;
953
954 nonHwcDisplay->finishFrame(refreshArgs);
955}
956
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700957TEST_F(DisplayFinishFrameTest, performsCompositionIfRepaintEverything) {
958 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
959 std::shared_ptr<impl::Display> nonHwcDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800960
961 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
962 nonHwcDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
963
964 // We expect a single call to queueBuffer when composition is not skipped.
965 EXPECT_CALL(*renderSurface, queueBuffer(_)).Times(1);
966
967 nonHwcDisplay->editState().isEnabled = true;
968 nonHwcDisplay->editState().usesClientComposition = false;
969 nonHwcDisplay->editState().viewport = Rect(0, 0, 1, 1);
970 nonHwcDisplay->editState().dirtyRegion = Region::INVALID_REGION;
971
972 CompositionRefreshArgs refreshArgs;
973 refreshArgs.repaintEverything = true;
974
975 nonHwcDisplay->finishFrame(refreshArgs);
976}
977
Lloyd Piquec6607552019-12-02 17:57:39 -0800978/*
979 * Display functional tests
980 */
981
982struct DisplayFunctionalTest : public testing::Test {
983 class Display : public impl::Display {
984 public:
Lloyd Piquec6607552019-12-02 17:57:39 -0800985 using impl::Display::injectOutputLayerForTest;
986 virtual void injectOutputLayerForTest(std::unique_ptr<compositionengine::OutputLayer>) = 0;
987 };
988
Lloyd Piquec6607552019-12-02 17:57:39 -0800989 DisplayFunctionalTest() {
990 EXPECT_CALL(mCompositionEngine, getHwComposer()).WillRepeatedly(ReturnRef(mHwComposer));
991
992 mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(mRenderSurface));
993 }
994
995 NiceMock<android::mock::HWComposer> mHwComposer;
996 NiceMock<Hwc2::mock::PowerAdvisor> mPowerAdvisor;
997 NiceMock<mock::CompositionEngine> mCompositionEngine;
998 sp<mock::NativeWindow> mNativeWindow = new NiceMock<mock::NativeWindow>();
999 sp<mock::DisplaySurface> mDisplaySurface = new NiceMock<mock::DisplaySurface>();
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -07001000 std::shared_ptr<Display> mDisplay = impl::createDisplayTemplated<
1001 Display>(mCompositionEngine,
1002 DisplayCreationArgsBuilder()
1003 .setPhysical({DEFAULT_DISPLAY_ID, DisplayConnectionType::Internal})
1004 .setPixels({DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT})
1005 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
1006 .setIsSecure(true)
1007 .setLayerStackId(DEFAULT_LAYER_STACK)
1008 .setPowerAdvisor(&mPowerAdvisor)
1009 .build()
1010
1011 );
Lloyd Piquec6607552019-12-02 17:57:39 -08001012 impl::RenderSurface* mRenderSurface =
1013 new impl::RenderSurface{mCompositionEngine, *mDisplay,
1014 RenderSurfaceCreationArgs{DEFAULT_DISPLAY_WIDTH,
1015 DEFAULT_DISPLAY_HEIGHT, mNativeWindow,
1016 mDisplaySurface}};
1017};
1018
1019TEST_F(DisplayFunctionalTest, postFramebufferCriticalCallsAreOrdered) {
1020 InSequence seq;
1021
1022 mDisplay->editState().isEnabled = true;
1023
1024 EXPECT_CALL(mHwComposer, presentAndGetReleaseFences(_));
1025 EXPECT_CALL(*mDisplaySurface, onFrameCommitted());
1026
1027 mDisplay->postFramebuffer();
1028}
1029
Lloyd Pique45a165a2018-10-19 11:54:47 -07001030} // namespace
1031} // namespace android::compositionengine