blob: 323554c1e2fe7fa1ce84ee463c988816daa4fe14 [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
ramindani17c71102023-03-20 10:51:14 -0700121 int getInterfaceVersion() {
122 const auto& [versionStatus, version] = mComposerClient->getInterfaceVersion();
123 EXPECT_TRUE(versionStatus.isOk());
124 return version;
125 }
126
ramindani431aad42022-02-01 21:44:29 +0000127 const VtsDisplay& getPrimaryDisplay() const { return mDisplays[0]; }
ramindania9780262021-10-01 18:48:39 +0000128
ramindani431aad42022-02-01 21:44:29 +0000129 int64_t getPrimaryDisplayId() const { return getPrimaryDisplay().getDisplayId(); }
ramindania9780262021-10-01 18:48:39 +0000130
ramindani431aad42022-02-01 21:44:29 +0000131 int64_t getInvalidDisplayId() const { return mComposerClient->getInvalidDisplayId(); }
ramindani1cb794e2021-10-13 20:45:23 +0000132
ramindani431aad42022-02-01 21:44:29 +0000133 VtsDisplay& getEditablePrimaryDisplay() { return mDisplays[0]; }
ramindani0291f112021-11-04 03:45:46 +0000134
ramindani3335f7a2021-10-25 17:22:35 +0000135 struct TestParameters {
136 nsecs_t delayForChange;
137 bool refreshMiss;
138 };
139
ramindani431aad42022-02-01 21:44:29 +0000140 std::unique_ptr<VtsComposerClient> mComposerClient;
ramindani1cb794e2021-10-13 20:45:23 +0000141 std::vector<VtsDisplay> mDisplays;
ramindani3335f7a2021-10-25 17:22:35 +0000142 // use the slot count usually set by SF
143 static constexpr uint32_t kBufferSlotCount = 64;
ramindanid32ae8e2021-10-01 18:48:39 +0000144};
145
ramindani431aad42022-02-01 21:44:29 +0000146TEST_P(GraphicsComposerAidlTest, GetDisplayCapabilities_BadDisplay) {
147 const auto& [status, _] = mComposerClient->getDisplayCapabilities(getInvalidDisplayId());
ramindani5f696942021-10-14 16:24:18 +0000148
ramindani431aad42022-02-01 21:44:29 +0000149 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000150 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindania9780262021-10-01 18:48:39 +0000151}
152
ramindani431aad42022-02-01 21:44:29 +0000153TEST_P(GraphicsComposerAidlTest, GetDisplayCapabilities) {
ramindania9780262021-10-01 18:48:39 +0000154 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000155 const auto& [status, capabilities] =
156 mComposerClient->getDisplayCapabilities(display.getDisplayId());
ramindania9780262021-10-01 18:48:39 +0000157
ramindani431aad42022-02-01 21:44:29 +0000158 EXPECT_TRUE(status.isOk());
ramindania9780262021-10-01 18:48:39 +0000159 }
ramindanid32ae8e2021-10-01 18:48:39 +0000160}
161
ramindani2740bac2021-11-24 22:58:32 +0000162TEST_P(GraphicsComposerAidlTest, DumpDebugInfo) {
ramindani431aad42022-02-01 21:44:29 +0000163 ASSERT_TRUE(mComposerClient->dumpDebugInfo().isOk());
ramindani2740bac2021-11-24 22:58:32 +0000164}
165
166TEST_P(GraphicsComposerAidlTest, CreateClientSingleton) {
167 std::shared_ptr<IComposerClient> composerClient;
ramindani431aad42022-02-01 21:44:29 +0000168 const auto& status = mComposerClient->createClient();
ramindani2740bac2021-11-24 22:58:32 +0000169
ramindani431aad42022-02-01 21:44:29 +0000170 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000171 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_NO_RESOURCES));
ramindani2740bac2021-11-24 22:58:32 +0000172}
173
ramindani592b6512021-10-08 21:15:19 +0000174TEST_P(GraphicsComposerAidlTest, GetDisplayIdentificationData) {
ramindani431aad42022-02-01 21:44:29 +0000175 const auto& [status0, displayIdentification0] =
176 mComposerClient->getDisplayIdentificationData(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000177 if (!status0.isOk() && status0.getExceptionCode() == EX_SERVICE_SPECIFIC &&
178 status0.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani431aad42022-02-01 21:44:29 +0000179 GTEST_SUCCEED() << "Display identification data not supported, skipping test";
ramindani592b6512021-10-08 21:15:19 +0000180 return;
181 }
ramindani431aad42022-02-01 21:44:29 +0000182 ASSERT_TRUE(status0.isOk()) << "failed to get display identification data";
ramindani592b6512021-10-08 21:15:19 +0000183 ASSERT_FALSE(displayIdentification0.data.empty());
184
185 constexpr size_t kEdidBlockSize = 128;
186 ASSERT_TRUE(displayIdentification0.data.size() % kEdidBlockSize == 0)
187 << "EDID blob length is not a multiple of " << kEdidBlockSize;
188
189 const uint8_t kEdidHeader[] = {0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00};
190 ASSERT_TRUE(std::equal(std::begin(kEdidHeader), std::end(kEdidHeader),
191 displayIdentification0.data.begin()))
192 << "EDID blob doesn't start with the fixed EDID header";
193 ASSERT_EQ(0, std::accumulate(displayIdentification0.data.begin(),
194 displayIdentification0.data.begin() + kEdidBlockSize,
195 static_cast<uint8_t>(0)))
196 << "EDID base block doesn't checksum";
197
ramindani431aad42022-02-01 21:44:29 +0000198 const auto& [status1, displayIdentification1] =
199 mComposerClient->getDisplayIdentificationData(getPrimaryDisplayId());
200 ASSERT_TRUE(status1.isOk());
ramindani592b6512021-10-08 21:15:19 +0000201
202 ASSERT_EQ(displayIdentification0.port, displayIdentification1.port) << "ports are not stable";
203 ASSERT_TRUE(displayIdentification0.data.size() == displayIdentification1.data.size() &&
204 std::equal(displayIdentification0.data.begin(), displayIdentification0.data.end(),
205 displayIdentification1.data.begin()))
206 << "data is not stable";
207}
208
209TEST_P(GraphicsComposerAidlTest, GetHdrCapabilities) {
ramindani431aad42022-02-01 21:44:29 +0000210 const auto& [status, hdrCapabilities] =
211 mComposerClient->getHdrCapabilities(getPrimaryDisplayId());
ramindani592b6512021-10-08 21:15:19 +0000212
ramindani431aad42022-02-01 21:44:29 +0000213 ASSERT_TRUE(status.isOk());
214 EXPECT_TRUE(hdrCapabilities.maxLuminance >= hdrCapabilities.minLuminance);
ramindani592b6512021-10-08 21:15:19 +0000215}
216
217TEST_P(GraphicsComposerAidlTest, GetPerFrameMetadataKeys) {
ramindani431aad42022-02-01 21:44:29 +0000218 const auto& [status, keys] = mComposerClient->getPerFrameMetadataKeys(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000219 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
220 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindanic2b8d082021-11-06 02:03:50 +0000221 GTEST_SUCCEED() << "getPerFrameMetadataKeys is not supported";
222 return;
ramindani592b6512021-10-08 21:15:19 +0000223 }
ramindani431aad42022-02-01 21:44:29 +0000224
225 ASSERT_TRUE(status.isOk());
226 EXPECT_TRUE(keys.size() >= 0);
ramindani592b6512021-10-08 21:15:19 +0000227}
228
229TEST_P(GraphicsComposerAidlTest, GetReadbackBufferAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000230 const auto& [status, _] = mComposerClient->getReadbackBufferAttributes(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000231 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
232 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani431aad42022-02-01 21:44:29 +0000233 GTEST_SUCCEED() << "getReadbackBufferAttributes is not supported";
234 return;
ramindani592b6512021-10-08 21:15:19 +0000235 }
ramindani431aad42022-02-01 21:44:29 +0000236
237 ASSERT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000238}
239
240TEST_P(GraphicsComposerAidlTest, GetRenderIntents) {
ramindani431aad42022-02-01 21:44:29 +0000241 const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
242 EXPECT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000243
ramindani431aad42022-02-01 21:44:29 +0000244 for (auto mode : modes) {
245 const auto& [intentStatus, intents] =
246 mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
247 EXPECT_TRUE(intentStatus.isOk());
ramindani592b6512021-10-08 21:15:19 +0000248 bool isHdr;
249 switch (mode) {
250 case ColorMode::BT2100_PQ:
251 case ColorMode::BT2100_HLG:
252 isHdr = true;
253 break;
254 default:
255 isHdr = false;
256 break;
257 }
258 RenderIntent requiredIntent =
259 isHdr ? RenderIntent::TONE_MAP_COLORIMETRIC : RenderIntent::COLORIMETRIC;
260
ramindani431aad42022-02-01 21:44:29 +0000261 const auto iter = std::find(intents.cbegin(), intents.cend(), requiredIntent);
ramindani592b6512021-10-08 21:15:19 +0000262 EXPECT_NE(intents.cend(), iter);
263 }
264}
265
ramindani431aad42022-02-01 21:44:29 +0000266TEST_P(GraphicsComposerAidlTest, GetRenderIntents_BadDisplay) {
267 const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
268 ASSERT_TRUE(status.isOk());
269
ramindani592b6512021-10-08 21:15:19 +0000270 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000271 const auto& [intentStatus, _] =
272 mComposerClient->getRenderIntents(getInvalidDisplayId(), mode);
273
274 EXPECT_FALSE(intentStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000275 EXPECT_NO_FATAL_FAILURE(
276 assertServiceSpecificError(intentStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani592b6512021-10-08 21:15:19 +0000277 }
278}
279
ramindani431aad42022-02-01 21:44:29 +0000280TEST_P(GraphicsComposerAidlTest, GetRenderIntents_BadParameter) {
281 const auto& [status, _] =
282 mComposerClient->getRenderIntents(getPrimaryDisplayId(), static_cast<ColorMode>(-1));
283
284 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000285 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindani592b6512021-10-08 21:15:19 +0000286}
287
288TEST_P(GraphicsComposerAidlTest, GetColorModes) {
ramindani431aad42022-02-01 21:44:29 +0000289 const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
290 ASSERT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000291
ramindani431aad42022-02-01 21:44:29 +0000292 const auto native = std::find(colorModes.cbegin(), colorModes.cend(), ColorMode::NATIVE);
293 EXPECT_NE(colorModes.cend(), native);
ramindani592b6512021-10-08 21:15:19 +0000294}
295
ramindani431aad42022-02-01 21:44:29 +0000296TEST_P(GraphicsComposerAidlTest, GetColorMode_BadDisplay) {
297 const auto& [status, _] = mComposerClient->getColorModes(getInvalidDisplayId());
ramindani592b6512021-10-08 21:15:19 +0000298
ramindani431aad42022-02-01 21:44:29 +0000299 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000300 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani592b6512021-10-08 21:15:19 +0000301}
302
303TEST_P(GraphicsComposerAidlTest, SetColorMode) {
ramindani431aad42022-02-01 21:44:29 +0000304 const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
305 EXPECT_TRUE(status.isOk());
306
ramindani592b6512021-10-08 21:15:19 +0000307 for (auto mode : colorModes) {
ramindani431aad42022-02-01 21:44:29 +0000308 const auto& [intentStatus, intents] =
309 mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
310 EXPECT_TRUE(intentStatus.isOk()) << "failed to get render intents";
311
ramindani592b6512021-10-08 21:15:19 +0000312 for (auto intent : intents) {
ramindani431aad42022-02-01 21:44:29 +0000313 const auto modeStatus =
314 mComposerClient->setColorMode(getPrimaryDisplayId(), mode, intent);
315 EXPECT_TRUE(modeStatus.isOk() ||
ramindanid5751092022-04-22 22:30:20 +0000316 (modeStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
317 IComposerClient::EX_UNSUPPORTED == modeStatus.getServiceSpecificError()))
ramindani592b6512021-10-08 21:15:19 +0000318 << "failed to set color mode";
319 }
320 }
321
ramindani431aad42022-02-01 21:44:29 +0000322 const auto modeStatus = mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE,
323 RenderIntent::COLORIMETRIC);
324 EXPECT_TRUE(modeStatus.isOk() ||
ramindanid5751092022-04-22 22:30:20 +0000325 (modeStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
326 IComposerClient::EX_UNSUPPORTED == modeStatus.getServiceSpecificError()))
ramindani592b6512021-10-08 21:15:19 +0000327 << "failed to set color mode";
328}
329
ramindani431aad42022-02-01 21:44:29 +0000330TEST_P(GraphicsComposerAidlTest, SetColorMode_BadDisplay) {
331 const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
332 ASSERT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000333
ramindani431aad42022-02-01 21:44:29 +0000334 for (auto mode : colorModes) {
335 const auto& [intentStatus, intents] =
336 mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
337 ASSERT_TRUE(intentStatus.isOk()) << "failed to get render intents";
338
339 for (auto intent : intents) {
340 auto const modeStatus =
341 mComposerClient->setColorMode(getInvalidDisplayId(), mode, intent);
342
343 EXPECT_FALSE(modeStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000344 EXPECT_NO_FATAL_FAILURE(
345 assertServiceSpecificError(modeStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani770d7082021-11-30 00:36:42 +0000346 }
347 }
ramindani592b6512021-10-08 21:15:19 +0000348}
349
ramindani431aad42022-02-01 21:44:29 +0000350TEST_P(GraphicsComposerAidlTest, SetColorMode_BadParameter) {
351 auto status = mComposerClient->setColorMode(getPrimaryDisplayId(), static_cast<ColorMode>(-1),
352 RenderIntent::COLORIMETRIC);
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
ramindani431aad42022-02-01 21:44:29 +0000357 status = mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE,
358 static_cast<RenderIntent>(-1));
ramindani592b6512021-10-08 21:15:19 +0000359
ramindani431aad42022-02-01 21:44:29 +0000360 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000361 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindani592b6512021-10-08 21:15:19 +0000362}
363
364TEST_P(GraphicsComposerAidlTest, GetDisplayedContentSamplingAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000365 int constexpr kInvalid = -1;
366 const auto& [status, format] =
367 mComposerClient->getDisplayedContentSamplingAttributes(getPrimaryDisplayId());
ramindani592b6512021-10-08 21:15:19 +0000368
ramindanid5751092022-04-22 22:30:20 +0000369 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
370 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani592b6512021-10-08 21:15:19 +0000371 SUCCEED() << "Device does not support optional extension. Test skipped";
372 return;
373 }
374
ramindani431aad42022-02-01 21:44:29 +0000375 ASSERT_TRUE(status.isOk());
376 EXPECT_NE(kInvalid, static_cast<int>(format.format));
377 EXPECT_NE(kInvalid, static_cast<int>(format.dataspace));
378 EXPECT_NE(kInvalid, static_cast<int>(format.componentMask));
ramindani592b6512021-10-08 21:15:19 +0000379};
380
381TEST_P(GraphicsComposerAidlTest, SetDisplayedContentSamplingEnabled) {
ramindani431aad42022-02-01 21:44:29 +0000382 int constexpr kMaxFrames = 10;
ramindani592b6512021-10-08 21:15:19 +0000383 FormatColorComponent enableAllComponents = FormatColorComponent::FORMAT_COMPONENT_0;
ramindani431aad42022-02-01 21:44:29 +0000384 auto status = mComposerClient->setDisplayedContentSamplingEnabled(
385 getPrimaryDisplayId(), /*isEnabled*/ true, enableAllComponents, kMaxFrames);
ramindanid5751092022-04-22 22:30:20 +0000386 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
387 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani592b6512021-10-08 21:15:19 +0000388 SUCCEED() << "Device does not support optional extension. Test skipped";
389 return;
390 }
ramindani431aad42022-02-01 21:44:29 +0000391 EXPECT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000392
ramindani431aad42022-02-01 21:44:29 +0000393 status = mComposerClient->setDisplayedContentSamplingEnabled(
394 getPrimaryDisplayId(), /*isEnabled*/ false, enableAllComponents, kMaxFrames);
395 EXPECT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000396}
397
398TEST_P(GraphicsComposerAidlTest, GetDisplayedContentSample) {
ramindani431aad42022-02-01 21:44:29 +0000399 const auto& [status, displayContentSamplingAttributes] =
400 mComposerClient->getDisplayedContentSamplingAttributes(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000401 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
402 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindanideb059e2021-11-18 01:57:25 +0000403 SUCCEED() << "Sampling attributes aren't supported on this device, test skipped";
404 return;
405 }
ramindani592b6512021-10-08 21:15:19 +0000406
ramindani431aad42022-02-01 21:44:29 +0000407 int64_t constexpr kMaxFrames = 10;
408 int64_t constexpr kTimestamp = 0;
409 const auto& [sampleStatus, displayContentSample] = mComposerClient->getDisplayedContentSample(
410 getPrimaryDisplayId(), kMaxFrames, kTimestamp);
ramindanid5751092022-04-22 22:30:20 +0000411 if (!sampleStatus.isOk() && sampleStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
ramindani431aad42022-02-01 21:44:29 +0000412 sampleStatus.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani592b6512021-10-08 21:15:19 +0000413 SUCCEED() << "Device does not support optional extension. Test skipped";
414 return;
415 }
416
ramindani431aad42022-02-01 21:44:29 +0000417 EXPECT_TRUE(sampleStatus.isOk());
418 const std::vector<std::vector<int64_t>> histogram = {
ramindani592b6512021-10-08 21:15:19 +0000419 displayContentSample.sampleComponent0, displayContentSample.sampleComponent1,
420 displayContentSample.sampleComponent2, displayContentSample.sampleComponent3};
421
ramindani3335f7a2021-10-25 17:22:35 +0000422 for (size_t i = 0; i < histogram.size(); i++) {
423 const bool shouldHaveHistogram =
424 static_cast<int>(displayContentSamplingAttributes.componentMask) & (1 << i);
425 EXPECT_EQ(shouldHaveHistogram, !histogram[i].empty());
ramindani592b6512021-10-08 21:15:19 +0000426 }
427}
428
ramindani431aad42022-02-01 21:44:29 +0000429TEST_P(GraphicsComposerAidlTest, GetDisplayConnectionType) {
430 const auto& [status, type] = mComposerClient->getDisplayConnectionType(getInvalidDisplayId());
431
432 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000433 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani431aad42022-02-01 21:44:29 +0000434
ramindani0291f112021-11-04 03:45:46 +0000435 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000436 const auto& [connectionTypeStatus, _] =
437 mComposerClient->getDisplayConnectionType(display.getDisplayId());
438 EXPECT_TRUE(connectionTypeStatus.isOk());
ramindani0291f112021-11-04 03:45:46 +0000439 }
440}
441
ramindani431aad42022-02-01 21:44:29 +0000442TEST_P(GraphicsComposerAidlTest, GetDisplayAttribute) {
ramindani0291f112021-11-04 03:45:46 +0000443 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000444 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
445 EXPECT_TRUE(status.isOk());
446
ramindani0291f112021-11-04 03:45:46 +0000447 for (const auto& config : configs) {
448 const std::array<DisplayAttribute, 4> requiredAttributes = {{
449 DisplayAttribute::WIDTH,
450 DisplayAttribute::HEIGHT,
451 DisplayAttribute::VSYNC_PERIOD,
452 DisplayAttribute::CONFIG_GROUP,
453 }};
ramindani0291f112021-11-04 03:45:46 +0000454 for (const auto& attribute : requiredAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000455 const auto& [attribStatus, value] = mComposerClient->getDisplayAttribute(
456 display.getDisplayId(), config, attribute);
457 EXPECT_TRUE(attribStatus.isOk());
ramindani0291f112021-11-04 03:45:46 +0000458 EXPECT_NE(-1, value);
459 }
460
461 const std::array<DisplayAttribute, 2> optionalAttributes = {{
462 DisplayAttribute::DPI_X,
463 DisplayAttribute::DPI_Y,
464 }};
465 for (const auto& attribute : optionalAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000466 const auto& [attribStatus, value] = mComposerClient->getDisplayAttribute(
467 display.getDisplayId(), config, attribute);
ramindanid5751092022-04-22 22:30:20 +0000468 EXPECT_TRUE(attribStatus.isOk() ||
469 (attribStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
470 IComposerClient::EX_UNSUPPORTED ==
471 attribStatus.getServiceSpecificError()));
ramindani0291f112021-11-04 03:45:46 +0000472 }
473 }
474 }
475}
476
ramindani431aad42022-02-01 21:44:29 +0000477TEST_P(GraphicsComposerAidlTest, CheckConfigsAreValid) {
ramindani0291f112021-11-04 03:45:46 +0000478 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000479 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
480 EXPECT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000481
482 EXPECT_FALSE(std::any_of(configs.begin(), configs.end(), [](auto config) {
483 return config == IComposerClient::INVALID_CONFIGURATION;
484 }));
485 }
486}
487
ramindani431aad42022-02-01 21:44:29 +0000488TEST_P(GraphicsComposerAidlTest, GetDisplayVsyncPeriod_BadDisplay) {
489 const auto& [status, vsyncPeriodNanos] =
490 mComposerClient->getDisplayVsyncPeriod(getInvalidDisplayId());
491
492 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000493 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000494}
495
ramindani431aad42022-02-01 21:44:29 +0000496TEST_P(GraphicsComposerAidlTest, SetActiveConfigWithConstraints_BadDisplay) {
ramindani0291f112021-11-04 03:45:46 +0000497 VsyncPeriodChangeConstraints constraints;
ramindani0291f112021-11-04 03:45:46 +0000498 constraints.seamlessRequired = false;
499 constraints.desiredTimeNanos = systemTime();
ramindani431aad42022-02-01 21:44:29 +0000500 auto invalidDisplay = VtsDisplay(getInvalidDisplayId());
ramindani0291f112021-11-04 03:45:46 +0000501
ramindani431aad42022-02-01 21:44:29 +0000502 const auto& [status, timeline] = mComposerClient->setActiveConfigWithConstraints(
503 &invalidDisplay, /*config*/ 0, constraints);
504
505 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000506 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000507}
508
ramindani431aad42022-02-01 21:44:29 +0000509TEST_P(GraphicsComposerAidlTest, SetActiveConfigWithConstraints_BadConfig) {
ramindani0291f112021-11-04 03:45:46 +0000510 VsyncPeriodChangeConstraints constraints;
ramindani0291f112021-11-04 03:45:46 +0000511 constraints.seamlessRequired = false;
512 constraints.desiredTimeNanos = systemTime();
513
514 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000515 int32_t constexpr kInvalidConfigId = IComposerClient::INVALID_CONFIGURATION;
516 const auto& [status, _] = mComposerClient->setActiveConfigWithConstraints(
517 &display, kInvalidConfigId, constraints);
518
519 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000520 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_CONFIG));
ramindani0291f112021-11-04 03:45:46 +0000521 }
522}
523
ramindani431aad42022-02-01 21:44:29 +0000524TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig_BadDisplay) {
ramindani476314c2022-03-16 00:17:08 +0000525 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
526 GTEST_SUCCEED() << "Boot Display Config not supported";
527 return;
528 }
ramindani431aad42022-02-01 21:44:29 +0000529 const auto& status = mComposerClient->setBootDisplayConfig(getInvalidDisplayId(), /*config*/ 0);
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100530
ramindani431aad42022-02-01 21:44:29 +0000531 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000532 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100533}
534
ramindani431aad42022-02-01 21:44:29 +0000535TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig_BadConfig) {
ramindani476314c2022-03-16 00:17:08 +0000536 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
537 GTEST_SUCCEED() << "Boot Display Config not supported";
538 return;
539 }
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100540 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000541 int32_t constexpr kInvalidConfigId = IComposerClient::INVALID_CONFIGURATION;
542 const auto& status =
543 mComposerClient->setBootDisplayConfig(display.getDisplayId(), kInvalidConfigId);
544
545 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000546 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_CONFIG));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100547 }
548}
549
ramindani431aad42022-02-01 21:44:29 +0000550TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig) {
ramindani476314c2022-03-16 00:17:08 +0000551 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
552 GTEST_SUCCEED() << "Boot Display Config not supported";
553 return;
554 }
ramindani431aad42022-02-01 21:44:29 +0000555 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
556 EXPECT_TRUE(status.isOk());
557 for (const auto& config : configs) {
558 EXPECT_TRUE(mComposerClient->setBootDisplayConfig(getPrimaryDisplayId(), config).isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100559 }
560}
561
ramindani431aad42022-02-01 21:44:29 +0000562TEST_P(GraphicsComposerAidlTest, ClearBootDisplayConfig_BadDisplay) {
ramindani476314c2022-03-16 00:17:08 +0000563 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
564 GTEST_SUCCEED() << "Boot Display Config not supported";
565 return;
566 }
ramindani431aad42022-02-01 21:44:29 +0000567 const auto& status = mComposerClient->clearBootDisplayConfig(getInvalidDisplayId());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100568
ramindani431aad42022-02-01 21:44:29 +0000569 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000570 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100571}
572
ramindani431aad42022-02-01 21:44:29 +0000573TEST_P(GraphicsComposerAidlTest, ClearBootDisplayConfig) {
ramindani476314c2022-03-16 00:17:08 +0000574 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
575 GTEST_SUCCEED() << "Boot Display Config not supported";
576 return;
577 }
ramindani431aad42022-02-01 21:44:29 +0000578 EXPECT_TRUE(mComposerClient->clearBootDisplayConfig(getPrimaryDisplayId()).isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100579}
580
ramindani431aad42022-02-01 21:44:29 +0000581TEST_P(GraphicsComposerAidlTest, GetPreferredBootDisplayConfig_BadDisplay) {
ramindani476314c2022-03-16 00:17:08 +0000582 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
583 GTEST_SUCCEED() << "Boot Display Config not supported";
584 return;
585 }
ramindani431aad42022-02-01 21:44:29 +0000586 const auto& [status, _] = mComposerClient->getPreferredBootDisplayConfig(getInvalidDisplayId());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100587
ramindani431aad42022-02-01 21:44:29 +0000588 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000589 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100590}
591
ramindani431aad42022-02-01 21:44:29 +0000592TEST_P(GraphicsComposerAidlTest, GetPreferredBootDisplayConfig) {
ramindani476314c2022-03-16 00:17:08 +0000593 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
594 GTEST_SUCCEED() << "Boot Display Config not supported";
595 return;
596 }
ramindani431aad42022-02-01 21:44:29 +0000597 const auto& [status, preferredDisplayConfig] =
598 mComposerClient->getPreferredBootDisplayConfig(getPrimaryDisplayId());
599 EXPECT_TRUE(status.isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100600
ramindani431aad42022-02-01 21:44:29 +0000601 const auto& [configStatus, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
602
603 EXPECT_TRUE(configStatus.isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100604 EXPECT_NE(configs.end(), std::find(configs.begin(), configs.end(), preferredDisplayConfig));
605}
606
ramindani476314c2022-03-16 00:17:08 +0000607TEST_P(GraphicsComposerAidlTest, BootDisplayConfig_Unsupported) {
608 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
609 const auto& [configStatus, config] =
610 mComposerClient->getActiveConfig(getPrimaryDisplayId());
611 EXPECT_TRUE(configStatus.isOk());
612
613 auto status = mComposerClient->setBootDisplayConfig(getPrimaryDisplayId(), config);
614 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000615 EXPECT_NO_FATAL_FAILURE(
616 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani476314c2022-03-16 00:17:08 +0000617
618 status = mComposerClient->getPreferredBootDisplayConfig(getPrimaryDisplayId()).first;
619 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000620 EXPECT_NO_FATAL_FAILURE(
621 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani476314c2022-03-16 00:17:08 +0000622
623 status = mComposerClient->clearBootDisplayConfig(getPrimaryDisplayId());
624 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000625 EXPECT_NO_FATAL_FAILURE(
626 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani476314c2022-03-16 00:17:08 +0000627 }
628}
629
Kriti Dang3793ebd2022-12-05 13:03:49 +0100630TEST_P(GraphicsComposerAidlTest, GetHdrConversionCapabilities) {
631 if (!hasCapability(Capability::HDR_OUTPUT_CONVERSION_CONFIG)) {
632 GTEST_SUCCEED() << "HDR output conversion not supported";
633 return;
634 }
635 const auto& [status, conversionCapabilities] = mComposerClient->getHdrConversionCapabilities();
636 EXPECT_TRUE(status.isOk());
637}
638
639TEST_P(GraphicsComposerAidlTest, SetHdrConversionStrategy_Passthrough) {
640 if (!hasCapability(Capability::HDR_OUTPUT_CONVERSION_CONFIG)) {
641 GTEST_SUCCEED() << "HDR output conversion not supported";
642 return;
643 }
644 common::HdrConversionStrategy hdrConversionStrategy;
645 hdrConversionStrategy.set<common::HdrConversionStrategy::Tag::passthrough>(true);
Kriti Dang37622762023-02-09 18:15:37 +0100646 const auto& [status, preferredHdrOutputType] =
647 mComposerClient->setHdrConversionStrategy(hdrConversionStrategy);
Kriti Dang3793ebd2022-12-05 13:03:49 +0100648 EXPECT_TRUE(status.isOk());
Kriti Dang37622762023-02-09 18:15:37 +0100649 EXPECT_EQ(common::Hdr::INVALID, preferredHdrOutputType);
Kriti Dang3793ebd2022-12-05 13:03:49 +0100650}
651
652TEST_P(GraphicsComposerAidlTest, SetHdrConversionStrategy_Force) {
653 if (!hasCapability(Capability::HDR_OUTPUT_CONVERSION_CONFIG)) {
654 GTEST_SUCCEED() << "HDR output conversion not supported";
655 return;
656 }
657 const auto& [status, conversionCapabilities] = mComposerClient->getHdrConversionCapabilities();
658 for (auto conversionCapability : conversionCapabilities) {
Kriti Dang5fcddd72023-03-07 14:55:51 +0100659 if (conversionCapability.outputType != common::Hdr::INVALID) {
Kriti Dang3793ebd2022-12-05 13:03:49 +0100660 common::HdrConversionStrategy hdrConversionStrategy;
661 hdrConversionStrategy.set<common::HdrConversionStrategy::Tag::forceHdrConversion>(
Kriti Dang5fcddd72023-03-07 14:55:51 +0100662 conversionCapability.outputType);
Kriti Dang37622762023-02-09 18:15:37 +0100663 const auto& [statusSet, preferredHdrOutputType] =
Kriti Dang3793ebd2022-12-05 13:03:49 +0100664 mComposerClient->setHdrConversionStrategy(hdrConversionStrategy);
Kriti Dang37622762023-02-09 18:15:37 +0100665 EXPECT_TRUE(statusSet.isOk());
666 EXPECT_EQ(common::Hdr::INVALID, preferredHdrOutputType);
Kriti Dang3793ebd2022-12-05 13:03:49 +0100667 }
668 }
669}
670
671TEST_P(GraphicsComposerAidlTest, SetHdrConversionStrategy_Auto) {
672 if (!hasCapability(Capability::HDR_OUTPUT_CONVERSION_CONFIG)) {
673 GTEST_SUCCEED() << "HDR output conversion not supported";
674 return;
675 }
676 const auto& [status, conversionCapabilities] = mComposerClient->getHdrConversionCapabilities();
677 std::vector<aidl::android::hardware::graphics::common::Hdr> autoHdrTypes;
678 for (auto conversionCapability : conversionCapabilities) {
Kriti Dang5fcddd72023-03-07 14:55:51 +0100679 if (conversionCapability.outputType != common::Hdr::INVALID) {
680 autoHdrTypes.push_back(conversionCapability.outputType);
Kriti Dang3793ebd2022-12-05 13:03:49 +0100681 }
682 }
683 common::HdrConversionStrategy hdrConversionStrategy;
684 hdrConversionStrategy.set<common::HdrConversionStrategy::Tag::autoAllowedHdrTypes>(
685 autoHdrTypes);
Kriti Dang37622762023-02-09 18:15:37 +0100686 const auto& [statusSet, preferredHdrOutputType] =
687 mComposerClient->setHdrConversionStrategy(hdrConversionStrategy);
688 EXPECT_TRUE(statusSet.isOk());
689 EXPECT_NE(common::Hdr::INVALID, preferredHdrOutputType);
Kriti Dang3793ebd2022-12-05 13:03:49 +0100690}
691
ramindani431aad42022-02-01 21:44:29 +0000692TEST_P(GraphicsComposerAidlTest, SetAutoLowLatencyMode_BadDisplay) {
693 auto status = mComposerClient->setAutoLowLatencyMode(getInvalidDisplayId(), /*isEnabled*/ true);
694 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000695 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani431aad42022-02-01 21:44:29 +0000696
697 status = mComposerClient->setAutoLowLatencyMode(getInvalidDisplayId(), /*isEnabled*/ false);
698 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000699 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000700}
701
ramindani431aad42022-02-01 21:44:29 +0000702TEST_P(GraphicsComposerAidlTest, SetAutoLowLatencyMode) {
ramindani0291f112021-11-04 03:45:46 +0000703 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000704 const auto& [status, capabilities] =
705 mComposerClient->getDisplayCapabilities(display.getDisplayId());
706 ASSERT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000707
708 const bool allmSupport =
709 std::find(capabilities.begin(), capabilities.end(),
710 DisplayCapability::AUTO_LOW_LATENCY_MODE) != capabilities.end();
711
712 if (!allmSupport) {
ramindani431aad42022-02-01 21:44:29 +0000713 const auto& statusIsOn = mComposerClient->setAutoLowLatencyMode(display.getDisplayId(),
714 /*isEnabled*/ true);
715 EXPECT_FALSE(statusIsOn.isOk());
ramindanid5751092022-04-22 22:30:20 +0000716 EXPECT_NO_FATAL_FAILURE(
717 assertServiceSpecificError(statusIsOn, IComposerClient::EX_UNSUPPORTED));
ramindani431aad42022-02-01 21:44:29 +0000718 const auto& statusIsOff = mComposerClient->setAutoLowLatencyMode(display.getDisplayId(),
719 /*isEnabled*/ false);
720 EXPECT_FALSE(statusIsOff.isOk());
ramindanid5751092022-04-22 22:30:20 +0000721 EXPECT_NO_FATAL_FAILURE(
722 assertServiceSpecificError(statusIsOff, IComposerClient::EX_UNSUPPORTED));
ramindani0291f112021-11-04 03:45:46 +0000723 GTEST_SUCCEED() << "Auto Low Latency Mode is not supported on display "
ramindani431aad42022-02-01 21:44:29 +0000724 << std::to_string(display.getDisplayId()) << ", skipping test";
ramindani0291f112021-11-04 03:45:46 +0000725 return;
726 }
727
ramindani431aad42022-02-01 21:44:29 +0000728 EXPECT_TRUE(mComposerClient->setAutoLowLatencyMode(display.getDisplayId(), true).isOk());
729 EXPECT_TRUE(mComposerClient->setAutoLowLatencyMode(display.getDisplayId(), false).isOk());
ramindani0291f112021-11-04 03:45:46 +0000730 }
731}
732
ramindani431aad42022-02-01 21:44:29 +0000733TEST_P(GraphicsComposerAidlTest, GetSupportedContentTypes_BadDisplay) {
734 const auto& [status, _] = mComposerClient->getSupportedContentTypes(getInvalidDisplayId());
735
736 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000737 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000738}
739
ramindani431aad42022-02-01 21:44:29 +0000740TEST_P(GraphicsComposerAidlTest, GetSupportedContentTypes) {
ramindani0291f112021-11-04 03:45:46 +0000741 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000742 const auto& [status, supportedContentTypes] =
743 mComposerClient->getSupportedContentTypes(display.getDisplayId());
744 ASSERT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000745
746 const bool noneSupported =
747 std::find(supportedContentTypes.begin(), supportedContentTypes.end(),
748 ContentType::NONE) != supportedContentTypes.end();
ramindani431aad42022-02-01 21:44:29 +0000749
ramindani0291f112021-11-04 03:45:46 +0000750 EXPECT_FALSE(noneSupported);
751 }
752}
753
ramindani431aad42022-02-01 21:44:29 +0000754TEST_P(GraphicsComposerAidlTest, SetContentTypeNoneAlwaysAccepted) {
ramindani0291f112021-11-04 03:45:46 +0000755 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000756 EXPECT_TRUE(
757 mComposerClient->setContentType(display.getDisplayId(), ContentType::NONE).isOk());
ramindani0291f112021-11-04 03:45:46 +0000758 }
759}
760
ramindani431aad42022-02-01 21:44:29 +0000761TEST_P(GraphicsComposerAidlTest, SetContentType_BadDisplay) {
ramindani0291f112021-11-04 03:45:46 +0000762 constexpr ContentType types[] = {ContentType::NONE, ContentType::GRAPHICS, ContentType::PHOTO,
763 ContentType::CINEMA, ContentType::GAME};
764 for (const auto& type : types) {
ramindani431aad42022-02-01 21:44:29 +0000765 const auto& status = mComposerClient->setContentType(getInvalidDisplayId(), type);
ramindani0291f112021-11-04 03:45:46 +0000766
ramindani431aad42022-02-01 21:44:29 +0000767 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000768 EXPECT_NO_FATAL_FAILURE(
769 assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000770 }
771}
772
ramindani431aad42022-02-01 21:44:29 +0000773TEST_P(GraphicsComposerAidlTest, SetGraphicsContentType) {
ramindani0291f112021-11-04 03:45:46 +0000774 Test_setContentType(ContentType::GRAPHICS, "GRAPHICS");
775}
776
ramindani431aad42022-02-01 21:44:29 +0000777TEST_P(GraphicsComposerAidlTest, SetPhotoContentType) {
ramindani0291f112021-11-04 03:45:46 +0000778 Test_setContentType(ContentType::PHOTO, "PHOTO");
779}
780
ramindani431aad42022-02-01 21:44:29 +0000781TEST_P(GraphicsComposerAidlTest, SetCinemaContentType) {
ramindani0291f112021-11-04 03:45:46 +0000782 Test_setContentType(ContentType::CINEMA, "CINEMA");
783}
784
ramindani431aad42022-02-01 21:44:29 +0000785TEST_P(GraphicsComposerAidlTest, SetGameContentType) {
ramindani0291f112021-11-04 03:45:46 +0000786 Test_setContentType(ContentType::GAME, "GAME");
787}
788
ramindanic2b8d082021-11-06 02:03:50 +0000789TEST_P(GraphicsComposerAidlTest, CreateVirtualDisplay) {
ramindani431aad42022-02-01 21:44:29 +0000790 const auto& [status, maxVirtualDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
791 EXPECT_TRUE(status.isOk());
792
ramindanic2b8d082021-11-06 02:03:50 +0000793 if (maxVirtualDisplayCount == 0) {
794 GTEST_SUCCEED() << "no virtual display support";
795 return;
796 }
797
ramindani431aad42022-02-01 21:44:29 +0000798 const auto& [virtualDisplayStatus, virtualDisplay] = mComposerClient->createVirtualDisplay(
799 /*width*/ 64, /*height*/ 64, common::PixelFormat::IMPLEMENTATION_DEFINED,
800 kBufferSlotCount);
ramindanic2b8d082021-11-06 02:03:50 +0000801
ramindani431aad42022-02-01 21:44:29 +0000802 ASSERT_TRUE(virtualDisplayStatus.isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000803 EXPECT_TRUE(mComposerClient->destroyVirtualDisplay(virtualDisplay.display).isOk());
804}
805
ramindani431aad42022-02-01 21:44:29 +0000806TEST_P(GraphicsComposerAidlTest, DestroyVirtualDisplay_BadDisplay) {
807 const auto& [status, maxDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
808 EXPECT_TRUE(status.isOk());
809
ramindani2740bac2021-11-24 22:58:32 +0000810 if (maxDisplayCount == 0) {
811 GTEST_SUCCEED() << "no virtual display support";
812 return;
813 }
ramindani2740bac2021-11-24 22:58:32 +0000814
ramindani431aad42022-02-01 21:44:29 +0000815 const auto& destroyStatus = mComposerClient->destroyVirtualDisplay(getInvalidDisplayId());
816
817 EXPECT_FALSE(destroyStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000818 EXPECT_NO_FATAL_FAILURE(
819 assertServiceSpecificError(destroyStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000820}
821
822TEST_P(GraphicsComposerAidlTest, CreateLayer) {
ramindani431aad42022-02-01 21:44:29 +0000823 const auto& [status, layer] =
824 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
ramindani2740bac2021-11-24 22:58:32 +0000825
ramindani431aad42022-02-01 21:44:29 +0000826 EXPECT_TRUE(status.isOk());
827 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000828}
829
ramindani431aad42022-02-01 21:44:29 +0000830TEST_P(GraphicsComposerAidlTest, CreateLayer_BadDisplay) {
831 const auto& [status, _] = mComposerClient->createLayer(getInvalidDisplayId(), kBufferSlotCount);
ramindani2740bac2021-11-24 22:58:32 +0000832
ramindani431aad42022-02-01 21:44:29 +0000833 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000834 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000835}
836
ramindani431aad42022-02-01 21:44:29 +0000837TEST_P(GraphicsComposerAidlTest, DestroyLayer_BadDisplay) {
838 const auto& [status, layer] =
839 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
840 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000841
ramindani431aad42022-02-01 21:44:29 +0000842 const auto& destroyStatus = mComposerClient->destroyLayer(getInvalidDisplayId(), layer);
ramindani2740bac2021-11-24 22:58:32 +0000843
ramindani431aad42022-02-01 21:44:29 +0000844 EXPECT_FALSE(destroyStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000845 EXPECT_NO_FATAL_FAILURE(
846 assertServiceSpecificError(destroyStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani431aad42022-02-01 21:44:29 +0000847 ASSERT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000848}
849
ramindani431aad42022-02-01 21:44:29 +0000850TEST_P(GraphicsComposerAidlTest, DestroyLayer_BadLayerError) {
ramindani2740bac2021-11-24 22:58:32 +0000851 // We haven't created any layers yet, so any id should be invalid
ramindani431aad42022-02-01 21:44:29 +0000852 const auto& status = mComposerClient->destroyLayer(getPrimaryDisplayId(), /*layer*/ 1);
ramindani2740bac2021-11-24 22:58:32 +0000853
ramindani431aad42022-02-01 21:44:29 +0000854 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000855 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_LAYER));
ramindani2740bac2021-11-24 22:58:32 +0000856}
857
ramindani431aad42022-02-01 21:44:29 +0000858TEST_P(GraphicsComposerAidlTest, GetActiveConfig_BadDisplay) {
859 const auto& [status, _] = mComposerClient->getActiveConfig(getInvalidDisplayId());
ramindani2740bac2021-11-24 22:58:32 +0000860
ramindani431aad42022-02-01 21:44:29 +0000861 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000862 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000863}
864
865TEST_P(GraphicsComposerAidlTest, GetDisplayConfig) {
ramindani431aad42022-02-01 21:44:29 +0000866 const auto& [status, _] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
867 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000868}
869
ramindani431aad42022-02-01 21:44:29 +0000870TEST_P(GraphicsComposerAidlTest, GetDisplayConfig_BadDisplay) {
871 const auto& [status, _] = mComposerClient->getDisplayConfigs(getInvalidDisplayId());
ramindani2740bac2021-11-24 22:58:32 +0000872
ramindani431aad42022-02-01 21:44:29 +0000873 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000874 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000875}
876
877TEST_P(GraphicsComposerAidlTest, GetDisplayName) {
ramindani431aad42022-02-01 21:44:29 +0000878 const auto& [status, _] = mComposerClient->getDisplayName(getPrimaryDisplayId());
879 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000880}
881
Sally Qi8ec063f2022-11-12 11:18:56 -0800882TEST_P(GraphicsComposerAidlTest, GetOverlaySupport) {
ramindani17c71102023-03-20 10:51:14 -0700883 if (getInterfaceVersion() <= 1) {
Dorin Drimus08212492023-02-23 17:06:58 +0000884 GTEST_SUCCEED() << "Device does not support the new API for overlay support";
885 return;
886 }
887
Sally Qic2c392f2023-01-13 14:50:20 -0800888 const auto& [status, properties] = mComposerClient->getOverlaySupport();
Sally Qi2600d342022-08-16 12:46:17 -0700889 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
890 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
891 GTEST_SUCCEED() << "getOverlaySupport is not supported";
892 return;
893 }
894
895 ASSERT_TRUE(status.isOk());
Sally Qic2c392f2023-01-13 14:50:20 -0800896 for (const auto& i : properties.combinations) {
897 for (const auto standard : i.standards) {
898 const auto val = static_cast<int32_t>(standard) &
899 static_cast<int32_t>(common::Dataspace::STANDARD_MASK);
900 ASSERT_TRUE(val == static_cast<int32_t>(standard));
901 }
902 for (const auto transfer : i.transfers) {
903 const auto val = static_cast<int32_t>(transfer) &
904 static_cast<int32_t>(common::Dataspace::TRANSFER_MASK);
905 ASSERT_TRUE(val == static_cast<int32_t>(transfer));
906 }
907 for (const auto range : i.ranges) {
908 const auto val = static_cast<int32_t>(range) &
909 static_cast<int32_t>(common::Dataspace::RANGE_MASK);
910 ASSERT_TRUE(val == static_cast<int32_t>(range));
911 }
912 }
Sally Qi2600d342022-08-16 12:46:17 -0700913}
914
ramindani431aad42022-02-01 21:44:29 +0000915TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation_BadDisplay) {
916 const auto& [status, _] = mComposerClient->getDisplayPhysicalOrientation(getInvalidDisplayId());
Ady Abrahamae12e382022-01-13 18:06:21 -0800917
ramindani431aad42022-02-01 21:44:29 +0000918 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000919 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Ady Abrahamae12e382022-01-13 18:06:21 -0800920}
921
922TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation) {
923 const auto allowedDisplayOrientations = std::array<Transform, 4>{
924 Transform::NONE,
925 Transform::ROT_90,
926 Transform::ROT_180,
927 Transform::ROT_270,
928 };
929
ramindani431aad42022-02-01 21:44:29 +0000930 const auto& [status, displayOrientation] =
931 mComposerClient->getDisplayPhysicalOrientation(getPrimaryDisplayId());
Ady Abrahamae12e382022-01-13 18:06:21 -0800932
ramindani431aad42022-02-01 21:44:29 +0000933 EXPECT_TRUE(status.isOk());
Ady Abrahamae12e382022-01-13 18:06:21 -0800934 EXPECT_NE(std::find(allowedDisplayOrientations.begin(), allowedDisplayOrientations.end(),
935 displayOrientation),
936 allowedDisplayOrientations.end());
937}
938
ramindani2740bac2021-11-24 22:58:32 +0000939TEST_P(GraphicsComposerAidlTest, SetClientTargetSlotCount) {
ramindani431aad42022-02-01 21:44:29 +0000940 EXPECT_TRUE(mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kBufferSlotCount)
941 .isOk());
ramindani2740bac2021-11-24 22:58:32 +0000942}
943
944TEST_P(GraphicsComposerAidlTest, SetActiveConfig) {
ramindani431aad42022-02-01 21:44:29 +0000945 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
946 EXPECT_TRUE(status.isOk());
947
948 for (const auto& config : configs) {
949 auto display = getEditablePrimaryDisplay();
950 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
951 const auto& [configStatus, config1] =
952 mComposerClient->getActiveConfig(getPrimaryDisplayId());
953 EXPECT_TRUE(configStatus.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000954 EXPECT_EQ(config, config1);
955 }
956}
957
958TEST_P(GraphicsComposerAidlTest, SetActiveConfigPowerCycle) {
ramindani431aad42022-02-01 21:44:29 +0000959 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
960 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000961
ramindani431aad42022-02-01 21:44:29 +0000962 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
963 EXPECT_TRUE(status.isOk());
964
965 for (const auto& config : configs) {
966 auto display = getEditablePrimaryDisplay();
967 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
968 const auto& [config1Status, config1] =
969 mComposerClient->getActiveConfig(getPrimaryDisplayId());
970 EXPECT_TRUE(config1Status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000971 EXPECT_EQ(config, config1);
972
ramindani431aad42022-02-01 21:44:29 +0000973 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
974 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
975 const auto& [config2Status, config2] =
976 mComposerClient->getActiveConfig(getPrimaryDisplayId());
977 EXPECT_TRUE(config2Status.isOk());
978 EXPECT_EQ(config, config2);
ramindani2740bac2021-11-24 22:58:32 +0000979 }
980}
981
ramindani2740bac2021-11-24 22:58:32 +0000982TEST_P(GraphicsComposerAidlTest, SetPowerModeUnsupported) {
ramindani431aad42022-02-01 21:44:29 +0000983 const auto& [status, capabilities] =
984 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
985 ASSERT_TRUE(status.isOk());
986
Ady Abraham6679baf2021-12-08 18:28:27 -0800987 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
988 DisplayCapability::DOZE) != capabilities.end();
989 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
990 DisplayCapability::SUSPEND) != capabilities.end();
ramindani2740bac2021-11-24 22:58:32 +0000991
ramindani431aad42022-02-01 21:44:29 +0000992 if (!isDozeSupported) {
993 const auto& powerModeDozeStatus =
994 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE);
995 EXPECT_FALSE(powerModeDozeStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000996 EXPECT_NO_FATAL_FAILURE(
997 assertServiceSpecificError(powerModeDozeStatus, IComposerClient::EX_UNSUPPORTED));
ramindani431aad42022-02-01 21:44:29 +0000998
999 const auto& powerModeDozeSuspendStatus =
1000 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
1001 EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +00001002 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeDozeSuspendStatus,
1003 IComposerClient::EX_UNSUPPORTED));
ramindani2740bac2021-11-24 22:58:32 +00001004 }
Ady Abraham6679baf2021-12-08 18:28:27 -08001005
1006 if (!isSuspendSupported) {
ramindani431aad42022-02-01 21:44:29 +00001007 const auto& powerModeSuspendStatus =
1008 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON_SUSPEND);
1009 EXPECT_FALSE(powerModeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +00001010 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeSuspendStatus,
1011 IComposerClient::EX_UNSUPPORTED));
Ady Abraham6679baf2021-12-08 18:28:27 -08001012
ramindani431aad42022-02-01 21:44:29 +00001013 const auto& powerModeDozeSuspendStatus =
1014 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
1015 EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +00001016 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeDozeSuspendStatus,
1017 IComposerClient::EX_UNSUPPORTED));
Ady Abraham6679baf2021-12-08 18:28:27 -08001018 }
ramindani2740bac2021-11-24 22:58:32 +00001019}
1020
1021TEST_P(GraphicsComposerAidlTest, SetVsyncEnabled) {
ramindani431aad42022-02-01 21:44:29 +00001022 mComposerClient->setVsyncAllowed(true);
ramindani2740bac2021-11-24 22:58:32 +00001023
ramindani431aad42022-02-01 21:44:29 +00001024 EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), true).isOk());
ramindani2740bac2021-11-24 22:58:32 +00001025 usleep(60 * 1000);
ramindani431aad42022-02-01 21:44:29 +00001026 EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), false).isOk());
ramindani2740bac2021-11-24 22:58:32 +00001027
ramindani431aad42022-02-01 21:44:29 +00001028 mComposerClient->setVsyncAllowed(false);
ramindani2740bac2021-11-24 22:58:32 +00001029}
1030
ramindanic2b8d082021-11-06 02:03:50 +00001031TEST_P(GraphicsComposerAidlTest, SetPowerMode) {
ramindani431aad42022-02-01 21:44:29 +00001032 const auto& [status, capabilities] =
1033 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
1034 ASSERT_TRUE(status.isOk());
1035
Ady Abraham6679baf2021-12-08 18:28:27 -08001036 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
1037 DisplayCapability::DOZE) != capabilities.end();
1038 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
1039 DisplayCapability::SUSPEND) != capabilities.end();
1040
ramindanic2b8d082021-11-06 02:03:50 +00001041 std::vector<PowerMode> modes;
1042 modes.push_back(PowerMode::OFF);
ramindanic2b8d082021-11-06 02:03:50 +00001043 modes.push_back(PowerMode::ON);
1044
Ady Abraham6679baf2021-12-08 18:28:27 -08001045 if (isSuspendSupported) {
1046 modes.push_back(PowerMode::ON_SUSPEND);
1047 }
1048
ramindani770d7082021-11-30 00:36:42 +00001049 if (isDozeSupported) {
1050 modes.push_back(PowerMode::DOZE);
Ady Abraham6679baf2021-12-08 18:28:27 -08001051 }
1052
1053 if (isSuspendSupported && isDozeSupported) {
ramindani770d7082021-11-30 00:36:42 +00001054 modes.push_back(PowerMode::DOZE_SUSPEND);
1055 }
1056
ramindanic2b8d082021-11-06 02:03:50 +00001057 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001058 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001059 }
1060}
1061
1062TEST_P(GraphicsComposerAidlTest, SetPowerModeVariations) {
ramindani431aad42022-02-01 21:44:29 +00001063 const auto& [status, capabilities] =
1064 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
1065 ASSERT_TRUE(status.isOk());
1066
Ady Abraham6679baf2021-12-08 18:28:27 -08001067 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
1068 DisplayCapability::DOZE) != capabilities.end();
1069 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
1070 DisplayCapability::SUSPEND) != capabilities.end();
1071
ramindanic2b8d082021-11-06 02:03:50 +00001072 std::vector<PowerMode> modes;
1073
1074 modes.push_back(PowerMode::OFF);
ramindani770d7082021-11-30 00:36:42 +00001075 modes.push_back(PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +00001076 modes.push_back(PowerMode::OFF);
ramindanic2b8d082021-11-06 02:03:50 +00001077 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001078 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001079 }
ramindani770d7082021-11-30 00:36:42 +00001080 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +00001081
ramindani770d7082021-11-30 00:36:42 +00001082 modes.push_back(PowerMode::OFF);
1083 modes.push_back(PowerMode::OFF);
1084 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001085 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindani770d7082021-11-30 00:36:42 +00001086 }
ramindanic2b8d082021-11-06 02:03:50 +00001087 modes.clear();
1088
1089 modes.push_back(PowerMode::ON);
1090 modes.push_back(PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +00001091 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001092 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001093 }
ramindanic2b8d082021-11-06 02:03:50 +00001094 modes.clear();
1095
Ady Abraham6679baf2021-12-08 18:28:27 -08001096 if (isSuspendSupported) {
1097 modes.push_back(PowerMode::ON_SUSPEND);
1098 modes.push_back(PowerMode::ON_SUSPEND);
1099 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001100 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
Ady Abraham6679baf2021-12-08 18:28:27 -08001101 }
1102 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +00001103 }
1104
ramindanic2b8d082021-11-06 02:03:50 +00001105 if (isDozeSupported) {
ramindanic2b8d082021-11-06 02:03:50 +00001106 modes.push_back(PowerMode::DOZE);
1107 modes.push_back(PowerMode::DOZE);
ramindanic2b8d082021-11-06 02:03:50 +00001108 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001109 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001110 }
ramindanic2b8d082021-11-06 02:03:50 +00001111 modes.clear();
Ady Abraham6679baf2021-12-08 18:28:27 -08001112 }
ramindanic2b8d082021-11-06 02:03:50 +00001113
Ady Abraham6679baf2021-12-08 18:28:27 -08001114 if (isSuspendSupported && isDozeSupported) {
ramindanic2b8d082021-11-06 02:03:50 +00001115 modes.push_back(PowerMode::DOZE_SUSPEND);
1116 modes.push_back(PowerMode::DOZE_SUSPEND);
ramindanic2b8d082021-11-06 02:03:50 +00001117 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001118 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001119 }
Ady Abraham6679baf2021-12-08 18:28:27 -08001120 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +00001121 }
1122}
1123
ramindani431aad42022-02-01 21:44:29 +00001124TEST_P(GraphicsComposerAidlTest, SetPowerMode_BadDisplay) {
1125 const auto& status = mComposerClient->setPowerMode(getInvalidDisplayId(), PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +00001126
ramindani431aad42022-02-01 21:44:29 +00001127 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001128 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindanic2b8d082021-11-06 02:03:50 +00001129}
1130
ramindani431aad42022-02-01 21:44:29 +00001131TEST_P(GraphicsComposerAidlTest, SetPowerMode_BadParameter) {
1132 const auto& status =
1133 mComposerClient->setPowerMode(getPrimaryDisplayId(), static_cast<PowerMode>(-1));
ramindanic2b8d082021-11-06 02:03:50 +00001134
ramindani431aad42022-02-01 21:44:29 +00001135 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001136 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanic2b8d082021-11-06 02:03:50 +00001137}
1138
ramindanic2b8d082021-11-06 02:03:50 +00001139TEST_P(GraphicsComposerAidlTest, GetDataspaceSaturationMatrix) {
ramindani431aad42022-02-01 21:44:29 +00001140 const auto& [status, matrix] =
1141 mComposerClient->getDataspaceSaturationMatrix(common::Dataspace::SRGB_LINEAR);
1142 ASSERT_TRUE(status.isOk());
1143 ASSERT_EQ(16, matrix.size()); // matrix should not be empty if call succeeded.
ramindanideb059e2021-11-18 01:57:25 +00001144
ramindanic2b8d082021-11-06 02:03:50 +00001145 // the last row is known
ramindani431aad42022-02-01 21:44:29 +00001146 EXPECT_EQ(0.0f, matrix[12]);
1147 EXPECT_EQ(0.0f, matrix[13]);
1148 EXPECT_EQ(0.0f, matrix[14]);
1149 EXPECT_EQ(1.0f, matrix[15]);
ramindanic2b8d082021-11-06 02:03:50 +00001150}
1151
ramindani431aad42022-02-01 21:44:29 +00001152TEST_P(GraphicsComposerAidlTest, GetDataspaceSaturationMatrix_BadParameter) {
1153 const auto& [status, matrix] =
1154 mComposerClient->getDataspaceSaturationMatrix(common::Dataspace::UNKNOWN);
ramindanic2b8d082021-11-06 02:03:50 +00001155
ramindani431aad42022-02-01 21:44:29 +00001156 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001157 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanic2b8d082021-11-06 02:03:50 +00001158}
1159
ramindanidcfe3a82021-11-29 17:00:31 +00001160// Tests for Command.
1161class GraphicsComposerAidlCommandTest : public GraphicsComposerAidlTest {
1162 protected:
ramindanidcfe3a82021-11-29 17:00:31 +00001163 void TearDown() override {
Ady Abraham3192f3d2021-12-03 16:08:56 -08001164 const auto errors = mReader.takeErrors();
1165 ASSERT_TRUE(mReader.takeErrors().empty());
ramindani431aad42022-02-01 21:44:29 +00001166 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001167
ramindanidcfe3a82021-11-29 17:00:31 +00001168 ASSERT_NO_FATAL_FAILURE(GraphicsComposerAidlTest::TearDown());
1169 }
1170
1171 void execute() {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001172 std::vector<CommandResultPayload> payloads;
1173 for (auto& [_, writer] : mWriters) {
1174 const auto& commands = writer.getPendingCommands();
1175 if (commands.empty()) {
1176 writer.reset();
1177 continue;
1178 }
1179
1180 auto [status, results] = mComposerClient->executeCommands(commands);
1181 ASSERT_TRUE(status.isOk()) << "executeCommands failed " << status.getDescription();
1182 writer.reset();
1183
1184 payloads.reserve(payloads.size() + results.size());
1185 payloads.insert(payloads.end(), std::make_move_iterator(results.begin()),
1186 std::make_move_iterator(results.end()));
ramindanidcfe3a82021-11-29 17:00:31 +00001187 }
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001188 mReader.parse(std::move(payloads));
ramindanidcfe3a82021-11-29 17:00:31 +00001189 }
1190
1191 static inline auto toTimePoint(nsecs_t time) {
1192 return std::chrono::time_point<std::chrono::steady_clock>(std::chrono::nanoseconds(time));
1193 }
1194
ramindanidcfe3a82021-11-29 17:00:31 +00001195 void forEachTwoConfigs(int64_t display, std::function<void(int32_t, int32_t)> func) {
ramindani431aad42022-02-01 21:44:29 +00001196 const auto& [status, displayConfigs] = mComposerClient->getDisplayConfigs(display);
1197 ASSERT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001198 for (const int32_t config1 : displayConfigs) {
1199 for (const int32_t config2 : displayConfigs) {
1200 if (config1 != config2) {
1201 func(config1, config2);
1202 }
1203 }
1204 }
1205 }
1206
1207 void waitForVsyncPeriodChange(int64_t display, const VsyncPeriodChangeTimeline& timeline,
1208 int64_t desiredTimeNanos, int64_t oldPeriodNanos,
1209 int64_t newPeriodNanos) {
1210 const auto kChangeDeadline = toTimePoint(timeline.newVsyncAppliedTimeNanos) + 100ms;
1211 while (std::chrono::steady_clock::now() <= kChangeDeadline) {
ramindani431aad42022-02-01 21:44:29 +00001212 const auto& [status, vsyncPeriodNanos] =
1213 mComposerClient->getDisplayVsyncPeriod(display);
1214 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001215 if (systemTime() <= desiredTimeNanos) {
1216 EXPECT_EQ(vsyncPeriodNanos, oldPeriodNanos);
1217 } else if (vsyncPeriodNanos == newPeriodNanos) {
1218 break;
1219 }
1220 std::this_thread::sleep_for(std::chrono::nanoseconds(oldPeriodNanos));
1221 }
1222 }
1223
ramindani9dd8c482023-02-21 18:07:56 -08001224 bool checkIfCallbackRefreshRateChangedDebugEnabledReceived(
1225 std::function<bool(RefreshRateChangedDebugData)> filter) {
1226 const auto list = mComposerClient->takeListOfRefreshRateChangedDebugData();
1227 return std::any_of(list.begin(), list.end(), [&](auto refreshRateChangedDebugData) {
1228 return filter(refreshRateChangedDebugData);
1229 });
1230 }
1231
Brian Lindahlca3eef22022-12-09 00:32:11 -07001232 sp<GraphicBuffer> allocate(::android::PixelFormat pixelFormat) {
Brian Lindahl14bd07b2023-01-17 14:54:39 -07001233 return sp<GraphicBuffer>::make(
1234 static_cast<uint32_t>(getPrimaryDisplay().getDisplayWidth()),
1235 static_cast<uint32_t>(getPrimaryDisplay().getDisplayHeight()), pixelFormat,
1236 /*layerCount*/ 1U,
1237 (static_cast<uint64_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
1238 static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
1239 static_cast<uint64_t>(common::BufferUsage::COMPOSER_OVERLAY)),
1240 "VtsHalGraphicsComposer3_TargetTest");
Brian Lindahlca3eef22022-12-09 00:32:11 -07001241 }
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
ramindani431aad42022-02-01 21:44:29 +00001756TEST_P(GraphicsComposerAidlCommandTest, SetLayerSurfaceDamage) {
1757 const auto& [layerStatus, layer] =
1758 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1759 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001760
1761 Rect empty{0, 0, 0, 0};
1762 Rect unit{0, 0, 1, 1};
1763
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001764 auto& writer = getWriter(getPrimaryDisplayId());
1765 writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
ramindanidcfe3a82021-11-29 17:00:31 +00001766 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001767 ASSERT_TRUE(mReader.takeErrors().empty());
1768
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001769 writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001770 execute();
1771 ASSERT_TRUE(mReader.takeErrors().empty());
1772
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001773 writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001774 execute();
1775 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001776}
1777
ramindani431aad42022-02-01 21:44:29 +00001778TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlockingRegion) {
1779 const auto& [layerStatus, layer] =
1780 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1781 EXPECT_TRUE(layerStatus.isOk());
Leon Scroggins III03318152022-01-13 12:24:19 -05001782
1783 Rect empty{0, 0, 0, 0};
1784 Rect unit{0, 0, 1, 1};
1785
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001786 auto& writer = getWriter(getPrimaryDisplayId());
1787 writer.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
Leon Scroggins III03318152022-01-13 12:24:19 -05001788 execute();
1789 ASSERT_TRUE(mReader.takeErrors().empty());
1790
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001791 writer.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Leon Scroggins III03318152022-01-13 12:24:19 -05001792 execute();
1793 ASSERT_TRUE(mReader.takeErrors().empty());
1794
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001795 writer.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
Leon Scroggins III03318152022-01-13 12:24:19 -05001796 execute();
1797 ASSERT_TRUE(mReader.takeErrors().empty());
1798}
1799
ramindani431aad42022-02-01 21:44:29 +00001800TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlendMode) {
1801 const auto& [layerStatus, layer] =
1802 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1803 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001804
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001805 auto& writer = getWriter(getPrimaryDisplayId());
1806 writer.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::NONE);
ramindanidcfe3a82021-11-29 17:00:31 +00001807 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001808 ASSERT_TRUE(mReader.takeErrors().empty());
1809
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001810 writer.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::PREMULTIPLIED);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001811 execute();
1812 ASSERT_TRUE(mReader.takeErrors().empty());
1813
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001814 writer.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::COVERAGE);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001815 execute();
1816 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001817}
1818
ramindani431aad42022-02-01 21:44:29 +00001819TEST_P(GraphicsComposerAidlCommandTest, SetLayerColor) {
1820 const auto& [layerStatus, layer] =
1821 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1822 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001823
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001824 auto& writer = getWriter(getPrimaryDisplayId());
1825 writer.setLayerColor(getPrimaryDisplayId(), layer, Color{1.0f, 1.0f, 1.0f, 1.0f});
ramindanidcfe3a82021-11-29 17:00:31 +00001826 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001827 ASSERT_TRUE(mReader.takeErrors().empty());
1828
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001829 writer.setLayerColor(getPrimaryDisplayId(), layer, Color{0.0f, 0.0f, 0.0f, 0.0f});
Ady Abraham3192f3d2021-12-03 16:08:56 -08001830 execute();
1831 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001832}
1833
ramindani431aad42022-02-01 21:44:29 +00001834TEST_P(GraphicsComposerAidlCommandTest, SetLayerCompositionType) {
1835 const auto& [layerStatus, layer] =
1836 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1837 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001838
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001839 auto& writer = getWriter(getPrimaryDisplayId());
1840 writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CLIENT);
ramindanidcfe3a82021-11-29 17:00:31 +00001841 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001842 ASSERT_TRUE(mReader.takeErrors().empty());
1843
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001844 writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::DEVICE);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001845 execute();
1846 ASSERT_TRUE(mReader.takeErrors().empty());
1847
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001848 writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::SOLID_COLOR);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001849 execute();
1850 ASSERT_TRUE(mReader.takeErrors().empty());
1851
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001852 writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CURSOR);
ramindani431aad42022-02-01 21:44:29 +00001853 execute();
1854}
1855
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001856TEST_P(GraphicsComposerAidlCommandTest, DisplayDecoration) {
1857 for (VtsDisplay& display : mDisplays) {
1858 const auto [layerStatus, layer] =
1859 mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount);
1860 EXPECT_TRUE(layerStatus.isOk());
1861
1862 const auto [error, support] =
1863 mComposerClient->getDisplayDecorationSupport(display.getDisplayId());
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001864
Leon Scroggins III91590872022-02-23 09:51:21 -05001865 const auto format = (error.isOk() && support) ? support->format
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001866 : aidl::android::hardware::graphics::common::PixelFormat::RGBA_8888;
1867 const auto decorBuffer = allocate(static_cast<::android::PixelFormat>(format));
1868 ASSERT_NE(nullptr, decorBuffer);
1869 if (::android::OK != decorBuffer->initCheck()) {
1870 if (support) {
1871 FAIL() << "Device advertised display decoration support with format "
1872 << aidl::android::hardware::graphics::common::toString(format)
1873 << " but failed to allocate it!";
1874 } else {
1875 FAIL() << "Device advertised NO display decoration support, but it should "
1876 << "still be able to allocate "
1877 << aidl::android::hardware::graphics::common::toString(format);
1878 }
1879 }
1880
Midas Chien7d55d422022-06-07 02:32:28 +08001881 configureLayer(display, layer, Composition::DISPLAY_DECORATION, display.getFrameRect(),
1882 display.getCrop());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001883 auto& writer = getWriter(display.getDisplayId());
1884 writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, decorBuffer->handle,
1885 /*acquireFence*/ -1);
1886 writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001887 execute();
1888 if (support) {
1889 ASSERT_TRUE(mReader.takeErrors().empty());
1890 } else {
1891 const auto errors = mReader.takeErrors();
1892 ASSERT_EQ(1, errors.size());
Leon Scroggins III6455e792022-02-24 12:18:58 -05001893 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, errors[0].errorCode);
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001894 }
1895 }
1896}
1897
ramindani431aad42022-02-01 21:44:29 +00001898TEST_P(GraphicsComposerAidlCommandTest, SetLayerDataspace) {
1899 const auto& [layerStatus, layer] =
1900 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1901 EXPECT_TRUE(layerStatus.isOk());
1902
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001903 auto& writer = getWriter(getPrimaryDisplayId());
1904 writer.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
ramindani431aad42022-02-01 21:44:29 +00001905 execute();
1906}
1907
1908TEST_P(GraphicsComposerAidlCommandTest, SetLayerDisplayFrame) {
1909 const auto& [layerStatus, layer] =
1910 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1911 EXPECT_TRUE(layerStatus.isOk());
1912
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001913 auto& writer = getWriter(getPrimaryDisplayId());
1914 writer.setLayerDisplayFrame(getPrimaryDisplayId(), layer, Rect{0, 0, 1, 1});
ramindani431aad42022-02-01 21:44:29 +00001915 execute();
1916}
1917
1918TEST_P(GraphicsComposerAidlCommandTest, SetLayerPlaneAlpha) {
1919 const auto& [layerStatus, layer] =
1920 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1921 EXPECT_TRUE(layerStatus.isOk());
1922
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001923 auto& writer = getWriter(getPrimaryDisplayId());
1924 writer.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 0.0f);
ramindani431aad42022-02-01 21:44:29 +00001925 execute();
1926 ASSERT_TRUE(mReader.takeErrors().empty());
1927
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001928 writer.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 1.0f);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001929 execute();
1930 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001931}
1932
ramindani431aad42022-02-01 21:44:29 +00001933TEST_P(GraphicsComposerAidlCommandTest, SetLayerSidebandStream) {
Jason Macnak325e8232022-01-24 14:48:55 -08001934 if (!hasCapability(Capability::SIDEBAND_STREAM)) {
ramindanidcfe3a82021-11-29 17:00:31 +00001935 GTEST_SUCCEED() << "no sideband stream support";
1936 return;
1937 }
1938
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001939 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001940 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001941 ASSERT_NE(nullptr, handle);
1942
ramindani431aad42022-02-01 21:44:29 +00001943 const auto& [layerStatus, layer] =
1944 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1945 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001946
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001947 auto& writer = getWriter(getPrimaryDisplayId());
1948 writer.setLayerSidebandStream(getPrimaryDisplayId(), layer, handle);
ramindanidcfe3a82021-11-29 17:00:31 +00001949 execute();
1950}
1951
ramindani431aad42022-02-01 21:44:29 +00001952TEST_P(GraphicsComposerAidlCommandTest, SetLayerSourceCrop) {
1953 const auto& [layerStatus, layer] =
1954 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1955 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001956
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001957 auto& writer = getWriter(getPrimaryDisplayId());
1958 writer.setLayerSourceCrop(getPrimaryDisplayId(), layer, FRect{0.0f, 0.0f, 1.0f, 1.0f});
ramindanidcfe3a82021-11-29 17:00:31 +00001959 execute();
1960}
1961
ramindani431aad42022-02-01 21:44:29 +00001962TEST_P(GraphicsComposerAidlCommandTest, SetLayerTransform) {
1963 const auto& [layerStatus, layer] =
1964 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1965 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001966
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001967 auto& writer = getWriter(getPrimaryDisplayId());
1968 writer.setLayerTransform(getPrimaryDisplayId(), layer, static_cast<Transform>(0));
ramindanidcfe3a82021-11-29 17:00:31 +00001969 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001970 ASSERT_TRUE(mReader.takeErrors().empty());
1971
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001972 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_H);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001973 execute();
1974 ASSERT_TRUE(mReader.takeErrors().empty());
1975
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001976 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_V);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001977 execute();
1978 ASSERT_TRUE(mReader.takeErrors().empty());
1979
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001980 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_90);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001981 execute();
1982 ASSERT_TRUE(mReader.takeErrors().empty());
1983
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001984 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_180);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001985 execute();
1986 ASSERT_TRUE(mReader.takeErrors().empty());
1987
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001988 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_270);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001989 execute();
1990 ASSERT_TRUE(mReader.takeErrors().empty());
1991
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001992 writer.setLayerTransform(getPrimaryDisplayId(), layer,
1993 static_cast<Transform>(static_cast<int>(Transform::FLIP_H) |
1994 static_cast<int>(Transform::ROT_90)));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001995 execute();
1996 ASSERT_TRUE(mReader.takeErrors().empty());
1997
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001998 writer.setLayerTransform(getPrimaryDisplayId(), layer,
1999 static_cast<Transform>(static_cast<int>(Transform::FLIP_V) |
2000 static_cast<int>(Transform::ROT_90)));
Ady Abraham3192f3d2021-12-03 16:08:56 -08002001 execute();
2002 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00002003}
2004
ramindani431aad42022-02-01 21:44:29 +00002005TEST_P(GraphicsComposerAidlCommandTest, SetLayerVisibleRegion) {
2006 const auto& [layerStatus, layer] =
2007 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2008 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002009
2010 Rect empty{0, 0, 0, 0};
2011 Rect unit{0, 0, 1, 1};
2012
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002013 auto& writer = getWriter(getPrimaryDisplayId());
2014 writer.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
ramindanidcfe3a82021-11-29 17:00:31 +00002015 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08002016 ASSERT_TRUE(mReader.takeErrors().empty());
2017
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002018 writer.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Ady Abraham3192f3d2021-12-03 16:08:56 -08002019 execute();
2020 ASSERT_TRUE(mReader.takeErrors().empty());
2021
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002022 writer.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
Ady Abraham3192f3d2021-12-03 16:08:56 -08002023 execute();
2024 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00002025}
2026
ramindani431aad42022-02-01 21:44:29 +00002027TEST_P(GraphicsComposerAidlCommandTest, SetLayerZOrder) {
2028 const auto& [layerStatus, layer] =
2029 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2030 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002031
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002032 auto& writer = getWriter(getPrimaryDisplayId());
2033 writer.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 10);
ramindanidcfe3a82021-11-29 17:00:31 +00002034 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08002035 ASSERT_TRUE(mReader.takeErrors().empty());
2036
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002037 writer.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 0);
Ady Abraham3192f3d2021-12-03 16:08:56 -08002038 execute();
2039 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00002040}
2041
ramindani431aad42022-02-01 21:44:29 +00002042TEST_P(GraphicsComposerAidlCommandTest, SetLayerPerFrameMetadata) {
2043 const auto& [layerStatus, layer] =
2044 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2045 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002046
ramindanidcfe3a82021-11-29 17:00:31 +00002047 /**
2048 * DISPLAY_P3 is a color space that uses the DCI_P3 primaries,
2049 * the D65 white point and the SRGB transfer functions.
2050 * Rendering Intent: Colorimetric
2051 * Primaries:
2052 * x y
2053 * green 0.265 0.690
2054 * blue 0.150 0.060
2055 * red 0.680 0.320
2056 * white (D65) 0.3127 0.3290
2057 */
2058
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002059 auto& writer = getWriter(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00002060 std::vector<PerFrameMetadata> aidlMetadata;
2061 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X, 0.680f});
2062 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y, 0.320f});
2063 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_X, 0.265f});
2064 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_Y, 0.690f});
2065 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_X, 0.150f});
2066 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_Y, 0.060f});
2067 aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_X, 0.3127f});
2068 aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_Y, 0.3290f});
2069 aidlMetadata.push_back({PerFrameMetadataKey::MAX_LUMINANCE, 100.0f});
2070 aidlMetadata.push_back({PerFrameMetadataKey::MIN_LUMINANCE, 0.1f});
2071 aidlMetadata.push_back({PerFrameMetadataKey::MAX_CONTENT_LIGHT_LEVEL, 78.0});
2072 aidlMetadata.push_back({PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL, 62.0});
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002073 writer.setLayerPerFrameMetadata(getPrimaryDisplayId(), layer, aidlMetadata);
ramindanidcfe3a82021-11-29 17:00:31 +00002074 execute();
2075
Ady Abraham3192f3d2021-12-03 16:08:56 -08002076 const auto errors = mReader.takeErrors();
2077 if (errors.size() == 1 && errors[0].errorCode == EX_UNSUPPORTED_OPERATION) {
ramindanidcfe3a82021-11-29 17:00:31 +00002078 GTEST_SUCCEED() << "SetLayerPerFrameMetadata is not supported";
ramindani431aad42022-02-01 21:44:29 +00002079 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002080 return;
2081 }
2082
ramindani431aad42022-02-01 21:44:29 +00002083 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002084}
2085
Alec Mourib1f16722022-02-07 13:03:44 -08002086TEST_P(GraphicsComposerAidlCommandTest, setLayerBrightness) {
ramindani431aad42022-02-01 21:44:29 +00002087 const auto& [layerStatus, layer] =
2088 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
Alec Mouri95e490b2022-01-06 13:46:58 -08002089
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002090 auto& writer = getWriter(getPrimaryDisplayId());
2091 writer.setLayerBrightness(getPrimaryDisplayId(), layer, 0.2f);
Alec Mouri95e490b2022-01-06 13:46:58 -08002092 execute();
2093 ASSERT_TRUE(mReader.takeErrors().empty());
2094
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002095 writer.setLayerBrightness(getPrimaryDisplayId(), layer, 1.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08002096 execute();
2097 ASSERT_TRUE(mReader.takeErrors().empty());
2098
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002099 writer.setLayerBrightness(getPrimaryDisplayId(), layer, 0.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08002100 execute();
2101 ASSERT_TRUE(mReader.takeErrors().empty());
2102
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002103 writer.setLayerBrightness(getPrimaryDisplayId(), layer, -1.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08002104 execute();
Alec Mourib1f16722022-02-07 13:03:44 -08002105 {
2106 const auto errors = mReader.takeErrors();
2107 ASSERT_EQ(1, errors.size());
2108 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
2109 }
2110
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002111 writer.setLayerBrightness(getPrimaryDisplayId(), layer, std::nanf(""));
Alec Mourib1f16722022-02-07 13:03:44 -08002112 execute();
2113 {
2114 const auto errors = mReader.takeErrors();
2115 ASSERT_EQ(1, errors.size());
2116 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
2117 }
Alec Mouri95e490b2022-01-06 13:46:58 -08002118}
2119
ramindani431aad42022-02-01 21:44:29 +00002120TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints) {
ramindanidcfe3a82021-11-29 17:00:31 +00002121 Test_setActiveConfigWithConstraints({.delayForChange = 0, .refreshMiss = false});
2122}
2123
ramindani431aad42022-02-01 21:44:29 +00002124TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_Delayed) {
ramindanidcfe3a82021-11-29 17:00:31 +00002125 Test_setActiveConfigWithConstraints({.delayForChange = 300'000'000, // 300ms
2126 .refreshMiss = false});
2127}
2128
ramindani431aad42022-02-01 21:44:29 +00002129TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_MissRefresh) {
ramindanidcfe3a82021-11-29 17:00:31 +00002130 Test_setActiveConfigWithConstraints({.delayForChange = 0, .refreshMiss = true});
2131}
2132
ramindani431aad42022-02-01 21:44:29 +00002133TEST_P(GraphicsComposerAidlCommandTest, GetDisplayVsyncPeriod) {
ramindanidcfe3a82021-11-29 17:00:31 +00002134 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00002135 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
2136 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002137
ramindani431aad42022-02-01 21:44:29 +00002138 for (int32_t config : configs) {
2139 int32_t expectedVsyncPeriodNanos = display.getDisplayConfig(config).vsyncPeriod;
2140
ramindanidcfe3a82021-11-29 17:00:31 +00002141 VsyncPeriodChangeConstraints constraints;
2142
2143 constraints.desiredTimeNanos = systemTime();
2144 constraints.seamlessRequired = false;
ramindani431aad42022-02-01 21:44:29 +00002145
2146 const auto& [timelineStatus, timeline] =
2147 mComposerClient->setActiveConfigWithConstraints(&display, config, constraints);
2148 EXPECT_TRUE(timelineStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002149
2150 if (timeline.refreshRequired) {
2151 sendRefreshFrame(display, &timeline);
2152 }
ramindani431aad42022-02-01 21:44:29 +00002153 waitForVsyncPeriodChange(display.getDisplayId(), timeline, constraints.desiredTimeNanos,
2154 /*odPeriodNanos*/ 0, expectedVsyncPeriodNanos);
ramindanidcfe3a82021-11-29 17:00:31 +00002155
2156 int32_t vsyncPeriodNanos;
2157 int retryCount = 100;
2158 do {
2159 std::this_thread::sleep_for(10ms);
ramindani431aad42022-02-01 21:44:29 +00002160 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanosValue] =
2161 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
2162
2163 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
2164 vsyncPeriodNanos = vsyncPeriodNanosValue;
ramindanidcfe3a82021-11-29 17:00:31 +00002165 --retryCount;
2166 } while (vsyncPeriodNanos != expectedVsyncPeriodNanos && retryCount > 0);
2167
2168 EXPECT_EQ(vsyncPeriodNanos, expectedVsyncPeriodNanos);
2169
2170 // Make sure that the vsync period stays the same if the active config is not
2171 // changed.
2172 auto timeout = 1ms;
2173 for (int i = 0; i < 10; i++) {
2174 std::this_thread::sleep_for(timeout);
2175 timeout *= 2;
2176 vsyncPeriodNanos = 0;
ramindani431aad42022-02-01 21:44:29 +00002177 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanosValue] =
2178 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
2179
2180 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
2181 vsyncPeriodNanos = vsyncPeriodNanosValue;
ramindanidcfe3a82021-11-29 17:00:31 +00002182 EXPECT_EQ(vsyncPeriodNanos, expectedVsyncPeriodNanos);
2183 }
2184 }
2185 }
2186}
2187
ramindani431aad42022-02-01 21:44:29 +00002188TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_SeamlessNotAllowed) {
ramindanidcfe3a82021-11-29 17:00:31 +00002189 VsyncPeriodChangeConstraints constraints;
ramindanidcfe3a82021-11-29 17:00:31 +00002190 constraints.seamlessRequired = true;
2191 constraints.desiredTimeNanos = systemTime();
2192
2193 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00002194 forEachTwoConfigs(display.getDisplayId(), [&](int32_t config1, int32_t config2) {
2195 int32_t configGroup1 = display.getDisplayConfig(config1).configGroup;
2196 int32_t configGroup2 = display.getDisplayConfig(config2).configGroup;
ramindanidcfe3a82021-11-29 17:00:31 +00002197 if (configGroup1 != configGroup2) {
ramindani431aad42022-02-01 21:44:29 +00002198 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002199 sendRefreshFrame(display, nullptr);
ramindani431aad42022-02-01 21:44:29 +00002200 const auto& [status, _] = mComposerClient->setActiveConfigWithConstraints(
2201 &display, config2, constraints);
2202 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002203 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(
2204 status, IComposerClient::EX_SEAMLESS_NOT_ALLOWED));
ramindanidcfe3a82021-11-29 17:00:31 +00002205 }
2206 });
2207 }
2208}
2209
ramindani431aad42022-02-01 21:44:29 +00002210TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_NoTimestamp) {
2211 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ std::nullopt));
Ady Abraham72c5b502021-12-10 17:23:39 -08002212}
2213
ramindani431aad42022-02-01 21:44:29 +00002214TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_0) {
2215 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ 0));
Ady Abraham72c5b502021-12-10 17:23:39 -08002216}
2217
ramindani431aad42022-02-01 21:44:29 +00002218TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_5) {
2219 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ 5));
Ady Abraham72c5b502021-12-10 17:23:39 -08002220}
2221
ramindani431aad42022-02-01 21:44:29 +00002222TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Unsupported) {
2223 const bool hasDisplayIdleTimerSupport =
2224 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002225 if (!hasDisplayIdleTimerSupport) {
ramindani431aad42022-02-01 21:44:29 +00002226 const auto& status =
2227 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0);
2228 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002229 EXPECT_NO_FATAL_FAILURE(
2230 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
Midas Chiena0b56bd2022-01-13 23:27:33 +08002231 }
2232}
2233
ramindani431aad42022-02-01 21:44:29 +00002234TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_BadParameter) {
2235 const bool hasDisplayIdleTimerSupport =
2236 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002237 if (!hasDisplayIdleTimerSupport) {
2238 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2239 return;
2240 }
2241
ramindani431aad42022-02-01 21:44:29 +00002242 const auto& status =
2243 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ -1);
2244 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002245 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
Midas Chiena0b56bd2022-01-13 23:27:33 +08002246}
2247
ramindani431aad42022-02-01 21:44:29 +00002248TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Disable) {
2249 const bool hasDisplayIdleTimerSupport =
2250 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002251 if (!hasDisplayIdleTimerSupport) {
2252 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2253 return;
2254 }
2255
ramindani431aad42022-02-01 21:44:29 +00002256 EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002257 std::this_thread::sleep_for(1s);
ramindani431aad42022-02-01 21:44:29 +00002258 EXPECT_EQ(0, mComposerClient->getVsyncIdleCount());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002259}
2260
ramindani431aad42022-02-01 21:44:29 +00002261TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Timeout_2) {
2262 const bool hasDisplayIdleTimerSupport =
2263 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002264 if (!hasDisplayIdleTimerSupport) {
2265 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2266 return;
2267 }
2268
ramindani431aad42022-02-01 21:44:29 +00002269 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
2270 EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002271
Leon Scroggins IIIde057582022-01-13 12:26:00 -05002272 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002273 ASSERT_NE(nullptr, buffer->handle);
2274
2275 const auto layer = createOnScreenLayer();
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002276 auto& writer = getWriter(getPrimaryDisplayId());
2277 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer->handle,
2278 /*acquireFence*/ -1);
ramindani431aad42022-02-01 21:44:29 +00002279 int32_t vsyncIdleCount = mComposerClient->getVsyncIdleCount();
Midas Chiena0b56bd2022-01-13 23:27:33 +08002280 auto earlyVsyncIdleTime = systemTime() + std::chrono::nanoseconds(2s).count();
ramindani431aad42022-02-01 21:44:29 +00002281 EXPECT_TRUE(
2282 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 2000).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002283
2284 const sp<::android::Fence> presentFence =
ramindani431aad42022-02-01 21:44:29 +00002285 presentAndGetFence(ComposerClientWriter::kNoTimestamp);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002286 presentFence->waitForever(LOG_TAG);
2287
2288 std::this_thread::sleep_for(3s);
ramindani431aad42022-02-01 21:44:29 +00002289 if (vsyncIdleCount < mComposerClient->getVsyncIdleCount()) {
2290 EXPECT_GE(mComposerClient->getVsyncIdleTime(), earlyVsyncIdleTime);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002291 }
2292
ramindani431aad42022-02-01 21:44:29 +00002293 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002294}
2295
ramindani9dd8c482023-02-21 18:07:56 -08002296TEST_P(GraphicsComposerAidlCommandTest, SetRefreshRateChangedCallbackDebug_Unsupported) {
ramindani17c71102023-03-20 10:51:14 -07002297 if (getInterfaceVersion() <= 1) {
2298 GTEST_SUCCEED() << "Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG is "
2299 "not supported on older version of the service";
2300 return;
2301 }
ramindani9dd8c482023-02-21 18:07:56 -08002302 if (!hasCapability(Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG)) {
2303 auto status = mComposerClient->setRefreshRateChangedCallbackDebugEnabled(
2304 getPrimaryDisplayId(), /*enabled*/ true);
2305 EXPECT_FALSE(status.isOk());
2306 EXPECT_NO_FATAL_FAILURE(
2307 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
2308
2309 status = mComposerClient->setRefreshRateChangedCallbackDebugEnabled(getPrimaryDisplayId(),
2310 /*enabled*/ false);
2311 EXPECT_FALSE(status.isOk());
2312 EXPECT_NO_FATAL_FAILURE(
2313 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
2314 }
2315}
2316
2317TEST_P(GraphicsComposerAidlCommandTest, SetRefreshRateChangedCallbackDebug_Enabled) {
ramindani17c71102023-03-20 10:51:14 -07002318 if (getInterfaceVersion() <= 1) {
2319 GTEST_SUCCEED() << "Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG is "
2320 "not supported on older version of the service";
2321 return;
2322 }
ramindani9dd8c482023-02-21 18:07:56 -08002323 if (!hasCapability(Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG)) {
2324 GTEST_SUCCEED() << "Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG is not supported";
2325 return;
2326 }
2327
2328 const auto displayId = getPrimaryDisplayId();
2329 EXPECT_TRUE(mComposerClient->setPowerMode(displayId, PowerMode::ON).isOk());
2330 // Enable the callback
2331 ASSERT_TRUE(mComposerClient
2332 ->setRefreshRateChangedCallbackDebugEnabled(displayId,
2333 /*enabled*/ true)
2334 .isOk());
2335 std::this_thread::sleep_for(100ms);
2336
ramindani91518892023-03-03 16:55:09 +00002337 const auto displayFilter = [displayId](auto refreshRateChangedDebugData) {
2338 return displayId == refreshRateChangedDebugData.display;
2339 };
ramindani9dd8c482023-02-21 18:07:56 -08002340
2341 // Check that we immediately got a callback
ramindani91518892023-03-03 16:55:09 +00002342 EXPECT_TRUE(checkIfCallbackRefreshRateChangedDebugEnabledReceived(displayFilter));
ramindani9dd8c482023-02-21 18:07:56 -08002343
2344 ASSERT_TRUE(mComposerClient
2345 ->setRefreshRateChangedCallbackDebugEnabled(displayId,
2346 /*enabled*/ false)
2347 .isOk());
2348}
2349
2350TEST_P(GraphicsComposerAidlCommandTest,
2351 SetRefreshRateChangedCallbackDebugEnabled_noCallbackWhenIdle) {
ramindani17c71102023-03-20 10:51:14 -07002352 if (getInterfaceVersion() <= 1) {
2353 GTEST_SUCCEED() << "Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG is "
2354 "not supported on older version of the service";
2355 return;
2356 }
ramindani9dd8c482023-02-21 18:07:56 -08002357 if (!hasCapability(Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG)) {
2358 GTEST_SUCCEED() << "Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG is not supported";
2359 return;
2360 }
2361
2362 auto display = getEditablePrimaryDisplay();
2363 const auto displayId = display.getDisplayId();
2364
2365 if (!hasDisplayCapability(displayId, DisplayCapability::DISPLAY_IDLE_TIMER)) {
2366 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2367 return;
2368 }
2369
2370 EXPECT_TRUE(mComposerClient->setPowerMode(displayId, PowerMode::ON).isOk());
2371 EXPECT_TRUE(mComposerClient->setPeakRefreshRateConfig(&display).isOk());
2372
2373 ASSERT_TRUE(mComposerClient->setIdleTimerEnabled(displayId, /*timeoutMs*/ 500).isOk());
2374 // Enable the callback
2375 ASSERT_TRUE(mComposerClient
2376 ->setRefreshRateChangedCallbackDebugEnabled(displayId,
2377 /*enabled*/ true)
2378 .isOk());
2379
ramindani91518892023-03-03 16:55:09 +00002380 const auto displayFilter = [displayId](auto refreshRateChangedDebugData) {
2381 return displayId == refreshRateChangedDebugData.display;
2382 };
ramindani9dd8c482023-02-21 18:07:56 -08002383
2384 int retryCount = 3;
2385 do {
2386 // Wait for 1s so that we enter the idle state
2387 std::this_thread::sleep_for(1s);
ramindani91518892023-03-03 16:55:09 +00002388 if (!checkIfCallbackRefreshRateChangedDebugEnabledReceived(displayFilter)) {
ramindani9dd8c482023-02-21 18:07:56 -08002389 // DID NOT receive a callback, we are in the idle state.
2390 break;
2391 }
2392 } while (--retryCount > 0);
2393
2394 if (retryCount == 0) {
2395 GTEST_SUCCEED() << "Unable to enter the idle mode";
2396 return;
2397 }
2398
2399 // Send the REFRESH_RATE_INDICATOR update
2400 ASSERT_NO_FATAL_FAILURE(
2401 sendBufferUpdate(createOnScreenLayer(Composition::REFRESH_RATE_INDICATOR)));
2402 std::this_thread::sleep_for(1s);
ramindani91518892023-03-03 16:55:09 +00002403 EXPECT_FALSE(checkIfCallbackRefreshRateChangedDebugEnabledReceived(displayFilter))
ramindani9dd8c482023-02-21 18:07:56 -08002404 << "A callback should not be received for REFRESH_RATE_INDICATOR";
2405
2406 EXPECT_TRUE(mComposerClient
2407 ->setRefreshRateChangedCallbackDebugEnabled(displayId,
2408 /*enabled*/ false)
2409 .isOk());
2410}
2411
2412TEST_P(GraphicsComposerAidlCommandTest,
2413 SetRefreshRateChangedCallbackDebugEnabled_SetActiveConfigWithConstraints) {
ramindani17c71102023-03-20 10:51:14 -07002414 if (getInterfaceVersion() <= 1) {
2415 GTEST_SUCCEED() << "Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG is "
2416 "not supported on older version of the service";
2417 return;
2418 }
ramindani9dd8c482023-02-21 18:07:56 -08002419 if (!hasCapability(Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG)) {
2420 GTEST_SUCCEED() << "Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG is not supported";
2421 return;
2422 }
2423
2424 VsyncPeriodChangeConstraints constraints;
2425 constraints.seamlessRequired = false;
2426 constraints.desiredTimeNanos = systemTime();
2427
2428 for (VtsDisplay& display : mDisplays) {
2429 const auto displayId = display.getDisplayId();
2430 EXPECT_TRUE(mComposerClient->setPowerMode(displayId, PowerMode::ON).isOk());
2431
2432 // Enable the callback
2433 ASSERT_TRUE(mComposerClient
2434 ->setRefreshRateChangedCallbackDebugEnabled(displayId, /*enabled*/ true)
2435 .isOk());
2436
2437 forEachTwoConfigs(displayId, [&](int32_t config1, int32_t config2) {
2438 const int32_t vsyncPeriod1 = display.getDisplayConfig(config1).vsyncPeriod;
2439 const int32_t vsyncPeriod2 = display.getDisplayConfig(config2).vsyncPeriod;
2440
2441 if (vsyncPeriod1 == vsyncPeriod2) {
2442 return; // continue
2443 }
2444
2445 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
2446 sendRefreshFrame(display, nullptr);
2447
2448 const auto& [status, timeline] =
2449 mComposerClient->setActiveConfigWithConstraints(&display, config2, constraints);
2450 EXPECT_TRUE(status.isOk());
2451
2452 if (timeline.refreshRequired) {
2453 sendRefreshFrame(display, &timeline);
2454 }
2455
ramindani91518892023-03-03 16:55:09 +00002456 const auto callbackFilter = [displayId,
2457 vsyncPeriod2](auto refreshRateChangedDebugData) {
2458 constexpr int kVsyncThreshold = 1000;
2459 return displayId == refreshRateChangedDebugData.display &&
2460 std::abs(vsyncPeriod2 - refreshRateChangedDebugData.vsyncPeriodNanos) <=
2461 kVsyncThreshold;
2462 };
ramindani9dd8c482023-02-21 18:07:56 -08002463
2464 int retryCount = 3;
2465 do {
2466 std::this_thread::sleep_for(100ms);
ramindani91518892023-03-03 16:55:09 +00002467 if (checkIfCallbackRefreshRateChangedDebugEnabledReceived(callbackFilter)) {
ramindani9dd8c482023-02-21 18:07:56 -08002468 GTEST_SUCCEED() << "Received a callback successfully";
2469 break;
2470 }
2471 } while (--retryCount > 0);
2472
2473 if (retryCount == 0) {
2474 GTEST_FAIL() << "failed to get a callback for the display " << displayId
2475 << " with config " << config2;
2476 }
2477 });
2478
2479 EXPECT_TRUE(
2480 mComposerClient
2481 ->setRefreshRateChangedCallbackDebugEnabled(displayId, /*enabled*/ false)
2482 .isOk());
2483 }
2484}
2485
Kriti Dang4efe8602022-05-03 16:55:59 +02002486/*
2487 * Test that no two display configs are exactly the same.
2488 */
2489TEST_P(GraphicsComposerAidlTest, GetDisplayConfigNoRepetitions) {
2490 for (const auto& display : mDisplays) {
2491 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
2492 for (std::vector<int>::size_type i = 0; i < configs.size(); i++) {
2493 for (std::vector<int>::size_type j = i + 1; j < configs.size(); j++) {
2494 const auto& [widthStatus1, width1] = mComposerClient->getDisplayAttribute(
2495 display.getDisplayId(), configs[i], DisplayAttribute::WIDTH);
2496 const auto& [heightStatus1, height1] = mComposerClient->getDisplayAttribute(
2497 display.getDisplayId(), configs[i], DisplayAttribute::HEIGHT);
2498 const auto& [vsyncPeriodStatus1, vsyncPeriod1] =
2499 mComposerClient->getDisplayAttribute(display.getDisplayId(), configs[i],
2500 DisplayAttribute::VSYNC_PERIOD);
2501 const auto& [groupStatus1, group1] = mComposerClient->getDisplayAttribute(
2502 display.getDisplayId(), configs[i], DisplayAttribute::CONFIG_GROUP);
2503
2504 const auto& [widthStatus2, width2] = mComposerClient->getDisplayAttribute(
2505 display.getDisplayId(), configs[j], DisplayAttribute::WIDTH);
2506 const auto& [heightStatus2, height2] = mComposerClient->getDisplayAttribute(
2507 display.getDisplayId(), configs[j], DisplayAttribute::HEIGHT);
2508 const auto& [vsyncPeriodStatus2, vsyncPeriod2] =
2509 mComposerClient->getDisplayAttribute(display.getDisplayId(), configs[j],
2510 DisplayAttribute::VSYNC_PERIOD);
2511 const auto& [groupStatus2, group2] = mComposerClient->getDisplayAttribute(
2512 display.getDisplayId(), configs[j], DisplayAttribute::CONFIG_GROUP);
2513
2514 ASSERT_FALSE(width1 == width2 && height1 == height2 &&
2515 vsyncPeriod1 == vsyncPeriod2 && group1 == group2);
2516 }
2517 }
2518 }
2519}
2520
Leon Scroggins IIIb3e336e2022-10-06 12:32:16 -04002521TEST_P(GraphicsComposerAidlCommandTest, MultiThreadedPresent) {
2522 std::vector<VtsDisplay*> displays;
2523 for (auto& display : mDisplays) {
2524 if (hasDisplayCapability(display.getDisplayId(),
2525 DisplayCapability::MULTI_THREADED_PRESENT)) {
2526 displays.push_back(&display);
2527 }
2528 }
2529 if (displays.size() <= 1u) {
2530 return;
2531 }
2532 // TODO(b/251842321): Try to present on multiple threads.
2533}
2534
Carlos Martinez Romerocd043612023-01-05 22:28:05 +00002535/**
2536 * Test Capability::SKIP_VALIDATE
2537 *
2538 * Capability::SKIP_VALIDATE has been deprecated and should not be enabled.
2539 */
2540TEST_P(GraphicsComposerAidlCommandTest, SkipValidateDeprecatedTest) {
ramindani17c71102023-03-20 10:51:14 -07002541 if (getInterfaceVersion() <= 1) {
Carlos Martinez Romerocd043612023-01-05 22:28:05 +00002542 GTEST_SUCCEED() << "HAL at version 1 or lower can contain Capability::SKIP_VALIDATE.";
2543 return;
2544 }
2545 ASSERT_FALSE(hasCapability(Capability::SKIP_VALIDATE))
2546 << "Found Capability::SKIP_VALIDATE capability.";
2547}
2548
ramindanidcfe3a82021-11-29 17:00:31 +00002549GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlCommandTest);
2550INSTANTIATE_TEST_SUITE_P(
2551 PerInstance, GraphicsComposerAidlCommandTest,
2552 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
2553 ::android::PrintInstanceNameToString);
2554
ramindanid32ae8e2021-10-01 18:48:39 +00002555GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlTest);
2556INSTANTIATE_TEST_SUITE_P(
2557 PerInstance, GraphicsComposerAidlTest,
2558 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
2559 ::android::PrintInstanceNameToString);
2560} // namespace
2561} // namespace aidl::android::hardware::graphics::composer3::vts
2562
2563int main(int argc, char** argv) {
2564 ::testing::InitGoogleTest(&argc, argv);
2565
2566 using namespace std::chrono_literals;
2567 if (!android::base::WaitForProperty("init.svc.surfaceflinger", "stopped", 10s)) {
2568 ALOGE("Failed to stop init.svc.surfaceflinger");
2569 return -1;
2570 }
ramindanibeea10e2021-12-07 21:02:49 +00002571
2572 android::ProcessState::self()->setThreadPoolMaxThreadCount(4);
2573
2574 // The binder threadpool we start will inherit sched policy and priority
2575 // of (this) creating thread. We want the binder thread pool to have
2576 // SCHED_FIFO policy and priority 1 (lowest RT priority)
2577 // Once the pool is created we reset this thread's priority back to
2578 // original.
2579 // This thread policy is based on what we do in the SurfaceFlinger while starting
2580 // the thread pool and we need to replicate that for the VTS tests.
2581 int newPriority = 0;
2582 int origPolicy = sched_getscheduler(0);
2583 struct sched_param origSchedParam;
2584
2585 int errorInPriorityModification = sched_getparam(0, &origSchedParam);
2586 if (errorInPriorityModification == 0) {
2587 int policy = SCHED_FIFO;
2588 newPriority = sched_get_priority_min(policy);
2589
2590 struct sched_param param;
2591 param.sched_priority = newPriority;
2592
2593 errorInPriorityModification = sched_setscheduler(0, policy, &param);
2594 }
2595
2596 // start the thread pool
2597 android::ProcessState::self()->startThreadPool();
2598
2599 // Reset current thread's policy and priority
2600 if (errorInPriorityModification == 0) {
2601 errorInPriorityModification = sched_setscheduler(0, origPolicy, &origSchedParam);
2602 } else {
2603 ALOGE("Failed to set VtsHalGraphicsComposer3_TargetTest binder threadpool priority to "
2604 "SCHED_FIFO");
2605 }
2606
ramindanid32ae8e2021-10-01 18:48:39 +00002607 return RUN_ALL_TESTS();
Carlos Martinez Romerocd043612023-01-05 22:28:05 +00002608}