blob: a95a5c62fd0b0e46e6679bf7c4a306692667bffd [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>
Vishnu Naira3140382022-02-24 14:07:11 -080033#include <renderengine/mock/FakeExternalTexture.h>
Lloyd Piquee9eff972020-05-05 12:36:44 -070034#include <renderengine/mock/RenderEngine.h>
Vishnu Naira3140382022-02-24 14:07:11 -080035
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070036#include <ui/Rect.h>
Marin Shalamanov228f46b2021-01-28 21:11:45 +010037#include <ui/StaticDisplayInfo.h>
Lloyd Pique45a165a2018-10-19 11:54:47 -070038
Lloyd Pique66d68602019-02-13 14:23:31 -080039#include "MockHWC2.h"
Lloyd Pique45a165a2018-10-19 11:54:47 -070040#include "MockHWComposer.h"
Lloyd Pique688abd42019-02-15 15:42:24 -080041#include "MockPowerAdvisor.h"
Alec Mouricdf16792021-12-10 13:16:06 -080042#include "ftl/future.h"
Lloyd Pique45a165a2018-10-19 11:54:47 -070043
Leon Scroggins III2e1aa182021-12-01 17:33:12 -050044#include <aidl/android/hardware/graphics/composer3/Composition.h>
45
Ady Abrahamde549d42022-01-26 19:19:17 -080046using aidl::android::hardware::graphics::composer3::Capability;
Leon Scroggins III2e1aa182021-12-01 17:33:12 -050047using aidl::android::hardware::graphics::composer3::Composition;
Vishnu Naira3140382022-02-24 14:07:11 -080048using aidl::android::hardware::graphics::composer3::DimmingStage;
Leon Scroggins III2e1aa182021-12-01 17:33:12 -050049
Lloyd Pique45a165a2018-10-19 11:54:47 -070050namespace android::compositionengine {
51namespace {
52
Peiyong Line9d809e2020-04-14 13:10:48 -070053namespace hal = android::hardware::graphics::composer::hal;
54
Lloyd Piquef5275482019-01-29 18:42:42 -080055using testing::_;
Alec Mouricdf16792021-12-10 13:16:06 -080056using testing::ByMove;
Lloyd Pique66d68602019-02-13 14:23:31 -080057using testing::DoAll;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070058using testing::Eq;
Lloyd Piquec6607552019-12-02 17:57:39 -080059using testing::InSequence;
60using testing::NiceMock;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070061using testing::Pointee;
62using testing::Ref;
Lloyd Pique31cb2942018-10-19 17:23:03 -070063using testing::Return;
Lloyd Pique45a165a2018-10-19 11:54:47 -070064using testing::ReturnRef;
Lloyd Pique66d68602019-02-13 14:23:31 -080065using testing::Sequence;
66using testing::SetArgPointee;
Lloyd Pique45a165a2018-10-19 11:54:47 -070067using testing::StrictMock;
68
Dominik Laskowski3dce4f42021-03-08 20:48:28 -080069constexpr PhysicalDisplayId DEFAULT_DISPLAY_ID = PhysicalDisplayId::fromPort(123u);
70constexpr HalVirtualDisplayId HAL_VIRTUAL_DISPLAY_ID{456u};
71constexpr GpuVirtualDisplayId GPU_VIRTUAL_DISPLAY_ID{789u};
Dominik Laskowskif1833852021-03-23 15:06:50 -070072
Dominik Laskowski3dce4f42021-03-08 20:48:28 -080073constexpr ui::Size DEFAULT_RESOLUTION{1920, 1080};
Lloyd Pique45a165a2018-10-19 11:54:47 -070074
Lloyd Piquede196652020-01-22 17:29:58 -080075struct Layer {
76 Layer() {
77 EXPECT_CALL(*outputLayer, getLayerFE()).WillRepeatedly(ReturnRef(*layerFE));
78 EXPECT_CALL(*outputLayer, getHwcLayer()).WillRepeatedly(Return(&hwc2Layer));
79 }
80
Ady Abrahame0eafa82022-02-02 19:30:47 -080081 sp<StrictMock<mock::LayerFE>> layerFE = sp<StrictMock<mock::LayerFE>>::make();
Lloyd Piquede196652020-01-22 17:29:58 -080082 StrictMock<mock::OutputLayer>* outputLayer = new StrictMock<mock::OutputLayer>();
83 StrictMock<HWC2::mock::Layer> hwc2Layer;
84};
85
86struct LayerNoHWC2Layer {
87 LayerNoHWC2Layer() {
88 EXPECT_CALL(*outputLayer, getLayerFE()).WillRepeatedly(ReturnRef(*layerFE));
89 EXPECT_CALL(*outputLayer, getHwcLayer()).WillRepeatedly(Return(nullptr));
90 }
91
Ady Abrahame0eafa82022-02-02 19:30:47 -080092 sp<StrictMock<mock::LayerFE>> layerFE = sp<StrictMock<mock::LayerFE>>::make();
Lloyd Piquede196652020-01-22 17:29:58 -080093 StrictMock<mock::OutputLayer>* outputLayer = new StrictMock<mock::OutputLayer>();
94};
95
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -070096struct DisplayTestCommon : public testing::Test {
97 // Uses the full implementation of a display
98 class FullImplDisplay : public impl::Display {
Lloyd Pique01c77c12019-04-17 12:48:32 -070099 public:
Lloyd Pique01c77c12019-04-17 12:48:32 -0700100 using impl::Display::injectOutputLayerForTest;
101 virtual void injectOutputLayerForTest(std::unique_ptr<compositionengine::OutputLayer>) = 0;
102 };
103
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700104 // Uses a special implementation with key internal member functions set up
105 // as mock implementations, to allow for easier testing.
106 struct PartialMockDisplay : public impl::Display {
107 PartialMockDisplay(const compositionengine::CompositionEngine& compositionEngine)
108 : mCompositionEngine(compositionEngine) {}
109
110 // compositionengine::Output overrides
111 const OutputCompositionState& getState() const override { return mState; }
112 OutputCompositionState& editState() override { return mState; }
113
114 // compositionengine::impl::Output overrides
115 const CompositionEngine& getCompositionEngine() const override {
116 return mCompositionEngine;
117 };
118
Vishnu Naira3140382022-02-24 14:07:11 -0800119 size_t getOutputLayerCount() const override { return 1u; }
120
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700121 // Mock implementation overrides
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700122 MOCK_CONST_METHOD1(getOutputLayerOrderedByZByIndex,
123 compositionengine::OutputLayer*(size_t));
124 MOCK_METHOD2(ensureOutputLayer,
125 compositionengine::OutputLayer*(std::optional<size_t>, const sp<LayerFE>&));
126 MOCK_METHOD0(finalizePendingOutputLayers, void());
127 MOCK_METHOD0(clearOutputLayers, void());
128 MOCK_CONST_METHOD1(dumpState, void(std::string&));
129 MOCK_METHOD1(injectOutputLayerForTest, compositionengine::OutputLayer*(const sp<LayerFE>&));
130 MOCK_METHOD1(injectOutputLayerForTest, void(std::unique_ptr<OutputLayer>));
131 MOCK_CONST_METHOD0(anyLayersRequireClientComposition, bool());
132 MOCK_CONST_METHOD0(allLayersRequireClientComposition, bool());
133 MOCK_METHOD1(applyChangedTypesToLayers, void(const impl::Display::ChangedTypes&));
134 MOCK_METHOD1(applyDisplayRequests, void(const impl::Display::DisplayRequests&));
135 MOCK_METHOD1(applyLayerRequestsToLayers, void(const impl::Display::LayerRequests&));
136
137 const compositionengine::CompositionEngine& mCompositionEngine;
138 impl::OutputCompositionState mState;
139 };
140
141 static std::string getDisplayNameFromCurrentTest() {
142 const ::testing::TestInfo* const test_info =
143 ::testing::UnitTest::GetInstance()->current_test_info();
144 return std::string("display for ") + test_info->test_case_name() + "." + test_info->name();
145 }
146
147 template <typename Display>
Lloyd Pique01c77c12019-04-17 12:48:32 -0700148 static std::shared_ptr<Display> createDisplay(
149 const compositionengine::CompositionEngine& compositionEngine,
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700150 compositionengine::DisplayCreationArgs args) {
151 args.name = getDisplayNameFromCurrentTest();
Lloyd Pique01c77c12019-04-17 12:48:32 -0700152 return impl::createDisplayTemplated<Display>(compositionEngine, args);
153 }
154
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700155 template <typename Display>
156 static std::shared_ptr<StrictMock<Display>> createPartialMockDisplay(
157 const compositionengine::CompositionEngine& compositionEngine,
158 compositionengine::DisplayCreationArgs args) {
159 args.name = getDisplayNameFromCurrentTest();
160 auto display = std::make_shared<StrictMock<Display>>(compositionEngine);
Lloyd Pique66d68602019-02-13 14:23:31 -0800161
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700162 display->setConfiguration(args);
163
164 return display;
165 }
166
167 DisplayTestCommon() {
168 EXPECT_CALL(mCompositionEngine, getHwComposer()).WillRepeatedly(ReturnRef(mHwComposer));
Lloyd Piquee9eff972020-05-05 12:36:44 -0700169 EXPECT_CALL(mCompositionEngine, getRenderEngine()).WillRepeatedly(ReturnRef(mRenderEngine));
170 EXPECT_CALL(mRenderEngine, supportsProtectedContent()).WillRepeatedly(Return(false));
Peiyong Lin09f910f2020-09-25 10:54:13 -0700171 EXPECT_CALL(mRenderEngine, isProtected()).WillRepeatedly(Return(false));
Matt Buckley50c44062022-01-17 20:48:10 +0000172 EXPECT_CALL(mPowerAdvisor, usePowerHintSession()).WillRepeatedly(Return(false));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700173 }
174
Dominik Laskowski29fa1462021-04-27 15:51:50 -0700175 DisplayCreationArgs getDisplayCreationArgsForPhysicalDisplay() {
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700176 return DisplayCreationArgsBuilder()
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800177 .setId(DEFAULT_DISPLAY_ID)
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800178 .setPixels(DEFAULT_RESOLUTION)
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700179 .setIsSecure(true)
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700180 .setPowerAdvisor(&mPowerAdvisor)
181 .build();
182 }
183
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800184 DisplayCreationArgs getDisplayCreationArgsForGpuVirtualDisplay() {
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700185 return DisplayCreationArgsBuilder()
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800186 .setId(GPU_VIRTUAL_DISPLAY_ID)
187 .setPixels(DEFAULT_RESOLUTION)
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700188 .setIsSecure(false)
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700189 .setPowerAdvisor(&mPowerAdvisor)
190 .build();
191 }
192
193 StrictMock<android::mock::HWComposer> mHwComposer;
194 StrictMock<Hwc2::mock::PowerAdvisor> mPowerAdvisor;
Lloyd Piquee9eff972020-05-05 12:36:44 -0700195 StrictMock<renderengine::mock::RenderEngine> mRenderEngine;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700196 StrictMock<mock::CompositionEngine> mCompositionEngine;
Ady Abrahamd11bade2022-08-01 16:18:03 -0700197 sp<mock::NativeWindow> mNativeWindow = sp<StrictMock<mock::NativeWindow>>::make();
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700198};
199
200struct PartialMockDisplayTestCommon : public DisplayTestCommon {
201 using Display = DisplayTestCommon::PartialMockDisplay;
202 std::shared_ptr<Display> mDisplay =
203 createPartialMockDisplay<Display>(mCompositionEngine,
Dominik Laskowski29fa1462021-04-27 15:51:50 -0700204 getDisplayCreationArgsForPhysicalDisplay());
Vishnu Naira3140382022-02-24 14:07:11 -0800205
206 android::HWComposer::DeviceRequestedChanges mDeviceRequestedChanges{
207 {{nullptr, Composition::CLIENT}},
208 hal::DisplayRequest::FLIP_CLIENT_TARGET,
209 {{nullptr, hal::LayerRequest::CLEAR_CLIENT_TARGET}},
210 {DEFAULT_DISPLAY_ID.value,
211 {aidl::android::hardware::graphics::common::PixelFormat::RGBA_8888,
212 aidl::android::hardware::graphics::common::Dataspace::UNKNOWN},
213 -1.f,
214 DimmingStage::NONE},
215 };
216
217 void chooseCompositionStrategy(Display* display) {
218 std::optional<android::HWComposer::DeviceRequestedChanges> changes;
219 bool success = display->chooseCompositionStrategy(&changes);
220 display->resetCompositionStrategy();
221 if (success) {
222 display->applyCompositionStrategy(changes);
223 }
224 }
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700225};
226
227struct FullDisplayImplTestCommon : public DisplayTestCommon {
228 using Display = DisplayTestCommon::FullImplDisplay;
229 std::shared_ptr<Display> mDisplay =
Dominik Laskowski29fa1462021-04-27 15:51:50 -0700230 createDisplay<Display>(mCompositionEngine, getDisplayCreationArgsForPhysicalDisplay());
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700231};
232
233struct DisplayWithLayersTestCommon : public FullDisplayImplTestCommon {
234 DisplayWithLayersTestCommon() {
Lloyd Pique01c77c12019-04-17 12:48:32 -0700235 mDisplay->injectOutputLayerForTest(
Lloyd Piquede196652020-01-22 17:29:58 -0800236 std::unique_ptr<compositionengine::OutputLayer>(mLayer1.outputLayer));
Lloyd Pique01c77c12019-04-17 12:48:32 -0700237 mDisplay->injectOutputLayerForTest(
Lloyd Piquede196652020-01-22 17:29:58 -0800238 std::unique_ptr<compositionengine::OutputLayer>(mLayer2.outputLayer));
Lloyd Pique01c77c12019-04-17 12:48:32 -0700239 mDisplay->injectOutputLayerForTest(
Lloyd Piquede196652020-01-22 17:29:58 -0800240 std::unique_ptr<compositionengine::OutputLayer>(mLayer3.outputLayer));
Vishnu Naira3140382022-02-24 14:07:11 -0800241 mResultWithBuffer.buffer = std::make_shared<
242 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
243 1ULL /* bufferId */,
244 HAL_PIXEL_FORMAT_RGBA_8888,
245 0ULL /*usage*/);
Lloyd Pique66d68602019-02-13 14:23:31 -0800246 }
Lloyd Pique45a165a2018-10-19 11:54:47 -0700247
Lloyd Piquede196652020-01-22 17:29:58 -0800248 Layer mLayer1;
249 Layer mLayer2;
250 LayerNoHWC2Layer mLayer3;
251 StrictMock<HWC2::mock::Layer> hwc2LayerUnknown;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700252 std::shared_ptr<Display> mDisplay =
Dominik Laskowski29fa1462021-04-27 15:51:50 -0700253 createDisplay<Display>(mCompositionEngine, getDisplayCreationArgsForPhysicalDisplay());
Vishnu Naira3140382022-02-24 14:07:11 -0800254 impl::GpuCompositionResult mResultWithBuffer;
255 impl::GpuCompositionResult mResultWithoutBuffer;
Lloyd Pique45a165a2018-10-19 11:54:47 -0700256};
257
Lloyd Pique66d68602019-02-13 14:23:31 -0800258/*
Lloyd Pique45a165a2018-10-19 11:54:47 -0700259 * Basic construction
260 */
261
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700262struct DisplayCreationTest : public DisplayTestCommon {
263 using Display = DisplayTestCommon::FullImplDisplay;
264};
Lloyd Pique45a165a2018-10-19 11:54:47 -0700265
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700266TEST_F(DisplayCreationTest, createPhysicalInternalDisplay) {
267 auto display =
Dominik Laskowski29fa1462021-04-27 15:51:50 -0700268 impl::createDisplay(mCompositionEngine, getDisplayCreationArgsForPhysicalDisplay());
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700269 EXPECT_TRUE(display->isSecure());
270 EXPECT_FALSE(display->isVirtual());
271 EXPECT_EQ(DEFAULT_DISPLAY_ID, display->getId());
272}
Lloyd Pique45a165a2018-10-19 11:54:47 -0700273
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800274TEST_F(DisplayCreationTest, createGpuVirtualDisplay) {
275 auto display =
276 impl::createDisplay(mCompositionEngine, getDisplayCreationArgsForGpuVirtualDisplay());
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700277 EXPECT_FALSE(display->isSecure());
278 EXPECT_TRUE(display->isVirtual());
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200279 EXPECT_TRUE(GpuVirtualDisplayId::tryCast(display->getId()));
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700280}
281
282/*
283 * Display::setConfiguration()
284 */
285
286using DisplaySetConfigurationTest = PartialMockDisplayTestCommon;
287
Dominik Laskowski29fa1462021-04-27 15:51:50 -0700288TEST_F(DisplaySetConfigurationTest, configuresPhysicalDisplay) {
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800289 mDisplay->setConfiguration(DisplayCreationArgsBuilder()
290 .setId(DEFAULT_DISPLAY_ID)
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800291 .setPixels(DEFAULT_RESOLUTION)
292 .setIsSecure(true)
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800293 .setPowerAdvisor(&mPowerAdvisor)
294 .setName(getDisplayNameFromCurrentTest())
295 .build());
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700296
297 EXPECT_EQ(DEFAULT_DISPLAY_ID, mDisplay->getId());
298 EXPECT_TRUE(mDisplay->isSecure());
299 EXPECT_FALSE(mDisplay->isVirtual());
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700300 EXPECT_FALSE(mDisplay->isValid());
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700301
Dominik Laskowski29fa1462021-04-27 15:51:50 -0700302 const auto& filter = mDisplay->getState().layerFilter;
303 EXPECT_EQ(ui::INVALID_LAYER_STACK, filter.layerStack);
304 EXPECT_FALSE(filter.toInternalDisplay);
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700305}
306
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800307TEST_F(DisplaySetConfigurationTest, configuresHalVirtualDisplay) {
308 mDisplay->setConfiguration(DisplayCreationArgsBuilder()
309 .setId(HAL_VIRTUAL_DISPLAY_ID)
310 .setPixels(DEFAULT_RESOLUTION)
311 .setIsSecure(false)
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800312 .setPowerAdvisor(&mPowerAdvisor)
313 .setName(getDisplayNameFromCurrentTest())
314 .build());
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700315
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800316 EXPECT_EQ(HAL_VIRTUAL_DISPLAY_ID, mDisplay->getId());
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700317 EXPECT_FALSE(mDisplay->isSecure());
318 EXPECT_TRUE(mDisplay->isVirtual());
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700319 EXPECT_FALSE(mDisplay->isValid());
Dominik Laskowski29fa1462021-04-27 15:51:50 -0700320
321 const auto& filter = mDisplay->getState().layerFilter;
322 EXPECT_EQ(ui::INVALID_LAYER_STACK, filter.layerStack);
323 EXPECT_FALSE(filter.toInternalDisplay);
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700324}
325
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800326TEST_F(DisplaySetConfigurationTest, configuresGpuVirtualDisplay) {
327 mDisplay->setConfiguration(DisplayCreationArgsBuilder()
328 .setId(GPU_VIRTUAL_DISPLAY_ID)
329 .setPixels(DEFAULT_RESOLUTION)
330 .setIsSecure(false)
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800331 .setPowerAdvisor(&mPowerAdvisor)
332 .setName(getDisplayNameFromCurrentTest())
333 .build());
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700334
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800335 EXPECT_EQ(GPU_VIRTUAL_DISPLAY_ID, mDisplay->getId());
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700336 EXPECT_FALSE(mDisplay->isSecure());
337 EXPECT_TRUE(mDisplay->isVirtual());
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700338 EXPECT_FALSE(mDisplay->isValid());
Dominik Laskowski29fa1462021-04-27 15:51:50 -0700339
340 const auto& filter = mDisplay->getState().layerFilter;
341 EXPECT_EQ(ui::INVALID_LAYER_STACK, filter.layerStack);
342 EXPECT_FALSE(filter.toInternalDisplay);
Lloyd Pique45a165a2018-10-19 11:54:47 -0700343}
344
Lloyd Pique66d68602019-02-13 14:23:31 -0800345/*
Lloyd Pique45a165a2018-10-19 11:54:47 -0700346 * Display::disconnect()
347 */
348
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700349using DisplayDisconnectTest = PartialMockDisplayTestCommon;
350
351TEST_F(DisplayDisconnectTest, disconnectsDisplay) {
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200352 // The first call to disconnect will disconnect the display with the HWC.
353 EXPECT_CALL(mHwComposer, disconnectDisplay(HalDisplayId(DEFAULT_DISPLAY_ID))).Times(1);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700354 mDisplay->disconnect();
Lloyd Pique45a165a2018-10-19 11:54:47 -0700355
356 // Subsequent calls will do nothing,
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200357 EXPECT_CALL(mHwComposer, disconnectDisplay(HalDisplayId(DEFAULT_DISPLAY_ID))).Times(0);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700358 mDisplay->disconnect();
Lloyd Pique45a165a2018-10-19 11:54:47 -0700359}
360
Lloyd Pique66d68602019-02-13 14:23:31 -0800361/*
Lloyd Pique32cbe282018-10-19 13:09:22 -0700362 * Display::setColorTransform()
363 */
364
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700365using DisplaySetColorTransformTest = PartialMockDisplayTestCommon;
366
367TEST_F(DisplaySetColorTransformTest, setsTransform) {
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800368 // No change does nothing
369 CompositionRefreshArgs refreshArgs;
370 refreshArgs.colorTransformMatrix = std::nullopt;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700371 mDisplay->setColorTransform(refreshArgs);
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800372
Lloyd Pique32cbe282018-10-19 13:09:22 -0700373 // Identity matrix sets an identity state value
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800374 const mat4 kIdentity;
Lloyd Pique32cbe282018-10-19 13:09:22 -0700375
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200376 EXPECT_CALL(mHwComposer, setColorTransform(HalDisplayId(DEFAULT_DISPLAY_ID), kIdentity))
377 .Times(1);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700378
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800379 refreshArgs.colorTransformMatrix = kIdentity;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700380 mDisplay->setColorTransform(refreshArgs);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700381
382 // Non-identity matrix sets a non-identity state value
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800383 const mat4 kNonIdentity = mat4() * 2;
Lloyd Pique32cbe282018-10-19 13:09:22 -0700384
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200385 EXPECT_CALL(mHwComposer, setColorTransform(HalDisplayId(DEFAULT_DISPLAY_ID), kNonIdentity))
386 .Times(1);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700387
Lloyd Pique3eb1b212019-03-07 21:15:40 -0800388 refreshArgs.colorTransformMatrix = kNonIdentity;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700389 mDisplay->setColorTransform(refreshArgs);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700390}
391
Lloyd Pique66d68602019-02-13 14:23:31 -0800392/*
Lloyd Pique32cbe282018-10-19 13:09:22 -0700393 * Display::setColorMode()
394 */
395
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700396using DisplaySetColorModeTest = PartialMockDisplayTestCommon;
397
398TEST_F(DisplaySetColorModeTest, setsModeUnlessNoChange) {
Lloyd Pique6a3b4462019-03-07 20:58:12 -0800399 using ColorProfile = Output::ColorProfile;
400
Lloyd Pique31cb2942018-10-19 17:23:03 -0700401 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700402 mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
Lloyd Piquef5275482019-01-29 18:42:42 -0800403 mock::DisplayColorProfile* colorProfile = new StrictMock<mock::DisplayColorProfile>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700404 mDisplay->setDisplayColorProfileForTest(std::unique_ptr<DisplayColorProfile>(colorProfile));
Lloyd Pique31cb2942018-10-19 17:23:03 -0700405
Lloyd Pique32cbe282018-10-19 13:09:22 -0700406 // These values are expected to be the initial state.
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700407 ASSERT_EQ(ui::ColorMode::NATIVE, mDisplay->getState().colorMode);
408 ASSERT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().dataspace);
409 ASSERT_EQ(ui::RenderIntent::COLORIMETRIC, mDisplay->getState().renderIntent);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700410
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700411 // Otherwise if the values are unchanged, nothing happens
412 mDisplay->setColorProfile(ColorProfile{ui::ColorMode::NATIVE, ui::Dataspace::UNKNOWN,
Alec Mouri88790f32023-07-21 01:25:14 +0000413 ui::RenderIntent::COLORIMETRIC});
Lloyd Pique32cbe282018-10-19 13:09:22 -0700414
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700415 EXPECT_EQ(ui::ColorMode::NATIVE, mDisplay->getState().colorMode);
416 EXPECT_EQ(ui::Dataspace::UNKNOWN, mDisplay->getState().dataspace);
417 EXPECT_EQ(ui::RenderIntent::COLORIMETRIC, mDisplay->getState().renderIntent);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700418
419 // Otherwise if the values are different, updates happen
Lloyd Piqueef958122019-02-05 18:00:12 -0800420 EXPECT_CALL(*renderSurface, setBufferDataspace(ui::Dataspace::DISPLAY_P3)).Times(1);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700421 EXPECT_CALL(mHwComposer,
Lloyd Piqueef958122019-02-05 18:00:12 -0800422 setActiveColorMode(DEFAULT_DISPLAY_ID, ui::ColorMode::DISPLAY_P3,
Lloyd Pique32cbe282018-10-19 13:09:22 -0700423 ui::RenderIntent::TONE_MAP_COLORIMETRIC))
424 .Times(1);
425
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700426 mDisplay->setColorProfile(ColorProfile{ui::ColorMode::DISPLAY_P3, ui::Dataspace::DISPLAY_P3,
Alec Mouri88790f32023-07-21 01:25:14 +0000427 ui::RenderIntent::TONE_MAP_COLORIMETRIC});
Lloyd Pique32cbe282018-10-19 13:09:22 -0700428
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700429 EXPECT_EQ(ui::ColorMode::DISPLAY_P3, mDisplay->getState().colorMode);
430 EXPECT_EQ(ui::Dataspace::DISPLAY_P3, mDisplay->getState().dataspace);
431 EXPECT_EQ(ui::RenderIntent::TONE_MAP_COLORIMETRIC, mDisplay->getState().renderIntent);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700432}
433
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700434TEST_F(DisplaySetColorModeTest, doesNothingForVirtualDisplay) {
Lloyd Pique6a3b4462019-03-07 20:58:12 -0800435 using ColorProfile = Output::ColorProfile;
436
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800437 auto args = getDisplayCreationArgsForGpuVirtualDisplay();
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700438 std::shared_ptr<impl::Display> virtualDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700439
Lloyd Piquef5275482019-01-29 18:42:42 -0800440 mock::DisplayColorProfile* colorProfile = new StrictMock<mock::DisplayColorProfile>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700441 virtualDisplay->setDisplayColorProfileForTest(
Lloyd Piquef5275482019-01-29 18:42:42 -0800442 std::unique_ptr<DisplayColorProfile>(colorProfile));
443
Alec Mouri88790f32023-07-21 01:25:14 +0000444 virtualDisplay->setColorProfile(ColorProfile{ui::ColorMode::DISPLAY_P3,
445 ui::Dataspace::DISPLAY_P3,
446 ui::RenderIntent::TONE_MAP_COLORIMETRIC});
Lloyd Pique32cbe282018-10-19 13:09:22 -0700447
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700448 EXPECT_EQ(ui::ColorMode::NATIVE, virtualDisplay->getState().colorMode);
449 EXPECT_EQ(ui::Dataspace::UNKNOWN, virtualDisplay->getState().dataspace);
450 EXPECT_EQ(ui::RenderIntent::COLORIMETRIC, virtualDisplay->getState().renderIntent);
Lloyd Pique32cbe282018-10-19 13:09:22 -0700451}
452
Lloyd Pique66d68602019-02-13 14:23:31 -0800453/*
Lloyd Pique3d0c02e2018-10-19 18:38:12 -0700454 * Display::createDisplayColorProfile()
455 */
456
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700457using DisplayCreateColorProfileTest = PartialMockDisplayTestCommon;
458
459TEST_F(DisplayCreateColorProfileTest, setsDisplayColorProfile) {
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700460 EXPECT_TRUE(mDisplay->getDisplayColorProfile() == nullptr);
461 mDisplay->createDisplayColorProfile(
Lloyd Pique3d0c02e2018-10-19 18:38:12 -0700462 DisplayColorProfileCreationArgs{false, HdrCapabilities(), 0,
463 DisplayColorProfileCreationArgs::HwcColorModes()});
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700464 EXPECT_TRUE(mDisplay->getDisplayColorProfile() != nullptr);
Lloyd Pique3d0c02e2018-10-19 18:38:12 -0700465}
466
Lloyd Pique66d68602019-02-13 14:23:31 -0800467/*
Lloyd Pique31cb2942018-10-19 17:23:03 -0700468 * Display::createRenderSurface()
469 */
470
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700471using DisplayCreateRenderSurfaceTest = PartialMockDisplayTestCommon;
472
473TEST_F(DisplayCreateRenderSurfaceTest, setsRenderSurface) {
chaviw8beb4142019-04-11 13:09:05 -0700474 EXPECT_CALL(*mNativeWindow, disconnect(NATIVE_WINDOW_API_EGL)).WillRepeatedly(Return(NO_ERROR));
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700475 EXPECT_TRUE(mDisplay->getRenderSurface() == nullptr);
Dominik Laskowski50121d52021-04-23 13:01:16 -0700476 mDisplay->createRenderSurface(RenderSurfaceCreationArgsBuilder()
477 .setDisplayWidth(640)
478 .setDisplayHeight(480)
479 .setNativeWindow(mNativeWindow)
480 .build());
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700481 EXPECT_TRUE(mDisplay->getRenderSurface() != nullptr);
Lloyd Pique31cb2942018-10-19 17:23:03 -0700482}
483
Lloyd Pique66d68602019-02-13 14:23:31 -0800484/*
Lloyd Piquedf336d92019-03-07 21:38:42 -0800485 * Display::createOutputLayer()
486 */
487
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700488using DisplayCreateOutputLayerTest = FullDisplayImplTestCommon;
489
490TEST_F(DisplayCreateOutputLayerTest, setsHwcLayer) {
Ady Abrahame0eafa82022-02-02 19:30:47 -0800491 sp<StrictMock<mock::LayerFE>> layerFE = sp<StrictMock<mock::LayerFE>>::make();
Lloyd Piquea516c002021-05-07 14:36:58 -0700492 auto hwcLayer = std::make_shared<StrictMock<HWC2::mock::Layer>>();
Lloyd Piquedf336d92019-03-07 21:38:42 -0800493
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200494 EXPECT_CALL(mHwComposer, createLayer(HalDisplayId(DEFAULT_DISPLAY_ID)))
Lloyd Piquea516c002021-05-07 14:36:58 -0700495 .WillOnce(Return(hwcLayer));
Lloyd Piquedf336d92019-03-07 21:38:42 -0800496
Lloyd Piquede196652020-01-22 17:29:58 -0800497 auto outputLayer = mDisplay->createOutputLayer(layerFE);
Lloyd Piquedf336d92019-03-07 21:38:42 -0800498
Lloyd Piquea516c002021-05-07 14:36:58 -0700499 EXPECT_EQ(hwcLayer.get(), outputLayer->getHwcLayer());
Lloyd Piquedf336d92019-03-07 21:38:42 -0800500
Lloyd Piquedf336d92019-03-07 21:38:42 -0800501 outputLayer.reset();
502}
503
504/*
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800505 * Display::setReleasedLayers()
506 */
507
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700508using DisplaySetReleasedLayersTest = DisplayWithLayersTestCommon;
509
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800510TEST_F(DisplaySetReleasedLayersTest, doesNothingIfGpuDisplay) {
511 auto args = getDisplayCreationArgsForGpuVirtualDisplay();
512 std::shared_ptr<impl::Display> gpuDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800513
Ady Abrahamd11bade2022-08-01 16:18:03 -0700514 sp<mock::LayerFE> layerXLayerFE = sp<StrictMock<mock::LayerFE>>::make();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800515
516 {
517 Output::ReleasedLayers releasedLayers;
518 releasedLayers.emplace_back(layerXLayerFE);
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800519 gpuDisplay->setReleasedLayers(std::move(releasedLayers));
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800520 }
521
522 CompositionRefreshArgs refreshArgs;
Lloyd Piquede196652020-01-22 17:29:58 -0800523 refreshArgs.layersWithQueuedFrames.push_back(layerXLayerFE);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800524
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800525 gpuDisplay->setReleasedLayers(refreshArgs);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800526
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800527 const auto& releasedLayers = gpuDisplay->getReleasedLayersForTest();
528 ASSERT_EQ(1u, releasedLayers.size());
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800529}
530
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700531TEST_F(DisplaySetReleasedLayersTest, doesNothingIfNoLayersWithQueuedFrames) {
Ady Abrahamd11bade2022-08-01 16:18:03 -0700532 sp<mock::LayerFE> layerXLayerFE = sp<StrictMock<mock::LayerFE>>::make();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800533
534 {
535 Output::ReleasedLayers releasedLayers;
536 releasedLayers.emplace_back(layerXLayerFE);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700537 mDisplay->setReleasedLayers(std::move(releasedLayers));
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800538 }
539
540 CompositionRefreshArgs refreshArgs;
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700541 mDisplay->setReleasedLayers(refreshArgs);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800542
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700543 const auto& releasedLayers = mDisplay->getReleasedLayersForTest();
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800544 ASSERT_EQ(1u, releasedLayers.size());
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800545}
546
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700547TEST_F(DisplaySetReleasedLayersTest, setReleasedLayers) {
Ady Abrahamd11bade2022-08-01 16:18:03 -0700548 sp<mock::LayerFE> unknownLayer = sp<StrictMock<mock::LayerFE>>::make();
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800549
550 CompositionRefreshArgs refreshArgs;
Lloyd Piquede196652020-01-22 17:29:58 -0800551 refreshArgs.layersWithQueuedFrames.push_back(mLayer1.layerFE);
552 refreshArgs.layersWithQueuedFrames.push_back(mLayer2.layerFE);
553 refreshArgs.layersWithQueuedFrames.push_back(unknownLayer);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800554
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700555 mDisplay->setReleasedLayers(refreshArgs);
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800556
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700557 const auto& releasedLayers = mDisplay->getReleasedLayersForTest();
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800558 ASSERT_EQ(2u, releasedLayers.size());
Lloyd Piquede196652020-01-22 17:29:58 -0800559 ASSERT_EQ(mLayer1.layerFE.get(), releasedLayers[0].promote().get());
560 ASSERT_EQ(mLayer2.layerFE.get(), releasedLayers[1].promote().get());
Lloyd Piquec29e4c62019-03-07 21:48:19 -0800561}
562
563/*
Lloyd Pique66d68602019-02-13 14:23:31 -0800564 * Display::chooseCompositionStrategy()
565 */
566
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700567using DisplayChooseCompositionStrategyTest = PartialMockDisplayTestCommon;
Lloyd Pique66d68602019-02-13 14:23:31 -0800568
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800569TEST_F(DisplayChooseCompositionStrategyTest, takesEarlyOutIfGpuDisplay) {
570 auto args = getDisplayCreationArgsForGpuVirtualDisplay();
571 std::shared_ptr<Display> gpuDisplay =
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700572 createPartialMockDisplay<Display>(mCompositionEngine, args);
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800573 EXPECT_TRUE(GpuVirtualDisplayId::tryCast(gpuDisplay->getId()));
Lloyd Pique66d68602019-02-13 14:23:31 -0800574
Vishnu Naira3140382022-02-24 14:07:11 -0800575 chooseCompositionStrategy(gpuDisplay.get());
Lloyd Pique66d68602019-02-13 14:23:31 -0800576
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800577 auto& state = gpuDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800578 EXPECT_TRUE(state.usesClientComposition);
579 EXPECT_FALSE(state.usesDeviceComposition);
580}
581
582TEST_F(DisplayChooseCompositionStrategyTest, takesEarlyOutOnHwcError) {
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700583 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition()).WillOnce(Return(false));
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200584 EXPECT_CALL(mHwComposer,
ramindani4aac32c2023-10-30 14:13:30 -0700585 getDeviceCompositionChanges(HalDisplayId(DEFAULT_DISPLAY_ID), false, _, _, _, _))
Lloyd Pique66d68602019-02-13 14:23:31 -0800586 .WillOnce(Return(INVALID_OPERATION));
587
Vishnu Naira3140382022-02-24 14:07:11 -0800588 chooseCompositionStrategy(mDisplay.get());
Lloyd Pique66d68602019-02-13 14:23:31 -0800589
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700590 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800591 EXPECT_TRUE(state.usesClientComposition);
592 EXPECT_FALSE(state.usesDeviceComposition);
Vishnu Naira3140382022-02-24 14:07:11 -0800593 EXPECT_FALSE(state.previousDeviceRequestedChanges.has_value());
Lloyd Pique66d68602019-02-13 14:23:31 -0800594}
595
596TEST_F(DisplayChooseCompositionStrategyTest, normalOperation) {
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700597 // Since two calls are made to anyLayersRequireClientComposition with different return
598 // values, use a Sequence to control the matching so the values are returned in a known
599 // order.
Lloyd Pique66d68602019-02-13 14:23:31 -0800600 Sequence s;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700601 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
602 .InSequence(s)
603 .WillOnce(Return(true));
604 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
Lloyd Pique66d68602019-02-13 14:23:31 -0800605 .InSequence(s)
606 .WillOnce(Return(false));
607
Ady Abrahamb42cdc12021-05-11 14:31:26 -0700608 EXPECT_CALL(mHwComposer,
ramindani4aac32c2023-10-30 14:13:30 -0700609 getDeviceCompositionChanges(HalDisplayId(DEFAULT_DISPLAY_ID), true, _, _, _, _))
610 .WillOnce(testing::DoAll(testing::SetArgPointee<5>(mDeviceRequestedChanges),
Vishnu Naira3140382022-02-24 14:07:11 -0800611 Return(NO_ERROR)));
612 EXPECT_CALL(*mDisplay, applyChangedTypesToLayers(mDeviceRequestedChanges.changedTypes))
613 .Times(1);
614 EXPECT_CALL(*mDisplay, applyDisplayRequests(mDeviceRequestedChanges.displayRequests)).Times(1);
615 EXPECT_CALL(*mDisplay, applyLayerRequestsToLayers(mDeviceRequestedChanges.layerRequests))
616 .Times(1);
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700617 EXPECT_CALL(*mDisplay, allLayersRequireClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800618
Vishnu Naira3140382022-02-24 14:07:11 -0800619 chooseCompositionStrategy(mDisplay.get());
Lloyd Pique66d68602019-02-13 14:23:31 -0800620
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700621 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800622 EXPECT_FALSE(state.usesClientComposition);
623 EXPECT_TRUE(state.usesDeviceComposition);
624}
625
Alec Mouricdf16792021-12-10 13:16:06 -0800626TEST_F(DisplayChooseCompositionStrategyTest, normalOperationWithDisplayBrightness) {
627 // Since two calls are made to anyLayersRequireClientComposition with different return
628 // values, use a Sequence to control the matching so the values are returned in a known
629 // order.
630 constexpr float kDisplayBrightness = 0.5f;
Alec Mouri4d8a05d2022-03-23 18:14:26 +0000631 constexpr float kDisplayBrightnessNits = 200.f;
Alec Mouricdf16792021-12-10 13:16:06 -0800632 EXPECT_CALL(mHwComposer,
Alec Mouri4d8a05d2022-03-23 18:14:26 +0000633 setDisplayBrightness(DEFAULT_DISPLAY_ID, kDisplayBrightness, kDisplayBrightnessNits,
Alec Mouricdf16792021-12-10 13:16:06 -0800634 Hwc2::Composer::DisplayBrightnessOptions{.applyImmediately =
635 false}))
636 .WillOnce(Return(ByMove(ftl::yield<status_t>(NO_ERROR))));
637
Alec Mouricdf16792021-12-10 13:16:06 -0800638 mDisplay->setNextBrightness(kDisplayBrightness);
Vishnu Naira3140382022-02-24 14:07:11 -0800639 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
640 EXPECT_CALL(*renderSurface, beginFrame(_)).Times(1);
641 mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
Alec Mouri4d8a05d2022-03-23 18:14:26 +0000642 mDisplay->editState().displayBrightnessNits = kDisplayBrightnessNits;
Vishnu Naira3140382022-02-24 14:07:11 -0800643 mDisplay->beginFrame();
Alec Mouricdf16792021-12-10 13:16:06 -0800644
645 auto& state = mDisplay->getState();
Alec Mouricdf16792021-12-10 13:16:06 -0800646 EXPECT_FALSE(state.displayBrightness.has_value());
647}
648
Lloyd Pique66d68602019-02-13 14:23:31 -0800649TEST_F(DisplayChooseCompositionStrategyTest, normalOperationWithChanges) {
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700650 // Since two calls are made to anyLayersRequireClientComposition with different return
651 // values, use a Sequence to control the matching so the values are returned in a known
652 // order.
Lloyd Pique66d68602019-02-13 14:23:31 -0800653 Sequence s;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700654 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
655 .InSequence(s)
656 .WillOnce(Return(true));
657 EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition())
Lloyd Pique66d68602019-02-13 14:23:31 -0800658 .InSequence(s)
659 .WillOnce(Return(false));
660
Ady Abrahamb42cdc12021-05-11 14:31:26 -0700661 EXPECT_CALL(mHwComposer,
ramindani4aac32c2023-10-30 14:13:30 -0700662 getDeviceCompositionChanges(HalDisplayId(DEFAULT_DISPLAY_ID), true, _, _, _, _))
663 .WillOnce(DoAll(SetArgPointee<5>(mDeviceRequestedChanges), Return(NO_ERROR)));
Vishnu Naira3140382022-02-24 14:07:11 -0800664 EXPECT_CALL(*mDisplay, applyChangedTypesToLayers(mDeviceRequestedChanges.changedTypes))
665 .Times(1);
666 EXPECT_CALL(*mDisplay, applyDisplayRequests(mDeviceRequestedChanges.displayRequests)).Times(1);
667 EXPECT_CALL(*mDisplay, applyLayerRequestsToLayers(mDeviceRequestedChanges.layerRequests))
668 .Times(1);
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700669 EXPECT_CALL(*mDisplay, allLayersRequireClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800670
Vishnu Naira3140382022-02-24 14:07:11 -0800671 chooseCompositionStrategy(mDisplay.get());
Lloyd Pique66d68602019-02-13 14:23:31 -0800672
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700673 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800674 EXPECT_FALSE(state.usesClientComposition);
675 EXPECT_TRUE(state.usesDeviceComposition);
676}
677
678/*
Lloyd Pique688abd42019-02-15 15:42:24 -0800679 * Display::getSkipColorTransform()
680 */
681
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700682using DisplayGetSkipColorTransformTest = DisplayWithLayersTestCommon;
Leon Scroggins III5967aec2021-12-29 11:14:22 -0500683using aidl::android::hardware::graphics::composer3::DisplayCapability;
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700684
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800685TEST_F(DisplayGetSkipColorTransformTest, checksCapabilityIfGpuDisplay) {
Ady Abrahamde549d42022-01-26 19:19:17 -0800686 EXPECT_CALL(mHwComposer, hasCapability(Capability::SKIP_CLIENT_COLOR_TRANSFORM))
Dominik Laskowski1162e472020-04-02 19:02:47 -0700687 .WillOnce(Return(true));
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800688 auto args = getDisplayCreationArgsForGpuVirtualDisplay();
689 auto gpuDisplay{impl::createDisplay(mCompositionEngine, args)};
690 EXPECT_TRUE(gpuDisplay->getSkipColorTransform());
Lloyd Pique688abd42019-02-15 15:42:24 -0800691}
692
Dominik Laskowski1162e472020-04-02 19:02:47 -0700693TEST_F(DisplayGetSkipColorTransformTest, checksDisplayCapability) {
Lloyd Pique688abd42019-02-15 15:42:24 -0800694 EXPECT_CALL(mHwComposer,
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200695 hasDisplayCapability(HalDisplayId(DEFAULT_DISPLAY_ID),
Leon Scroggins III5967aec2021-12-29 11:14:22 -0500696 DisplayCapability::SKIP_CLIENT_COLOR_TRANSFORM))
Lloyd Pique688abd42019-02-15 15:42:24 -0800697 .WillOnce(Return(true));
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700698 EXPECT_TRUE(mDisplay->getSkipColorTransform());
Lloyd Pique688abd42019-02-15 15:42:24 -0800699}
700
701/*
Lloyd Pique66d68602019-02-13 14:23:31 -0800702 * Display::anyLayersRequireClientComposition()
703 */
704
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700705using DisplayAnyLayersRequireClientCompositionTest = DisplayWithLayersTestCommon;
706
707TEST_F(DisplayAnyLayersRequireClientCompositionTest, returnsFalse) {
Lloyd Piquede196652020-01-22 17:29:58 -0800708 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(false));
709 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(false));
710 EXPECT_CALL(*mLayer3.outputLayer, requiresClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800711
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700712 EXPECT_FALSE(mDisplay->anyLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800713}
714
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700715TEST_F(DisplayAnyLayersRequireClientCompositionTest, returnsTrue) {
Lloyd Piquede196652020-01-22 17:29:58 -0800716 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(false));
717 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(true));
Lloyd Pique66d68602019-02-13 14:23:31 -0800718
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700719 EXPECT_TRUE(mDisplay->anyLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800720}
721
722/*
723 * Display::allLayersRequireClientComposition()
724 */
725
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700726using DisplayAllLayersRequireClientCompositionTest = DisplayWithLayersTestCommon;
727
728TEST_F(DisplayAllLayersRequireClientCompositionTest, returnsTrue) {
Lloyd Piquede196652020-01-22 17:29:58 -0800729 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(true));
730 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(true));
731 EXPECT_CALL(*mLayer3.outputLayer, requiresClientComposition()).WillOnce(Return(true));
Lloyd Pique66d68602019-02-13 14:23:31 -0800732
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700733 EXPECT_TRUE(mDisplay->allLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800734}
735
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700736TEST_F(DisplayAllLayersRequireClientCompositionTest, returnsFalse) {
Lloyd Piquede196652020-01-22 17:29:58 -0800737 EXPECT_CALL(*mLayer1.outputLayer, requiresClientComposition()).WillOnce(Return(true));
738 EXPECT_CALL(*mLayer2.outputLayer, requiresClientComposition()).WillOnce(Return(false));
Lloyd Pique66d68602019-02-13 14:23:31 -0800739
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700740 EXPECT_FALSE(mDisplay->allLayersRequireClientComposition());
Lloyd Pique66d68602019-02-13 14:23:31 -0800741}
742
743/*
744 * Display::applyChangedTypesToLayers()
745 */
746
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700747using DisplayApplyChangedTypesToLayersTest = DisplayWithLayersTestCommon;
748
749TEST_F(DisplayApplyChangedTypesToLayersTest, takesEarlyOutIfNoChangedLayers) {
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700750 mDisplay->applyChangedTypesToLayers(impl::Display::ChangedTypes());
Lloyd Pique66d68602019-02-13 14:23:31 -0800751}
752
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700753TEST_F(DisplayApplyChangedTypesToLayersTest, appliesChanges) {
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500754 EXPECT_CALL(*mLayer1.outputLayer, applyDeviceCompositionTypeChange(Composition::CLIENT))
Lloyd Pique66d68602019-02-13 14:23:31 -0800755 .Times(1);
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500756 EXPECT_CALL(*mLayer2.outputLayer, applyDeviceCompositionTypeChange(Composition::DEVICE))
Lloyd Pique66d68602019-02-13 14:23:31 -0800757 .Times(1);
758
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700759 mDisplay->applyChangedTypesToLayers(impl::Display::ChangedTypes{
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500760 {&mLayer1.hwc2Layer, Composition::CLIENT},
761 {&mLayer2.hwc2Layer, Composition::DEVICE},
762 {&hwc2LayerUnknown, Composition::SOLID_COLOR},
Lloyd Pique66d68602019-02-13 14:23:31 -0800763 });
764}
765
766/*
767 * Display::applyDisplayRequests()
768 */
769
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700770using DisplayApplyDisplayRequestsTest = DisplayWithLayersTestCommon;
771
772TEST_F(DisplayApplyDisplayRequestsTest, handlesNoRequests) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700773 mDisplay->applyDisplayRequests(static_cast<hal::DisplayRequest>(0));
Lloyd Pique66d68602019-02-13 14:23:31 -0800774
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700775 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800776 EXPECT_FALSE(state.flipClientTarget);
777}
778
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700779TEST_F(DisplayApplyDisplayRequestsTest, handlesFlipClientTarget) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700780 mDisplay->applyDisplayRequests(hal::DisplayRequest::FLIP_CLIENT_TARGET);
Lloyd Pique66d68602019-02-13 14:23:31 -0800781
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700782 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800783 EXPECT_TRUE(state.flipClientTarget);
784}
785
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700786TEST_F(DisplayApplyDisplayRequestsTest, handlesWriteClientTargetToOutput) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700787 mDisplay->applyDisplayRequests(hal::DisplayRequest::WRITE_CLIENT_TARGET_TO_OUTPUT);
Lloyd Pique66d68602019-02-13 14:23:31 -0800788
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700789 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800790 EXPECT_FALSE(state.flipClientTarget);
791}
792
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700793TEST_F(DisplayApplyDisplayRequestsTest, handlesAllRequestFlagsSet) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700794 mDisplay->applyDisplayRequests(static_cast<hal::DisplayRequest>(~0));
Lloyd Pique66d68602019-02-13 14:23:31 -0800795
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700796 auto& state = mDisplay->getState();
Lloyd Pique66d68602019-02-13 14:23:31 -0800797 EXPECT_TRUE(state.flipClientTarget);
798}
799
800/*
801 * Display::applyLayerRequestsToLayers()
802 */
803
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700804using DisplayApplyLayerRequestsToLayersTest = DisplayWithLayersTestCommon;
805
806TEST_F(DisplayApplyLayerRequestsToLayersTest, preparesAllLayers) {
Lloyd Piquede196652020-01-22 17:29:58 -0800807 EXPECT_CALL(*mLayer1.outputLayer, prepareForDeviceLayerRequests()).Times(1);
808 EXPECT_CALL(*mLayer2.outputLayer, prepareForDeviceLayerRequests()).Times(1);
809 EXPECT_CALL(*mLayer3.outputLayer, prepareForDeviceLayerRequests()).Times(1);
Lloyd Pique66d68602019-02-13 14:23:31 -0800810
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700811 mDisplay->applyLayerRequestsToLayers(impl::Display::LayerRequests());
Lloyd Pique66d68602019-02-13 14:23:31 -0800812}
813
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700814TEST_F(DisplayApplyLayerRequestsToLayersTest, appliesDeviceLayerRequests) {
Lloyd Piquede196652020-01-22 17:29:58 -0800815 EXPECT_CALL(*mLayer1.outputLayer, prepareForDeviceLayerRequests()).Times(1);
816 EXPECT_CALL(*mLayer2.outputLayer, prepareForDeviceLayerRequests()).Times(1);
817 EXPECT_CALL(*mLayer3.outputLayer, prepareForDeviceLayerRequests()).Times(1);
Lloyd Pique66d68602019-02-13 14:23:31 -0800818
Lloyd Piquede196652020-01-22 17:29:58 -0800819 EXPECT_CALL(*mLayer1.outputLayer,
Lloyd Pique66d68602019-02-13 14:23:31 -0800820 applyDeviceLayerRequest(Hwc2::IComposerClient::LayerRequest::CLEAR_CLIENT_TARGET))
821 .Times(1);
822
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700823 mDisplay->applyLayerRequestsToLayers(impl::Display::LayerRequests{
Peiyong Line9d809e2020-04-14 13:10:48 -0700824 {&mLayer1.hwc2Layer, hal::LayerRequest::CLEAR_CLIENT_TARGET},
825 {&hwc2LayerUnknown, hal::LayerRequest::CLEAR_CLIENT_TARGET},
Lloyd Pique66d68602019-02-13 14:23:31 -0800826 });
827}
828
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800829/*
Ady Abraham0094dc62021-06-03 10:08:33 -0700830 * Display::applyClientTargetRequests()
831 */
832
833using DisplayApplyClientTargetRequests = DisplayWithLayersTestCommon;
834
835TEST_F(DisplayApplyLayerRequestsToLayersTest, applyClientTargetRequests) {
Alec Mouricdf6cbc2021-11-01 17:21:15 -0700836 static constexpr float kWhitePointNits = 800.f;
837
Alec Mouri85065692022-03-18 00:58:26 +0000838 Display::ClientTargetProperty clientTargetProperty = {
839 .clientTargetProperty =
840 {
841 .pixelFormat =
842 aidl::android::hardware::graphics::common::PixelFormat::RGB_565,
843 .dataspace = aidl::android::hardware::graphics::common::Dataspace::
844 STANDARD_BT470M,
845 },
846 .brightness = kWhitePointNits,
847 .dimmingStage = aidl::android::hardware::graphics::composer3::DimmingStage::GAMMA_OETF,
848 };
849
Ady Abraham0094dc62021-06-03 10:08:33 -0700850 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
851 mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
852
Alec Mouri85065692022-03-18 00:58:26 +0000853 EXPECT_CALL(*renderSurface,
854 setBufferPixelFormat(static_cast<ui::PixelFormat>(
855 clientTargetProperty.clientTargetProperty.pixelFormat)));
856 EXPECT_CALL(*renderSurface,
857 setBufferDataspace(static_cast<ui::Dataspace>(
858 clientTargetProperty.clientTargetProperty.dataspace)));
859 mDisplay->applyClientTargetRequests(clientTargetProperty);
Ady Abraham0094dc62021-06-03 10:08:33 -0700860
861 auto& state = mDisplay->getState();
Alec Mouri85065692022-03-18 00:58:26 +0000862 EXPECT_EQ(clientTargetProperty.clientTargetProperty.dataspace,
863 static_cast<aidl::android::hardware::graphics::common::Dataspace>(state.dataspace));
Alec Mourif8d093d2022-02-10 15:16:59 -0800864 EXPECT_EQ(kWhitePointNits, state.clientTargetBrightness);
Alec Mouri85065692022-03-18 00:58:26 +0000865 EXPECT_EQ(aidl::android::hardware::graphics::composer3::DimmingStage::GAMMA_OETF,
866 state.clientTargetDimmingStage);
Ady Abraham0094dc62021-06-03 10:08:33 -0700867}
868
869/*
Leon Scroggins IIIc1623d12023-11-06 15:31:05 -0500870 * Display::presentFrame()
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800871 */
872
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700873using DisplayPresentAndGetFrameFencesTest = DisplayWithLayersTestCommon;
874
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800875TEST_F(DisplayPresentAndGetFrameFencesTest, returnsNoFencesOnGpuDisplay) {
876 auto args = getDisplayCreationArgsForGpuVirtualDisplay();
877 auto gpuDisplay{impl::createDisplay(mCompositionEngine, args)};
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800878
Leon Scroggins IIIc1623d12023-11-06 15:31:05 -0500879 auto result = gpuDisplay->presentFrame();
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800880
881 ASSERT_TRUE(result.presentFence.get());
882 EXPECT_FALSE(result.presentFence->isValid());
883 EXPECT_EQ(0u, result.layerFences.size());
884}
885
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700886TEST_F(DisplayPresentAndGetFrameFencesTest, returnsPresentAndLayerFences) {
Ady Abrahamd11bade2022-08-01 16:18:03 -0700887 sp<Fence> presentFence = sp<Fence>::make();
888 sp<Fence> layer1Fence = sp<Fence>::make();
889 sp<Fence> layer2Fence = sp<Fence>::make();
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800890
Ady Abrahamf1db8032023-03-24 17:52:34 -0700891 EXPECT_CALL(mHwComposer, presentAndGetReleaseFences(HalDisplayId(DEFAULT_DISPLAY_ID), _))
Ady Abrahamb42cdc12021-05-11 14:31:26 -0700892 .Times(1);
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200893 EXPECT_CALL(mHwComposer, getPresentFence(HalDisplayId(DEFAULT_DISPLAY_ID)))
894 .WillOnce(Return(presentFence));
895 EXPECT_CALL(mHwComposer,
896 getLayerReleaseFence(HalDisplayId(DEFAULT_DISPLAY_ID), &mLayer1.hwc2Layer))
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800897 .WillOnce(Return(layer1Fence));
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200898 EXPECT_CALL(mHwComposer,
899 getLayerReleaseFence(HalDisplayId(DEFAULT_DISPLAY_ID), &mLayer2.hwc2Layer))
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800900 .WillOnce(Return(layer2Fence));
Marin Shalamanov0f10d0d2020-08-06 20:04:06 +0200901 EXPECT_CALL(mHwComposer, clearReleaseFences(HalDisplayId(DEFAULT_DISPLAY_ID))).Times(1);
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800902
Leon Scroggins IIIc1623d12023-11-06 15:31:05 -0500903 auto result = mDisplay->presentFrame();
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800904
905 EXPECT_EQ(presentFence, result.presentFence);
906
907 EXPECT_EQ(2u, result.layerFences.size());
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800908 ASSERT_EQ(1u, result.layerFences.count(&mLayer1.hwc2Layer));
Lloyd Piquede196652020-01-22 17:29:58 -0800909 EXPECT_EQ(layer1Fence, result.layerFences[&mLayer1.hwc2Layer]);
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800910 ASSERT_EQ(1u, result.layerFences.count(&mLayer2.hwc2Layer));
Lloyd Piquede196652020-01-22 17:29:58 -0800911 EXPECT_EQ(layer2Fence, result.layerFences[&mLayer2.hwc2Layer]);
Lloyd Pique35fca9d2019-02-13 14:24:11 -0800912}
913
Lloyd Pique688abd42019-02-15 15:42:24 -0800914/*
915 * Display::setExpensiveRenderingExpected()
916 */
917
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700918using DisplaySetExpensiveRenderingExpectedTest = DisplayWithLayersTestCommon;
919
920TEST_F(DisplaySetExpensiveRenderingExpectedTest, forwardsToPowerAdvisor) {
Lloyd Pique688abd42019-02-15 15:42:24 -0800921 EXPECT_CALL(mPowerAdvisor, setExpensiveRenderingExpected(DEFAULT_DISPLAY_ID, true)).Times(1);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700922 mDisplay->setExpensiveRenderingExpected(true);
Lloyd Pique688abd42019-02-15 15:42:24 -0800923
924 EXPECT_CALL(mPowerAdvisor, setExpensiveRenderingExpected(DEFAULT_DISPLAY_ID, false)).Times(1);
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700925 mDisplay->setExpensiveRenderingExpected(false);
Lloyd Pique688abd42019-02-15 15:42:24 -0800926}
927
Lloyd Piqued3d69882019-02-28 16:03:46 -0800928/*
929 * Display::finishFrame()
930 */
931
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700932using DisplayFinishFrameTest = DisplayWithLayersTestCommon;
933
934TEST_F(DisplayFinishFrameTest, doesNotSkipCompositionIfNotDirtyOnHwcDisplay) {
Lloyd Piqued3d69882019-02-28 16:03:46 -0800935 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700936 mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
Lloyd Piqued3d69882019-02-28 16:03:46 -0800937
938 // We expect no calls to queueBuffer if composition was skipped.
Alec Mourif97df4d2023-09-06 02:10:05 +0000939 EXPECT_CALL(*renderSurface, queueBuffer(_, _)).Times(1);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800940
Lloyd Piquea76ce462020-01-14 13:06:37 -0800941 // Expect a call to signal no expensive rendering since there is no client composition.
942 EXPECT_CALL(mPowerAdvisor, setExpensiveRenderingExpected(DEFAULT_DISPLAY_ID, false));
943
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700944 mDisplay->editState().isEnabled = true;
945 mDisplay->editState().usesClientComposition = false;
Angel Aguayob084e0c2021-08-04 23:27:28 +0000946 mDisplay->editState().layerStackSpace.setContent(Rect(0, 0, 1, 1));
Lloyd Piquea38ea7e2019-04-16 18:10:26 -0700947 mDisplay->editState().dirtyRegion = Region::INVALID_REGION;
Lloyd Piqued3d69882019-02-28 16:03:46 -0800948
Carlos Martinez Romeroe5d57ea2022-11-15 19:14:36 +0000949 mDisplay->finishFrame(std::move(mResultWithBuffer));
Lloyd Piqued3d69882019-02-28 16:03:46 -0800950}
951
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -0700952TEST_F(DisplayFinishFrameTest, skipsCompositionIfNotDirty) {
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800953 auto args = getDisplayCreationArgsForGpuVirtualDisplay();
954 std::shared_ptr<impl::Display> gpuDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800955
956 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800957 gpuDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
Lloyd Piqued3d69882019-02-28 16:03:46 -0800958
959 // We expect no calls to queueBuffer if composition was skipped.
Alec Mourif97df4d2023-09-06 02:10:05 +0000960 EXPECT_CALL(*renderSurface, queueBuffer(_, _)).Times(0);
Chavi Weingarten09fa1d62022-08-17 21:57:04 +0000961 EXPECT_CALL(*renderSurface, beginFrame(false));
Lloyd Piqued3d69882019-02-28 16:03:46 -0800962
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800963 gpuDisplay->editState().isEnabled = true;
964 gpuDisplay->editState().usesClientComposition = false;
Angel Aguayob084e0c2021-08-04 23:27:28 +0000965 gpuDisplay->editState().layerStackSpace.setContent(Rect(0, 0, 1, 1));
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800966 gpuDisplay->editState().dirtyRegion = Region::INVALID_REGION;
Chavi Weingarten09fa1d62022-08-17 21:57:04 +0000967 gpuDisplay->editState().lastCompositionHadVisibleLayers = true;
Lloyd Piqued3d69882019-02-28 16:03:46 -0800968
Chavi Weingarten09fa1d62022-08-17 21:57:04 +0000969 gpuDisplay->beginFrame();
Carlos Martinez Romeroe5d57ea2022-11-15 19:14:36 +0000970 gpuDisplay->finishFrame(std::move(mResultWithoutBuffer));
Lloyd Piqued3d69882019-02-28 16:03:46 -0800971}
972
Chavi Weingarten09fa1d62022-08-17 21:57:04 +0000973TEST_F(DisplayFinishFrameTest, skipsCompositionIfEmpty) {
974 auto args = getDisplayCreationArgsForGpuVirtualDisplay();
975 std::shared_ptr<impl::Display> gpuDisplay = impl::createDisplay(mCompositionEngine, args);
976
977 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
978 gpuDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
979
980 // We expect no calls to queueBuffer if composition was skipped.
Alec Mourif97df4d2023-09-06 02:10:05 +0000981 EXPECT_CALL(*renderSurface, queueBuffer(_, _)).Times(0);
Chavi Weingarten09fa1d62022-08-17 21:57:04 +0000982 EXPECT_CALL(*renderSurface, beginFrame(false));
983
984 gpuDisplay->editState().isEnabled = true;
985 gpuDisplay->editState().usesClientComposition = false;
986 gpuDisplay->editState().layerStackSpace.setContent(Rect(0, 0, 1, 1));
987 gpuDisplay->editState().dirtyRegion = Region(Rect(0, 0, 1, 1));
988 gpuDisplay->editState().lastCompositionHadVisibleLayers = false;
989
990 gpuDisplay->beginFrame();
Carlos Martinez Romeroe5d57ea2022-11-15 19:14:36 +0000991 gpuDisplay->finishFrame(std::move(mResultWithoutBuffer));
Chavi Weingarten09fa1d62022-08-17 21:57:04 +0000992}
993
994TEST_F(DisplayFinishFrameTest, performsCompositionIfDirtyAndNotEmpty) {
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800995 auto args = getDisplayCreationArgsForGpuVirtualDisplay();
996 std::shared_ptr<impl::Display> gpuDisplay = impl::createDisplay(mCompositionEngine, args);
Lloyd Piqued3d69882019-02-28 16:03:46 -0800997
998 mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>();
Dominik Laskowski3dce4f42021-03-08 20:48:28 -0800999 gpuDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(renderSurface));
Lloyd Piqued3d69882019-02-28 16:03:46 -08001000
1001 // We expect a single call to queueBuffer when composition is not skipped.
Alec Mourif97df4d2023-09-06 02:10:05 +00001002 EXPECT_CALL(*renderSurface, queueBuffer(_, _)).Times(1);
Chavi Weingarten09fa1d62022-08-17 21:57:04 +00001003 EXPECT_CALL(*renderSurface, beginFrame(true));
Lloyd Piqued3d69882019-02-28 16:03:46 -08001004
Dominik Laskowski3dce4f42021-03-08 20:48:28 -08001005 gpuDisplay->editState().isEnabled = true;
1006 gpuDisplay->editState().usesClientComposition = false;
Angel Aguayob084e0c2021-08-04 23:27:28 +00001007 gpuDisplay->editState().layerStackSpace.setContent(Rect(0, 0, 1, 1));
Dominik Laskowski3dce4f42021-03-08 20:48:28 -08001008 gpuDisplay->editState().dirtyRegion = Region(Rect(0, 0, 1, 1));
Chavi Weingarten09fa1d62022-08-17 21:57:04 +00001009 gpuDisplay->editState().lastCompositionHadVisibleLayers = true;
1010
1011 gpuDisplay->beginFrame();
Carlos Martinez Romeroe5d57ea2022-11-15 19:14:36 +00001012 gpuDisplay->finishFrame(std::move(mResultWithBuffer));
Lloyd Piqued3d69882019-02-28 16:03:46 -08001013}
1014
Lloyd Piquec6607552019-12-02 17:57:39 -08001015/*
1016 * Display functional tests
1017 */
1018
1019struct DisplayFunctionalTest : public testing::Test {
1020 class Display : public impl::Display {
1021 public:
Lloyd Piquec6607552019-12-02 17:57:39 -08001022 using impl::Display::injectOutputLayerForTest;
1023 virtual void injectOutputLayerForTest(std::unique_ptr<compositionengine::OutputLayer>) = 0;
1024 };
1025
Lloyd Piquec6607552019-12-02 17:57:39 -08001026 DisplayFunctionalTest() {
1027 EXPECT_CALL(mCompositionEngine, getHwComposer()).WillRepeatedly(ReturnRef(mHwComposer));
Kriti Dang646f8ec2022-01-18 14:35:02 +01001028 mDisplay = createDisplay();
1029 mRenderSurface = createRenderSurface();
Lloyd Piquec6607552019-12-02 17:57:39 -08001030 mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(mRenderSurface));
1031 }
1032
1033 NiceMock<android::mock::HWComposer> mHwComposer;
1034 NiceMock<Hwc2::mock::PowerAdvisor> mPowerAdvisor;
1035 NiceMock<mock::CompositionEngine> mCompositionEngine;
Ady Abrahamd11bade2022-08-01 16:18:03 -07001036 sp<mock::NativeWindow> mNativeWindow = sp<NiceMock<mock::NativeWindow>>::make();
1037 sp<mock::DisplaySurface> mDisplaySurface = sp<NiceMock<mock::DisplaySurface>>::make();
Kriti Dang646f8ec2022-01-18 14:35:02 +01001038 std::shared_ptr<Display> mDisplay;
1039 impl::RenderSurface* mRenderSurface;
Dominik Laskowski3dce4f42021-03-08 20:48:28 -08001040
Kriti Dang646f8ec2022-01-18 14:35:02 +01001041 std::shared_ptr<Display> createDisplay() {
1042 return impl::createDisplayTemplated<Display>(mCompositionEngine,
1043 DisplayCreationArgsBuilder()
1044 .setId(DEFAULT_DISPLAY_ID)
1045 .setPixels(DEFAULT_RESOLUTION)
1046 .setIsSecure(true)
1047 .setPowerAdvisor(&mPowerAdvisor)
1048 .build());
1049 ;
1050 }
Lloyd Piqueaad4ebf2019-10-03 17:58:30 -07001051
Kriti Dang646f8ec2022-01-18 14:35:02 +01001052 impl::RenderSurface* createRenderSurface() {
1053 return new impl::RenderSurface{mCompositionEngine, *mDisplay,
1054 RenderSurfaceCreationArgsBuilder()
1055 .setDisplayWidth(DEFAULT_RESOLUTION.width)
1056 .setDisplayHeight(DEFAULT_RESOLUTION.height)
1057 .setNativeWindow(mNativeWindow)
1058 .setDisplaySurface(mDisplaySurface)
1059 .build()};
1060 }
Lloyd Piquec6607552019-12-02 17:57:39 -08001061};
1062
Leon Scroggins IIIc1623d12023-11-06 15:31:05 -05001063TEST_F(DisplayFunctionalTest, presentFrameAndReleaseLayersCriticalCallsAreOrdered) {
Lloyd Piquec6607552019-12-02 17:57:39 -08001064 InSequence seq;
1065
1066 mDisplay->editState().isEnabled = true;
1067
Ady Abrahamf1db8032023-03-24 17:52:34 -07001068 EXPECT_CALL(mHwComposer, presentAndGetReleaseFences(_, _));
Lloyd Piquec6607552019-12-02 17:57:39 -08001069 EXPECT_CALL(*mDisplaySurface, onFrameCommitted());
1070
Leon Scroggins IIIc1623d12023-11-06 15:31:05 -05001071 mDisplay->presentFrameAndReleaseLayers();
Lloyd Piquec6607552019-12-02 17:57:39 -08001072}
1073
Lloyd Pique45a165a2018-10-19 11:54:47 -07001074} // namespace
1075} // namespace android::compositionengine