blob: 1befbf830669ae0d2b2016b0fc8b46075a28e338 [file] [log] [blame]
Lloyd Pique45a165a2018-10-19 11:54:47 -07001/*
2 * Copyright 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Lloyd Pique45a165a2018-10-19 11:54:47 -070017#include <cmath>
18
Lloyd Pique3d0c02e2018-10-19 18:38:12 -070019#include <compositionengine/DisplayColorProfileCreationArgs.h>
Lloyd Pique45a165a2018-10-19 11:54:47 -070020#include <compositionengine/DisplayCreationArgs.h>
Lloyd Pique31cb2942018-10-19 17:23:03 -070021#include <compositionengine/DisplaySurface.h>
22#include <compositionengine/RenderSurfaceCreationArgs.h>
Lloyd Pique45a165a2018-10-19 11:54:47 -070023#include <compositionengine/impl/Display.h>
Lloyd Piquec6607552019-12-02 17:57:39 -080024#include <compositionengine/impl/RenderSurface.h>
Lloyd Pique45a165a2018-10-19 11:54:47 -070025#include <compositionengine/mock/CompositionEngine.h>
Lloyd Piquef5275482019-01-29 18:42:42 -080026#include <compositionengine/mock/DisplayColorProfile.h>
Lloyd Piquec6607552019-12-02 17:57:39 -080027#include <compositionengine/mock/DisplaySurface.h>
Lloyd Piquedf336d92019-03-07 21:38:42 -080028#include <compositionengine/mock/LayerFE.h>
chaviw8beb4142019-04-11 13:09:05 -070029#include <compositionengine/mock/NativeWindow.h>
Lloyd Pique66d68602019-02-13 14:23:31 -080030#include <compositionengine/mock/OutputLayer.h>
Lloyd Pique31cb2942018-10-19 17:23:03 -070031#include <compositionengine/mock/RenderSurface.h>
Lloyd Pique32cbe282018-10-19 13:09:22 -070032#include <gtest/gtest.h>
Lloyd Piquee9eff972020-05-05 12:36:44 -070033#include <renderengine/mock/RenderEngine.h>
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070034#include <ui/DisplayInfo.h>
35#include <ui/Rect.h>
Lloyd Pique45a165a2018-10-19 11:54:47 -070036
Lloyd Pique66d68602019-02-13 14:23:31 -080037#include "MockHWC2.h"
Lloyd Pique45a165a2018-10-19 11:54:47 -070038#include "MockHWComposer.h"
Lloyd Pique688abd42019-02-15 15:42:24 -080039#include "MockPowerAdvisor.h"
Lloyd Pique45a165a2018-10-19 11:54:47 -070040
41namespace android::compositionengine {
42namespace {
43
Peiyong Line9d809e2020-04-14 13:10:48 -070044namespace hal = android::hardware::graphics::composer::hal;
45
Lloyd Piquef5275482019-01-29 18:42:42 -080046using testing::_;
Lloyd Pique66d68602019-02-13 14:23:31 -080047using testing::DoAll;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070048using testing::Eq;
Lloyd Piquec6607552019-12-02 17:57:39 -080049using testing::InSequence;
50using testing::NiceMock;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070051using testing::Pointee;
52using testing::Ref;
Lloyd Pique31cb2942018-10-19 17:23:03 -070053using testing::Return;
Lloyd Pique45a165a2018-10-19 11:54:47 -070054using testing::ReturnRef;
Lloyd Pique66d68602019-02-13 14:23:31 -080055using testing::Sequence;
56using testing::SetArgPointee;
Lloyd Pique45a165a2018-10-19 11:54:47 -070057using testing::StrictMock;
58
Marin Shalamanova524a092020-07-27 21:39:55 +020059constexpr PhysicalDisplayId DEFAULT_DISPLAY_ID = PhysicalDisplayId{42};
60// TODO(b/160679868) Use VirtualDisplayId
61constexpr PhysicalDisplayId VIRTUAL_DISPLAY_ID = PhysicalDisplayId{43};
Lloyd Piquec6607552019-12-02 17:57:39 -080062constexpr int32_t DEFAULT_DISPLAY_WIDTH = 1920;
63constexpr int32_t DEFAULT_DISPLAY_HEIGHT = 1080;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070064constexpr int32_t DEFAULT_LAYER_STACK = 123;
Lloyd Pique45a165a2018-10-19 11:54:47 -070065
Lloyd Piquede196652020-01-22 17:29:58 -080066struct Layer {
67 Layer() {
68 EXPECT_CALL(*outputLayer, getLayerFE()).WillRepeatedly(ReturnRef(*layerFE));
69 EXPECT_CALL(*outputLayer, getHwcLayer()).WillRepeatedly(Return(&hwc2Layer));
70 }
71
72 sp<mock::LayerFE> layerFE = new StrictMock<mock::LayerFE>();
73 StrictMock<mock::OutputLayer>* outputLayer = new StrictMock<mock::OutputLayer>();
74 StrictMock<HWC2::mock::Layer> hwc2Layer;
75};
76
77struct LayerNoHWC2Layer {
78 LayerNoHWC2Layer() {
79 EXPECT_CALL(*outputLayer, getLayerFE()).WillRepeatedly(ReturnRef(*layerFE));
80 EXPECT_CALL(*outputLayer, getHwcLayer()).WillRepeatedly(Return(nullptr));
81 }
82
83 sp<mock::LayerFE> layerFE = new StrictMock<mock::LayerFE>();
84 StrictMock<mock::OutputLayer>* outputLayer = new StrictMock<mock::OutputLayer>();
85};
86
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070087struct DisplayTestCommon : public testing::Test {
88 // Uses the full implementation of a display
89 class FullImplDisplay : public impl::Display {
Lloyd Pique01c77c12019-04-17 12:48:32 -070090 public:
Lloyd Pique01c77c12019-04-17 12:48:32 -070091 using impl::Display::injectOutputLayerForTest;
92 virtual void injectOutputLayerForTest(std::unique_ptr<compositionengine::OutputLayer>) = 0;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070093
94 using impl::Display::maybeAllocateDisplayIdForVirtualDisplay;
Lloyd Pique01c77c12019-04-17 12:48:32 -070095 };
96
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070097 // Uses a special implementation with key internal member functions set up
98 // as mock implementations, to allow for easier testing.
99 struct PartialMockDisplay : public impl::Display {
100 PartialMockDisplay(const compositionengine::CompositionEngine& compositionEngine)
101 : mCompositionEngine(compositionEngine) {}
102
103 // compositionengine::Output overrides
104 const OutputCompositionState& getState() const override { return mState; }
105 OutputCompositionState& editState() override { return mState; }
106
107 // compositionengine::impl::Output overrides
108 const CompositionEngine& getCompositionEngine() const override {
109 return mCompositionEngine;
110 };
111
112 // Mock implementation overrides
113 MOCK_CONST_METHOD0(getOutputLayerCount, size_t());
114 MOCK_CONST_METHOD1(getOutputLayerOrderedByZByIndex,
115 compositionengine::OutputLayer*(size_t));
116 MOCK_METHOD2(ensureOutputLayer,
117 compositionengine::OutputLayer*(std::optional<size_t>, const sp<LayerFE>&));
118 MOCK_METHOD0(finalizePendingOutputLayers, void());
119 MOCK_METHOD0(clearOutputLayers, void());
120 MOCK_CONST_METHOD1(dumpState, void(std::string&));
121 MOCK_METHOD1(injectOutputLayerForTest, compositionengine::OutputLayer*(const sp<LayerFE>&));
122 MOCK_METHOD1(injectOutputLayerForTest, void(std::unique_ptr<OutputLayer>));
123 MOCK_CONST_METHOD0(anyLayersRequireClientComposition, bool());
124 MOCK_CONST_METHOD0(allLayersRequireClientComposition, bool());
125 MOCK_METHOD1(applyChangedTypesToLayers, void(const impl::Display::ChangedTypes&));
126 MOCK_METHOD1(applyDisplayRequests, void(const impl::Display::DisplayRequests&));
127 MOCK_METHOD1(applyLayerRequestsToLayers, void(const impl::Display::LayerRequests&));
128
129 const compositionengine::CompositionEngine& mCompositionEngine;
130 impl::OutputCompositionState mState;
131 };
132
133 static std::string getDisplayNameFromCurrentTest() {
134 const ::testing::TestInfo* const test_info =
135 ::testing::UnitTest::GetInstance()->current_test_info();
136 return std::string("display for ") + test_info->test_case_name() + "." + test_info->name();
137 }
138
139 template <typename Display>
Lloyd Pique01c77c12019-04-17 12:48:32 -0700140 static std::shared_ptr<Display> createDisplay(
141 const compositionengine::CompositionEngine& compositionEngine,
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700142 compositionengine::DisplayCreationArgs args) {
143 args.name = getDisplayNameFromCurrentTest();
Lloyd Pique01c77c12019-04-17 12:48:32 -0700144 return impl::createDisplayTemplated<Display>(compositionEngine, args);
145 }
146
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700147 template <typename Display>
148 static std::shared_ptr<StrictMock<Display>> createPartialMockDisplay(
149 const compositionengine::CompositionEngine& compositionEngine,
150 compositionengine::DisplayCreationArgs args) {
151 args.name = getDisplayNameFromCurrentTest();
152 auto display = std::make_shared<StrictMock<Display>>(compositionEngine);
Lloyd Pique66d68602019-02-13 14:23:31 -0800153
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700154 display->setConfiguration(args);
155
156 return display;
157 }
158
159 DisplayTestCommon() {
160 EXPECT_CALL(mCompositionEngine, getHwComposer()).WillRepeatedly(ReturnRef(mHwComposer));
Lloyd Piquee9eff972020-05-05 12:36:44 -0700161 EXPECT_CALL(mCompositionEngine, getRenderEngine()).WillRepeatedly(ReturnRef(mRenderEngine));
162 EXPECT_CALL(mRenderEngine, supportsProtectedContent()).WillRepeatedly(Return(false));
Peiyong Lin09f910f2020-09-25 10:54:13 -0700163 EXPECT_CALL(mRenderEngine, isProtected()).WillRepeatedly(Return(false));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700164 }
165
166 DisplayCreationArgs getDisplayCreationArgsForPhysicalHWCDisplay() {
167 return DisplayCreationArgsBuilder()
168 .setPhysical({DEFAULT_DISPLAY_ID, DisplayConnectionType::Internal})
169 .setPixels({DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT})
170 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
171 .setIsSecure(true)
172 .setLayerStackId(DEFAULT_LAYER_STACK)
173 .setPowerAdvisor(&mPowerAdvisor)
174 .build();
175 }
176
177 DisplayCreationArgs getDisplayCreationArgsForNonHWCVirtualDisplay() {
178 return DisplayCreationArgsBuilder()
179 .setUseHwcVirtualDisplays(false)
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200180 .setGpuVirtualDisplayIdGenerator(mGpuDisplayIdGenerator)
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700181 .setPixels({DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT})
182 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
183 .setIsSecure(false)
184 .setLayerStackId(DEFAULT_LAYER_STACK)
185 .setPowerAdvisor(&mPowerAdvisor)
186 .build();
187 }
188
189 StrictMock<android::mock::HWComposer> mHwComposer;
190 StrictMock<Hwc2::mock::PowerAdvisor> mPowerAdvisor;
Lloyd Piquee9eff972020-05-05 12:36:44 -0700191 StrictMock<renderengine::mock::RenderEngine> mRenderEngine;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700192 StrictMock<mock::CompositionEngine> mCompositionEngine;
193 sp<mock::NativeWindow> mNativeWindow = new StrictMock<mock::NativeWindow>();
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200194 RandomDisplayIdGenerator<GpuVirtualDisplayId> mGpuDisplayIdGenerator;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700195};
196
197struct PartialMockDisplayTestCommon : public DisplayTestCommon {
198 using Display = DisplayTestCommon::PartialMockDisplay;
199 std::shared_ptr<Display> mDisplay =
200 createPartialMockDisplay<Display>(mCompositionEngine,
201 getDisplayCreationArgsForPhysicalHWCDisplay());
202};
203
204struct FullDisplayImplTestCommon : public DisplayTestCommon {
205 using Display = DisplayTestCommon::FullImplDisplay;
206 std::shared_ptr<Display> mDisplay =
207 createDisplay<Display>(mCompositionEngine,
208 getDisplayCreationArgsForPhysicalHWCDisplay());
209};
210
211struct DisplayWithLayersTestCommon : public FullDisplayImplTestCommon {
212 DisplayWithLayersTestCommon() {
Lloyd Pique01c77c12019-04-17 12:48:32 -0700213 mDisplay->injectOutputLayerForTest(
Lloyd Piquede196652020-01-22 17:29:58 -0800214 std::unique_ptr<compositionengine::OutputLayer>(mLayer1.outputLayer));
Lloyd Pique01c77c12019-04-17 12:48:32 -0700215 mDisplay->injectOutputLayerForTest(
Lloyd Piquede196652020-01-22 17:29:58 -0800216 std::unique_ptr<compositionengine::OutputLayer>(mLayer2.outputLayer));
Lloyd Pique01c77c12019-04-17 12:48:32 -0700217 mDisplay->injectOutputLayerForTest(
Lloyd Piquede196652020-01-22 17:29:58 -0800218 std::unique_ptr<compositionengine::OutputLayer>(mLayer3.outputLayer));
Lloyd Pique66d68602019-02-13 14:23:31 -0800219 }
Lloyd Pique45a165a2018-10-19 11:54:47 -0700220
Lloyd Piquede196652020-01-22 17:29:58 -0800221 Layer mLayer1;
222 Layer mLayer2;
223 LayerNoHWC2Layer mLayer3;
224 StrictMock<HWC2::mock::Layer> hwc2LayerUnknown;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700225 std::shared_ptr<Display> mDisplay =
226 createDisplay<Display>(mCompositionEngine,
227 getDisplayCreationArgsForPhysicalHWCDisplay());
Lloyd Pique45a165a2018-10-19 11:54:47 -0700228};
229
Lloyd Pique66d68602019-02-13 14:23:31 -0800230/*
Lloyd Pique45a165a2018-10-19 11:54:47 -0700231 * Basic construction
232 */
233
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700234struct DisplayCreationTest : public DisplayTestCommon {
235 using Display = DisplayTestCommon::FullImplDisplay;
236};
Lloyd Pique45a165a2018-10-19 11:54:47 -0700237
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700238TEST_F(DisplayCreationTest, createPhysicalInternalDisplay) {
239 auto display =
240 impl::createDisplay(mCompositionEngine, getDisplayCreationArgsForPhysicalHWCDisplay());
241 EXPECT_TRUE(display->isSecure());
242 EXPECT_FALSE(display->isVirtual());
243 EXPECT_EQ(DEFAULT_DISPLAY_ID, display->getId());
244}
Lloyd Pique45a165a2018-10-19 11:54:47 -0700245
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700246TEST_F(DisplayCreationTest, createNonHwcVirtualDisplay) {
247 auto display = impl::createDisplay(mCompositionEngine,
248 getDisplayCreationArgsForNonHWCVirtualDisplay());
249 EXPECT_FALSE(display->isSecure());
250 EXPECT_TRUE(display->isVirtual());
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200251 EXPECT_TRUE(GpuVirtualDisplayId::tryCast(display->getId()));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700252}
253
254/*
255 * Display::setConfiguration()
256 */
257
258using DisplaySetConfigurationTest = PartialMockDisplayTestCommon;
259
260TEST_F(DisplaySetConfigurationTest, configuresInternalSecurePhysicalDisplay) {
261 mDisplay->setConfiguration(
262 DisplayCreationArgsBuilder()
263 .setUseHwcVirtualDisplays(true)
264 .setPhysical({DEFAULT_DISPLAY_ID, DisplayConnectionType::Internal})
265 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
266 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
267 .setIsSecure(true)
268 .setLayerStackId(DEFAULT_LAYER_STACK)
269 .setPowerAdvisor(&mPowerAdvisor)
270 .setName(getDisplayNameFromCurrentTest())
271 .build());
272
273 EXPECT_EQ(DEFAULT_DISPLAY_ID, mDisplay->getId());
274 EXPECT_TRUE(mDisplay->isSecure());
275 EXPECT_FALSE(mDisplay->isVirtual());
276 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
277 EXPECT_TRUE(mDisplay->getState().layerStackInternal);
278 EXPECT_FALSE(mDisplay->isValid());
279}
280
281TEST_F(DisplaySetConfigurationTest, configuresExternalInsecurePhysicalDisplay) {
282 mDisplay->setConfiguration(
283 DisplayCreationArgsBuilder()
284 .setUseHwcVirtualDisplays(true)
285 .setPhysical({DEFAULT_DISPLAY_ID, DisplayConnectionType::External})
286 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
287 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
288 .setIsSecure(false)
289 .setLayerStackId(DEFAULT_LAYER_STACK)
290 .setPowerAdvisor(&mPowerAdvisor)
291 .setName(getDisplayNameFromCurrentTest())
292 .build());
293
294 EXPECT_EQ(DEFAULT_DISPLAY_ID, mDisplay->getId());
295 EXPECT_FALSE(mDisplay->isSecure());
296 EXPECT_FALSE(mDisplay->isVirtual());
297 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
298 EXPECT_FALSE(mDisplay->getState().layerStackInternal);
299 EXPECT_FALSE(mDisplay->isValid());
300}
301
302TEST_F(DisplaySetConfigurationTest, configuresHwcBackedVirtualDisplay) {
303 EXPECT_CALL(mHwComposer,
304 allocateVirtualDisplay(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH,
305 Pointee(Eq(static_cast<ui::PixelFormat>(
306 PIXEL_FORMAT_RGBA_8888)))))
307 .WillOnce(Return(VIRTUAL_DISPLAY_ID));
308
309 mDisplay->setConfiguration(
310 DisplayCreationArgsBuilder()
311 .setUseHwcVirtualDisplays(true)
312 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
313 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
314 .setIsSecure(false)
315 .setLayerStackId(DEFAULT_LAYER_STACK)
316 .setPowerAdvisor(&mPowerAdvisor)
317 .setName(getDisplayNameFromCurrentTest())
318 .build());
319
320 EXPECT_EQ(VIRTUAL_DISPLAY_ID, mDisplay->getId());
321 EXPECT_FALSE(mDisplay->isSecure());
322 EXPECT_TRUE(mDisplay->isVirtual());
323 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
324 EXPECT_FALSE(mDisplay->getState().layerStackInternal);
325 EXPECT_FALSE(mDisplay->isValid());
326}
327
328TEST_F(DisplaySetConfigurationTest, configuresNonHwcBackedVirtualDisplayIfHwcAllocationFails) {
329 EXPECT_CALL(mHwComposer,
330 allocateVirtualDisplay(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH,
331 Pointee(Eq(static_cast<ui::PixelFormat>(
332 PIXEL_FORMAT_RGBA_8888)))))
333 .WillOnce(Return(std::nullopt));
334
335 mDisplay->setConfiguration(
336 DisplayCreationArgsBuilder()
337 .setUseHwcVirtualDisplays(true)
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200338 .setGpuVirtualDisplayIdGenerator(mGpuDisplayIdGenerator)
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700339 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
340 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
341 .setIsSecure(false)
342 .setLayerStackId(DEFAULT_LAYER_STACK)
343 .setPowerAdvisor(&mPowerAdvisor)
344 .setName(getDisplayNameFromCurrentTest())
345 .build());
346
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200347 EXPECT_TRUE(GpuVirtualDisplayId::tryCast(mDisplay->getId()));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700348 EXPECT_FALSE(mDisplay->isSecure());
349 EXPECT_TRUE(mDisplay->isVirtual());
350 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
351 EXPECT_FALSE(mDisplay->getState().layerStackInternal);
352 EXPECT_FALSE(mDisplay->isValid());
353}
354
355TEST_F(DisplaySetConfigurationTest, configuresNonHwcBackedVirtualDisplayIfShouldNotUseHwc) {
356 mDisplay->setConfiguration(
357 DisplayCreationArgsBuilder()
358 .setUseHwcVirtualDisplays(false)
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200359 .setGpuVirtualDisplayIdGenerator(mGpuDisplayIdGenerator)
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700360 .setPixels(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH))
361 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
362 .setIsSecure(false)
363 .setLayerStackId(DEFAULT_LAYER_STACK)
364 .setPowerAdvisor(&mPowerAdvisor)
365 .setName(getDisplayNameFromCurrentTest())
366 .build());
367
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200368 EXPECT_TRUE(GpuVirtualDisplayId::tryCast(mDisplay->getId()));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700369 EXPECT_FALSE(mDisplay->isSecure());
370 EXPECT_TRUE(mDisplay->isVirtual());
371 EXPECT_EQ(DEFAULT_LAYER_STACK, mDisplay->getState().layerStackId);
372 EXPECT_FALSE(mDisplay->getState().layerStackInternal);
373 EXPECT_FALSE(mDisplay->isValid());
Lloyd Pique45a165a2018-10-19 11:54:47 -0700374}
375
Lloyd Pique66d68602019-02-13 14:23:31 -0800376/*
Lloyd Pique45a165a2018-10-19 11:54:47 -0700377 * Display::disconnect()
378 */
379
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700380using DisplayDisconnectTest = PartialMockDisplayTestCommon;
381
382TEST_F(DisplayDisconnectTest, disconnectsDisplay) {
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200383 // The first call to disconnect will disconnect the display with the HWC.
384 EXPECT_CALL(mHwComposer, disconnectDisplay(HalDisplayId(DEFAULT_DISPLAY_ID))).Times(1);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700385 mDisplay->disconnect();
Lloyd Pique45a165a2018-10-19 11:54:47 -0700386
387 // Subsequent calls will do nothing,
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200388 EXPECT_CALL(mHwComposer, disconnectDisplay(HalDisplayId(DEFAULT_DISPLAY_ID))).Times(0);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700389 mDisplay->disconnect();
Lloyd Pique45a165a2018-10-19 11:54:47 -0700390}
391
Lloyd Pique66d68602019-02-13 14:23:31 -0800392/*
Lloyd Pique32cbe282018-10-19 13:09:22 -0700393 * Display::setColorTransform()
394 */
395
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700396using DisplaySetColorTransformTest = PartialMockDisplayTestCommon;
397
398TEST_F(DisplaySetColorTransformTest, setsTransform) {
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800399 // No change does nothing
400 CompositionRefreshArgs refreshArgs;
401 refreshArgs.colorTransformMatrix = std::nullopt;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700402 mDisplay->setColorTransform(refreshArgs);
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800403
Lloyd Pique32cbe282018-10-19 13:09:22 -0700404 // Identity matrix sets an identity state value
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800405 const mat4 kIdentity;
Lloyd Pique32cbe282018-10-19 13:09:22 -0700406
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200407 EXPECT_CALL(mHwComposer, setColorTransform(HalDisplayId(DEFAULT_DISPLAY_ID), kIdentity))
408 .Times(1);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700409
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800410 refreshArgs.colorTransformMatrix = kIdentity;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700411 mDisplay->setColorTransform(refreshArgs);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700412
413 // Non-identity matrix sets a non-identity state value
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800414 const mat4 kNonIdentity = mat4() * 2;
Lloyd Pique32cbe282018-10-19 13:09:22 -0700415
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200416 EXPECT_CALL(mHwComposer, setColorTransform(HalDisplayId(DEFAULT_DISPLAY_ID), kNonIdentity))
417 .Times(1);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700418
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800419 refreshArgs.colorTransformMatrix = kNonIdentity;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700420 mDisplay->setColorTransform(refreshArgs);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700421}
422
Lloyd Pique66d68602019-02-13 14:23:31 -0800423/*
Lloyd Pique32cbe282018-10-19 13:09:22 -0700424 * Display::setColorMode()
425 */
426
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700427using DisplaySetColorModeTest = PartialMockDisplayTestCommon;
428
429TEST_F(DisplaySetColorModeTest, setsModeUnlessNoChange) {
Lloyd Pique6a3b4462019-03-07 20:58:12 -0800430 using ColorProfile = Output::ColorProfile;
431
Lloyd Pique31cb2942018-10-19 17:23:03 -0700432 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700433 mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
Lloyd Piquef5275482019-01-29 18:42:42 -0800434 mock::DisplayColorProfile* colorProfile = new StrictMock<mock::DisplayColorProfile>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700435 mDisplay->setDisplayColorProfileForTest(std::unique_ptr<DisplayColorProfile>(colorProfile));
Lloyd Pique31cb2942018-10-19 17:23:03 -0700436
Lloyd Piquef5275482019-01-29 18:42:42 -0800437 EXPECT_CALL(*colorProfile, getTargetDataspace(_, _, _))
438 .WillRepeatedly(Return(ui::Dataspace::UNKNOWN));
Lloyd Pique32cbe282018-10-19 13:09:22 -0700439
440 // These values are expected to be the initial state.
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700441 ASSERT_EQ(ui::ColorMode::NATIVE, mDisplay->getState().colorMode);
442 ASSERT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().dataspace);
443 ASSERT_EQ(ui::RenderIntent::COLORIMETRIC, mDisplay->getState().renderIntent);
444 ASSERT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().targetDataspace);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700445
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700446 // Otherwise if the values are unchanged, nothing happens
447 mDisplay->setColorProfile(ColorProfile{ui::ColorMode::NATIVE, ui::Dataspace::UNKNOWN,
448 ui::RenderIntent::COLORIMETRIC, ui::Dataspace::UNKNOWN});
Lloyd Pique32cbe282018-10-19 13:09:22 -0700449
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700450 EXPECT_EQ(ui::ColorMode::NATIVE, mDisplay->getState().colorMode);
451 EXPECT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().dataspace);
452 EXPECT_EQ(ui::RenderIntent::COLORIMETRIC, mDisplay->getState().renderIntent);
453 EXPECT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().targetDataspace);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700454
455 // Otherwise if the values are different, updates happen
Lloyd Piqueef958122019-02-05 18:00:12 -0800456 EXPECT_CALL(*renderSurface, setBufferDataspace(ui::Dataspace::DISPLAY_P3)).Times(1);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700457 EXPECT_CALL(mHwComposer,
Lloyd Piqueef958122019-02-05 18:00:12 -0800458 setActiveColorMode(DEFAULT_DISPLAY_ID, ui::ColorMode::DISPLAY_P3,
Lloyd Pique32cbe282018-10-19 13:09:22 -0700459 ui::RenderIntent::TONE_MAP_COLORIMETRIC))
460 .Times(1);
461
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700462 mDisplay->setColorProfile(ColorProfile{ui::ColorMode::DISPLAY_P3, ui::Dataspace::DISPLAY_P3,
463 ui::RenderIntent::TONE_MAP_COLORIMETRIC,
464 ui::Dataspace::UNKNOWN});
Lloyd Pique32cbe282018-10-19 13:09:22 -0700465
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700466 EXPECT_EQ(ui::ColorMode::DISPLAY_P3, mDisplay->getState().colorMode);
467 EXPECT_EQ(ui::Dataspace::DISPLAY_P3, mDisplay->getState().dataspace);
468 EXPECT_EQ(ui::RenderIntent::TONE_MAP_COLORIMETRIC, mDisplay->getState().renderIntent);
469 EXPECT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().targetDataspace);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700470}
471
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700472TEST_F(DisplaySetColorModeTest, doesNothingForVirtualDisplay) {
Lloyd Pique6a3b4462019-03-07 20:58:12 -0800473 using ColorProfile = Output::ColorProfile;
474
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700475 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
476 std::shared_ptr<impl::Display> virtualDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700477
Lloyd Piquef5275482019-01-29 18:42:42 -0800478 mock::DisplayColorProfile* colorProfile = new StrictMock<mock::DisplayColorProfile>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700479 virtualDisplay->setDisplayColorProfileForTest(
Lloyd Piquef5275482019-01-29 18:42:42 -0800480 std::unique_ptr<DisplayColorProfile>(colorProfile));
481
482 EXPECT_CALL(*colorProfile,
483 getTargetDataspace(ui::ColorMode::DISPLAY_P3, ui::Dataspace::DISPLAY_P3,
484 ui::Dataspace::UNKNOWN))
485 .WillOnce(Return(ui::Dataspace::UNKNOWN));
486
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700487 virtualDisplay->setColorProfile(
Lloyd Pique6a3b4462019-03-07 20:58:12 -0800488 ColorProfile{ui::ColorMode::DISPLAY_P3, ui::Dataspace::DISPLAY_P3,
489 ui::RenderIntent::TONE_MAP_COLORIMETRIC, ui::Dataspace::UNKNOWN});
Lloyd Pique32cbe282018-10-19 13:09:22 -0700490
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700491 EXPECT_EQ(ui::ColorMode::NATIVE, virtualDisplay->getState().colorMode);
492 EXPECT_EQ(ui::Dataspace::UNKNOWN, virtualDisplay->getState().dataspace);
493 EXPECT_EQ(ui::RenderIntent::COLORIMETRIC, virtualDisplay->getState().renderIntent);
494 EXPECT_EQ(ui::Dataspace::UNKNOWN, virtualDisplay->getState().targetDataspace);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700495}
496
Lloyd Pique66d68602019-02-13 14:23:31 -0800497/*
Lloyd Pique3d0c02e2018-10-19 18:38:12 -0700498 * Display::createDisplayColorProfile()
499 */
500
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700501using DisplayCreateColorProfileTest = PartialMockDisplayTestCommon;
502
503TEST_F(DisplayCreateColorProfileTest, setsDisplayColorProfile) {
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700504 EXPECT_TRUE(mDisplay->getDisplayColorProfile() == nullptr);
505 mDisplay->createDisplayColorProfile(
Lloyd Pique3d0c02e2018-10-19 18:38:12 -0700506 DisplayColorProfileCreationArgs{false, HdrCapabilities(), 0,
507 DisplayColorProfileCreationArgs::HwcColorModes()});
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700508 EXPECT_TRUE(mDisplay->getDisplayColorProfile() != nullptr);
Lloyd Pique3d0c02e2018-10-19 18:38:12 -0700509}
510
Lloyd Pique66d68602019-02-13 14:23:31 -0800511/*
Lloyd Pique31cb2942018-10-19 17:23:03 -0700512 * Display::createRenderSurface()
513 */
514
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700515using DisplayCreateRenderSurfaceTest = PartialMockDisplayTestCommon;
516
517TEST_F(DisplayCreateRenderSurfaceTest, setsRenderSurface) {
chaviw8beb4142019-04-11 13:09:05 -0700518 EXPECT_CALL(*mNativeWindow, disconnect(NATIVE_WINDOW_API_EGL)).WillRepeatedly(Return(NO_ERROR));
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700519 EXPECT_TRUE(mDisplay->getRenderSurface() == nullptr);
520 mDisplay->createRenderSurface(RenderSurfaceCreationArgs{640, 480, mNativeWindow, nullptr});
521 EXPECT_TRUE(mDisplay->getRenderSurface() != nullptr);
Lloyd Pique31cb2942018-10-19 17:23:03 -0700522}
523
Lloyd Pique66d68602019-02-13 14:23:31 -0800524/*
Lloyd Piquedf336d92019-03-07 21:38:42 -0800525 * Display::createOutputLayer()
526 */
527
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700528using DisplayCreateOutputLayerTest = FullDisplayImplTestCommon;
529
530TEST_F(DisplayCreateOutputLayerTest, setsHwcLayer) {
Lloyd Piquedf336d92019-03-07 21:38:42 -0800531 sp<mock::LayerFE> layerFE = new StrictMock<mock::LayerFE>();
Lloyd Piquedf336d92019-03-07 21:38:42 -0800532 StrictMock<HWC2::mock::Layer> hwcLayer;
533
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200534 EXPECT_CALL(mHwComposer, createLayer(HalDisplayId(DEFAULT_DISPLAY_ID)))
535 .WillOnce(Return(&hwcLayer));
Lloyd Piquedf336d92019-03-07 21:38:42 -0800536
Lloyd Piquede196652020-01-22 17:29:58 -0800537 auto outputLayer = mDisplay->createOutputLayer(layerFE);
Lloyd Piquedf336d92019-03-07 21:38:42 -0800538
539 EXPECT_EQ(&hwcLayer, outputLayer->getHwcLayer());
540
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200541 EXPECT_CALL(mHwComposer, destroyLayer(HalDisplayId(DEFAULT_DISPLAY_ID), &hwcLayer));
Lloyd Piquedf336d92019-03-07 21:38:42 -0800542 outputLayer.reset();
543}
544
545/*
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800546 * Display::setReleasedLayers()
547 */
548
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700549using DisplaySetReleasedLayersTest = DisplayWithLayersTestCommon;
550
551TEST_F(DisplaySetReleasedLayersTest, doesNothingIfNotHwcDisplay) {
552 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
553 std::shared_ptr<impl::Display> nonHwcDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800554
555 sp<mock::LayerFE> layerXLayerFE = new StrictMock<mock::LayerFE>();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800556
557 {
558 Output::ReleasedLayers releasedLayers;
559 releasedLayers.emplace_back(layerXLayerFE);
560 nonHwcDisplay->setReleasedLayers(std::move(releasedLayers));
561 }
562
563 CompositionRefreshArgs refreshArgs;
Lloyd Piquede196652020-01-22 17:29:58 -0800564 refreshArgs.layersWithQueuedFrames.push_back(layerXLayerFE);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800565
566 nonHwcDisplay->setReleasedLayers(refreshArgs);
567
568 const auto& releasedLayers = nonHwcDisplay->getReleasedLayersForTest();
569 ASSERT_EQ(1, releasedLayers.size());
570}
571
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700572TEST_F(DisplaySetReleasedLayersTest, doesNothingIfNoLayersWithQueuedFrames) {
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800573 sp<mock::LayerFE> layerXLayerFE = new StrictMock<mock::LayerFE>();
574
575 {
576 Output::ReleasedLayers releasedLayers;
577 releasedLayers.emplace_back(layerXLayerFE);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700578 mDisplay->setReleasedLayers(std::move(releasedLayers));
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800579 }
580
581 CompositionRefreshArgs refreshArgs;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700582 mDisplay->setReleasedLayers(refreshArgs);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800583
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700584 const auto& releasedLayers = mDisplay->getReleasedLayersForTest();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800585 ASSERT_EQ(1, releasedLayers.size());
586}
587
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700588TEST_F(DisplaySetReleasedLayersTest, setReleasedLayers) {
Lloyd Piquede196652020-01-22 17:29:58 -0800589 sp<mock::LayerFE> unknownLayer = new StrictMock<mock::LayerFE>();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800590
591 CompositionRefreshArgs refreshArgs;
Lloyd Piquede196652020-01-22 17:29:58 -0800592 refreshArgs.layersWithQueuedFrames.push_back(mLayer1.layerFE);
593 refreshArgs.layersWithQueuedFrames.push_back(mLayer2.layerFE);
594 refreshArgs.layersWithQueuedFrames.push_back(unknownLayer);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800595
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700596 mDisplay->setReleasedLayers(refreshArgs);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800597
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700598 const auto& releasedLayers = mDisplay->getReleasedLayersForTest();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800599 ASSERT_EQ(2, releasedLayers.size());
Lloyd Piquede196652020-01-22 17:29:58 -0800600 ASSERT_EQ(mLayer1.layerFE.get(), releasedLayers[0].promote().get());
601 ASSERT_EQ(mLayer2.layerFE.get(), releasedLayers[1].promote().get());
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800602}
603
604/*
Lloyd Pique66d68602019-02-13 14:23:31 -0800605 * Display::chooseCompositionStrategy()
606 */
607
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700608using DisplayChooseCompositionStrategyTest = PartialMockDisplayTestCommon;
Lloyd Pique66d68602019-02-13 14:23:31 -0800609
610TEST_F(DisplayChooseCompositionStrategyTest, takesEarlyOutIfNotAHwcDisplay) {
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700611 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
612 std::shared_ptr<Display> nonHwcDisplay =
613 createPartialMockDisplay<Display>(mCompositionEngine, args);
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200614 EXPECT_TRUE(GpuVirtualDisplayId::tryCast(nonHwcDisplay->getId()));
Lloyd Pique66d68602019-02-13 14:23:31 -0800615
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700616 nonHwcDisplay->chooseCompositionStrategy();
Lloyd Pique66d68602019-02-13 14:23:31 -0800617
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700618 auto& state = nonHwcDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800619 EXPECT_TRUE(state.usesClientComposition);
620 EXPECT_FALSE(state.usesDeviceComposition);
621}
622
623TEST_F(DisplayChooseCompositionStrategyTest, takesEarlyOutOnHwcError) {
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700624 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition()).WillOnce(Return(false));
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200625 EXPECT_CALL(mHwComposer,
626 getDeviceCompositionChanges(HalDisplayId(DEFAULT_DISPLAY_ID), false, _))
Lloyd Pique66d68602019-02-13 14:23:31 -0800627 .WillOnce(Return(INVALID_OPERATION));
628
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700629 mDisplay->chooseCompositionStrategy();
Lloyd Pique66d68602019-02-13 14:23:31 -0800630
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700631 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800632 EXPECT_TRUE(state.usesClientComposition);
633 EXPECT_FALSE(state.usesDeviceComposition);
634}
635
636TEST_F(DisplayChooseCompositionStrategyTest, normalOperation) {
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700637 // Since two calls are made to anyLayersRequireClientComposition with different return
638 // values, use a Sequence to control the matching so the values are returned in a known
639 // order.
Lloyd Pique66d68602019-02-13 14:23:31 -0800640 Sequence s;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700641 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
642 .InSequence(s)
643 .WillOnce(Return(true));
644 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
Lloyd Pique66d68602019-02-13 14:23:31 -0800645 .InSequence(s)
646 .WillOnce(Return(false));
647
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200648 EXPECT_CALL(mHwComposer, getDeviceCompositionChanges(HalDisplayId(DEFAULT_DISPLAY_ID), true, _))
Lloyd Pique66d68602019-02-13 14:23:31 -0800649 .WillOnce(Return(NO_ERROR));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700650 EXPECT_CALL(*mDisplay, allLayersRequireClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800651
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700652 mDisplay->chooseCompositionStrategy();
Lloyd Pique66d68602019-02-13 14:23:31 -0800653
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700654 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800655 EXPECT_FALSE(state.usesClientComposition);
656 EXPECT_TRUE(state.usesDeviceComposition);
657}
658
659TEST_F(DisplayChooseCompositionStrategyTest, normalOperationWithChanges) {
660 android::HWComposer::DeviceRequestedChanges changes{
Peiyong Line9d809e2020-04-14 13:10:48 -0700661 {{nullptr, hal::Composition::CLIENT}},
662 hal::DisplayRequest::FLIP_CLIENT_TARGET,
663 {{nullptr, hal::LayerRequest::CLEAR_CLIENT_TARGET}},
Peiyong Lindfc3f7c2020-05-07 20:15:50 -0700664 {hal::PixelFormat::RGBA_8888, hal::Dataspace::UNKNOWN},
Lloyd Pique66d68602019-02-13 14:23:31 -0800665 };
666
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700667 // Since two calls are made to anyLayersRequireClientComposition with different return
668 // values, use a Sequence to control the matching so the values are returned in a known
669 // order.
Lloyd Pique66d68602019-02-13 14:23:31 -0800670 Sequence s;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700671 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
672 .InSequence(s)
673 .WillOnce(Return(true));
674 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
Lloyd Pique66d68602019-02-13 14:23:31 -0800675 .InSequence(s)
676 .WillOnce(Return(false));
677
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200678 EXPECT_CALL(mHwComposer, getDeviceCompositionChanges(HalDisplayId(DEFAULT_DISPLAY_ID), true, _))
Lloyd Pique66d68602019-02-13 14:23:31 -0800679 .WillOnce(DoAll(SetArgPointee<2>(changes), Return(NO_ERROR)));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700680 EXPECT_CALL(*mDisplay, applyChangedTypesToLayers(changes.changedTypes)).Times(1);
681 EXPECT_CALL(*mDisplay, applyDisplayRequests(changes.displayRequests)).Times(1);
682 EXPECT_CALL(*mDisplay, applyLayerRequestsToLayers(changes.layerRequests)).Times(1);
683 EXPECT_CALL(*mDisplay, allLayersRequireClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800684
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700685 mDisplay->chooseCompositionStrategy();
Lloyd Pique66d68602019-02-13 14:23:31 -0800686
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700687 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800688 EXPECT_FALSE(state.usesClientComposition);
689 EXPECT_TRUE(state.usesDeviceComposition);
690}
691
692/*
Lloyd Pique688abd42019-02-15 15:42:24 -0800693 * Display::getSkipColorTransform()
694 */
695
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700696using DisplayGetSkipColorTransformTest = DisplayWithLayersTestCommon;
697
Dominik Laskowski1162e472020-04-02 19:02:47 -0700698TEST_F(DisplayGetSkipColorTransformTest, checksCapabilityIfNonHwcDisplay) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700699 EXPECT_CALL(mHwComposer, hasCapability(hal::Capability::SKIP_CLIENT_COLOR_TRANSFORM))
Dominik Laskowski1162e472020-04-02 19:02:47 -0700700 .WillOnce(Return(true));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700701 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
702 auto nonHwcDisplay{impl::createDisplay(mCompositionEngine, args)};
Dominik Laskowski1162e472020-04-02 19:02:47 -0700703 EXPECT_TRUE(nonHwcDisplay->getSkipColorTransform());
Lloyd Pique688abd42019-02-15 15:42:24 -0800704}
705
Dominik Laskowski1162e472020-04-02 19:02:47 -0700706TEST_F(DisplayGetSkipColorTransformTest, checksDisplayCapability) {
Lloyd Pique688abd42019-02-15 15:42:24 -0800707 EXPECT_CALL(mHwComposer,
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200708 hasDisplayCapability(HalDisplayId(DEFAULT_DISPLAY_ID),
Peiyong Line9d809e2020-04-14 13:10:48 -0700709 hal::DisplayCapability::SKIP_CLIENT_COLOR_TRANSFORM))
Lloyd Pique688abd42019-02-15 15:42:24 -0800710 .WillOnce(Return(true));
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700711 EXPECT_TRUE(mDisplay->getSkipColorTransform());
Lloyd Pique688abd42019-02-15 15:42:24 -0800712}
713
714/*
Lloyd Pique66d68602019-02-13 14:23:31 -0800715 * Display::anyLayersRequireClientComposition()
716 */
717
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700718using DisplayAnyLayersRequireClientCompositionTest = DisplayWithLayersTestCommon;
719
720TEST_F(DisplayAnyLayersRequireClientCompositionTest, returnsFalse) {
Lloyd Piquede196652020-01-22 17:29:58 -0800721 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(false));
722 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(false));
723 EXPECT_CALL(*mLayer3.outputLayer, requiresClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800724
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700725 EXPECT_FALSE(mDisplay->anyLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800726}
727
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700728TEST_F(DisplayAnyLayersRequireClientCompositionTest, returnsTrue) {
Lloyd Piquede196652020-01-22 17:29:58 -0800729 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(false));
730 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(true));
Lloyd Pique66d68602019-02-13 14:23:31 -0800731
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700732 EXPECT_TRUE(mDisplay->anyLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800733}
734
735/*
736 * Display::allLayersRequireClientComposition()
737 */
738
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700739using DisplayAllLayersRequireClientCompositionTest = DisplayWithLayersTestCommon;
740
741TEST_F(DisplayAllLayersRequireClientCompositionTest, returnsTrue) {
Lloyd Piquede196652020-01-22 17:29:58 -0800742 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(true));
743 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(true));
744 EXPECT_CALL(*mLayer3.outputLayer, requiresClientComposition()).WillOnce(Return(true));
Lloyd Pique66d68602019-02-13 14:23:31 -0800745
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700746 EXPECT_TRUE(mDisplay->allLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800747}
748
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700749TEST_F(DisplayAllLayersRequireClientCompositionTest, returnsFalse) {
Lloyd Piquede196652020-01-22 17:29:58 -0800750 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(true));
751 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800752
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700753 EXPECT_FALSE(mDisplay->allLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800754}
755
756/*
757 * Display::applyChangedTypesToLayers()
758 */
759
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700760using DisplayApplyChangedTypesToLayersTest = DisplayWithLayersTestCommon;
761
762TEST_F(DisplayApplyChangedTypesToLayersTest, takesEarlyOutIfNoChangedLayers) {
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700763 mDisplay->applyChangedTypesToLayers(impl::Display::ChangedTypes());
Lloyd Pique66d68602019-02-13 14:23:31 -0800764}
765
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700766TEST_F(DisplayApplyChangedTypesToLayersTest, appliesChanges) {
Lloyd Piquede196652020-01-22 17:29:58 -0800767 EXPECT_CALL(*mLayer1.outputLayer,
Lloyd Pique66d68602019-02-13 14:23:31 -0800768 applyDeviceCompositionTypeChange(Hwc2::IComposerClient::Composition::CLIENT))
769 .Times(1);
Lloyd Piquede196652020-01-22 17:29:58 -0800770 EXPECT_CALL(*mLayer2.outputLayer,
Lloyd Pique66d68602019-02-13 14:23:31 -0800771 applyDeviceCompositionTypeChange(Hwc2::IComposerClient::Composition::DEVICE))
772 .Times(1);
773
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700774 mDisplay->applyChangedTypesToLayers(impl::Display::ChangedTypes{
Peiyong Line9d809e2020-04-14 13:10:48 -0700775 {&mLayer1.hwc2Layer, hal::Composition::CLIENT},
776 {&mLayer2.hwc2Layer, hal::Composition::DEVICE},
777 {&hwc2LayerUnknown, hal::Composition::SOLID_COLOR},
Lloyd Pique66d68602019-02-13 14:23:31 -0800778 });
779}
780
781/*
782 * Display::applyDisplayRequests()
783 */
784
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700785using DisplayApplyDisplayRequestsTest = DisplayWithLayersTestCommon;
786
787TEST_F(DisplayApplyDisplayRequestsTest, handlesNoRequests) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700788 mDisplay->applyDisplayRequests(static_cast<hal::DisplayRequest>(0));
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_FALSE(state.flipClientTarget);
792}
793
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700794TEST_F(DisplayApplyDisplayRequestsTest, handlesFlipClientTarget) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700795 mDisplay->applyDisplayRequests(hal::DisplayRequest::FLIP_CLIENT_TARGET);
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_TRUE(state.flipClientTarget);
799}
800
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700801TEST_F(DisplayApplyDisplayRequestsTest, handlesWriteClientTargetToOutput) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700802 mDisplay->applyDisplayRequests(hal::DisplayRequest::WRITE_CLIENT_TARGET_TO_OUTPUT);
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_FALSE(state.flipClientTarget);
806}
807
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700808TEST_F(DisplayApplyDisplayRequestsTest, handlesAllRequestFlagsSet) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700809 mDisplay->applyDisplayRequests(static_cast<hal::DisplayRequest>(~0));
Lloyd Pique66d68602019-02-13 14:23:31 -0800810
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700811 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800812 EXPECT_TRUE(state.flipClientTarget);
813}
814
815/*
816 * Display::applyLayerRequestsToLayers()
817 */
818
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700819using DisplayApplyLayerRequestsToLayersTest = DisplayWithLayersTestCommon;
820
821TEST_F(DisplayApplyLayerRequestsToLayersTest, preparesAllLayers) {
Lloyd Piquede196652020-01-22 17:29:58 -0800822 EXPECT_CALL(*mLayer1.outputLayer, prepareForDeviceLayerRequests()).Times(1);
823 EXPECT_CALL(*mLayer2.outputLayer, prepareForDeviceLayerRequests()).Times(1);
824 EXPECT_CALL(*mLayer3.outputLayer, prepareForDeviceLayerRequests()).Times(1);
Lloyd Pique66d68602019-02-13 14:23:31 -0800825
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700826 mDisplay->applyLayerRequestsToLayers(impl::Display::LayerRequests());
Lloyd Pique66d68602019-02-13 14:23:31 -0800827}
828
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700829TEST_F(DisplayApplyLayerRequestsToLayersTest, appliesDeviceLayerRequests) {
Lloyd Piquede196652020-01-22 17:29:58 -0800830 EXPECT_CALL(*mLayer1.outputLayer, prepareForDeviceLayerRequests()).Times(1);
831 EXPECT_CALL(*mLayer2.outputLayer, prepareForDeviceLayerRequests()).Times(1);
832 EXPECT_CALL(*mLayer3.outputLayer, prepareForDeviceLayerRequests()).Times(1);
Lloyd Pique66d68602019-02-13 14:23:31 -0800833
Lloyd Piquede196652020-01-22 17:29:58 -0800834 EXPECT_CALL(*mLayer1.outputLayer,
Lloyd Pique66d68602019-02-13 14:23:31 -0800835 applyDeviceLayerRequest(Hwc2::IComposerClient::LayerRequest::CLEAR_CLIENT_TARGET))
836 .Times(1);
837
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700838 mDisplay->applyLayerRequestsToLayers(impl::Display::LayerRequests{
Peiyong Line9d809e2020-04-14 13:10:48 -0700839 {&mLayer1.hwc2Layer, hal::LayerRequest::CLEAR_CLIENT_TARGET},
840 {&hwc2LayerUnknown, hal::LayerRequest::CLEAR_CLIENT_TARGET},
Lloyd Pique66d68602019-02-13 14:23:31 -0800841 });
842}
843
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800844/*
845 * Display::presentAndGetFrameFences()
846 */
847
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700848using DisplayPresentAndGetFrameFencesTest = DisplayWithLayersTestCommon;
849
850TEST_F(DisplayPresentAndGetFrameFencesTest, returnsNoFencesOnNonHwcDisplay) {
851 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
852 auto nonHwcDisplay{impl::createDisplay(mCompositionEngine, args)};
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800853
854 auto result = nonHwcDisplay->presentAndGetFrameFences();
855
856 ASSERT_TRUE(result.presentFence.get());
857 EXPECT_FALSE(result.presentFence->isValid());
858 EXPECT_EQ(0u, result.layerFences.size());
859}
860
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700861TEST_F(DisplayPresentAndGetFrameFencesTest, returnsPresentAndLayerFences) {
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800862 sp<Fence> presentFence = new Fence();
863 sp<Fence> layer1Fence = new Fence();
864 sp<Fence> layer2Fence = new Fence();
865
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200866 EXPECT_CALL(mHwComposer, presentAndGetReleaseFences(HalDisplayId(DEFAULT_DISPLAY_ID))).Times(1);
867 EXPECT_CALL(mHwComposer, getPresentFence(HalDisplayId(DEFAULT_DISPLAY_ID)))
868 .WillOnce(Return(presentFence));
869 EXPECT_CALL(mHwComposer,
870 getLayerReleaseFence(HalDisplayId(DEFAULT_DISPLAY_ID), &mLayer1.hwc2Layer))
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800871 .WillOnce(Return(layer1Fence));
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200872 EXPECT_CALL(mHwComposer,
873 getLayerReleaseFence(HalDisplayId(DEFAULT_DISPLAY_ID), &mLayer2.hwc2Layer))
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800874 .WillOnce(Return(layer2Fence));
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200875 EXPECT_CALL(mHwComposer, clearReleaseFences(HalDisplayId(DEFAULT_DISPLAY_ID))).Times(1);
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800876
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700877 auto result = mDisplay->presentAndGetFrameFences();
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800878
879 EXPECT_EQ(presentFence, result.presentFence);
880
881 EXPECT_EQ(2u, result.layerFences.size());
Lloyd Piquede196652020-01-22 17:29:58 -0800882 ASSERT_EQ(1, result.layerFences.count(&mLayer1.hwc2Layer));
883 EXPECT_EQ(layer1Fence, result.layerFences[&mLayer1.hwc2Layer]);
884 ASSERT_EQ(1, result.layerFences.count(&mLayer2.hwc2Layer));
885 EXPECT_EQ(layer2Fence, result.layerFences[&mLayer2.hwc2Layer]);
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800886}
887
Lloyd Pique688abd42019-02-15 15:42:24 -0800888/*
889 * Display::setExpensiveRenderingExpected()
890 */
891
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700892using DisplaySetExpensiveRenderingExpectedTest = DisplayWithLayersTestCommon;
893
894TEST_F(DisplaySetExpensiveRenderingExpectedTest, forwardsToPowerAdvisor) {
Lloyd Pique688abd42019-02-15 15:42:24 -0800895 EXPECT_CALL(mPowerAdvisor, setExpensiveRenderingExpected(DEFAULT_DISPLAY_ID, true)).Times(1);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700896 mDisplay->setExpensiveRenderingExpected(true);
Lloyd Pique688abd42019-02-15 15:42:24 -0800897
898 EXPECT_CALL(mPowerAdvisor, setExpensiveRenderingExpected(DEFAULT_DISPLAY_ID, false)).Times(1);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700899 mDisplay->setExpensiveRenderingExpected(false);
Lloyd Pique688abd42019-02-15 15:42:24 -0800900}
901
Lloyd Piqued3d69882019-02-28 16:03:46 -0800902/*
903 * Display::finishFrame()
904 */
905
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700906using DisplayFinishFrameTest = DisplayWithLayersTestCommon;
907
908TEST_F(DisplayFinishFrameTest, doesNotSkipCompositionIfNotDirtyOnHwcDisplay) {
Lloyd Piqued3d69882019-02-28 16:03:46 -0800909 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700910 mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
Lloyd Piqued3d69882019-02-28 16:03:46 -0800911
912 // We expect no calls to queueBuffer if composition was skipped.
913 EXPECT_CALL(*renderSurface, queueBuffer(_)).Times(1);
914
Lloyd Piquea76ce462020-01-14 13:06:37 -0800915 // Expect a call to signal no expensive rendering since there is no client composition.
916 EXPECT_CALL(mPowerAdvisor, setExpensiveRenderingExpected(DEFAULT_DISPLAY_ID, false));
917
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700918 mDisplay->editState().isEnabled = true;
919 mDisplay->editState().usesClientComposition = false;
Marin Shalamanov6ad317c2020-07-29 23:34:07 +0200920 mDisplay->editState().layerStackSpace.content = Rect(0, 0, 1, 1);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700921 mDisplay->editState().dirtyRegion = Region::INVALID_REGION;
Lloyd Piqued3d69882019-02-28 16:03:46 -0800922
923 CompositionRefreshArgs refreshArgs;
924 refreshArgs.repaintEverything = false;
925
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700926 mDisplay->finishFrame(refreshArgs);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800927}
928
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700929TEST_F(DisplayFinishFrameTest, skipsCompositionIfNotDirty) {
930 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
931 std::shared_ptr<impl::Display> nonHwcDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800932
933 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
934 nonHwcDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
935
936 // We expect no calls to queueBuffer if composition was skipped.
937 EXPECT_CALL(*renderSurface, queueBuffer(_)).Times(0);
938
939 nonHwcDisplay->editState().isEnabled = true;
940 nonHwcDisplay->editState().usesClientComposition = false;
Marin Shalamanov6ad317c2020-07-29 23:34:07 +0200941 nonHwcDisplay->editState().layerStackSpace.content = Rect(0, 0, 1, 1);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800942 nonHwcDisplay->editState().dirtyRegion = Region::INVALID_REGION;
943
944 CompositionRefreshArgs refreshArgs;
945 refreshArgs.repaintEverything = false;
946
947 nonHwcDisplay->finishFrame(refreshArgs);
948}
949
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700950TEST_F(DisplayFinishFrameTest, performsCompositionIfDirty) {
951 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
952 std::shared_ptr<impl::Display> nonHwcDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800953
954 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
955 nonHwcDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
956
957 // We expect a single call to queueBuffer when composition is not skipped.
958 EXPECT_CALL(*renderSurface, queueBuffer(_)).Times(1);
959
960 nonHwcDisplay->editState().isEnabled = true;
961 nonHwcDisplay->editState().usesClientComposition = false;
Marin Shalamanov6ad317c2020-07-29 23:34:07 +0200962 nonHwcDisplay->editState().layerStackSpace.content = Rect(0, 0, 1, 1);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800963 nonHwcDisplay->editState().dirtyRegion = Region(Rect(0, 0, 1, 1));
964
965 CompositionRefreshArgs refreshArgs;
966 refreshArgs.repaintEverything = false;
967
968 nonHwcDisplay->finishFrame(refreshArgs);
969}
970
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700971TEST_F(DisplayFinishFrameTest, performsCompositionIfRepaintEverything) {
972 auto args = getDisplayCreationArgsForNonHWCVirtualDisplay();
973 std::shared_ptr<impl::Display> nonHwcDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800974
975 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
976 nonHwcDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
977
978 // We expect a single call to queueBuffer when composition is not skipped.
979 EXPECT_CALL(*renderSurface, queueBuffer(_)).Times(1);
980
981 nonHwcDisplay->editState().isEnabled = true;
982 nonHwcDisplay->editState().usesClientComposition = false;
Marin Shalamanov6ad317c2020-07-29 23:34:07 +0200983 nonHwcDisplay->editState().layerStackSpace.content = Rect(0, 0, 1, 1);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800984 nonHwcDisplay->editState().dirtyRegion = Region::INVALID_REGION;
985
986 CompositionRefreshArgs refreshArgs;
987 refreshArgs.repaintEverything = true;
988
989 nonHwcDisplay->finishFrame(refreshArgs);
990}
991
Lloyd Piquec6607552019-12-02 17:57:39 -0800992/*
993 * Display functional tests
994 */
995
996struct DisplayFunctionalTest : public testing::Test {
997 class Display : public impl::Display {
998 public:
Lloyd Piquec6607552019-12-02 17:57:39 -0800999 using impl::Display::injectOutputLayerForTest;
1000 virtual void injectOutputLayerForTest(std::unique_ptr<compositionengine::OutputLayer>) = 0;
1001 };
1002
Lloyd Piquec6607552019-12-02 17:57:39 -08001003 DisplayFunctionalTest() {
1004 EXPECT_CALL(mCompositionEngine, getHwComposer()).WillRepeatedly(ReturnRef(mHwComposer));
1005
1006 mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(mRenderSurface));
1007 }
1008
1009 NiceMock<android::mock::HWComposer> mHwComposer;
1010 NiceMock<Hwc2::mock::PowerAdvisor> mPowerAdvisor;
1011 NiceMock<mock::CompositionEngine> mCompositionEngine;
1012 sp<mock::NativeWindow> mNativeWindow = new NiceMock<mock::NativeWindow>();
1013 sp<mock::DisplaySurface> mDisplaySurface = new NiceMock<mock::DisplaySurface>();
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -07001014 std::shared_ptr<Display> mDisplay = impl::createDisplayTemplated<
1015 Display>(mCompositionEngine,
1016 DisplayCreationArgsBuilder()
1017 .setPhysical({DEFAULT_DISPLAY_ID, DisplayConnectionType::Internal})
1018 .setPixels({DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT})
1019 .setPixelFormat(static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888))
1020 .setIsSecure(true)
1021 .setLayerStackId(DEFAULT_LAYER_STACK)
1022 .setPowerAdvisor(&mPowerAdvisor)
1023 .build()
1024
1025 );
Lloyd Piquec6607552019-12-02 17:57:39 -08001026 impl::RenderSurface* mRenderSurface =
1027 new impl::RenderSurface{mCompositionEngine, *mDisplay,
1028 RenderSurfaceCreationArgs{DEFAULT_DISPLAY_WIDTH,
1029 DEFAULT_DISPLAY_HEIGHT, mNativeWindow,
1030 mDisplaySurface}};
1031};
1032
1033TEST_F(DisplayFunctionalTest, postFramebufferCriticalCallsAreOrdered) {
1034 InSequence seq;
1035
1036 mDisplay->editState().isEnabled = true;
1037
1038 EXPECT_CALL(mHwComposer, presentAndGetReleaseFences(_));
1039 EXPECT_CALL(*mDisplaySurface, onFrameCommitted());
1040
1041 mDisplay->postFramebuffer();
1042}
1043
Lloyd Pique45a165a2018-10-19 11:54:47 -07001044} // namespace
1045} // namespace android::compositionengine