blob: 2b1b7532d9b8051a0ca68a37a29aa046bb2273c6 [file] [log] [blame]
ramindani431aad42022-02-01 21:44:29 +00001/**
2 * Copyright (c) 2022, 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 */
Sally Qi2600d342022-08-16 12:46:17 -070016
ramindanid32ae8e2021-10-01 18:48:39 +000017#include <aidl/Gtest.h>
18#include <aidl/Vintf.h>
Ady Abraham3192f3d2021-12-03 16:08:56 -080019#include <aidl/android/hardware/graphics/common/BlendMode.h>
ramindani3335f7a2021-10-25 17:22:35 +000020#include <aidl/android/hardware/graphics/common/BufferUsage.h>
21#include <aidl/android/hardware/graphics/common/FRect.h>
Leon Scroggins IIIde057582022-01-13 12:26:00 -050022#include <aidl/android/hardware/graphics/common/PixelFormat.h>
ramindani3335f7a2021-10-25 17:22:35 +000023#include <aidl/android/hardware/graphics/common/Rect.h>
ramindani3335f7a2021-10-25 17:22:35 +000024#include <aidl/android/hardware/graphics/composer3/Composition.h>
ramindanid32ae8e2021-10-01 18:48:39 +000025#include <aidl/android/hardware/graphics/composer3/IComposer.h>
26#include <android-base/properties.h>
ramindania9780262021-10-01 18:48:39 +000027#include <android/binder_process.h>
Ady Abraham91c9d1a2021-12-15 18:14:45 -080028#include <android/hardware/graphics/composer3/ComposerClientReader.h>
29#include <android/hardware/graphics/composer3/ComposerClientWriter.h>
ramindanid32ae8e2021-10-01 18:48:39 +000030#include <binder/ProcessState.h>
31#include <gtest/gtest.h>
Ady Abraham72c5b502021-12-10 17:23:39 -080032#include <ui/Fence.h>
ramindani3335f7a2021-10-25 17:22:35 +000033#include <ui/GraphicBuffer.h>
34#include <ui/PixelFormat.h>
ramindani0291f112021-11-04 03:45:46 +000035#include <algorithm>
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -040036#include <iterator>
ramindani592b6512021-10-08 21:15:19 +000037#include <numeric>
ramindanid32ae8e2021-10-01 18:48:39 +000038#include <string>
ramindani1cb794e2021-10-13 20:45:23 +000039#include <thread>
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -040040#include <unordered_map>
ramindani458e53e2022-02-23 17:30:16 +000041#include "GraphicsComposerCallback.h"
42#include "VtsComposerClient.h"
ramindani3335f7a2021-10-25 17:22:35 +000043
ramindanid32ae8e2021-10-01 18:48:39 +000044#undef LOG_TAG
45#define LOG_TAG "VtsHalGraphicsComposer3_TargetTest"
46
47namespace aidl::android::hardware::graphics::composer3::vts {
48namespace {
49
ramindani1cb794e2021-10-13 20:45:23 +000050using namespace std::chrono_literals;
51
ramindanidcfe3a82021-11-29 17:00:31 +000052using ::android::GraphicBuffer;
53using ::android::sp;
54
ramindanid32ae8e2021-10-01 18:48:39 +000055class GraphicsComposerAidlTest : public ::testing::TestWithParam<std::string> {
ramindania9780262021-10-01 18:48:39 +000056 protected:
57 void SetUp() override {
ramindani431aad42022-02-01 21:44:29 +000058 mComposerClient = std::make_unique<VtsComposerClient>(GetParam());
59 ASSERT_TRUE(mComposerClient->createClient().isOk());
Jason Macnake531a092022-01-20 08:49:09 -080060
ramindani431aad42022-02-01 21:44:29 +000061 const auto& [status, displays] = mComposerClient->getDisplays();
Jason Macnake531a092022-01-20 08:49:09 -080062 ASSERT_TRUE(status.isOk());
ramindani431aad42022-02-01 21:44:29 +000063 mDisplays = displays;
ramindanidcfe3a82021-11-29 17:00:31 +000064
ramindani3335f7a2021-10-25 17:22:35 +000065 // explicitly disable vsync
66 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +000067 EXPECT_TRUE(mComposerClient->setVsync(display.getDisplayId(), false).isOk());
ramindani3335f7a2021-10-25 17:22:35 +000068 }
ramindani431aad42022-02-01 21:44:29 +000069 mComposerClient->setVsyncAllowed(false);
ramindania9780262021-10-01 18:48:39 +000070 }
71
ramindani3335f7a2021-10-25 17:22:35 +000072 void TearDown() override {
ramindani431aad42022-02-01 21:44:29 +000073 ASSERT_TRUE(mComposerClient->tearDown());
74 mComposerClient.reset();
ramindani3335f7a2021-10-25 17:22:35 +000075 }
ramindanic2b8d082021-11-06 02:03:50 +000076
ramindanid5751092022-04-22 22:30:20 +000077 void assertServiceSpecificError(const ScopedAStatus& status, int32_t serviceSpecificError) {
78 ASSERT_EQ(status.getExceptionCode(), EX_SERVICE_SPECIFIC);
79 ASSERT_EQ(status.getServiceSpecificError(), serviceSpecificError);
80 }
81
ramindani431aad42022-02-01 21:44:29 +000082 void Test_setContentTypeForDisplay(int64_t display,
83 const std::vector<ContentType>& supportedContentTypes,
84 ContentType contentType, const char* contentTypeStr) {
85 const bool contentTypeSupport =
86 std::find(supportedContentTypes.begin(), supportedContentTypes.end(),
87 contentType) != supportedContentTypes.end();
ramindanidcfe3a82021-11-29 17:00:31 +000088
89 if (!contentTypeSupport) {
ramindani431aad42022-02-01 21:44:29 +000090 const auto& status = mComposerClient->setContentType(display, contentType);
91 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +000092 EXPECT_NO_FATAL_FAILURE(
93 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindanidcfe3a82021-11-29 17:00:31 +000094 GTEST_SUCCEED() << contentTypeStr << " content type is not supported on display "
95 << std::to_string(display) << ", skipping test";
96 return;
97 }
98
99 EXPECT_TRUE(mComposerClient->setContentType(display, contentType).isOk());
100 EXPECT_TRUE(mComposerClient->setContentType(display, ContentType::NONE).isOk());
101 }
102
ramindani431aad42022-02-01 21:44:29 +0000103 void Test_setContentType(ContentType contentType, const char* contentTypeStr) {
ramindanidcfe3a82021-11-29 17:00:31 +0000104 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000105 const auto& [status, supportedContentTypes] =
106 mComposerClient->getSupportedContentTypes(display.getDisplayId());
107 EXPECT_TRUE(status.isOk());
108 Test_setContentTypeForDisplay(display.getDisplayId(), supportedContentTypes,
109 contentType, contentTypeStr);
ramindanidcfe3a82021-11-29 17:00:31 +0000110 }
111 }
112
Jason Macnak325e8232022-01-24 14:48:55 -0800113 bool hasCapability(Capability capability) {
ramindani431aad42022-02-01 21:44:29 +0000114 const auto& [status, capabilities] = mComposerClient->getCapabilities();
115 EXPECT_TRUE(status.isOk());
Jason Macnak325e8232022-01-24 14:48:55 -0800116 return std::any_of(
117 capabilities.begin(), capabilities.end(),
118 [&](const Capability& activeCapability) { return activeCapability == capability; });
119 }
120
ramindani431aad42022-02-01 21:44:29 +0000121 const VtsDisplay& getPrimaryDisplay() const { return mDisplays[0]; }
ramindania9780262021-10-01 18:48:39 +0000122
ramindani431aad42022-02-01 21:44:29 +0000123 int64_t getPrimaryDisplayId() const { return getPrimaryDisplay().getDisplayId(); }
ramindania9780262021-10-01 18:48:39 +0000124
ramindani431aad42022-02-01 21:44:29 +0000125 int64_t getInvalidDisplayId() const { return mComposerClient->getInvalidDisplayId(); }
ramindani1cb794e2021-10-13 20:45:23 +0000126
ramindani431aad42022-02-01 21:44:29 +0000127 VtsDisplay& getEditablePrimaryDisplay() { return mDisplays[0]; }
ramindani0291f112021-11-04 03:45:46 +0000128
ramindani3335f7a2021-10-25 17:22:35 +0000129 struct TestParameters {
130 nsecs_t delayForChange;
131 bool refreshMiss;
132 };
133
ramindani431aad42022-02-01 21:44:29 +0000134 std::unique_ptr<VtsComposerClient> mComposerClient;
ramindani1cb794e2021-10-13 20:45:23 +0000135 std::vector<VtsDisplay> mDisplays;
ramindani3335f7a2021-10-25 17:22:35 +0000136 // use the slot count usually set by SF
137 static constexpr uint32_t kBufferSlotCount = 64;
ramindanid32ae8e2021-10-01 18:48:39 +0000138};
139
ramindani431aad42022-02-01 21:44:29 +0000140TEST_P(GraphicsComposerAidlTest, GetDisplayCapabilities_BadDisplay) {
141 const auto& [status, _] = mComposerClient->getDisplayCapabilities(getInvalidDisplayId());
ramindani5f696942021-10-14 16:24:18 +0000142
ramindani431aad42022-02-01 21:44:29 +0000143 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000144 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindania9780262021-10-01 18:48:39 +0000145}
146
ramindani431aad42022-02-01 21:44:29 +0000147TEST_P(GraphicsComposerAidlTest, GetDisplayCapabilities) {
ramindania9780262021-10-01 18:48:39 +0000148 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000149 const auto& [status, capabilities] =
150 mComposerClient->getDisplayCapabilities(display.getDisplayId());
ramindania9780262021-10-01 18:48:39 +0000151
ramindani431aad42022-02-01 21:44:29 +0000152 EXPECT_TRUE(status.isOk());
ramindania9780262021-10-01 18:48:39 +0000153 }
ramindanid32ae8e2021-10-01 18:48:39 +0000154}
155
ramindani2740bac2021-11-24 22:58:32 +0000156TEST_P(GraphicsComposerAidlTest, DumpDebugInfo) {
ramindani431aad42022-02-01 21:44:29 +0000157 ASSERT_TRUE(mComposerClient->dumpDebugInfo().isOk());
ramindani2740bac2021-11-24 22:58:32 +0000158}
159
160TEST_P(GraphicsComposerAidlTest, CreateClientSingleton) {
161 std::shared_ptr<IComposerClient> composerClient;
ramindani431aad42022-02-01 21:44:29 +0000162 const auto& status = mComposerClient->createClient();
ramindani2740bac2021-11-24 22:58:32 +0000163
ramindani431aad42022-02-01 21:44:29 +0000164 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000165 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_NO_RESOURCES));
ramindani2740bac2021-11-24 22:58:32 +0000166}
167
ramindani592b6512021-10-08 21:15:19 +0000168TEST_P(GraphicsComposerAidlTest, GetDisplayIdentificationData) {
ramindani431aad42022-02-01 21:44:29 +0000169 const auto& [status0, displayIdentification0] =
170 mComposerClient->getDisplayIdentificationData(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000171 if (!status0.isOk() && status0.getExceptionCode() == EX_SERVICE_SPECIFIC &&
172 status0.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani431aad42022-02-01 21:44:29 +0000173 GTEST_SUCCEED() << "Display identification data not supported, skipping test";
ramindani592b6512021-10-08 21:15:19 +0000174 return;
175 }
ramindani431aad42022-02-01 21:44:29 +0000176 ASSERT_TRUE(status0.isOk()) << "failed to get display identification data";
ramindani592b6512021-10-08 21:15:19 +0000177 ASSERT_FALSE(displayIdentification0.data.empty());
178
179 constexpr size_t kEdidBlockSize = 128;
180 ASSERT_TRUE(displayIdentification0.data.size() % kEdidBlockSize == 0)
181 << "EDID blob length is not a multiple of " << kEdidBlockSize;
182
183 const uint8_t kEdidHeader[] = {0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00};
184 ASSERT_TRUE(std::equal(std::begin(kEdidHeader), std::end(kEdidHeader),
185 displayIdentification0.data.begin()))
186 << "EDID blob doesn't start with the fixed EDID header";
187 ASSERT_EQ(0, std::accumulate(displayIdentification0.data.begin(),
188 displayIdentification0.data.begin() + kEdidBlockSize,
189 static_cast<uint8_t>(0)))
190 << "EDID base block doesn't checksum";
191
ramindani431aad42022-02-01 21:44:29 +0000192 const auto& [status1, displayIdentification1] =
193 mComposerClient->getDisplayIdentificationData(getPrimaryDisplayId());
194 ASSERT_TRUE(status1.isOk());
ramindani592b6512021-10-08 21:15:19 +0000195
196 ASSERT_EQ(displayIdentification0.port, displayIdentification1.port) << "ports are not stable";
197 ASSERT_TRUE(displayIdentification0.data.size() == displayIdentification1.data.size() &&
198 std::equal(displayIdentification0.data.begin(), displayIdentification0.data.end(),
199 displayIdentification1.data.begin()))
200 << "data is not stable";
201}
202
203TEST_P(GraphicsComposerAidlTest, GetHdrCapabilities) {
ramindani431aad42022-02-01 21:44:29 +0000204 const auto& [status, hdrCapabilities] =
205 mComposerClient->getHdrCapabilities(getPrimaryDisplayId());
ramindani592b6512021-10-08 21:15:19 +0000206
ramindani431aad42022-02-01 21:44:29 +0000207 ASSERT_TRUE(status.isOk());
208 EXPECT_TRUE(hdrCapabilities.maxLuminance >= hdrCapabilities.minLuminance);
ramindani592b6512021-10-08 21:15:19 +0000209}
210
211TEST_P(GraphicsComposerAidlTest, GetPerFrameMetadataKeys) {
ramindani431aad42022-02-01 21:44:29 +0000212 const auto& [status, keys] = mComposerClient->getPerFrameMetadataKeys(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000213 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
214 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindanic2b8d082021-11-06 02:03:50 +0000215 GTEST_SUCCEED() << "getPerFrameMetadataKeys is not supported";
216 return;
ramindani592b6512021-10-08 21:15:19 +0000217 }
ramindani431aad42022-02-01 21:44:29 +0000218
219 ASSERT_TRUE(status.isOk());
220 EXPECT_TRUE(keys.size() >= 0);
ramindani592b6512021-10-08 21:15:19 +0000221}
222
223TEST_P(GraphicsComposerAidlTest, GetReadbackBufferAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000224 const auto& [status, _] = mComposerClient->getReadbackBufferAttributes(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000225 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
226 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani431aad42022-02-01 21:44:29 +0000227 GTEST_SUCCEED() << "getReadbackBufferAttributes is not supported";
228 return;
ramindani592b6512021-10-08 21:15:19 +0000229 }
ramindani431aad42022-02-01 21:44:29 +0000230
231 ASSERT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000232}
233
234TEST_P(GraphicsComposerAidlTest, GetRenderIntents) {
ramindani431aad42022-02-01 21:44:29 +0000235 const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
236 EXPECT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000237
ramindani431aad42022-02-01 21:44:29 +0000238 for (auto mode : modes) {
239 const auto& [intentStatus, intents] =
240 mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
241 EXPECT_TRUE(intentStatus.isOk());
ramindani592b6512021-10-08 21:15:19 +0000242 bool isHdr;
243 switch (mode) {
244 case ColorMode::BT2100_PQ:
245 case ColorMode::BT2100_HLG:
246 isHdr = true;
247 break;
248 default:
249 isHdr = false;
250 break;
251 }
252 RenderIntent requiredIntent =
253 isHdr ? RenderIntent::TONE_MAP_COLORIMETRIC : RenderIntent::COLORIMETRIC;
254
ramindani431aad42022-02-01 21:44:29 +0000255 const auto iter = std::find(intents.cbegin(), intents.cend(), requiredIntent);
ramindani592b6512021-10-08 21:15:19 +0000256 EXPECT_NE(intents.cend(), iter);
257 }
258}
259
ramindani431aad42022-02-01 21:44:29 +0000260TEST_P(GraphicsComposerAidlTest, GetRenderIntents_BadDisplay) {
261 const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
262 ASSERT_TRUE(status.isOk());
263
ramindani592b6512021-10-08 21:15:19 +0000264 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000265 const auto& [intentStatus, _] =
266 mComposerClient->getRenderIntents(getInvalidDisplayId(), mode);
267
268 EXPECT_FALSE(intentStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000269 EXPECT_NO_FATAL_FAILURE(
270 assertServiceSpecificError(intentStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani592b6512021-10-08 21:15:19 +0000271 }
272}
273
ramindani431aad42022-02-01 21:44:29 +0000274TEST_P(GraphicsComposerAidlTest, GetRenderIntents_BadParameter) {
275 const auto& [status, _] =
276 mComposerClient->getRenderIntents(getPrimaryDisplayId(), static_cast<ColorMode>(-1));
277
278 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000279 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindani592b6512021-10-08 21:15:19 +0000280}
281
282TEST_P(GraphicsComposerAidlTest, GetColorModes) {
ramindani431aad42022-02-01 21:44:29 +0000283 const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
284 ASSERT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000285
ramindani431aad42022-02-01 21:44:29 +0000286 const auto native = std::find(colorModes.cbegin(), colorModes.cend(), ColorMode::NATIVE);
287 EXPECT_NE(colorModes.cend(), native);
ramindani592b6512021-10-08 21:15:19 +0000288}
289
ramindani431aad42022-02-01 21:44:29 +0000290TEST_P(GraphicsComposerAidlTest, GetColorMode_BadDisplay) {
291 const auto& [status, _] = mComposerClient->getColorModes(getInvalidDisplayId());
ramindani592b6512021-10-08 21:15:19 +0000292
ramindani431aad42022-02-01 21:44:29 +0000293 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000294 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani592b6512021-10-08 21:15:19 +0000295}
296
297TEST_P(GraphicsComposerAidlTest, SetColorMode) {
ramindani431aad42022-02-01 21:44:29 +0000298 const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
299 EXPECT_TRUE(status.isOk());
300
ramindani592b6512021-10-08 21:15:19 +0000301 for (auto mode : colorModes) {
ramindani431aad42022-02-01 21:44:29 +0000302 const auto& [intentStatus, intents] =
303 mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
304 EXPECT_TRUE(intentStatus.isOk()) << "failed to get render intents";
305
ramindani592b6512021-10-08 21:15:19 +0000306 for (auto intent : intents) {
ramindani431aad42022-02-01 21:44:29 +0000307 const auto modeStatus =
308 mComposerClient->setColorMode(getPrimaryDisplayId(), mode, intent);
309 EXPECT_TRUE(modeStatus.isOk() ||
ramindanid5751092022-04-22 22:30:20 +0000310 (modeStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
311 IComposerClient::EX_UNSUPPORTED == modeStatus.getServiceSpecificError()))
ramindani592b6512021-10-08 21:15:19 +0000312 << "failed to set color mode";
313 }
314 }
315
ramindani431aad42022-02-01 21:44:29 +0000316 const auto modeStatus = mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE,
317 RenderIntent::COLORIMETRIC);
318 EXPECT_TRUE(modeStatus.isOk() ||
ramindanid5751092022-04-22 22:30:20 +0000319 (modeStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
320 IComposerClient::EX_UNSUPPORTED == modeStatus.getServiceSpecificError()))
ramindani592b6512021-10-08 21:15:19 +0000321 << "failed to set color mode";
322}
323
ramindani431aad42022-02-01 21:44:29 +0000324TEST_P(GraphicsComposerAidlTest, SetColorMode_BadDisplay) {
325 const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
326 ASSERT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000327
ramindani431aad42022-02-01 21:44:29 +0000328 for (auto mode : colorModes) {
329 const auto& [intentStatus, intents] =
330 mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
331 ASSERT_TRUE(intentStatus.isOk()) << "failed to get render intents";
332
333 for (auto intent : intents) {
334 auto const modeStatus =
335 mComposerClient->setColorMode(getInvalidDisplayId(), mode, intent);
336
337 EXPECT_FALSE(modeStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000338 EXPECT_NO_FATAL_FAILURE(
339 assertServiceSpecificError(modeStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani770d7082021-11-30 00:36:42 +0000340 }
341 }
ramindani592b6512021-10-08 21:15:19 +0000342}
343
ramindani431aad42022-02-01 21:44:29 +0000344TEST_P(GraphicsComposerAidlTest, SetColorMode_BadParameter) {
345 auto status = mComposerClient->setColorMode(getPrimaryDisplayId(), static_cast<ColorMode>(-1),
346 RenderIntent::COLORIMETRIC);
ramindani592b6512021-10-08 21:15:19 +0000347
ramindani431aad42022-02-01 21:44:29 +0000348 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000349 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindani592b6512021-10-08 21:15:19 +0000350
ramindani431aad42022-02-01 21:44:29 +0000351 status = mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE,
352 static_cast<RenderIntent>(-1));
ramindani592b6512021-10-08 21:15:19 +0000353
ramindani431aad42022-02-01 21:44:29 +0000354 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000355 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindani592b6512021-10-08 21:15:19 +0000356}
357
358TEST_P(GraphicsComposerAidlTest, GetDisplayedContentSamplingAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000359 int constexpr kInvalid = -1;
360 const auto& [status, format] =
361 mComposerClient->getDisplayedContentSamplingAttributes(getPrimaryDisplayId());
ramindani592b6512021-10-08 21:15:19 +0000362
ramindanid5751092022-04-22 22:30:20 +0000363 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
364 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani592b6512021-10-08 21:15:19 +0000365 SUCCEED() << "Device does not support optional extension. Test skipped";
366 return;
367 }
368
ramindani431aad42022-02-01 21:44:29 +0000369 ASSERT_TRUE(status.isOk());
370 EXPECT_NE(kInvalid, static_cast<int>(format.format));
371 EXPECT_NE(kInvalid, static_cast<int>(format.dataspace));
372 EXPECT_NE(kInvalid, static_cast<int>(format.componentMask));
ramindani592b6512021-10-08 21:15:19 +0000373};
374
375TEST_P(GraphicsComposerAidlTest, SetDisplayedContentSamplingEnabled) {
ramindani431aad42022-02-01 21:44:29 +0000376 int constexpr kMaxFrames = 10;
ramindani592b6512021-10-08 21:15:19 +0000377 FormatColorComponent enableAllComponents = FormatColorComponent::FORMAT_COMPONENT_0;
ramindani431aad42022-02-01 21:44:29 +0000378 auto status = mComposerClient->setDisplayedContentSamplingEnabled(
379 getPrimaryDisplayId(), /*isEnabled*/ true, enableAllComponents, kMaxFrames);
ramindanid5751092022-04-22 22:30:20 +0000380 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
381 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani592b6512021-10-08 21:15:19 +0000382 SUCCEED() << "Device does not support optional extension. Test skipped";
383 return;
384 }
ramindani431aad42022-02-01 21:44:29 +0000385 EXPECT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000386
ramindani431aad42022-02-01 21:44:29 +0000387 status = mComposerClient->setDisplayedContentSamplingEnabled(
388 getPrimaryDisplayId(), /*isEnabled*/ false, enableAllComponents, kMaxFrames);
389 EXPECT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000390}
391
392TEST_P(GraphicsComposerAidlTest, GetDisplayedContentSample) {
ramindani431aad42022-02-01 21:44:29 +0000393 const auto& [status, displayContentSamplingAttributes] =
394 mComposerClient->getDisplayedContentSamplingAttributes(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000395 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
396 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindanideb059e2021-11-18 01:57:25 +0000397 SUCCEED() << "Sampling attributes aren't supported on this device, test skipped";
398 return;
399 }
ramindani592b6512021-10-08 21:15:19 +0000400
ramindani431aad42022-02-01 21:44:29 +0000401 int64_t constexpr kMaxFrames = 10;
402 int64_t constexpr kTimestamp = 0;
403 const auto& [sampleStatus, displayContentSample] = mComposerClient->getDisplayedContentSample(
404 getPrimaryDisplayId(), kMaxFrames, kTimestamp);
ramindanid5751092022-04-22 22:30:20 +0000405 if (!sampleStatus.isOk() && sampleStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
ramindani431aad42022-02-01 21:44:29 +0000406 sampleStatus.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani592b6512021-10-08 21:15:19 +0000407 SUCCEED() << "Device does not support optional extension. Test skipped";
408 return;
409 }
410
ramindani431aad42022-02-01 21:44:29 +0000411 EXPECT_TRUE(sampleStatus.isOk());
412 const std::vector<std::vector<int64_t>> histogram = {
ramindani592b6512021-10-08 21:15:19 +0000413 displayContentSample.sampleComponent0, displayContentSample.sampleComponent1,
414 displayContentSample.sampleComponent2, displayContentSample.sampleComponent3};
415
ramindani3335f7a2021-10-25 17:22:35 +0000416 for (size_t i = 0; i < histogram.size(); i++) {
417 const bool shouldHaveHistogram =
418 static_cast<int>(displayContentSamplingAttributes.componentMask) & (1 << i);
419 EXPECT_EQ(shouldHaveHistogram, !histogram[i].empty());
ramindani592b6512021-10-08 21:15:19 +0000420 }
421}
422
ramindani431aad42022-02-01 21:44:29 +0000423TEST_P(GraphicsComposerAidlTest, GetDisplayConnectionType) {
424 const auto& [status, type] = mComposerClient->getDisplayConnectionType(getInvalidDisplayId());
425
426 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000427 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani431aad42022-02-01 21:44:29 +0000428
ramindani0291f112021-11-04 03:45:46 +0000429 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000430 const auto& [connectionTypeStatus, _] =
431 mComposerClient->getDisplayConnectionType(display.getDisplayId());
432 EXPECT_TRUE(connectionTypeStatus.isOk());
ramindani0291f112021-11-04 03:45:46 +0000433 }
434}
435
ramindani431aad42022-02-01 21:44:29 +0000436TEST_P(GraphicsComposerAidlTest, GetDisplayAttribute) {
ramindani0291f112021-11-04 03:45:46 +0000437 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000438 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
439 EXPECT_TRUE(status.isOk());
440
ramindani0291f112021-11-04 03:45:46 +0000441 for (const auto& config : configs) {
442 const std::array<DisplayAttribute, 4> requiredAttributes = {{
443 DisplayAttribute::WIDTH,
444 DisplayAttribute::HEIGHT,
445 DisplayAttribute::VSYNC_PERIOD,
446 DisplayAttribute::CONFIG_GROUP,
447 }};
ramindani0291f112021-11-04 03:45:46 +0000448 for (const auto& attribute : requiredAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000449 const auto& [attribStatus, value] = mComposerClient->getDisplayAttribute(
450 display.getDisplayId(), config, attribute);
451 EXPECT_TRUE(attribStatus.isOk());
ramindani0291f112021-11-04 03:45:46 +0000452 EXPECT_NE(-1, value);
453 }
454
455 const std::array<DisplayAttribute, 2> optionalAttributes = {{
456 DisplayAttribute::DPI_X,
457 DisplayAttribute::DPI_Y,
458 }};
459 for (const auto& attribute : optionalAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000460 const auto& [attribStatus, value] = mComposerClient->getDisplayAttribute(
461 display.getDisplayId(), config, attribute);
ramindanid5751092022-04-22 22:30:20 +0000462 EXPECT_TRUE(attribStatus.isOk() ||
463 (attribStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
464 IComposerClient::EX_UNSUPPORTED ==
465 attribStatus.getServiceSpecificError()));
ramindani0291f112021-11-04 03:45:46 +0000466 }
467 }
468 }
469}
470
ramindani431aad42022-02-01 21:44:29 +0000471TEST_P(GraphicsComposerAidlTest, CheckConfigsAreValid) {
ramindani0291f112021-11-04 03:45:46 +0000472 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000473 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
474 EXPECT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000475
476 EXPECT_FALSE(std::any_of(configs.begin(), configs.end(), [](auto config) {
477 return config == IComposerClient::INVALID_CONFIGURATION;
478 }));
479 }
480}
481
ramindani431aad42022-02-01 21:44:29 +0000482TEST_P(GraphicsComposerAidlTest, GetDisplayVsyncPeriod_BadDisplay) {
483 const auto& [status, vsyncPeriodNanos] =
484 mComposerClient->getDisplayVsyncPeriod(getInvalidDisplayId());
485
486 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000487 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000488}
489
ramindani431aad42022-02-01 21:44:29 +0000490TEST_P(GraphicsComposerAidlTest, SetActiveConfigWithConstraints_BadDisplay) {
ramindani0291f112021-11-04 03:45:46 +0000491 VsyncPeriodChangeConstraints constraints;
ramindani0291f112021-11-04 03:45:46 +0000492 constraints.seamlessRequired = false;
493 constraints.desiredTimeNanos = systemTime();
ramindani431aad42022-02-01 21:44:29 +0000494 auto invalidDisplay = VtsDisplay(getInvalidDisplayId());
ramindani0291f112021-11-04 03:45:46 +0000495
ramindani431aad42022-02-01 21:44:29 +0000496 const auto& [status, timeline] = mComposerClient->setActiveConfigWithConstraints(
497 &invalidDisplay, /*config*/ 0, constraints);
498
499 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000500 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000501}
502
ramindani431aad42022-02-01 21:44:29 +0000503TEST_P(GraphicsComposerAidlTest, SetActiveConfigWithConstraints_BadConfig) {
ramindani0291f112021-11-04 03:45:46 +0000504 VsyncPeriodChangeConstraints constraints;
ramindani0291f112021-11-04 03:45:46 +0000505 constraints.seamlessRequired = false;
506 constraints.desiredTimeNanos = systemTime();
507
508 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000509 int32_t constexpr kInvalidConfigId = IComposerClient::INVALID_CONFIGURATION;
510 const auto& [status, _] = mComposerClient->setActiveConfigWithConstraints(
511 &display, kInvalidConfigId, constraints);
512
513 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000514 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_CONFIG));
ramindani0291f112021-11-04 03:45:46 +0000515 }
516}
517
ramindani431aad42022-02-01 21:44:29 +0000518TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig_BadDisplay) {
ramindani476314c2022-03-16 00:17:08 +0000519 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
520 GTEST_SUCCEED() << "Boot Display Config not supported";
521 return;
522 }
ramindani431aad42022-02-01 21:44:29 +0000523 const auto& status = mComposerClient->setBootDisplayConfig(getInvalidDisplayId(), /*config*/ 0);
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100524
ramindani431aad42022-02-01 21:44:29 +0000525 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000526 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100527}
528
ramindani431aad42022-02-01 21:44:29 +0000529TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig_BadConfig) {
ramindani476314c2022-03-16 00:17:08 +0000530 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
531 GTEST_SUCCEED() << "Boot Display Config not supported";
532 return;
533 }
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100534 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000535 int32_t constexpr kInvalidConfigId = IComposerClient::INVALID_CONFIGURATION;
536 const auto& status =
537 mComposerClient->setBootDisplayConfig(display.getDisplayId(), kInvalidConfigId);
538
539 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000540 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_CONFIG));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100541 }
542}
543
ramindani431aad42022-02-01 21:44:29 +0000544TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig) {
ramindani476314c2022-03-16 00:17:08 +0000545 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
546 GTEST_SUCCEED() << "Boot Display Config not supported";
547 return;
548 }
ramindani431aad42022-02-01 21:44:29 +0000549 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
550 EXPECT_TRUE(status.isOk());
551 for (const auto& config : configs) {
552 EXPECT_TRUE(mComposerClient->setBootDisplayConfig(getPrimaryDisplayId(), config).isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100553 }
554}
555
ramindani431aad42022-02-01 21:44:29 +0000556TEST_P(GraphicsComposerAidlTest, ClearBootDisplayConfig_BadDisplay) {
ramindani476314c2022-03-16 00:17:08 +0000557 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
558 GTEST_SUCCEED() << "Boot Display Config not supported";
559 return;
560 }
ramindani431aad42022-02-01 21:44:29 +0000561 const auto& status = mComposerClient->clearBootDisplayConfig(getInvalidDisplayId());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100562
ramindani431aad42022-02-01 21:44:29 +0000563 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000564 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100565}
566
ramindani431aad42022-02-01 21:44:29 +0000567TEST_P(GraphicsComposerAidlTest, ClearBootDisplayConfig) {
ramindani476314c2022-03-16 00:17:08 +0000568 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
569 GTEST_SUCCEED() << "Boot Display Config not supported";
570 return;
571 }
ramindani431aad42022-02-01 21:44:29 +0000572 EXPECT_TRUE(mComposerClient->clearBootDisplayConfig(getPrimaryDisplayId()).isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100573}
574
ramindani431aad42022-02-01 21:44:29 +0000575TEST_P(GraphicsComposerAidlTest, GetPreferredBootDisplayConfig_BadDisplay) {
ramindani476314c2022-03-16 00:17:08 +0000576 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
577 GTEST_SUCCEED() << "Boot Display Config not supported";
578 return;
579 }
ramindani431aad42022-02-01 21:44:29 +0000580 const auto& [status, _] = mComposerClient->getPreferredBootDisplayConfig(getInvalidDisplayId());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100581
ramindani431aad42022-02-01 21:44:29 +0000582 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000583 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100584}
585
ramindani431aad42022-02-01 21:44:29 +0000586TEST_P(GraphicsComposerAidlTest, GetPreferredBootDisplayConfig) {
ramindani476314c2022-03-16 00:17:08 +0000587 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
588 GTEST_SUCCEED() << "Boot Display Config not supported";
589 return;
590 }
ramindani431aad42022-02-01 21:44:29 +0000591 const auto& [status, preferredDisplayConfig] =
592 mComposerClient->getPreferredBootDisplayConfig(getPrimaryDisplayId());
593 EXPECT_TRUE(status.isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100594
ramindani431aad42022-02-01 21:44:29 +0000595 const auto& [configStatus, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
596
597 EXPECT_TRUE(configStatus.isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100598 EXPECT_NE(configs.end(), std::find(configs.begin(), configs.end(), preferredDisplayConfig));
599}
600
ramindani476314c2022-03-16 00:17:08 +0000601TEST_P(GraphicsComposerAidlTest, BootDisplayConfig_Unsupported) {
602 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
603 const auto& [configStatus, config] =
604 mComposerClient->getActiveConfig(getPrimaryDisplayId());
605 EXPECT_TRUE(configStatus.isOk());
606
607 auto status = mComposerClient->setBootDisplayConfig(getPrimaryDisplayId(), config);
608 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000609 EXPECT_NO_FATAL_FAILURE(
610 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani476314c2022-03-16 00:17:08 +0000611
612 status = mComposerClient->getPreferredBootDisplayConfig(getPrimaryDisplayId()).first;
613 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000614 EXPECT_NO_FATAL_FAILURE(
615 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani476314c2022-03-16 00:17:08 +0000616
617 status = mComposerClient->clearBootDisplayConfig(getPrimaryDisplayId());
618 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000619 EXPECT_NO_FATAL_FAILURE(
620 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani476314c2022-03-16 00:17:08 +0000621 }
622}
623
Kriti Dang3793ebd2022-12-05 13:03:49 +0100624TEST_P(GraphicsComposerAidlTest, GetHdrConversionCapabilities) {
625 if (!hasCapability(Capability::HDR_OUTPUT_CONVERSION_CONFIG)) {
626 GTEST_SUCCEED() << "HDR output conversion not supported";
627 return;
628 }
629 const auto& [status, conversionCapabilities] = mComposerClient->getHdrConversionCapabilities();
630 EXPECT_TRUE(status.isOk());
631}
632
633TEST_P(GraphicsComposerAidlTest, SetHdrConversionStrategy_Passthrough) {
634 if (!hasCapability(Capability::HDR_OUTPUT_CONVERSION_CONFIG)) {
635 GTEST_SUCCEED() << "HDR output conversion not supported";
636 return;
637 }
638 common::HdrConversionStrategy hdrConversionStrategy;
639 hdrConversionStrategy.set<common::HdrConversionStrategy::Tag::passthrough>(true);
Kriti Dang37622762023-02-09 18:15:37 +0100640 const auto& [status, preferredHdrOutputType] =
641 mComposerClient->setHdrConversionStrategy(hdrConversionStrategy);
Kriti Dang3793ebd2022-12-05 13:03:49 +0100642 EXPECT_TRUE(status.isOk());
Kriti Dang37622762023-02-09 18:15:37 +0100643 EXPECT_EQ(common::Hdr::INVALID, preferredHdrOutputType);
Kriti Dang3793ebd2022-12-05 13:03:49 +0100644}
645
646TEST_P(GraphicsComposerAidlTest, SetHdrConversionStrategy_Force) {
647 if (!hasCapability(Capability::HDR_OUTPUT_CONVERSION_CONFIG)) {
648 GTEST_SUCCEED() << "HDR output conversion not supported";
649 return;
650 }
651 const auto& [status, conversionCapabilities] = mComposerClient->getHdrConversionCapabilities();
652 for (auto conversionCapability : conversionCapabilities) {
Kriti Dang5fcddd72023-03-07 14:55:51 +0100653 if (conversionCapability.outputType != common::Hdr::INVALID) {
Kriti Dang3793ebd2022-12-05 13:03:49 +0100654 common::HdrConversionStrategy hdrConversionStrategy;
655 hdrConversionStrategy.set<common::HdrConversionStrategy::Tag::forceHdrConversion>(
Kriti Dang5fcddd72023-03-07 14:55:51 +0100656 conversionCapability.outputType);
Kriti Dang37622762023-02-09 18:15:37 +0100657 const auto& [statusSet, preferredHdrOutputType] =
Kriti Dang3793ebd2022-12-05 13:03:49 +0100658 mComposerClient->setHdrConversionStrategy(hdrConversionStrategy);
Kriti Dang37622762023-02-09 18:15:37 +0100659 EXPECT_TRUE(statusSet.isOk());
660 EXPECT_EQ(common::Hdr::INVALID, preferredHdrOutputType);
Kriti Dang3793ebd2022-12-05 13:03:49 +0100661 }
662 }
663}
664
665TEST_P(GraphicsComposerAidlTest, SetHdrConversionStrategy_Auto) {
666 if (!hasCapability(Capability::HDR_OUTPUT_CONVERSION_CONFIG)) {
667 GTEST_SUCCEED() << "HDR output conversion not supported";
668 return;
669 }
670 const auto& [status, conversionCapabilities] = mComposerClient->getHdrConversionCapabilities();
671 std::vector<aidl::android::hardware::graphics::common::Hdr> autoHdrTypes;
672 for (auto conversionCapability : conversionCapabilities) {
Kriti Dang5fcddd72023-03-07 14:55:51 +0100673 if (conversionCapability.outputType != common::Hdr::INVALID) {
674 autoHdrTypes.push_back(conversionCapability.outputType);
Kriti Dang3793ebd2022-12-05 13:03:49 +0100675 }
676 }
677 common::HdrConversionStrategy hdrConversionStrategy;
678 hdrConversionStrategy.set<common::HdrConversionStrategy::Tag::autoAllowedHdrTypes>(
679 autoHdrTypes);
Kriti Dang37622762023-02-09 18:15:37 +0100680 const auto& [statusSet, preferredHdrOutputType] =
681 mComposerClient->setHdrConversionStrategy(hdrConversionStrategy);
682 EXPECT_TRUE(statusSet.isOk());
683 EXPECT_NE(common::Hdr::INVALID, preferredHdrOutputType);
Kriti Dang3793ebd2022-12-05 13:03:49 +0100684}
685
ramindani431aad42022-02-01 21:44:29 +0000686TEST_P(GraphicsComposerAidlTest, SetAutoLowLatencyMode_BadDisplay) {
687 auto status = mComposerClient->setAutoLowLatencyMode(getInvalidDisplayId(), /*isEnabled*/ true);
688 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000689 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani431aad42022-02-01 21:44:29 +0000690
691 status = mComposerClient->setAutoLowLatencyMode(getInvalidDisplayId(), /*isEnabled*/ false);
692 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000693 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000694}
695
ramindani431aad42022-02-01 21:44:29 +0000696TEST_P(GraphicsComposerAidlTest, SetAutoLowLatencyMode) {
ramindani0291f112021-11-04 03:45:46 +0000697 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000698 const auto& [status, capabilities] =
699 mComposerClient->getDisplayCapabilities(display.getDisplayId());
700 ASSERT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000701
702 const bool allmSupport =
703 std::find(capabilities.begin(), capabilities.end(),
704 DisplayCapability::AUTO_LOW_LATENCY_MODE) != capabilities.end();
705
706 if (!allmSupport) {
ramindani431aad42022-02-01 21:44:29 +0000707 const auto& statusIsOn = mComposerClient->setAutoLowLatencyMode(display.getDisplayId(),
708 /*isEnabled*/ true);
709 EXPECT_FALSE(statusIsOn.isOk());
ramindanid5751092022-04-22 22:30:20 +0000710 EXPECT_NO_FATAL_FAILURE(
711 assertServiceSpecificError(statusIsOn, IComposerClient::EX_UNSUPPORTED));
ramindani431aad42022-02-01 21:44:29 +0000712 const auto& statusIsOff = mComposerClient->setAutoLowLatencyMode(display.getDisplayId(),
713 /*isEnabled*/ false);
714 EXPECT_FALSE(statusIsOff.isOk());
ramindanid5751092022-04-22 22:30:20 +0000715 EXPECT_NO_FATAL_FAILURE(
716 assertServiceSpecificError(statusIsOff, IComposerClient::EX_UNSUPPORTED));
ramindani0291f112021-11-04 03:45:46 +0000717 GTEST_SUCCEED() << "Auto Low Latency Mode is not supported on display "
ramindani431aad42022-02-01 21:44:29 +0000718 << std::to_string(display.getDisplayId()) << ", skipping test";
ramindani0291f112021-11-04 03:45:46 +0000719 return;
720 }
721
ramindani431aad42022-02-01 21:44:29 +0000722 EXPECT_TRUE(mComposerClient->setAutoLowLatencyMode(display.getDisplayId(), true).isOk());
723 EXPECT_TRUE(mComposerClient->setAutoLowLatencyMode(display.getDisplayId(), false).isOk());
ramindani0291f112021-11-04 03:45:46 +0000724 }
725}
726
ramindani431aad42022-02-01 21:44:29 +0000727TEST_P(GraphicsComposerAidlTest, GetSupportedContentTypes_BadDisplay) {
728 const auto& [status, _] = mComposerClient->getSupportedContentTypes(getInvalidDisplayId());
729
730 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000731 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000732}
733
ramindani431aad42022-02-01 21:44:29 +0000734TEST_P(GraphicsComposerAidlTest, GetSupportedContentTypes) {
ramindani0291f112021-11-04 03:45:46 +0000735 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000736 const auto& [status, supportedContentTypes] =
737 mComposerClient->getSupportedContentTypes(display.getDisplayId());
738 ASSERT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000739
740 const bool noneSupported =
741 std::find(supportedContentTypes.begin(), supportedContentTypes.end(),
742 ContentType::NONE) != supportedContentTypes.end();
ramindani431aad42022-02-01 21:44:29 +0000743
ramindani0291f112021-11-04 03:45:46 +0000744 EXPECT_FALSE(noneSupported);
745 }
746}
747
ramindani431aad42022-02-01 21:44:29 +0000748TEST_P(GraphicsComposerAidlTest, SetContentTypeNoneAlwaysAccepted) {
ramindani0291f112021-11-04 03:45:46 +0000749 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000750 EXPECT_TRUE(
751 mComposerClient->setContentType(display.getDisplayId(), ContentType::NONE).isOk());
ramindani0291f112021-11-04 03:45:46 +0000752 }
753}
754
ramindani431aad42022-02-01 21:44:29 +0000755TEST_P(GraphicsComposerAidlTest, SetContentType_BadDisplay) {
ramindani0291f112021-11-04 03:45:46 +0000756 constexpr ContentType types[] = {ContentType::NONE, ContentType::GRAPHICS, ContentType::PHOTO,
757 ContentType::CINEMA, ContentType::GAME};
758 for (const auto& type : types) {
ramindani431aad42022-02-01 21:44:29 +0000759 const auto& status = mComposerClient->setContentType(getInvalidDisplayId(), type);
ramindani0291f112021-11-04 03:45:46 +0000760
ramindani431aad42022-02-01 21:44:29 +0000761 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000762 EXPECT_NO_FATAL_FAILURE(
763 assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000764 }
765}
766
ramindani431aad42022-02-01 21:44:29 +0000767TEST_P(GraphicsComposerAidlTest, SetGraphicsContentType) {
ramindani0291f112021-11-04 03:45:46 +0000768 Test_setContentType(ContentType::GRAPHICS, "GRAPHICS");
769}
770
ramindani431aad42022-02-01 21:44:29 +0000771TEST_P(GraphicsComposerAidlTest, SetPhotoContentType) {
ramindani0291f112021-11-04 03:45:46 +0000772 Test_setContentType(ContentType::PHOTO, "PHOTO");
773}
774
ramindani431aad42022-02-01 21:44:29 +0000775TEST_P(GraphicsComposerAidlTest, SetCinemaContentType) {
ramindani0291f112021-11-04 03:45:46 +0000776 Test_setContentType(ContentType::CINEMA, "CINEMA");
777}
778
ramindani431aad42022-02-01 21:44:29 +0000779TEST_P(GraphicsComposerAidlTest, SetGameContentType) {
ramindani0291f112021-11-04 03:45:46 +0000780 Test_setContentType(ContentType::GAME, "GAME");
781}
782
ramindanic2b8d082021-11-06 02:03:50 +0000783TEST_P(GraphicsComposerAidlTest, CreateVirtualDisplay) {
ramindani431aad42022-02-01 21:44:29 +0000784 const auto& [status, maxVirtualDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
785 EXPECT_TRUE(status.isOk());
786
ramindanic2b8d082021-11-06 02:03:50 +0000787 if (maxVirtualDisplayCount == 0) {
788 GTEST_SUCCEED() << "no virtual display support";
789 return;
790 }
791
ramindani431aad42022-02-01 21:44:29 +0000792 const auto& [virtualDisplayStatus, virtualDisplay] = mComposerClient->createVirtualDisplay(
793 /*width*/ 64, /*height*/ 64, common::PixelFormat::IMPLEMENTATION_DEFINED,
794 kBufferSlotCount);
ramindanic2b8d082021-11-06 02:03:50 +0000795
ramindani431aad42022-02-01 21:44:29 +0000796 ASSERT_TRUE(virtualDisplayStatus.isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000797 EXPECT_TRUE(mComposerClient->destroyVirtualDisplay(virtualDisplay.display).isOk());
798}
799
ramindani431aad42022-02-01 21:44:29 +0000800TEST_P(GraphicsComposerAidlTest, DestroyVirtualDisplay_BadDisplay) {
801 const auto& [status, maxDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
802 EXPECT_TRUE(status.isOk());
803
ramindani2740bac2021-11-24 22:58:32 +0000804 if (maxDisplayCount == 0) {
805 GTEST_SUCCEED() << "no virtual display support";
806 return;
807 }
ramindani2740bac2021-11-24 22:58:32 +0000808
ramindani431aad42022-02-01 21:44:29 +0000809 const auto& destroyStatus = mComposerClient->destroyVirtualDisplay(getInvalidDisplayId());
810
811 EXPECT_FALSE(destroyStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000812 EXPECT_NO_FATAL_FAILURE(
813 assertServiceSpecificError(destroyStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000814}
815
816TEST_P(GraphicsComposerAidlTest, CreateLayer) {
ramindani431aad42022-02-01 21:44:29 +0000817 const auto& [status, layer] =
818 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
ramindani2740bac2021-11-24 22:58:32 +0000819
ramindani431aad42022-02-01 21:44:29 +0000820 EXPECT_TRUE(status.isOk());
821 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000822}
823
ramindani431aad42022-02-01 21:44:29 +0000824TEST_P(GraphicsComposerAidlTest, CreateLayer_BadDisplay) {
825 const auto& [status, _] = mComposerClient->createLayer(getInvalidDisplayId(), kBufferSlotCount);
ramindani2740bac2021-11-24 22:58:32 +0000826
ramindani431aad42022-02-01 21:44:29 +0000827 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000828 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000829}
830
ramindani431aad42022-02-01 21:44:29 +0000831TEST_P(GraphicsComposerAidlTest, DestroyLayer_BadDisplay) {
832 const auto& [status, layer] =
833 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
834 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000835
ramindani431aad42022-02-01 21:44:29 +0000836 const auto& destroyStatus = mComposerClient->destroyLayer(getInvalidDisplayId(), layer);
ramindani2740bac2021-11-24 22:58:32 +0000837
ramindani431aad42022-02-01 21:44:29 +0000838 EXPECT_FALSE(destroyStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000839 EXPECT_NO_FATAL_FAILURE(
840 assertServiceSpecificError(destroyStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani431aad42022-02-01 21:44:29 +0000841 ASSERT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000842}
843
ramindani431aad42022-02-01 21:44:29 +0000844TEST_P(GraphicsComposerAidlTest, DestroyLayer_BadLayerError) {
ramindani2740bac2021-11-24 22:58:32 +0000845 // We haven't created any layers yet, so any id should be invalid
ramindani431aad42022-02-01 21:44:29 +0000846 const auto& status = mComposerClient->destroyLayer(getPrimaryDisplayId(), /*layer*/ 1);
ramindani2740bac2021-11-24 22:58:32 +0000847
ramindani431aad42022-02-01 21:44:29 +0000848 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000849 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_LAYER));
ramindani2740bac2021-11-24 22:58:32 +0000850}
851
ramindani431aad42022-02-01 21:44:29 +0000852TEST_P(GraphicsComposerAidlTest, GetActiveConfig_BadDisplay) {
853 const auto& [status, _] = mComposerClient->getActiveConfig(getInvalidDisplayId());
ramindani2740bac2021-11-24 22:58:32 +0000854
ramindani431aad42022-02-01 21:44:29 +0000855 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000856 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000857}
858
859TEST_P(GraphicsComposerAidlTest, GetDisplayConfig) {
ramindani431aad42022-02-01 21:44:29 +0000860 const auto& [status, _] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
861 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000862}
863
ramindani431aad42022-02-01 21:44:29 +0000864TEST_P(GraphicsComposerAidlTest, GetDisplayConfig_BadDisplay) {
865 const auto& [status, _] = mComposerClient->getDisplayConfigs(getInvalidDisplayId());
ramindani2740bac2021-11-24 22:58:32 +0000866
ramindani431aad42022-02-01 21:44:29 +0000867 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000868 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000869}
870
871TEST_P(GraphicsComposerAidlTest, GetDisplayName) {
ramindani431aad42022-02-01 21:44:29 +0000872 const auto& [status, _] = mComposerClient->getDisplayName(getPrimaryDisplayId());
873 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000874}
875
Sally Qi8ec063f2022-11-12 11:18:56 -0800876TEST_P(GraphicsComposerAidlTest, GetOverlaySupport) {
Dorin Drimus08212492023-02-23 17:06:58 +0000877 const auto& [versionStatus, version] = mComposerClient->getInterfaceVersion();
878 ASSERT_TRUE(versionStatus.isOk());
879 if (version == 1) {
880 GTEST_SUCCEED() << "Device does not support the new API for overlay support";
881 return;
882 }
883
Sally Qic2c392f2023-01-13 14:50:20 -0800884 const auto& [status, properties] = mComposerClient->getOverlaySupport();
Sally Qi2600d342022-08-16 12:46:17 -0700885 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
886 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
887 GTEST_SUCCEED() << "getOverlaySupport is not supported";
888 return;
889 }
890
891 ASSERT_TRUE(status.isOk());
Sally Qic2c392f2023-01-13 14:50:20 -0800892 for (const auto& i : properties.combinations) {
893 for (const auto standard : i.standards) {
894 const auto val = static_cast<int32_t>(standard) &
895 static_cast<int32_t>(common::Dataspace::STANDARD_MASK);
896 ASSERT_TRUE(val == static_cast<int32_t>(standard));
897 }
898 for (const auto transfer : i.transfers) {
899 const auto val = static_cast<int32_t>(transfer) &
900 static_cast<int32_t>(common::Dataspace::TRANSFER_MASK);
901 ASSERT_TRUE(val == static_cast<int32_t>(transfer));
902 }
903 for (const auto range : i.ranges) {
904 const auto val = static_cast<int32_t>(range) &
905 static_cast<int32_t>(common::Dataspace::RANGE_MASK);
906 ASSERT_TRUE(val == static_cast<int32_t>(range));
907 }
908 }
Sally Qi2600d342022-08-16 12:46:17 -0700909}
910
ramindani431aad42022-02-01 21:44:29 +0000911TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation_BadDisplay) {
912 const auto& [status, _] = mComposerClient->getDisplayPhysicalOrientation(getInvalidDisplayId());
Ady Abrahamae12e382022-01-13 18:06:21 -0800913
ramindani431aad42022-02-01 21:44:29 +0000914 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000915 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Ady Abrahamae12e382022-01-13 18:06:21 -0800916}
917
918TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation) {
919 const auto allowedDisplayOrientations = std::array<Transform, 4>{
920 Transform::NONE,
921 Transform::ROT_90,
922 Transform::ROT_180,
923 Transform::ROT_270,
924 };
925
ramindani431aad42022-02-01 21:44:29 +0000926 const auto& [status, displayOrientation] =
927 mComposerClient->getDisplayPhysicalOrientation(getPrimaryDisplayId());
Ady Abrahamae12e382022-01-13 18:06:21 -0800928
ramindani431aad42022-02-01 21:44:29 +0000929 EXPECT_TRUE(status.isOk());
Ady Abrahamae12e382022-01-13 18:06:21 -0800930 EXPECT_NE(std::find(allowedDisplayOrientations.begin(), allowedDisplayOrientations.end(),
931 displayOrientation),
932 allowedDisplayOrientations.end());
933}
934
ramindani2740bac2021-11-24 22:58:32 +0000935TEST_P(GraphicsComposerAidlTest, SetClientTargetSlotCount) {
ramindani431aad42022-02-01 21:44:29 +0000936 EXPECT_TRUE(mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kBufferSlotCount)
937 .isOk());
ramindani2740bac2021-11-24 22:58:32 +0000938}
939
940TEST_P(GraphicsComposerAidlTest, SetActiveConfig) {
ramindani431aad42022-02-01 21:44:29 +0000941 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
942 EXPECT_TRUE(status.isOk());
943
944 for (const auto& config : configs) {
945 auto display = getEditablePrimaryDisplay();
946 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
947 const auto& [configStatus, config1] =
948 mComposerClient->getActiveConfig(getPrimaryDisplayId());
949 EXPECT_TRUE(configStatus.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000950 EXPECT_EQ(config, config1);
951 }
952}
953
954TEST_P(GraphicsComposerAidlTest, SetActiveConfigPowerCycle) {
ramindani431aad42022-02-01 21:44:29 +0000955 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
956 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000957
ramindani431aad42022-02-01 21:44:29 +0000958 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
959 EXPECT_TRUE(status.isOk());
960
961 for (const auto& config : configs) {
962 auto display = getEditablePrimaryDisplay();
963 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
964 const auto& [config1Status, config1] =
965 mComposerClient->getActiveConfig(getPrimaryDisplayId());
966 EXPECT_TRUE(config1Status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000967 EXPECT_EQ(config, config1);
968
ramindani431aad42022-02-01 21:44:29 +0000969 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
970 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
971 const auto& [config2Status, config2] =
972 mComposerClient->getActiveConfig(getPrimaryDisplayId());
973 EXPECT_TRUE(config2Status.isOk());
974 EXPECT_EQ(config, config2);
ramindani2740bac2021-11-24 22:58:32 +0000975 }
976}
977
ramindani2740bac2021-11-24 22:58:32 +0000978TEST_P(GraphicsComposerAidlTest, SetPowerModeUnsupported) {
ramindani431aad42022-02-01 21:44:29 +0000979 const auto& [status, capabilities] =
980 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
981 ASSERT_TRUE(status.isOk());
982
Ady Abraham6679baf2021-12-08 18:28:27 -0800983 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
984 DisplayCapability::DOZE) != capabilities.end();
985 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
986 DisplayCapability::SUSPEND) != capabilities.end();
ramindani2740bac2021-11-24 22:58:32 +0000987
ramindani431aad42022-02-01 21:44:29 +0000988 if (!isDozeSupported) {
989 const auto& powerModeDozeStatus =
990 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE);
991 EXPECT_FALSE(powerModeDozeStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000992 EXPECT_NO_FATAL_FAILURE(
993 assertServiceSpecificError(powerModeDozeStatus, IComposerClient::EX_UNSUPPORTED));
ramindani431aad42022-02-01 21:44:29 +0000994
995 const auto& powerModeDozeSuspendStatus =
996 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
997 EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000998 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeDozeSuspendStatus,
999 IComposerClient::EX_UNSUPPORTED));
ramindani2740bac2021-11-24 22:58:32 +00001000 }
Ady Abraham6679baf2021-12-08 18:28:27 -08001001
1002 if (!isSuspendSupported) {
ramindani431aad42022-02-01 21:44:29 +00001003 const auto& powerModeSuspendStatus =
1004 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON_SUSPEND);
1005 EXPECT_FALSE(powerModeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +00001006 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeSuspendStatus,
1007 IComposerClient::EX_UNSUPPORTED));
Ady Abraham6679baf2021-12-08 18:28:27 -08001008
ramindani431aad42022-02-01 21:44:29 +00001009 const auto& powerModeDozeSuspendStatus =
1010 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
1011 EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +00001012 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeDozeSuspendStatus,
1013 IComposerClient::EX_UNSUPPORTED));
Ady Abraham6679baf2021-12-08 18:28:27 -08001014 }
ramindani2740bac2021-11-24 22:58:32 +00001015}
1016
1017TEST_P(GraphicsComposerAidlTest, SetVsyncEnabled) {
ramindani431aad42022-02-01 21:44:29 +00001018 mComposerClient->setVsyncAllowed(true);
ramindani2740bac2021-11-24 22:58:32 +00001019
ramindani431aad42022-02-01 21:44:29 +00001020 EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), true).isOk());
ramindani2740bac2021-11-24 22:58:32 +00001021 usleep(60 * 1000);
ramindani431aad42022-02-01 21:44:29 +00001022 EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), false).isOk());
ramindani2740bac2021-11-24 22:58:32 +00001023
ramindani431aad42022-02-01 21:44:29 +00001024 mComposerClient->setVsyncAllowed(false);
ramindani2740bac2021-11-24 22:58:32 +00001025}
1026
ramindanic2b8d082021-11-06 02:03:50 +00001027TEST_P(GraphicsComposerAidlTest, SetPowerMode) {
ramindani431aad42022-02-01 21:44:29 +00001028 const auto& [status, capabilities] =
1029 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
1030 ASSERT_TRUE(status.isOk());
1031
Ady Abraham6679baf2021-12-08 18:28:27 -08001032 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
1033 DisplayCapability::DOZE) != capabilities.end();
1034 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
1035 DisplayCapability::SUSPEND) != capabilities.end();
1036
ramindanic2b8d082021-11-06 02:03:50 +00001037 std::vector<PowerMode> modes;
1038 modes.push_back(PowerMode::OFF);
ramindanic2b8d082021-11-06 02:03:50 +00001039 modes.push_back(PowerMode::ON);
1040
Ady Abraham6679baf2021-12-08 18:28:27 -08001041 if (isSuspendSupported) {
1042 modes.push_back(PowerMode::ON_SUSPEND);
1043 }
1044
ramindani770d7082021-11-30 00:36:42 +00001045 if (isDozeSupported) {
1046 modes.push_back(PowerMode::DOZE);
Ady Abraham6679baf2021-12-08 18:28:27 -08001047 }
1048
1049 if (isSuspendSupported && isDozeSupported) {
ramindani770d7082021-11-30 00:36:42 +00001050 modes.push_back(PowerMode::DOZE_SUSPEND);
1051 }
1052
ramindanic2b8d082021-11-06 02:03:50 +00001053 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001054 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001055 }
1056}
1057
1058TEST_P(GraphicsComposerAidlTest, SetPowerModeVariations) {
ramindani431aad42022-02-01 21:44:29 +00001059 const auto& [status, capabilities] =
1060 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
1061 ASSERT_TRUE(status.isOk());
1062
Ady Abraham6679baf2021-12-08 18:28:27 -08001063 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
1064 DisplayCapability::DOZE) != capabilities.end();
1065 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
1066 DisplayCapability::SUSPEND) != capabilities.end();
1067
ramindanic2b8d082021-11-06 02:03:50 +00001068 std::vector<PowerMode> modes;
1069
1070 modes.push_back(PowerMode::OFF);
ramindani770d7082021-11-30 00:36:42 +00001071 modes.push_back(PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +00001072 modes.push_back(PowerMode::OFF);
ramindanic2b8d082021-11-06 02:03:50 +00001073 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001074 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001075 }
ramindani770d7082021-11-30 00:36:42 +00001076 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +00001077
ramindani770d7082021-11-30 00:36:42 +00001078 modes.push_back(PowerMode::OFF);
1079 modes.push_back(PowerMode::OFF);
1080 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001081 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindani770d7082021-11-30 00:36:42 +00001082 }
ramindanic2b8d082021-11-06 02:03:50 +00001083 modes.clear();
1084
1085 modes.push_back(PowerMode::ON);
1086 modes.push_back(PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +00001087 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001088 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001089 }
ramindanic2b8d082021-11-06 02:03:50 +00001090 modes.clear();
1091
Ady Abraham6679baf2021-12-08 18:28:27 -08001092 if (isSuspendSupported) {
1093 modes.push_back(PowerMode::ON_SUSPEND);
1094 modes.push_back(PowerMode::ON_SUSPEND);
1095 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001096 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
Ady Abraham6679baf2021-12-08 18:28:27 -08001097 }
1098 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +00001099 }
1100
ramindanic2b8d082021-11-06 02:03:50 +00001101 if (isDozeSupported) {
ramindanic2b8d082021-11-06 02:03:50 +00001102 modes.push_back(PowerMode::DOZE);
1103 modes.push_back(PowerMode::DOZE);
ramindanic2b8d082021-11-06 02:03:50 +00001104 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001105 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001106 }
ramindanic2b8d082021-11-06 02:03:50 +00001107 modes.clear();
Ady Abraham6679baf2021-12-08 18:28:27 -08001108 }
ramindanic2b8d082021-11-06 02:03:50 +00001109
Ady Abraham6679baf2021-12-08 18:28:27 -08001110 if (isSuspendSupported && isDozeSupported) {
ramindanic2b8d082021-11-06 02:03:50 +00001111 modes.push_back(PowerMode::DOZE_SUSPEND);
1112 modes.push_back(PowerMode::DOZE_SUSPEND);
ramindanic2b8d082021-11-06 02:03:50 +00001113 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001114 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001115 }
Ady Abraham6679baf2021-12-08 18:28:27 -08001116 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +00001117 }
1118}
1119
ramindani431aad42022-02-01 21:44:29 +00001120TEST_P(GraphicsComposerAidlTest, SetPowerMode_BadDisplay) {
1121 const auto& status = mComposerClient->setPowerMode(getInvalidDisplayId(), PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +00001122
ramindani431aad42022-02-01 21:44:29 +00001123 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001124 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindanic2b8d082021-11-06 02:03:50 +00001125}
1126
ramindani431aad42022-02-01 21:44:29 +00001127TEST_P(GraphicsComposerAidlTest, SetPowerMode_BadParameter) {
1128 const auto& status =
1129 mComposerClient->setPowerMode(getPrimaryDisplayId(), static_cast<PowerMode>(-1));
ramindanic2b8d082021-11-06 02:03:50 +00001130
ramindani431aad42022-02-01 21:44:29 +00001131 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001132 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanic2b8d082021-11-06 02:03:50 +00001133}
1134
ramindanic2b8d082021-11-06 02:03:50 +00001135TEST_P(GraphicsComposerAidlTest, GetDataspaceSaturationMatrix) {
ramindani431aad42022-02-01 21:44:29 +00001136 const auto& [status, matrix] =
1137 mComposerClient->getDataspaceSaturationMatrix(common::Dataspace::SRGB_LINEAR);
1138 ASSERT_TRUE(status.isOk());
1139 ASSERT_EQ(16, matrix.size()); // matrix should not be empty if call succeeded.
ramindanideb059e2021-11-18 01:57:25 +00001140
ramindanic2b8d082021-11-06 02:03:50 +00001141 // the last row is known
ramindani431aad42022-02-01 21:44:29 +00001142 EXPECT_EQ(0.0f, matrix[12]);
1143 EXPECT_EQ(0.0f, matrix[13]);
1144 EXPECT_EQ(0.0f, matrix[14]);
1145 EXPECT_EQ(1.0f, matrix[15]);
ramindanic2b8d082021-11-06 02:03:50 +00001146}
1147
ramindani431aad42022-02-01 21:44:29 +00001148TEST_P(GraphicsComposerAidlTest, GetDataspaceSaturationMatrix_BadParameter) {
1149 const auto& [status, matrix] =
1150 mComposerClient->getDataspaceSaturationMatrix(common::Dataspace::UNKNOWN);
ramindanic2b8d082021-11-06 02:03:50 +00001151
ramindani431aad42022-02-01 21:44:29 +00001152 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001153 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanic2b8d082021-11-06 02:03:50 +00001154}
1155
ramindanidcfe3a82021-11-29 17:00:31 +00001156// Tests for Command.
1157class GraphicsComposerAidlCommandTest : public GraphicsComposerAidlTest {
1158 protected:
ramindanidcfe3a82021-11-29 17:00:31 +00001159 void TearDown() override {
Ady Abraham3192f3d2021-12-03 16:08:56 -08001160 const auto errors = mReader.takeErrors();
1161 ASSERT_TRUE(mReader.takeErrors().empty());
ramindani431aad42022-02-01 21:44:29 +00001162 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001163
ramindanidcfe3a82021-11-29 17:00:31 +00001164 ASSERT_NO_FATAL_FAILURE(GraphicsComposerAidlTest::TearDown());
1165 }
1166
1167 void execute() {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001168 std::vector<CommandResultPayload> payloads;
1169 for (auto& [_, writer] : mWriters) {
1170 const auto& commands = writer.getPendingCommands();
1171 if (commands.empty()) {
1172 writer.reset();
1173 continue;
1174 }
1175
1176 auto [status, results] = mComposerClient->executeCommands(commands);
1177 ASSERT_TRUE(status.isOk()) << "executeCommands failed " << status.getDescription();
1178 writer.reset();
1179
1180 payloads.reserve(payloads.size() + results.size());
1181 payloads.insert(payloads.end(), std::make_move_iterator(results.begin()),
1182 std::make_move_iterator(results.end()));
ramindanidcfe3a82021-11-29 17:00:31 +00001183 }
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001184 mReader.parse(std::move(payloads));
ramindanidcfe3a82021-11-29 17:00:31 +00001185 }
1186
1187 static inline auto toTimePoint(nsecs_t time) {
1188 return std::chrono::time_point<std::chrono::steady_clock>(std::chrono::nanoseconds(time));
1189 }
1190
ramindanidcfe3a82021-11-29 17:00:31 +00001191 void forEachTwoConfigs(int64_t display, std::function<void(int32_t, int32_t)> func) {
ramindani431aad42022-02-01 21:44:29 +00001192 const auto& [status, displayConfigs] = mComposerClient->getDisplayConfigs(display);
1193 ASSERT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001194 for (const int32_t config1 : displayConfigs) {
1195 for (const int32_t config2 : displayConfigs) {
1196 if (config1 != config2) {
1197 func(config1, config2);
1198 }
1199 }
1200 }
1201 }
1202
1203 void waitForVsyncPeriodChange(int64_t display, const VsyncPeriodChangeTimeline& timeline,
1204 int64_t desiredTimeNanos, int64_t oldPeriodNanos,
1205 int64_t newPeriodNanos) {
1206 const auto kChangeDeadline = toTimePoint(timeline.newVsyncAppliedTimeNanos) + 100ms;
1207 while (std::chrono::steady_clock::now() <= kChangeDeadline) {
ramindani431aad42022-02-01 21:44:29 +00001208 const auto& [status, vsyncPeriodNanos] =
1209 mComposerClient->getDisplayVsyncPeriod(display);
1210 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001211 if (systemTime() <= desiredTimeNanos) {
1212 EXPECT_EQ(vsyncPeriodNanos, oldPeriodNanos);
1213 } else if (vsyncPeriodNanos == newPeriodNanos) {
1214 break;
1215 }
1216 std::this_thread::sleep_for(std::chrono::nanoseconds(oldPeriodNanos));
1217 }
1218 }
1219
ramindani9dd8c482023-02-21 18:07:56 -08001220 bool checkIfCallbackRefreshRateChangedDebugEnabledReceived(
1221 std::function<bool(RefreshRateChangedDebugData)> filter) {
1222 const auto list = mComposerClient->takeListOfRefreshRateChangedDebugData();
1223 return std::any_of(list.begin(), list.end(), [&](auto refreshRateChangedDebugData) {
1224 return filter(refreshRateChangedDebugData);
1225 });
1226 }
1227
Brian Lindahl25e0d092022-12-09 00:32:11 -07001228 sp<GraphicBuffer> allocate(uint32_t width, uint32_t height,
1229 ::android::PixelFormat pixelFormat) {
Brian Lindahl14bd07b2023-01-17 14:54:39 -07001230 return sp<GraphicBuffer>::make(
Brian Lindahl25e0d092022-12-09 00:32:11 -07001231 width, height, pixelFormat, /*layerCount*/ 1U,
1232 static_cast<uint64_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
1233 static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
1234 static_cast<uint64_t>(common::BufferUsage::COMPOSER_OVERLAY),
Brian Lindahl14bd07b2023-01-17 14:54:39 -07001235 "VtsHalGraphicsComposer3_TargetTest");
Brian Lindahlca3eef22022-12-09 00:32:11 -07001236 }
1237
Brian Lindahl25e0d092022-12-09 00:32:11 -07001238 sp<GraphicBuffer> allocate(::android::PixelFormat pixelFormat) {
1239 return allocate(static_cast<uint32_t>(getPrimaryDisplay().getDisplayWidth()),
1240 static_cast<uint32_t>(getPrimaryDisplay().getDisplayHeight()), pixelFormat);
1241 }
1242
ramindanidcfe3a82021-11-29 17:00:31 +00001243 void sendRefreshFrame(const VtsDisplay& display, const VsyncPeriodChangeTimeline* timeline) {
1244 if (timeline != nullptr) {
1245 // Refresh time should be before newVsyncAppliedTimeNanos
1246 EXPECT_LT(timeline->refreshTimeNanos, timeline->newVsyncAppliedTimeNanos);
1247
1248 std::this_thread::sleep_until(toTimePoint(timeline->refreshTimeNanos));
1249 }
1250
ramindani431aad42022-02-01 21:44:29 +00001251 EXPECT_TRUE(mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::ON).isOk());
1252 EXPECT_TRUE(mComposerClient
1253 ->setColorMode(display.getDisplayId(), ColorMode::NATIVE,
1254 RenderIntent::COLORIMETRIC)
1255 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001256
ramindani431aad42022-02-01 21:44:29 +00001257 const auto& [status, layer] =
1258 mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount);
1259 EXPECT_TRUE(status.isOk());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001260 auto& writer = getWriter(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001261 {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001262 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindanidcfe3a82021-11-29 17:00:31 +00001263 ASSERT_NE(nullptr, buffer);
1264 ASSERT_EQ(::android::OK, buffer->initCheck());
1265 ASSERT_NE(nullptr, buffer->handle);
1266
ramindani431aad42022-02-01 21:44:29 +00001267 configureLayer(display, layer, Composition::DEVICE, display.getFrameRect(),
1268 display.getCrop());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001269 writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer->handle,
1270 /*acquireFence*/ -1);
1271 writer.setLayerDataspace(display.getDisplayId(), layer, common::Dataspace::UNKNOWN);
ramindanidcfe3a82021-11-29 17:00:31 +00001272
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001273 writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001274 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001275 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001276
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001277 writer.presentDisplay(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001278 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001279 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001280 }
1281
1282 {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001283 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindanidcfe3a82021-11-29 17:00:31 +00001284 ASSERT_NE(nullptr, buffer->handle);
1285
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001286 writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer->handle,
1287 /*acquireFence*/ -1);
1288 writer.setLayerSurfaceDamage(display.getDisplayId(), layer,
1289 std::vector<Rect>(1, {0, 0, 10, 10}));
1290 writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001291 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001292 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001293
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001294 writer.presentDisplay(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001295 execute();
1296 }
1297
ramindani431aad42022-02-01 21:44:29 +00001298 EXPECT_TRUE(mComposerClient->destroyLayer(display.getDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001299 }
1300
Ady Abraham72c5b502021-12-10 17:23:39 -08001301 sp<::android::Fence> presentAndGetFence(
1302 std::optional<ClockMonotonicTimestamp> expectedPresentTime) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001303 auto& writer = getWriter(getPrimaryDisplayId());
1304 writer.validateDisplay(getPrimaryDisplayId(), expectedPresentTime);
Ady Abraham72c5b502021-12-10 17:23:39 -08001305 execute();
1306 EXPECT_TRUE(mReader.takeErrors().empty());
1307
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001308 writer.presentDisplay(getPrimaryDisplayId());
Ady Abraham72c5b502021-12-10 17:23:39 -08001309 execute();
1310 EXPECT_TRUE(mReader.takeErrors().empty());
1311
ramindani431aad42022-02-01 21:44:29 +00001312 auto presentFence = mReader.takePresentFence(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -08001313 // take ownership
1314 const int fenceOwner = presentFence.get();
1315 *presentFence.getR() = -1;
1316 EXPECT_NE(-1, fenceOwner);
1317 return sp<::android::Fence>::make(fenceOwner);
Ady Abraham72c5b502021-12-10 17:23:39 -08001318 }
1319
1320 int32_t getVsyncPeriod() {
ramindani431aad42022-02-01 21:44:29 +00001321 const auto& [status, activeConfig] =
1322 mComposerClient->getActiveConfig(getPrimaryDisplayId());
1323 EXPECT_TRUE(status.isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001324
ramindani431aad42022-02-01 21:44:29 +00001325 const auto& [vsyncPeriodStatus, vsyncPeriod] = mComposerClient->getDisplayAttribute(
1326 getPrimaryDisplayId(), activeConfig, DisplayAttribute::VSYNC_PERIOD);
1327 EXPECT_TRUE(vsyncPeriodStatus.isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001328 return vsyncPeriod;
1329 }
1330
ramindani9dd8c482023-02-21 18:07:56 -08001331 int64_t createOnScreenLayer(Composition composition = Composition::DEVICE) {
ramindani431aad42022-02-01 21:44:29 +00001332 const auto& [status, layer] =
1333 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1334 EXPECT_TRUE(status.isOk());
1335 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1336 getPrimaryDisplay().getDisplayHeight()};
1337 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1338 (float)getPrimaryDisplay().getDisplayHeight()};
ramindani9dd8c482023-02-21 18:07:56 -08001339 configureLayer(getPrimaryDisplay(), layer, composition, displayFrame, cropRect);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001340 auto& writer = getWriter(getPrimaryDisplayId());
1341 writer.setLayerDataspace(getPrimaryDisplayId(), layer, common::Dataspace::UNKNOWN);
Ady Abraham72c5b502021-12-10 17:23:39 -08001342 return layer;
1343 }
1344
ramindani9dd8c482023-02-21 18:07:56 -08001345 void sendBufferUpdate(int64_t layer) {
1346 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1347 ASSERT_NE(nullptr, buffer->handle);
1348
1349 auto& writer = getWriter(getPrimaryDisplayId());
1350 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer->handle,
1351 /*acquireFence*/ -1);
1352
1353 const sp<::android::Fence> presentFence =
1354 presentAndGetFence(ComposerClientWriter::kNoTimestamp);
1355 presentFence->waitForever(LOG_TAG);
1356 }
1357
Midas Chiena0b56bd2022-01-13 23:27:33 +08001358 bool hasDisplayCapability(int64_t display, DisplayCapability cap) {
ramindani431aad42022-02-01 21:44:29 +00001359 const auto& [status, capabilities] = mComposerClient->getDisplayCapabilities(display);
1360 EXPECT_TRUE(status.isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08001361
1362 return std::find(capabilities.begin(), capabilities.end(), cap) != capabilities.end();
1363 }
1364
ramindanidcfe3a82021-11-29 17:00:31 +00001365 void Test_setActiveConfigWithConstraints(const TestParameters& params) {
1366 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00001367 forEachTwoConfigs(display.getDisplayId(), [&](int32_t config1, int32_t config2) {
1368 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001369 sendRefreshFrame(display, nullptr);
1370
ramindani431aad42022-02-01 21:44:29 +00001371 const auto displayConfigGroup1 = display.getDisplayConfig(config1);
1372 int32_t vsyncPeriod1 = displayConfigGroup1.vsyncPeriod;
1373 int32_t configGroup1 = displayConfigGroup1.configGroup;
1374
1375 const auto displayConfigGroup2 = display.getDisplayConfig(config2);
1376 int32_t vsyncPeriod2 = displayConfigGroup2.vsyncPeriod;
1377 int32_t configGroup2 = displayConfigGroup2.configGroup;
ramindanidcfe3a82021-11-29 17:00:31 +00001378
1379 if (vsyncPeriod1 == vsyncPeriod2) {
1380 return; // continue
1381 }
1382
1383 // We don't allow delayed change when changing config groups
1384 if (params.delayForChange > 0 && configGroup1 != configGroup2) {
1385 return; // continue
1386 }
1387
ramindanidcfe3a82021-11-29 17:00:31 +00001388 VsyncPeriodChangeConstraints constraints = {
1389 .desiredTimeNanos = systemTime() + params.delayForChange,
1390 .seamlessRequired = false};
ramindani431aad42022-02-01 21:44:29 +00001391 const auto& [status, timeline] = mComposerClient->setActiveConfigWithConstraints(
1392 &display, config2, constraints);
1393 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001394
1395 EXPECT_TRUE(timeline.newVsyncAppliedTimeNanos >= constraints.desiredTimeNanos);
1396 // Refresh rate should change within a reasonable time
1397 constexpr std::chrono::nanoseconds kReasonableTimeForChange = 1s; // 1 second
1398 EXPECT_TRUE(timeline.newVsyncAppliedTimeNanos - constraints.desiredTimeNanos <=
1399 kReasonableTimeForChange.count());
1400
1401 if (timeline.refreshRequired) {
1402 if (params.refreshMiss) {
1403 // Miss the refresh frame on purpose to make sure the implementation sends a
1404 // callback
1405 std::this_thread::sleep_until(toTimePoint(timeline.refreshTimeNanos) +
1406 100ms);
1407 }
1408 sendRefreshFrame(display, &timeline);
1409 }
ramindani431aad42022-02-01 21:44:29 +00001410 waitForVsyncPeriodChange(display.getDisplayId(), timeline,
1411 constraints.desiredTimeNanos, vsyncPeriod1, vsyncPeriod2);
ramindanidcfe3a82021-11-29 17:00:31 +00001412
1413 // At this point the refresh rate should have changed already, however in rare
1414 // cases the implementation might have missed the deadline. In this case a new
1415 // timeline should have been provided.
ramindani431aad42022-02-01 21:44:29 +00001416 auto newTimeline = mComposerClient->takeLastVsyncPeriodChangeTimeline();
ramindanidcfe3a82021-11-29 17:00:31 +00001417 if (timeline.refreshRequired && params.refreshMiss) {
1418 EXPECT_TRUE(newTimeline.has_value());
1419 }
1420
1421 if (newTimeline.has_value()) {
1422 if (newTimeline->refreshRequired) {
1423 sendRefreshFrame(display, &newTimeline.value());
1424 }
ramindani431aad42022-02-01 21:44:29 +00001425 waitForVsyncPeriodChange(display.getDisplayId(), newTimeline.value(),
ramindanidcfe3a82021-11-29 17:00:31 +00001426 constraints.desiredTimeNanos, vsyncPeriod1,
1427 vsyncPeriod2);
1428 }
1429
ramindani431aad42022-02-01 21:44:29 +00001430 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanos] =
1431 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
1432 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001433 EXPECT_EQ(vsyncPeriodNanos, vsyncPeriod2);
1434 });
1435 }
1436 }
1437
Ady Abraham72c5b502021-12-10 17:23:39 -08001438 void Test_expectedPresentTime(std::optional<int> framesDelay) {
Jason Macnak325e8232022-01-24 14:48:55 -08001439 if (hasCapability(Capability::PRESENT_FENCE_IS_NOT_RELIABLE)) {
1440 GTEST_SUCCEED() << "Device has unreliable present fences capability, skipping";
1441 return;
1442 }
1443
ramindani431aad42022-02-01 21:44:29 +00001444 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001445
1446 const auto vsyncPeriod = getVsyncPeriod();
1447
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001448 const auto buffer1 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1449 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
Ady Abraham72c5b502021-12-10 17:23:39 -08001450 ASSERT_NE(nullptr, buffer1);
1451 ASSERT_NE(nullptr, buffer2);
1452
1453 const auto layer = createOnScreenLayer();
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001454 auto& writer = getWriter(getPrimaryDisplayId());
1455 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer1->handle,
1456 /*acquireFence*/ -1);
Ady Abraham72c5b502021-12-10 17:23:39 -08001457 const sp<::android::Fence> presentFence1 =
1458 presentAndGetFence(ComposerClientWriter::kNoTimestamp);
1459 presentFence1->waitForever(LOG_TAG);
1460
1461 auto expectedPresentTime = presentFence1->getSignalTime() + vsyncPeriod;
1462 if (framesDelay.has_value()) {
1463 expectedPresentTime += *framesDelay * vsyncPeriod;
1464 }
1465
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001466 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer2->handle,
1467 /*acquireFence*/ -1);
Ady Abraham72c5b502021-12-10 17:23:39 -08001468 const auto setExpectedPresentTime = [&]() -> std::optional<ClockMonotonicTimestamp> {
1469 if (!framesDelay.has_value()) {
1470 return ComposerClientWriter::kNoTimestamp;
1471 } else if (*framesDelay == 0) {
1472 return ClockMonotonicTimestamp{0};
1473 }
1474 return ClockMonotonicTimestamp{expectedPresentTime};
1475 }();
1476
1477 const sp<::android::Fence> presentFence2 = presentAndGetFence(setExpectedPresentTime);
1478 presentFence2->waitForever(LOG_TAG);
1479
1480 const auto actualPresentTime = presentFence2->getSignalTime();
Ady Abrahamdf084f32022-01-10 14:10:23 -08001481 EXPECT_GE(actualPresentTime, expectedPresentTime - vsyncPeriod / 2);
Ady Abraham72c5b502021-12-10 17:23:39 -08001482
ramindani431aad42022-02-01 21:44:29 +00001483 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001484 }
1485
ramindani431aad42022-02-01 21:44:29 +00001486 void configureLayer(const VtsDisplay& display, int64_t layer, Composition composition,
1487 const Rect& displayFrame, const FRect& cropRect) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001488 auto& writer = getWriter(display.getDisplayId());
1489 writer.setLayerCompositionType(display.getDisplayId(), layer, composition);
1490 writer.setLayerDisplayFrame(display.getDisplayId(), layer, displayFrame);
1491 writer.setLayerPlaneAlpha(display.getDisplayId(), layer, /*alpha*/ 1);
1492 writer.setLayerSourceCrop(display.getDisplayId(), layer, cropRect);
1493 writer.setLayerTransform(display.getDisplayId(), layer, static_cast<Transform>(0));
1494 writer.setLayerVisibleRegion(display.getDisplayId(), layer,
1495 std::vector<Rect>(1, displayFrame));
1496 writer.setLayerZOrder(display.getDisplayId(), layer, /*z*/ 10);
1497 writer.setLayerBlendMode(display.getDisplayId(), layer, BlendMode::NONE);
1498 writer.setLayerSurfaceDamage(display.getDisplayId(), layer,
1499 std::vector<Rect>(1, displayFrame));
ramindani431aad42022-02-01 21:44:29 +00001500 }
ramindanidcfe3a82021-11-29 17:00:31 +00001501 // clang-format off
1502 const std::array<float, 16> kIdentity = {{
1503 1.0f, 0.0f, 0.0f, 0.0f,
1504 0.0f, 1.0f, 0.0f, 0.0f,
1505 0.0f, 0.0f, 1.0f, 0.0f,
1506 0.0f, 0.0f, 0.0f, 1.0f,
1507 }};
1508 // clang-format on
1509
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001510 ComposerClientWriter& getWriter(int64_t display) {
1511 auto [it, _] = mWriters.try_emplace(display, display);
1512 return it->second;
1513 }
1514
Ady Abraham91c9d1a2021-12-15 18:14:45 -08001515 ComposerClientReader mReader;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001516
1517 private:
1518 std::unordered_map<int64_t, ComposerClientWriter> mWriters;
ramindanidcfe3a82021-11-29 17:00:31 +00001519};
1520
ramindani431aad42022-02-01 21:44:29 +00001521TEST_P(GraphicsComposerAidlCommandTest, SetColorTransform) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001522 auto& writer = getWriter(getPrimaryDisplayId());
1523 writer.setColorTransform(getPrimaryDisplayId(), kIdentity.data());
ramindanidcfe3a82021-11-29 17:00:31 +00001524 execute();
1525}
1526
1527TEST_P(GraphicsComposerAidlCommandTest, SetLayerColorTransform) {
ramindani431aad42022-02-01 21:44:29 +00001528 const auto& [status, layer] =
1529 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1530 EXPECT_TRUE(status.isOk());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001531 auto& writer = getWriter(getPrimaryDisplayId());
1532 writer.setLayerColorTransform(getPrimaryDisplayId(), layer, kIdentity.data());
ramindanidcfe3a82021-11-29 17:00:31 +00001533 execute();
1534
Ady Abraham3192f3d2021-12-03 16:08:56 -08001535 const auto errors = mReader.takeErrors();
Jason Macnak062bc9a2022-01-20 15:00:09 -08001536 if (errors.size() == 1 && errors[0].errorCode == IComposerClient::EX_UNSUPPORTED) {
ramindanidcfe3a82021-11-29 17:00:31 +00001537 GTEST_SUCCEED() << "setLayerColorTransform is not supported";
1538 return;
1539 }
1540}
1541
Alec Mouri60564e12021-12-09 18:48:20 -08001542TEST_P(GraphicsComposerAidlCommandTest, SetDisplayBrightness) {
ramindani431aad42022-02-01 21:44:29 +00001543 const auto& [status, capabilities] =
1544 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
1545 ASSERT_TRUE(status.isOk());
Alec Mouri60564e12021-12-09 18:48:20 -08001546 bool brightnessSupport = std::find(capabilities.begin(), capabilities.end(),
1547 DisplayCapability::BRIGHTNESS) != capabilities.end();
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001548 auto& writer = getWriter(getPrimaryDisplayId());
Alec Mouri60564e12021-12-09 18:48:20 -08001549 if (!brightnessSupport) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001550 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.5f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001551 execute();
1552 const auto errors = mReader.takeErrors();
1553 EXPECT_EQ(1, errors.size());
Jason Macnak062bc9a2022-01-20 15:00:09 -08001554 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, errors[0].errorCode);
Alec Mouri60564e12021-12-09 18:48:20 -08001555 GTEST_SUCCEED() << "SetDisplayBrightness is not supported";
1556 return;
1557 }
1558
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001559 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001560 execute();
1561 EXPECT_TRUE(mReader.takeErrors().empty());
1562
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001563 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.5f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001564 execute();
1565 EXPECT_TRUE(mReader.takeErrors().empty());
1566
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001567 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 1.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001568 execute();
1569 EXPECT_TRUE(mReader.takeErrors().empty());
1570
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001571 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ -1.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001572 execute();
1573 EXPECT_TRUE(mReader.takeErrors().empty());
1574
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001575 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 2.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001576 execute();
1577 {
1578 const auto errors = mReader.takeErrors();
ramindanib3bdf052022-01-12 18:27:05 +00001579 ASSERT_EQ(1, errors.size());
Alec Mouri60564e12021-12-09 18:48:20 -08001580 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1581 }
1582
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001583 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ -2.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001584 execute();
1585 {
1586 const auto errors = mReader.takeErrors();
ramindanib3bdf052022-01-12 18:27:05 +00001587 ASSERT_EQ(1, errors.size());
Alec Mouri60564e12021-12-09 18:48:20 -08001588 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1589 }
1590}
1591
ramindani431aad42022-02-01 21:44:29 +00001592TEST_P(GraphicsComposerAidlCommandTest, SetClientTarget) {
1593 EXPECT_TRUE(mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kBufferSlotCount)
1594 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001595
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001596 auto& writer = getWriter(getPrimaryDisplayId());
1597 writer.setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, nullptr, /*acquireFence*/ -1,
1598 Dataspace::UNKNOWN, std::vector<Rect>());
ramindanidcfe3a82021-11-29 17:00:31 +00001599
1600 execute();
1601}
1602
ramindani431aad42022-02-01 21:44:29 +00001603TEST_P(GraphicsComposerAidlCommandTest, SetOutputBuffer) {
1604 const auto& [status, virtualDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
1605 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001606 if (virtualDisplayCount == 0) {
1607 GTEST_SUCCEED() << "no virtual display support";
1608 return;
1609 }
1610
ramindani431aad42022-02-01 21:44:29 +00001611 const auto& [displayStatus, display] = mComposerClient->createVirtualDisplay(
1612 /*width*/ 64, /*height*/ 64, common::PixelFormat::IMPLEMENTATION_DEFINED,
1613 kBufferSlotCount);
1614 EXPECT_TRUE(displayStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001615
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001616 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001617 const auto handle = buffer->handle;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001618 auto& writer = getWriter(display.display);
1619 writer.setOutputBuffer(display.display, /*slot*/ 0, handle, /*releaseFence*/ -1);
ramindanidcfe3a82021-11-29 17:00:31 +00001620 execute();
1621}
1622
ramindani431aad42022-02-01 21:44:29 +00001623TEST_P(GraphicsComposerAidlCommandTest, ValidDisplay) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001624 auto& writer = getWriter(getPrimaryDisplayId());
1625 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001626 execute();
1627}
1628
ramindani431aad42022-02-01 21:44:29 +00001629TEST_P(GraphicsComposerAidlCommandTest, AcceptDisplayChanges) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001630 auto& writer = getWriter(getPrimaryDisplayId());
1631 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1632 writer.acceptDisplayChanges(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001633 execute();
1634}
1635
ramindani431aad42022-02-01 21:44:29 +00001636TEST_P(GraphicsComposerAidlCommandTest, PresentDisplay) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001637 auto& writer = getWriter(getPrimaryDisplayId());
1638 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1639 writer.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001640 execute();
1641}
1642
1643/**
1644 * Test IComposerClient::Command::PRESENT_DISPLAY
1645 *
1646 * Test that IComposerClient::Command::PRESENT_DISPLAY works without
1647 * additional call to validateDisplay when only the layer buffer handle and
1648 * surface damage have been set
1649 */
ramindani431aad42022-02-01 21:44:29 +00001650TEST_P(GraphicsComposerAidlCommandTest, PresentDisplayNoLayerStateChanges) {
Jason Macnak325e8232022-01-24 14:48:55 -08001651 if (!hasCapability(Capability::SKIP_VALIDATE)) {
ramindanidcfe3a82021-11-29 17:00:31 +00001652 GTEST_SUCCEED() << "Device does not have skip validate capability, skipping";
1653 return;
1654 }
ramindani431aad42022-02-01 21:44:29 +00001655 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001656
ramindani431aad42022-02-01 21:44:29 +00001657 const auto& [renderIntentsStatus, renderIntents] =
1658 mComposerClient->getRenderIntents(getPrimaryDisplayId(), ColorMode::NATIVE);
1659 EXPECT_TRUE(renderIntentsStatus.isOk());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001660 auto& writer = getWriter(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001661 for (auto intent : renderIntents) {
ramindani431aad42022-02-01 21:44:29 +00001662 EXPECT_TRUE(mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE, intent)
1663 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001664
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001665 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001666 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001667 ASSERT_NE(nullptr, handle);
1668
ramindani431aad42022-02-01 21:44:29 +00001669 const auto& [layerStatus, layer] =
1670 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1671 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001672
ramindani431aad42022-02-01 21:44:29 +00001673 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1674 getPrimaryDisplay().getDisplayHeight()};
1675 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1676 (float)getPrimaryDisplay().getDisplayHeight()};
1677 configureLayer(getPrimaryDisplay(), layer, Composition::CURSOR, displayFrame, cropRect);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001678 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle,
1679 /*acquireFence*/ -1);
1680 writer.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1681 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001682 execute();
ramindani431aad42022-02-01 21:44:29 +00001683 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanidcfe3a82021-11-29 17:00:31 +00001684 GTEST_SUCCEED() << "Composition change requested, skipping test";
1685 return;
1686 }
1687
Ady Abraham3192f3d2021-12-03 16:08:56 -08001688 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001689 writer.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001690 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001691 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001692
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001693 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001694 const auto handle2 = buffer2->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001695 ASSERT_NE(nullptr, handle2);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001696 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle2,
1697 /*acquireFence*/ -1);
1698 writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer,
1699 std::vector<Rect>(1, {0, 0, 10, 10}));
1700 writer.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001701 execute();
1702 }
1703}
1704
ramindani431aad42022-02-01 21:44:29 +00001705TEST_P(GraphicsComposerAidlCommandTest, SetLayerCursorPosition) {
1706 const auto& [layerStatus, layer] =
1707 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1708 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001709
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001710 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001711 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001712 ASSERT_NE(nullptr, handle);
ramindanidcfe3a82021-11-29 17:00:31 +00001713
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001714 auto& writer = getWriter(getPrimaryDisplayId());
1715 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
ramindani431aad42022-02-01 21:44:29 +00001716
1717 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1718 getPrimaryDisplay().getDisplayHeight()};
1719 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1720 (float)getPrimaryDisplay().getDisplayHeight()};
1721 configureLayer(getPrimaryDisplay(), layer, Composition::CURSOR, displayFrame, cropRect);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001722 writer.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1723 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001724
1725 execute();
Ady Abraham46219f52021-12-20 09:44:31 -08001726
ramindani431aad42022-02-01 21:44:29 +00001727 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanidcfe3a82021-11-29 17:00:31 +00001728 GTEST_SUCCEED() << "Composition change requested, skipping test";
1729 return;
1730 }
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001731 writer.presentDisplay(getPrimaryDisplayId());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001732 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001733
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001734 writer.setLayerCursorPosition(getPrimaryDisplayId(), layer, /*x*/ 1, /*y*/ 1);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001735 execute();
1736
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001737 writer.setLayerCursorPosition(getPrimaryDisplayId(), layer, /*x*/ 0, /*y*/ 0);
1738 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1739 writer.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001740 execute();
1741}
1742
ramindani431aad42022-02-01 21:44:29 +00001743TEST_P(GraphicsComposerAidlCommandTest, SetLayerBuffer) {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001744 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001745 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001746 ASSERT_NE(nullptr, handle);
1747
ramindani431aad42022-02-01 21:44:29 +00001748 const auto& [layerStatus, layer] =
1749 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1750 EXPECT_TRUE(layerStatus.isOk());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001751 auto& writer = getWriter(getPrimaryDisplayId());
1752 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
ramindanidcfe3a82021-11-29 17:00:31 +00001753 execute();
1754}
1755
Brian Lindahl25e0d092022-12-09 00:32:11 -07001756TEST_P(GraphicsComposerAidlCommandTest, SetLayerBufferSlotsToClear) {
1757 // Older HAL versions use a backwards compatible way of clearing buffer slots
1758 const auto& [versionStatus, version] = mComposerClient->getInterfaceVersion();
1759 ASSERT_TRUE(versionStatus.isOk());
1760 if (version <= 1) {
1761 GTEST_SUCCEED() << "HAL at version 1 or lower does not have "
1762 "LayerCommand::bufferSlotsToClear.";
1763 return;
1764 }
1765
1766 const auto& [layerStatus, layer] =
1767 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1768 EXPECT_TRUE(layerStatus.isOk());
1769 auto& writer = getWriter(getPrimaryDisplayId());
1770
1771 // setup 3 buffers in the buffer cache, with the last buffer being active
1772 // then emulate the Android platform code that clears all 3 buffer slots
1773
1774 const auto buffer1 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1775 ASSERT_NE(nullptr, buffer1);
1776 const auto handle1 = buffer1->handle;
1777 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle1, /*acquireFence*/ -1);
1778 execute();
1779 ASSERT_TRUE(mReader.takeErrors().empty());
1780
1781 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1782 ASSERT_NE(nullptr, buffer2);
1783 const auto handle2 = buffer2->handle;
1784 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 1, handle2, /*acquireFence*/ -1);
1785 execute();
1786 ASSERT_TRUE(mReader.takeErrors().empty());
1787
1788 const auto buffer3 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1789 ASSERT_NE(nullptr, buffer3);
1790 const auto handle3 = buffer3->handle;
1791 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 2, handle3, /*acquireFence*/ -1);
1792 execute();
1793 ASSERT_TRUE(mReader.takeErrors().empty());
1794
1795 // Ensure we can clear all 3 buffer slots, even the active buffer - it is assumed the
1796 // current active buffer's slot will be cleared, but still remain the active buffer and no
1797 // errors will occur.
1798 writer.setLayerBufferSlotsToClear(getPrimaryDisplayId(), layer, {0, 1, 2});
1799 execute();
1800 ASSERT_TRUE(mReader.takeErrors().empty());
1801}
1802
1803TEST_P(GraphicsComposerAidlCommandTest, SetLayerBufferMultipleTimes) {
1804 const auto& [layerStatus, layer] =
1805 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1806 EXPECT_TRUE(layerStatus.isOk());
1807 auto& writer = getWriter(getPrimaryDisplayId());
1808
1809 // Setup 3 buffers in the buffer cache, with the last buffer being active. Then, emulate the
1810 // Android platform code that clears all 3 buffer slots by setting all but the active buffer
1811 // slot to a placeholder buffer, and then restoring the active buffer.
1812
1813 // This is used on HALs that don't support setLayerBufferSlotsToClear (version <= 3.1).
1814
1815 const auto buffer1 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1816 ASSERT_NE(nullptr, buffer1);
1817 const auto handle1 = buffer1->handle;
1818 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle1, /*acquireFence*/ -1);
1819 execute();
1820 ASSERT_TRUE(mReader.takeErrors().empty());
1821
1822 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1823 ASSERT_NE(nullptr, buffer2);
1824 const auto handle2 = buffer2->handle;
1825 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 1, handle2, /*acquireFence*/ -1);
1826 execute();
1827 ASSERT_TRUE(mReader.takeErrors().empty());
1828
1829 const auto buffer3 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1830 ASSERT_NE(nullptr, buffer3);
1831 const auto handle3 = buffer3->handle;
1832 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 2, handle3, /*acquireFence*/ -1);
1833 execute();
1834 ASSERT_TRUE(mReader.takeErrors().empty());
1835
1836 // Older versions of the HAL clear all but the active buffer slot with a placeholder buffer,
1837 // and then restoring the current active buffer at the end
1838 auto clearSlotBuffer = allocate(1u, 1u, ::android::PIXEL_FORMAT_RGB_888);
1839 ASSERT_NE(nullptr, clearSlotBuffer);
1840 auto clearSlotBufferHandle = clearSlotBuffer->handle;
1841
1842 // clear buffer slots 0 and 1 with new layer commands... and then...
1843 writer.setLayerBufferWithNewCommand(getPrimaryDisplayId(), layer, /* slot */ 0,
1844 clearSlotBufferHandle, /*acquireFence*/ -1);
1845 writer.setLayerBufferWithNewCommand(getPrimaryDisplayId(), layer, /* slot */ 1,
1846 clearSlotBufferHandle, /*acquireFence*/ -1);
1847 // ...reset the layer buffer to the current active buffer slot with a final new command
1848 writer.setLayerBufferWithNewCommand(getPrimaryDisplayId(), layer, /*slot*/ 2, nullptr,
1849 /*acquireFence*/ -1);
1850 execute();
1851 ASSERT_TRUE(mReader.takeErrors().empty());
1852}
1853
ramindani431aad42022-02-01 21:44:29 +00001854TEST_P(GraphicsComposerAidlCommandTest, SetLayerSurfaceDamage) {
1855 const auto& [layerStatus, layer] =
1856 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1857 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001858
1859 Rect empty{0, 0, 0, 0};
1860 Rect unit{0, 0, 1, 1};
1861
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001862 auto& writer = getWriter(getPrimaryDisplayId());
1863 writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
ramindanidcfe3a82021-11-29 17:00:31 +00001864 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001865 ASSERT_TRUE(mReader.takeErrors().empty());
1866
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001867 writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001868 execute();
1869 ASSERT_TRUE(mReader.takeErrors().empty());
1870
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001871 writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001872 execute();
1873 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001874}
1875
ramindani431aad42022-02-01 21:44:29 +00001876TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlockingRegion) {
1877 const auto& [layerStatus, layer] =
1878 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1879 EXPECT_TRUE(layerStatus.isOk());
Leon Scroggins III03318152022-01-13 12:24:19 -05001880
1881 Rect empty{0, 0, 0, 0};
1882 Rect unit{0, 0, 1, 1};
1883
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001884 auto& writer = getWriter(getPrimaryDisplayId());
1885 writer.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
Leon Scroggins III03318152022-01-13 12:24:19 -05001886 execute();
1887 ASSERT_TRUE(mReader.takeErrors().empty());
1888
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001889 writer.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Leon Scroggins III03318152022-01-13 12:24:19 -05001890 execute();
1891 ASSERT_TRUE(mReader.takeErrors().empty());
1892
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001893 writer.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
Leon Scroggins III03318152022-01-13 12:24:19 -05001894 execute();
1895 ASSERT_TRUE(mReader.takeErrors().empty());
1896}
1897
ramindani431aad42022-02-01 21:44:29 +00001898TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlendMode) {
1899 const auto& [layerStatus, layer] =
1900 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1901 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001902
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001903 auto& writer = getWriter(getPrimaryDisplayId());
1904 writer.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::NONE);
ramindanidcfe3a82021-11-29 17:00:31 +00001905 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001906 ASSERT_TRUE(mReader.takeErrors().empty());
1907
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001908 writer.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::PREMULTIPLIED);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001909 execute();
1910 ASSERT_TRUE(mReader.takeErrors().empty());
1911
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001912 writer.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::COVERAGE);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001913 execute();
1914 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001915}
1916
ramindani431aad42022-02-01 21:44:29 +00001917TEST_P(GraphicsComposerAidlCommandTest, SetLayerColor) {
1918 const auto& [layerStatus, layer] =
1919 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1920 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001921
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001922 auto& writer = getWriter(getPrimaryDisplayId());
1923 writer.setLayerColor(getPrimaryDisplayId(), layer, Color{1.0f, 1.0f, 1.0f, 1.0f});
ramindanidcfe3a82021-11-29 17:00:31 +00001924 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001925 ASSERT_TRUE(mReader.takeErrors().empty());
1926
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001927 writer.setLayerColor(getPrimaryDisplayId(), layer, Color{0.0f, 0.0f, 0.0f, 0.0f});
Ady Abraham3192f3d2021-12-03 16:08:56 -08001928 execute();
1929 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001930}
1931
ramindani431aad42022-02-01 21:44:29 +00001932TEST_P(GraphicsComposerAidlCommandTest, SetLayerCompositionType) {
1933 const auto& [layerStatus, layer] =
1934 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1935 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001936
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001937 auto& writer = getWriter(getPrimaryDisplayId());
1938 writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CLIENT);
ramindanidcfe3a82021-11-29 17:00:31 +00001939 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001940 ASSERT_TRUE(mReader.takeErrors().empty());
1941
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001942 writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::DEVICE);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001943 execute();
1944 ASSERT_TRUE(mReader.takeErrors().empty());
1945
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001946 writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::SOLID_COLOR);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001947 execute();
1948 ASSERT_TRUE(mReader.takeErrors().empty());
1949
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001950 writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CURSOR);
ramindani431aad42022-02-01 21:44:29 +00001951 execute();
1952}
1953
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001954TEST_P(GraphicsComposerAidlCommandTest, DisplayDecoration) {
1955 for (VtsDisplay& display : mDisplays) {
1956 const auto [layerStatus, layer] =
1957 mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount);
1958 EXPECT_TRUE(layerStatus.isOk());
1959
1960 const auto [error, support] =
1961 mComposerClient->getDisplayDecorationSupport(display.getDisplayId());
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001962
Leon Scroggins III91590872022-02-23 09:51:21 -05001963 const auto format = (error.isOk() && support) ? support->format
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001964 : aidl::android::hardware::graphics::common::PixelFormat::RGBA_8888;
1965 const auto decorBuffer = allocate(static_cast<::android::PixelFormat>(format));
1966 ASSERT_NE(nullptr, decorBuffer);
1967 if (::android::OK != decorBuffer->initCheck()) {
1968 if (support) {
1969 FAIL() << "Device advertised display decoration support with format "
1970 << aidl::android::hardware::graphics::common::toString(format)
1971 << " but failed to allocate it!";
1972 } else {
1973 FAIL() << "Device advertised NO display decoration support, but it should "
1974 << "still be able to allocate "
1975 << aidl::android::hardware::graphics::common::toString(format);
1976 }
1977 }
1978
Midas Chien7d55d422022-06-07 02:32:28 +08001979 configureLayer(display, layer, Composition::DISPLAY_DECORATION, display.getFrameRect(),
1980 display.getCrop());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001981 auto& writer = getWriter(display.getDisplayId());
1982 writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, decorBuffer->handle,
1983 /*acquireFence*/ -1);
1984 writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001985 execute();
1986 if (support) {
1987 ASSERT_TRUE(mReader.takeErrors().empty());
1988 } else {
1989 const auto errors = mReader.takeErrors();
1990 ASSERT_EQ(1, errors.size());
Leon Scroggins III6455e792022-02-24 12:18:58 -05001991 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, errors[0].errorCode);
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001992 }
1993 }
1994}
1995
ramindani431aad42022-02-01 21:44:29 +00001996TEST_P(GraphicsComposerAidlCommandTest, SetLayerDataspace) {
1997 const auto& [layerStatus, layer] =
1998 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1999 EXPECT_TRUE(layerStatus.isOk());
2000
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002001 auto& writer = getWriter(getPrimaryDisplayId());
2002 writer.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
ramindani431aad42022-02-01 21:44:29 +00002003 execute();
2004}
2005
2006TEST_P(GraphicsComposerAidlCommandTest, SetLayerDisplayFrame) {
2007 const auto& [layerStatus, layer] =
2008 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2009 EXPECT_TRUE(layerStatus.isOk());
2010
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002011 auto& writer = getWriter(getPrimaryDisplayId());
2012 writer.setLayerDisplayFrame(getPrimaryDisplayId(), layer, Rect{0, 0, 1, 1});
ramindani431aad42022-02-01 21:44:29 +00002013 execute();
2014}
2015
2016TEST_P(GraphicsComposerAidlCommandTest, SetLayerPlaneAlpha) {
2017 const auto& [layerStatus, layer] =
2018 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2019 EXPECT_TRUE(layerStatus.isOk());
2020
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002021 auto& writer = getWriter(getPrimaryDisplayId());
2022 writer.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 0.0f);
ramindani431aad42022-02-01 21:44:29 +00002023 execute();
2024 ASSERT_TRUE(mReader.takeErrors().empty());
2025
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002026 writer.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 1.0f);
Ady Abraham3192f3d2021-12-03 16:08:56 -08002027 execute();
2028 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00002029}
2030
ramindani431aad42022-02-01 21:44:29 +00002031TEST_P(GraphicsComposerAidlCommandTest, SetLayerSidebandStream) {
Jason Macnak325e8232022-01-24 14:48:55 -08002032 if (!hasCapability(Capability::SIDEBAND_STREAM)) {
ramindanidcfe3a82021-11-29 17:00:31 +00002033 GTEST_SUCCEED() << "no sideband stream support";
2034 return;
2035 }
2036
Leon Scroggins IIIde057582022-01-13 12:26:00 -05002037 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00002038 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00002039 ASSERT_NE(nullptr, handle);
2040
ramindani431aad42022-02-01 21:44:29 +00002041 const auto& [layerStatus, layer] =
2042 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2043 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002044
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002045 auto& writer = getWriter(getPrimaryDisplayId());
2046 writer.setLayerSidebandStream(getPrimaryDisplayId(), layer, handle);
ramindanidcfe3a82021-11-29 17:00:31 +00002047 execute();
2048}
2049
ramindani431aad42022-02-01 21:44:29 +00002050TEST_P(GraphicsComposerAidlCommandTest, SetLayerSourceCrop) {
2051 const auto& [layerStatus, layer] =
2052 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2053 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002054
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002055 auto& writer = getWriter(getPrimaryDisplayId());
2056 writer.setLayerSourceCrop(getPrimaryDisplayId(), layer, FRect{0.0f, 0.0f, 1.0f, 1.0f});
ramindanidcfe3a82021-11-29 17:00:31 +00002057 execute();
2058}
2059
ramindani431aad42022-02-01 21:44:29 +00002060TEST_P(GraphicsComposerAidlCommandTest, SetLayerTransform) {
2061 const auto& [layerStatus, layer] =
2062 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2063 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002064
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002065 auto& writer = getWriter(getPrimaryDisplayId());
2066 writer.setLayerTransform(getPrimaryDisplayId(), layer, static_cast<Transform>(0));
ramindanidcfe3a82021-11-29 17:00:31 +00002067 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08002068 ASSERT_TRUE(mReader.takeErrors().empty());
2069
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002070 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_H);
Ady Abraham3192f3d2021-12-03 16:08:56 -08002071 execute();
2072 ASSERT_TRUE(mReader.takeErrors().empty());
2073
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002074 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_V);
Ady Abraham3192f3d2021-12-03 16:08:56 -08002075 execute();
2076 ASSERT_TRUE(mReader.takeErrors().empty());
2077
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002078 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_90);
Ady Abraham3192f3d2021-12-03 16:08:56 -08002079 execute();
2080 ASSERT_TRUE(mReader.takeErrors().empty());
2081
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002082 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_180);
Ady Abraham3192f3d2021-12-03 16:08:56 -08002083 execute();
2084 ASSERT_TRUE(mReader.takeErrors().empty());
2085
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002086 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_270);
Ady Abraham3192f3d2021-12-03 16:08:56 -08002087 execute();
2088 ASSERT_TRUE(mReader.takeErrors().empty());
2089
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002090 writer.setLayerTransform(getPrimaryDisplayId(), layer,
2091 static_cast<Transform>(static_cast<int>(Transform::FLIP_H) |
2092 static_cast<int>(Transform::ROT_90)));
Ady Abraham3192f3d2021-12-03 16:08:56 -08002093 execute();
2094 ASSERT_TRUE(mReader.takeErrors().empty());
2095
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002096 writer.setLayerTransform(getPrimaryDisplayId(), layer,
2097 static_cast<Transform>(static_cast<int>(Transform::FLIP_V) |
2098 static_cast<int>(Transform::ROT_90)));
Ady Abraham3192f3d2021-12-03 16:08:56 -08002099 execute();
2100 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00002101}
2102
ramindani431aad42022-02-01 21:44:29 +00002103TEST_P(GraphicsComposerAidlCommandTest, SetLayerVisibleRegion) {
2104 const auto& [layerStatus, layer] =
2105 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2106 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002107
2108 Rect empty{0, 0, 0, 0};
2109 Rect unit{0, 0, 1, 1};
2110
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002111 auto& writer = getWriter(getPrimaryDisplayId());
2112 writer.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
ramindanidcfe3a82021-11-29 17:00:31 +00002113 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08002114 ASSERT_TRUE(mReader.takeErrors().empty());
2115
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002116 writer.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Ady Abraham3192f3d2021-12-03 16:08:56 -08002117 execute();
2118 ASSERT_TRUE(mReader.takeErrors().empty());
2119
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002120 writer.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
Ady Abraham3192f3d2021-12-03 16:08:56 -08002121 execute();
2122 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00002123}
2124
ramindani431aad42022-02-01 21:44:29 +00002125TEST_P(GraphicsComposerAidlCommandTest, SetLayerZOrder) {
2126 const auto& [layerStatus, layer] =
2127 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2128 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002129
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002130 auto& writer = getWriter(getPrimaryDisplayId());
2131 writer.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 10);
ramindanidcfe3a82021-11-29 17:00:31 +00002132 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08002133 ASSERT_TRUE(mReader.takeErrors().empty());
2134
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002135 writer.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 0);
Ady Abraham3192f3d2021-12-03 16:08:56 -08002136 execute();
2137 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00002138}
2139
ramindani431aad42022-02-01 21:44:29 +00002140TEST_P(GraphicsComposerAidlCommandTest, SetLayerPerFrameMetadata) {
2141 const auto& [layerStatus, layer] =
2142 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2143 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002144
ramindanidcfe3a82021-11-29 17:00:31 +00002145 /**
2146 * DISPLAY_P3 is a color space that uses the DCI_P3 primaries,
2147 * the D65 white point and the SRGB transfer functions.
2148 * Rendering Intent: Colorimetric
2149 * Primaries:
2150 * x y
2151 * green 0.265 0.690
2152 * blue 0.150 0.060
2153 * red 0.680 0.320
2154 * white (D65) 0.3127 0.3290
2155 */
2156
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002157 auto& writer = getWriter(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00002158 std::vector<PerFrameMetadata> aidlMetadata;
2159 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X, 0.680f});
2160 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y, 0.320f});
2161 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_X, 0.265f});
2162 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_Y, 0.690f});
2163 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_X, 0.150f});
2164 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_Y, 0.060f});
2165 aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_X, 0.3127f});
2166 aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_Y, 0.3290f});
2167 aidlMetadata.push_back({PerFrameMetadataKey::MAX_LUMINANCE, 100.0f});
2168 aidlMetadata.push_back({PerFrameMetadataKey::MIN_LUMINANCE, 0.1f});
2169 aidlMetadata.push_back({PerFrameMetadataKey::MAX_CONTENT_LIGHT_LEVEL, 78.0});
2170 aidlMetadata.push_back({PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL, 62.0});
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002171 writer.setLayerPerFrameMetadata(getPrimaryDisplayId(), layer, aidlMetadata);
ramindanidcfe3a82021-11-29 17:00:31 +00002172 execute();
2173
Ady Abraham3192f3d2021-12-03 16:08:56 -08002174 const auto errors = mReader.takeErrors();
2175 if (errors.size() == 1 && errors[0].errorCode == EX_UNSUPPORTED_OPERATION) {
ramindanidcfe3a82021-11-29 17:00:31 +00002176 GTEST_SUCCEED() << "SetLayerPerFrameMetadata is not supported";
ramindani431aad42022-02-01 21:44:29 +00002177 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002178 return;
2179 }
2180
ramindani431aad42022-02-01 21:44:29 +00002181 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002182}
2183
Alec Mourib1f16722022-02-07 13:03:44 -08002184TEST_P(GraphicsComposerAidlCommandTest, setLayerBrightness) {
ramindani431aad42022-02-01 21:44:29 +00002185 const auto& [layerStatus, layer] =
2186 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
Alec Mouri95e490b2022-01-06 13:46:58 -08002187
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002188 auto& writer = getWriter(getPrimaryDisplayId());
2189 writer.setLayerBrightness(getPrimaryDisplayId(), layer, 0.2f);
Alec Mouri95e490b2022-01-06 13:46:58 -08002190 execute();
2191 ASSERT_TRUE(mReader.takeErrors().empty());
2192
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002193 writer.setLayerBrightness(getPrimaryDisplayId(), layer, 1.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08002194 execute();
2195 ASSERT_TRUE(mReader.takeErrors().empty());
2196
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002197 writer.setLayerBrightness(getPrimaryDisplayId(), layer, 0.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08002198 execute();
2199 ASSERT_TRUE(mReader.takeErrors().empty());
2200
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002201 writer.setLayerBrightness(getPrimaryDisplayId(), layer, -1.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08002202 execute();
Alec Mourib1f16722022-02-07 13:03:44 -08002203 {
2204 const auto errors = mReader.takeErrors();
2205 ASSERT_EQ(1, errors.size());
2206 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
2207 }
2208
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002209 writer.setLayerBrightness(getPrimaryDisplayId(), layer, std::nanf(""));
Alec Mourib1f16722022-02-07 13:03:44 -08002210 execute();
2211 {
2212 const auto errors = mReader.takeErrors();
2213 ASSERT_EQ(1, errors.size());
2214 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
2215 }
Alec Mouri95e490b2022-01-06 13:46:58 -08002216}
2217
ramindani431aad42022-02-01 21:44:29 +00002218TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints) {
ramindanidcfe3a82021-11-29 17:00:31 +00002219 Test_setActiveConfigWithConstraints({.delayForChange = 0, .refreshMiss = false});
2220}
2221
ramindani431aad42022-02-01 21:44:29 +00002222TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_Delayed) {
ramindanidcfe3a82021-11-29 17:00:31 +00002223 Test_setActiveConfigWithConstraints({.delayForChange = 300'000'000, // 300ms
2224 .refreshMiss = false});
2225}
2226
ramindani431aad42022-02-01 21:44:29 +00002227TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_MissRefresh) {
ramindanidcfe3a82021-11-29 17:00:31 +00002228 Test_setActiveConfigWithConstraints({.delayForChange = 0, .refreshMiss = true});
2229}
2230
ramindani431aad42022-02-01 21:44:29 +00002231TEST_P(GraphicsComposerAidlCommandTest, GetDisplayVsyncPeriod) {
ramindanidcfe3a82021-11-29 17:00:31 +00002232 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00002233 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
2234 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002235
ramindani431aad42022-02-01 21:44:29 +00002236 for (int32_t config : configs) {
2237 int32_t expectedVsyncPeriodNanos = display.getDisplayConfig(config).vsyncPeriod;
2238
ramindanidcfe3a82021-11-29 17:00:31 +00002239 VsyncPeriodChangeConstraints constraints;
2240
2241 constraints.desiredTimeNanos = systemTime();
2242 constraints.seamlessRequired = false;
ramindani431aad42022-02-01 21:44:29 +00002243
2244 const auto& [timelineStatus, timeline] =
2245 mComposerClient->setActiveConfigWithConstraints(&display, config, constraints);
2246 EXPECT_TRUE(timelineStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002247
2248 if (timeline.refreshRequired) {
2249 sendRefreshFrame(display, &timeline);
2250 }
ramindani431aad42022-02-01 21:44:29 +00002251 waitForVsyncPeriodChange(display.getDisplayId(), timeline, constraints.desiredTimeNanos,
2252 /*odPeriodNanos*/ 0, expectedVsyncPeriodNanos);
ramindanidcfe3a82021-11-29 17:00:31 +00002253
2254 int32_t vsyncPeriodNanos;
2255 int retryCount = 100;
2256 do {
2257 std::this_thread::sleep_for(10ms);
ramindani431aad42022-02-01 21:44:29 +00002258 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanosValue] =
2259 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
2260
2261 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
2262 vsyncPeriodNanos = vsyncPeriodNanosValue;
ramindanidcfe3a82021-11-29 17:00:31 +00002263 --retryCount;
2264 } while (vsyncPeriodNanos != expectedVsyncPeriodNanos && retryCount > 0);
2265
2266 EXPECT_EQ(vsyncPeriodNanos, expectedVsyncPeriodNanos);
2267
2268 // Make sure that the vsync period stays the same if the active config is not
2269 // changed.
2270 auto timeout = 1ms;
2271 for (int i = 0; i < 10; i++) {
2272 std::this_thread::sleep_for(timeout);
2273 timeout *= 2;
2274 vsyncPeriodNanos = 0;
ramindani431aad42022-02-01 21:44:29 +00002275 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanosValue] =
2276 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
2277
2278 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
2279 vsyncPeriodNanos = vsyncPeriodNanosValue;
ramindanidcfe3a82021-11-29 17:00:31 +00002280 EXPECT_EQ(vsyncPeriodNanos, expectedVsyncPeriodNanos);
2281 }
2282 }
2283 }
2284}
2285
ramindani431aad42022-02-01 21:44:29 +00002286TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_SeamlessNotAllowed) {
ramindanidcfe3a82021-11-29 17:00:31 +00002287 VsyncPeriodChangeConstraints constraints;
ramindanidcfe3a82021-11-29 17:00:31 +00002288 constraints.seamlessRequired = true;
2289 constraints.desiredTimeNanos = systemTime();
2290
2291 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00002292 forEachTwoConfigs(display.getDisplayId(), [&](int32_t config1, int32_t config2) {
2293 int32_t configGroup1 = display.getDisplayConfig(config1).configGroup;
2294 int32_t configGroup2 = display.getDisplayConfig(config2).configGroup;
ramindanidcfe3a82021-11-29 17:00:31 +00002295 if (configGroup1 != configGroup2) {
ramindani431aad42022-02-01 21:44:29 +00002296 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002297 sendRefreshFrame(display, nullptr);
ramindani431aad42022-02-01 21:44:29 +00002298 const auto& [status, _] = mComposerClient->setActiveConfigWithConstraints(
2299 &display, config2, constraints);
2300 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002301 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(
2302 status, IComposerClient::EX_SEAMLESS_NOT_ALLOWED));
ramindanidcfe3a82021-11-29 17:00:31 +00002303 }
2304 });
2305 }
2306}
2307
ramindani431aad42022-02-01 21:44:29 +00002308TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_NoTimestamp) {
2309 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ std::nullopt));
Ady Abraham72c5b502021-12-10 17:23:39 -08002310}
2311
ramindani431aad42022-02-01 21:44:29 +00002312TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_0) {
2313 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ 0));
Ady Abraham72c5b502021-12-10 17:23:39 -08002314}
2315
ramindani431aad42022-02-01 21:44:29 +00002316TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_5) {
2317 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ 5));
Ady Abraham72c5b502021-12-10 17:23:39 -08002318}
2319
ramindani431aad42022-02-01 21:44:29 +00002320TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Unsupported) {
2321 const bool hasDisplayIdleTimerSupport =
2322 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002323 if (!hasDisplayIdleTimerSupport) {
ramindani431aad42022-02-01 21:44:29 +00002324 const auto& status =
2325 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0);
2326 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002327 EXPECT_NO_FATAL_FAILURE(
2328 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
Midas Chiena0b56bd2022-01-13 23:27:33 +08002329 }
2330}
2331
ramindani431aad42022-02-01 21:44:29 +00002332TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_BadParameter) {
2333 const bool hasDisplayIdleTimerSupport =
2334 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002335 if (!hasDisplayIdleTimerSupport) {
2336 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2337 return;
2338 }
2339
ramindani431aad42022-02-01 21:44:29 +00002340 const auto& status =
2341 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ -1);
2342 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002343 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
Midas Chiena0b56bd2022-01-13 23:27:33 +08002344}
2345
ramindani431aad42022-02-01 21:44:29 +00002346TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Disable) {
2347 const bool hasDisplayIdleTimerSupport =
2348 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002349 if (!hasDisplayIdleTimerSupport) {
2350 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2351 return;
2352 }
2353
ramindani431aad42022-02-01 21:44:29 +00002354 EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002355 std::this_thread::sleep_for(1s);
ramindani431aad42022-02-01 21:44:29 +00002356 EXPECT_EQ(0, mComposerClient->getVsyncIdleCount());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002357}
2358
ramindani431aad42022-02-01 21:44:29 +00002359TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Timeout_2) {
2360 const bool hasDisplayIdleTimerSupport =
2361 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002362 if (!hasDisplayIdleTimerSupport) {
2363 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2364 return;
2365 }
2366
ramindani431aad42022-02-01 21:44:29 +00002367 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
2368 EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002369
Leon Scroggins IIIde057582022-01-13 12:26:00 -05002370 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002371 ASSERT_NE(nullptr, buffer->handle);
2372
2373 const auto layer = createOnScreenLayer();
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002374 auto& writer = getWriter(getPrimaryDisplayId());
2375 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer->handle,
2376 /*acquireFence*/ -1);
ramindani431aad42022-02-01 21:44:29 +00002377 int32_t vsyncIdleCount = mComposerClient->getVsyncIdleCount();
Midas Chiena0b56bd2022-01-13 23:27:33 +08002378 auto earlyVsyncIdleTime = systemTime() + std::chrono::nanoseconds(2s).count();
ramindani431aad42022-02-01 21:44:29 +00002379 EXPECT_TRUE(
2380 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 2000).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002381
2382 const sp<::android::Fence> presentFence =
ramindani431aad42022-02-01 21:44:29 +00002383 presentAndGetFence(ComposerClientWriter::kNoTimestamp);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002384 presentFence->waitForever(LOG_TAG);
2385
2386 std::this_thread::sleep_for(3s);
ramindani431aad42022-02-01 21:44:29 +00002387 if (vsyncIdleCount < mComposerClient->getVsyncIdleCount()) {
2388 EXPECT_GE(mComposerClient->getVsyncIdleTime(), earlyVsyncIdleTime);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002389 }
2390
ramindani431aad42022-02-01 21:44:29 +00002391 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002392}
2393
ramindani9dd8c482023-02-21 18:07:56 -08002394TEST_P(GraphicsComposerAidlCommandTest, SetRefreshRateChangedCallbackDebug_Unsupported) {
2395 if (!hasCapability(Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG)) {
2396 auto status = mComposerClient->setRefreshRateChangedCallbackDebugEnabled(
2397 getPrimaryDisplayId(), /*enabled*/ true);
2398 EXPECT_FALSE(status.isOk());
2399 EXPECT_NO_FATAL_FAILURE(
2400 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
2401
2402 status = mComposerClient->setRefreshRateChangedCallbackDebugEnabled(getPrimaryDisplayId(),
2403 /*enabled*/ false);
2404 EXPECT_FALSE(status.isOk());
2405 EXPECT_NO_FATAL_FAILURE(
2406 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
2407 }
2408}
2409
2410TEST_P(GraphicsComposerAidlCommandTest, SetRefreshRateChangedCallbackDebug_Enabled) {
2411 if (!hasCapability(Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG)) {
2412 GTEST_SUCCEED() << "Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG is not supported";
2413 return;
2414 }
2415
2416 const auto displayId = getPrimaryDisplayId();
2417 EXPECT_TRUE(mComposerClient->setPowerMode(displayId, PowerMode::ON).isOk());
2418 // Enable the callback
2419 ASSERT_TRUE(mComposerClient
2420 ->setRefreshRateChangedCallbackDebugEnabled(displayId,
2421 /*enabled*/ true)
2422 .isOk());
2423 std::this_thread::sleep_for(100ms);
2424
ramindani91518892023-03-03 16:55:09 +00002425 const auto displayFilter = [displayId](auto refreshRateChangedDebugData) {
2426 return displayId == refreshRateChangedDebugData.display;
2427 };
ramindani9dd8c482023-02-21 18:07:56 -08002428
2429 // Check that we immediately got a callback
ramindani91518892023-03-03 16:55:09 +00002430 EXPECT_TRUE(checkIfCallbackRefreshRateChangedDebugEnabledReceived(displayFilter));
ramindani9dd8c482023-02-21 18:07:56 -08002431
2432 ASSERT_TRUE(mComposerClient
2433 ->setRefreshRateChangedCallbackDebugEnabled(displayId,
2434 /*enabled*/ false)
2435 .isOk());
2436}
2437
2438TEST_P(GraphicsComposerAidlCommandTest,
2439 SetRefreshRateChangedCallbackDebugEnabled_noCallbackWhenIdle) {
2440 if (!hasCapability(Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG)) {
2441 GTEST_SUCCEED() << "Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG is not supported";
2442 return;
2443 }
2444
2445 auto display = getEditablePrimaryDisplay();
2446 const auto displayId = display.getDisplayId();
2447
2448 if (!hasDisplayCapability(displayId, DisplayCapability::DISPLAY_IDLE_TIMER)) {
2449 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2450 return;
2451 }
2452
2453 EXPECT_TRUE(mComposerClient->setPowerMode(displayId, PowerMode::ON).isOk());
2454 EXPECT_TRUE(mComposerClient->setPeakRefreshRateConfig(&display).isOk());
2455
2456 ASSERT_TRUE(mComposerClient->setIdleTimerEnabled(displayId, /*timeoutMs*/ 500).isOk());
2457 // Enable the callback
2458 ASSERT_TRUE(mComposerClient
2459 ->setRefreshRateChangedCallbackDebugEnabled(displayId,
2460 /*enabled*/ true)
2461 .isOk());
2462
ramindani91518892023-03-03 16:55:09 +00002463 const auto displayFilter = [displayId](auto refreshRateChangedDebugData) {
2464 return displayId == refreshRateChangedDebugData.display;
2465 };
ramindani9dd8c482023-02-21 18:07:56 -08002466
2467 int retryCount = 3;
2468 do {
2469 // Wait for 1s so that we enter the idle state
2470 std::this_thread::sleep_for(1s);
ramindani91518892023-03-03 16:55:09 +00002471 if (!checkIfCallbackRefreshRateChangedDebugEnabledReceived(displayFilter)) {
ramindani9dd8c482023-02-21 18:07:56 -08002472 // DID NOT receive a callback, we are in the idle state.
2473 break;
2474 }
2475 } while (--retryCount > 0);
2476
2477 if (retryCount == 0) {
2478 GTEST_SUCCEED() << "Unable to enter the idle mode";
2479 return;
2480 }
2481
2482 // Send the REFRESH_RATE_INDICATOR update
2483 ASSERT_NO_FATAL_FAILURE(
2484 sendBufferUpdate(createOnScreenLayer(Composition::REFRESH_RATE_INDICATOR)));
2485 std::this_thread::sleep_for(1s);
ramindani91518892023-03-03 16:55:09 +00002486 EXPECT_FALSE(checkIfCallbackRefreshRateChangedDebugEnabledReceived(displayFilter))
ramindani9dd8c482023-02-21 18:07:56 -08002487 << "A callback should not be received for REFRESH_RATE_INDICATOR";
2488
2489 EXPECT_TRUE(mComposerClient
2490 ->setRefreshRateChangedCallbackDebugEnabled(displayId,
2491 /*enabled*/ false)
2492 .isOk());
2493}
2494
2495TEST_P(GraphicsComposerAidlCommandTest,
2496 SetRefreshRateChangedCallbackDebugEnabled_SetActiveConfigWithConstraints) {
2497 if (!hasCapability(Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG)) {
2498 GTEST_SUCCEED() << "Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG is not supported";
2499 return;
2500 }
2501
2502 VsyncPeriodChangeConstraints constraints;
2503 constraints.seamlessRequired = false;
2504 constraints.desiredTimeNanos = systemTime();
2505
2506 for (VtsDisplay& display : mDisplays) {
2507 const auto displayId = display.getDisplayId();
2508 EXPECT_TRUE(mComposerClient->setPowerMode(displayId, PowerMode::ON).isOk());
2509
2510 // Enable the callback
2511 ASSERT_TRUE(mComposerClient
2512 ->setRefreshRateChangedCallbackDebugEnabled(displayId, /*enabled*/ true)
2513 .isOk());
2514
2515 forEachTwoConfigs(displayId, [&](int32_t config1, int32_t config2) {
2516 const int32_t vsyncPeriod1 = display.getDisplayConfig(config1).vsyncPeriod;
2517 const int32_t vsyncPeriod2 = display.getDisplayConfig(config2).vsyncPeriod;
2518
2519 if (vsyncPeriod1 == vsyncPeriod2) {
2520 return; // continue
2521 }
2522
2523 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
2524 sendRefreshFrame(display, nullptr);
2525
2526 const auto& [status, timeline] =
2527 mComposerClient->setActiveConfigWithConstraints(&display, config2, constraints);
2528 EXPECT_TRUE(status.isOk());
2529
2530 if (timeline.refreshRequired) {
2531 sendRefreshFrame(display, &timeline);
2532 }
2533
ramindani91518892023-03-03 16:55:09 +00002534 const auto callbackFilter = [displayId,
2535 vsyncPeriod2](auto refreshRateChangedDebugData) {
2536 constexpr int kVsyncThreshold = 1000;
2537 return displayId == refreshRateChangedDebugData.display &&
2538 std::abs(vsyncPeriod2 - refreshRateChangedDebugData.vsyncPeriodNanos) <=
2539 kVsyncThreshold;
2540 };
ramindani9dd8c482023-02-21 18:07:56 -08002541
2542 int retryCount = 3;
2543 do {
2544 std::this_thread::sleep_for(100ms);
ramindani91518892023-03-03 16:55:09 +00002545 if (checkIfCallbackRefreshRateChangedDebugEnabledReceived(callbackFilter)) {
ramindani9dd8c482023-02-21 18:07:56 -08002546 GTEST_SUCCEED() << "Received a callback successfully";
2547 break;
2548 }
2549 } while (--retryCount > 0);
2550
2551 if (retryCount == 0) {
2552 GTEST_FAIL() << "failed to get a callback for the display " << displayId
2553 << " with config " << config2;
2554 }
2555 });
2556
2557 EXPECT_TRUE(
2558 mComposerClient
2559 ->setRefreshRateChangedCallbackDebugEnabled(displayId, /*enabled*/ false)
2560 .isOk());
2561 }
2562}
2563
Kriti Dang4efe8602022-05-03 16:55:59 +02002564/*
2565 * Test that no two display configs are exactly the same.
2566 */
2567TEST_P(GraphicsComposerAidlTest, GetDisplayConfigNoRepetitions) {
2568 for (const auto& display : mDisplays) {
2569 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
2570 for (std::vector<int>::size_type i = 0; i < configs.size(); i++) {
2571 for (std::vector<int>::size_type j = i + 1; j < configs.size(); j++) {
2572 const auto& [widthStatus1, width1] = mComposerClient->getDisplayAttribute(
2573 display.getDisplayId(), configs[i], DisplayAttribute::WIDTH);
2574 const auto& [heightStatus1, height1] = mComposerClient->getDisplayAttribute(
2575 display.getDisplayId(), configs[i], DisplayAttribute::HEIGHT);
2576 const auto& [vsyncPeriodStatus1, vsyncPeriod1] =
2577 mComposerClient->getDisplayAttribute(display.getDisplayId(), configs[i],
2578 DisplayAttribute::VSYNC_PERIOD);
2579 const auto& [groupStatus1, group1] = mComposerClient->getDisplayAttribute(
2580 display.getDisplayId(), configs[i], DisplayAttribute::CONFIG_GROUP);
2581
2582 const auto& [widthStatus2, width2] = mComposerClient->getDisplayAttribute(
2583 display.getDisplayId(), configs[j], DisplayAttribute::WIDTH);
2584 const auto& [heightStatus2, height2] = mComposerClient->getDisplayAttribute(
2585 display.getDisplayId(), configs[j], DisplayAttribute::HEIGHT);
2586 const auto& [vsyncPeriodStatus2, vsyncPeriod2] =
2587 mComposerClient->getDisplayAttribute(display.getDisplayId(), configs[j],
2588 DisplayAttribute::VSYNC_PERIOD);
2589 const auto& [groupStatus2, group2] = mComposerClient->getDisplayAttribute(
2590 display.getDisplayId(), configs[j], DisplayAttribute::CONFIG_GROUP);
2591
2592 ASSERT_FALSE(width1 == width2 && height1 == height2 &&
2593 vsyncPeriod1 == vsyncPeriod2 && group1 == group2);
2594 }
2595 }
2596 }
2597}
2598
Leon Scroggins IIIb3e336e2022-10-06 12:32:16 -04002599TEST_P(GraphicsComposerAidlCommandTest, MultiThreadedPresent) {
2600 std::vector<VtsDisplay*> displays;
2601 for (auto& display : mDisplays) {
2602 if (hasDisplayCapability(display.getDisplayId(),
2603 DisplayCapability::MULTI_THREADED_PRESENT)) {
2604 displays.push_back(&display);
2605 }
2606 }
2607 if (displays.size() <= 1u) {
2608 return;
2609 }
2610 // TODO(b/251842321): Try to present on multiple threads.
2611}
2612
Carlos Martinez Romerocd043612023-01-05 22:28:05 +00002613/**
2614 * Test Capability::SKIP_VALIDATE
2615 *
2616 * Capability::SKIP_VALIDATE has been deprecated and should not be enabled.
2617 */
2618TEST_P(GraphicsComposerAidlCommandTest, SkipValidateDeprecatedTest) {
2619 const auto& [versionStatus, version] = mComposerClient->getInterfaceVersion();
2620 ASSERT_TRUE(versionStatus.isOk());
2621 if (version <= 1) {
2622 GTEST_SUCCEED() << "HAL at version 1 or lower can contain Capability::SKIP_VALIDATE.";
2623 return;
2624 }
2625 ASSERT_FALSE(hasCapability(Capability::SKIP_VALIDATE))
2626 << "Found Capability::SKIP_VALIDATE capability.";
2627}
2628
ramindanidcfe3a82021-11-29 17:00:31 +00002629GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlCommandTest);
2630INSTANTIATE_TEST_SUITE_P(
2631 PerInstance, GraphicsComposerAidlCommandTest,
2632 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
2633 ::android::PrintInstanceNameToString);
2634
ramindanid32ae8e2021-10-01 18:48:39 +00002635GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlTest);
2636INSTANTIATE_TEST_SUITE_P(
2637 PerInstance, GraphicsComposerAidlTest,
2638 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
2639 ::android::PrintInstanceNameToString);
2640} // namespace
2641} // namespace aidl::android::hardware::graphics::composer3::vts
2642
2643int main(int argc, char** argv) {
2644 ::testing::InitGoogleTest(&argc, argv);
2645
2646 using namespace std::chrono_literals;
2647 if (!android::base::WaitForProperty("init.svc.surfaceflinger", "stopped", 10s)) {
2648 ALOGE("Failed to stop init.svc.surfaceflinger");
2649 return -1;
2650 }
ramindanibeea10e2021-12-07 21:02:49 +00002651
2652 android::ProcessState::self()->setThreadPoolMaxThreadCount(4);
2653
2654 // The binder threadpool we start will inherit sched policy and priority
2655 // of (this) creating thread. We want the binder thread pool to have
2656 // SCHED_FIFO policy and priority 1 (lowest RT priority)
2657 // Once the pool is created we reset this thread's priority back to
2658 // original.
2659 // This thread policy is based on what we do in the SurfaceFlinger while starting
2660 // the thread pool and we need to replicate that for the VTS tests.
2661 int newPriority = 0;
2662 int origPolicy = sched_getscheduler(0);
2663 struct sched_param origSchedParam;
2664
2665 int errorInPriorityModification = sched_getparam(0, &origSchedParam);
2666 if (errorInPriorityModification == 0) {
2667 int policy = SCHED_FIFO;
2668 newPriority = sched_get_priority_min(policy);
2669
2670 struct sched_param param;
2671 param.sched_priority = newPriority;
2672
2673 errorInPriorityModification = sched_setscheduler(0, policy, &param);
2674 }
2675
2676 // start the thread pool
2677 android::ProcessState::self()->startThreadPool();
2678
2679 // Reset current thread's policy and priority
2680 if (errorInPriorityModification == 0) {
2681 errorInPriorityModification = sched_setscheduler(0, origPolicy, &origSchedParam);
2682 } else {
2683 ALOGE("Failed to set VtsHalGraphicsComposer3_TargetTest binder threadpool priority to "
2684 "SCHED_FIFO");
2685 }
2686
ramindanid32ae8e2021-10-01 18:48:39 +00002687 return RUN_ALL_TESTS();
Brian Lindahl25e0d092022-12-09 00:32:11 -07002688}