blob: 18d36e4c14d14ccd74816579b33299c601daf411 [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();
Kriti Dang79bbec92023-05-04 17:54:26 +0200658 const auto& [status2, hdrCapabilities] =
659 mComposerClient->getHdrCapabilities(getPrimaryDisplayId());
660 const auto& hdrTypes = hdrCapabilities.types;
Kriti Dang3793ebd2022-12-05 13:03:49 +0100661 for (auto conversionCapability : conversionCapabilities) {
Kriti Dang5fcddd72023-03-07 14:55:51 +0100662 if (conversionCapability.outputType != common::Hdr::INVALID) {
Kriti Dang79bbec92023-05-04 17:54:26 +0200663 if (std::find(hdrTypes.begin(), hdrTypes.end(), conversionCapability.outputType) ==
664 hdrTypes.end()) {
665 continue;
666 }
Kriti Dang3793ebd2022-12-05 13:03:49 +0100667 common::HdrConversionStrategy hdrConversionStrategy;
668 hdrConversionStrategy.set<common::HdrConversionStrategy::Tag::forceHdrConversion>(
Kriti Dang5fcddd72023-03-07 14:55:51 +0100669 conversionCapability.outputType);
Kriti Dang37622762023-02-09 18:15:37 +0100670 const auto& [statusSet, preferredHdrOutputType] =
Kriti Dang3793ebd2022-12-05 13:03:49 +0100671 mComposerClient->setHdrConversionStrategy(hdrConversionStrategy);
Kriti Dang37622762023-02-09 18:15:37 +0100672 EXPECT_TRUE(statusSet.isOk());
673 EXPECT_EQ(common::Hdr::INVALID, preferredHdrOutputType);
Kriti Dang3793ebd2022-12-05 13:03:49 +0100674 }
675 }
676}
677
678TEST_P(GraphicsComposerAidlTest, SetHdrConversionStrategy_Auto) {
679 if (!hasCapability(Capability::HDR_OUTPUT_CONVERSION_CONFIG)) {
680 GTEST_SUCCEED() << "HDR output conversion not supported";
681 return;
682 }
683 const auto& [status, conversionCapabilities] = mComposerClient->getHdrConversionCapabilities();
Kriti Dang79bbec92023-05-04 17:54:26 +0200684 const auto& [status2, hdrCapabilities] =
685 mComposerClient->getHdrCapabilities(getPrimaryDisplayId());
686 if (hdrCapabilities.types.size() <= 0) {
687 return;
688 }
Kriti Dang3793ebd2022-12-05 13:03:49 +0100689 std::vector<aidl::android::hardware::graphics::common::Hdr> autoHdrTypes;
690 for (auto conversionCapability : conversionCapabilities) {
Kriti Dang5fcddd72023-03-07 14:55:51 +0100691 if (conversionCapability.outputType != common::Hdr::INVALID) {
692 autoHdrTypes.push_back(conversionCapability.outputType);
Kriti Dang3793ebd2022-12-05 13:03:49 +0100693 }
694 }
695 common::HdrConversionStrategy hdrConversionStrategy;
696 hdrConversionStrategy.set<common::HdrConversionStrategy::Tag::autoAllowedHdrTypes>(
697 autoHdrTypes);
Kriti Dang37622762023-02-09 18:15:37 +0100698 const auto& [statusSet, preferredHdrOutputType] =
699 mComposerClient->setHdrConversionStrategy(hdrConversionStrategy);
700 EXPECT_TRUE(statusSet.isOk());
701 EXPECT_NE(common::Hdr::INVALID, preferredHdrOutputType);
Kriti Dang3793ebd2022-12-05 13:03:49 +0100702}
703
ramindani431aad42022-02-01 21:44:29 +0000704TEST_P(GraphicsComposerAidlTest, SetAutoLowLatencyMode_BadDisplay) {
705 auto status = mComposerClient->setAutoLowLatencyMode(getInvalidDisplayId(), /*isEnabled*/ true);
706 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000707 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani431aad42022-02-01 21:44:29 +0000708
709 status = mComposerClient->setAutoLowLatencyMode(getInvalidDisplayId(), /*isEnabled*/ false);
710 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000711 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000712}
713
ramindani431aad42022-02-01 21:44:29 +0000714TEST_P(GraphicsComposerAidlTest, SetAutoLowLatencyMode) {
ramindani0291f112021-11-04 03:45:46 +0000715 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000716 const auto& [status, capabilities] =
717 mComposerClient->getDisplayCapabilities(display.getDisplayId());
718 ASSERT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000719
720 const bool allmSupport =
721 std::find(capabilities.begin(), capabilities.end(),
722 DisplayCapability::AUTO_LOW_LATENCY_MODE) != capabilities.end();
723
724 if (!allmSupport) {
ramindani431aad42022-02-01 21:44:29 +0000725 const auto& statusIsOn = mComposerClient->setAutoLowLatencyMode(display.getDisplayId(),
726 /*isEnabled*/ true);
727 EXPECT_FALSE(statusIsOn.isOk());
ramindanid5751092022-04-22 22:30:20 +0000728 EXPECT_NO_FATAL_FAILURE(
729 assertServiceSpecificError(statusIsOn, IComposerClient::EX_UNSUPPORTED));
ramindani431aad42022-02-01 21:44:29 +0000730 const auto& statusIsOff = mComposerClient->setAutoLowLatencyMode(display.getDisplayId(),
731 /*isEnabled*/ false);
732 EXPECT_FALSE(statusIsOff.isOk());
ramindanid5751092022-04-22 22:30:20 +0000733 EXPECT_NO_FATAL_FAILURE(
734 assertServiceSpecificError(statusIsOff, IComposerClient::EX_UNSUPPORTED));
ramindani0291f112021-11-04 03:45:46 +0000735 GTEST_SUCCEED() << "Auto Low Latency Mode is not supported on display "
ramindani431aad42022-02-01 21:44:29 +0000736 << std::to_string(display.getDisplayId()) << ", skipping test";
ramindani0291f112021-11-04 03:45:46 +0000737 return;
738 }
739
ramindani431aad42022-02-01 21:44:29 +0000740 EXPECT_TRUE(mComposerClient->setAutoLowLatencyMode(display.getDisplayId(), true).isOk());
741 EXPECT_TRUE(mComposerClient->setAutoLowLatencyMode(display.getDisplayId(), false).isOk());
ramindani0291f112021-11-04 03:45:46 +0000742 }
743}
744
ramindani431aad42022-02-01 21:44:29 +0000745TEST_P(GraphicsComposerAidlTest, GetSupportedContentTypes_BadDisplay) {
746 const auto& [status, _] = mComposerClient->getSupportedContentTypes(getInvalidDisplayId());
747
748 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000749 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000750}
751
ramindani431aad42022-02-01 21:44:29 +0000752TEST_P(GraphicsComposerAidlTest, GetSupportedContentTypes) {
ramindani0291f112021-11-04 03:45:46 +0000753 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000754 const auto& [status, supportedContentTypes] =
755 mComposerClient->getSupportedContentTypes(display.getDisplayId());
756 ASSERT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000757
758 const bool noneSupported =
759 std::find(supportedContentTypes.begin(), supportedContentTypes.end(),
760 ContentType::NONE) != supportedContentTypes.end();
ramindani431aad42022-02-01 21:44:29 +0000761
ramindani0291f112021-11-04 03:45:46 +0000762 EXPECT_FALSE(noneSupported);
763 }
764}
765
ramindani431aad42022-02-01 21:44:29 +0000766TEST_P(GraphicsComposerAidlTest, SetContentTypeNoneAlwaysAccepted) {
ramindani0291f112021-11-04 03:45:46 +0000767 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000768 EXPECT_TRUE(
769 mComposerClient->setContentType(display.getDisplayId(), ContentType::NONE).isOk());
ramindani0291f112021-11-04 03:45:46 +0000770 }
771}
772
ramindani431aad42022-02-01 21:44:29 +0000773TEST_P(GraphicsComposerAidlTest, SetContentType_BadDisplay) {
ramindani0291f112021-11-04 03:45:46 +0000774 constexpr ContentType types[] = {ContentType::NONE, ContentType::GRAPHICS, ContentType::PHOTO,
775 ContentType::CINEMA, ContentType::GAME};
776 for (const auto& type : types) {
ramindani431aad42022-02-01 21:44:29 +0000777 const auto& status = mComposerClient->setContentType(getInvalidDisplayId(), type);
ramindani0291f112021-11-04 03:45:46 +0000778
ramindani431aad42022-02-01 21:44:29 +0000779 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000780 EXPECT_NO_FATAL_FAILURE(
781 assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000782 }
783}
784
ramindani431aad42022-02-01 21:44:29 +0000785TEST_P(GraphicsComposerAidlTest, SetGraphicsContentType) {
ramindani0291f112021-11-04 03:45:46 +0000786 Test_setContentType(ContentType::GRAPHICS, "GRAPHICS");
787}
788
ramindani431aad42022-02-01 21:44:29 +0000789TEST_P(GraphicsComposerAidlTest, SetPhotoContentType) {
ramindani0291f112021-11-04 03:45:46 +0000790 Test_setContentType(ContentType::PHOTO, "PHOTO");
791}
792
ramindani431aad42022-02-01 21:44:29 +0000793TEST_P(GraphicsComposerAidlTest, SetCinemaContentType) {
ramindani0291f112021-11-04 03:45:46 +0000794 Test_setContentType(ContentType::CINEMA, "CINEMA");
795}
796
ramindani431aad42022-02-01 21:44:29 +0000797TEST_P(GraphicsComposerAidlTest, SetGameContentType) {
ramindani0291f112021-11-04 03:45:46 +0000798 Test_setContentType(ContentType::GAME, "GAME");
799}
800
ramindanic2b8d082021-11-06 02:03:50 +0000801TEST_P(GraphicsComposerAidlTest, CreateVirtualDisplay) {
ramindani431aad42022-02-01 21:44:29 +0000802 const auto& [status, maxVirtualDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
803 EXPECT_TRUE(status.isOk());
804
ramindanic2b8d082021-11-06 02:03:50 +0000805 if (maxVirtualDisplayCount == 0) {
806 GTEST_SUCCEED() << "no virtual display support";
807 return;
808 }
809
ramindani431aad42022-02-01 21:44:29 +0000810 const auto& [virtualDisplayStatus, virtualDisplay] = mComposerClient->createVirtualDisplay(
811 /*width*/ 64, /*height*/ 64, common::PixelFormat::IMPLEMENTATION_DEFINED,
812 kBufferSlotCount);
ramindanic2b8d082021-11-06 02:03:50 +0000813
ramindani431aad42022-02-01 21:44:29 +0000814 ASSERT_TRUE(virtualDisplayStatus.isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000815 EXPECT_TRUE(mComposerClient->destroyVirtualDisplay(virtualDisplay.display).isOk());
816}
817
ramindani431aad42022-02-01 21:44:29 +0000818TEST_P(GraphicsComposerAidlTest, DestroyVirtualDisplay_BadDisplay) {
819 const auto& [status, maxDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
820 EXPECT_TRUE(status.isOk());
821
ramindani2740bac2021-11-24 22:58:32 +0000822 if (maxDisplayCount == 0) {
823 GTEST_SUCCEED() << "no virtual display support";
824 return;
825 }
ramindani2740bac2021-11-24 22:58:32 +0000826
ramindani431aad42022-02-01 21:44:29 +0000827 const auto& destroyStatus = mComposerClient->destroyVirtualDisplay(getInvalidDisplayId());
828
829 EXPECT_FALSE(destroyStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000830 EXPECT_NO_FATAL_FAILURE(
831 assertServiceSpecificError(destroyStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000832}
833
834TEST_P(GraphicsComposerAidlTest, CreateLayer) {
ramindani431aad42022-02-01 21:44:29 +0000835 const auto& [status, layer] =
836 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
ramindani2740bac2021-11-24 22:58:32 +0000837
ramindani431aad42022-02-01 21:44:29 +0000838 EXPECT_TRUE(status.isOk());
839 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000840}
841
ramindani431aad42022-02-01 21:44:29 +0000842TEST_P(GraphicsComposerAidlTest, CreateLayer_BadDisplay) {
843 const auto& [status, _] = mComposerClient->createLayer(getInvalidDisplayId(), kBufferSlotCount);
ramindani2740bac2021-11-24 22:58:32 +0000844
ramindani431aad42022-02-01 21:44:29 +0000845 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000846 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000847}
848
ramindani431aad42022-02-01 21:44:29 +0000849TEST_P(GraphicsComposerAidlTest, DestroyLayer_BadDisplay) {
850 const auto& [status, layer] =
851 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
852 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000853
ramindani431aad42022-02-01 21:44:29 +0000854 const auto& destroyStatus = mComposerClient->destroyLayer(getInvalidDisplayId(), layer);
ramindani2740bac2021-11-24 22:58:32 +0000855
ramindani431aad42022-02-01 21:44:29 +0000856 EXPECT_FALSE(destroyStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000857 EXPECT_NO_FATAL_FAILURE(
858 assertServiceSpecificError(destroyStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani431aad42022-02-01 21:44:29 +0000859 ASSERT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000860}
861
ramindani431aad42022-02-01 21:44:29 +0000862TEST_P(GraphicsComposerAidlTest, DestroyLayer_BadLayerError) {
ramindani2740bac2021-11-24 22:58:32 +0000863 // We haven't created any layers yet, so any id should be invalid
ramindani431aad42022-02-01 21:44:29 +0000864 const auto& status = mComposerClient->destroyLayer(getPrimaryDisplayId(), /*layer*/ 1);
ramindani2740bac2021-11-24 22:58:32 +0000865
ramindani431aad42022-02-01 21:44:29 +0000866 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000867 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_LAYER));
ramindani2740bac2021-11-24 22:58:32 +0000868}
869
ramindani431aad42022-02-01 21:44:29 +0000870TEST_P(GraphicsComposerAidlTest, GetActiveConfig_BadDisplay) {
871 const auto& [status, _] = mComposerClient->getActiveConfig(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, GetDisplayConfig) {
ramindani431aad42022-02-01 21:44:29 +0000878 const auto& [status, _] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
879 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000880}
881
ramindani431aad42022-02-01 21:44:29 +0000882TEST_P(GraphicsComposerAidlTest, GetDisplayConfig_BadDisplay) {
883 const auto& [status, _] = mComposerClient->getDisplayConfigs(getInvalidDisplayId());
ramindani2740bac2021-11-24 22:58:32 +0000884
ramindani431aad42022-02-01 21:44:29 +0000885 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000886 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000887}
888
889TEST_P(GraphicsComposerAidlTest, GetDisplayName) {
ramindani431aad42022-02-01 21:44:29 +0000890 const auto& [status, _] = mComposerClient->getDisplayName(getPrimaryDisplayId());
891 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000892}
893
Sally Qi8ec063f2022-11-12 11:18:56 -0800894TEST_P(GraphicsComposerAidlTest, GetOverlaySupport) {
ramindani17c71102023-03-20 10:51:14 -0700895 if (getInterfaceVersion() <= 1) {
Dorin Drimus08212492023-02-23 17:06:58 +0000896 GTEST_SUCCEED() << "Device does not support the new API for overlay support";
897 return;
898 }
899
Sally Qic2c392f2023-01-13 14:50:20 -0800900 const auto& [status, properties] = mComposerClient->getOverlaySupport();
Sally Qi2600d342022-08-16 12:46:17 -0700901 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
902 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
903 GTEST_SUCCEED() << "getOverlaySupport is not supported";
904 return;
905 }
906
907 ASSERT_TRUE(status.isOk());
Sally Qic2c392f2023-01-13 14:50:20 -0800908 for (const auto& i : properties.combinations) {
909 for (const auto standard : i.standards) {
910 const auto val = static_cast<int32_t>(standard) &
911 static_cast<int32_t>(common::Dataspace::STANDARD_MASK);
912 ASSERT_TRUE(val == static_cast<int32_t>(standard));
913 }
914 for (const auto transfer : i.transfers) {
915 const auto val = static_cast<int32_t>(transfer) &
916 static_cast<int32_t>(common::Dataspace::TRANSFER_MASK);
917 ASSERT_TRUE(val == static_cast<int32_t>(transfer));
918 }
919 for (const auto range : i.ranges) {
920 const auto val = static_cast<int32_t>(range) &
921 static_cast<int32_t>(common::Dataspace::RANGE_MASK);
922 ASSERT_TRUE(val == static_cast<int32_t>(range));
923 }
924 }
Sally Qi2600d342022-08-16 12:46:17 -0700925}
926
ramindani431aad42022-02-01 21:44:29 +0000927TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation_BadDisplay) {
928 const auto& [status, _] = mComposerClient->getDisplayPhysicalOrientation(getInvalidDisplayId());
Ady Abrahamae12e382022-01-13 18:06:21 -0800929
ramindani431aad42022-02-01 21:44:29 +0000930 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000931 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Ady Abrahamae12e382022-01-13 18:06:21 -0800932}
933
934TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation) {
935 const auto allowedDisplayOrientations = std::array<Transform, 4>{
936 Transform::NONE,
937 Transform::ROT_90,
938 Transform::ROT_180,
939 Transform::ROT_270,
940 };
941
ramindani431aad42022-02-01 21:44:29 +0000942 const auto& [status, displayOrientation] =
943 mComposerClient->getDisplayPhysicalOrientation(getPrimaryDisplayId());
Ady Abrahamae12e382022-01-13 18:06:21 -0800944
ramindani431aad42022-02-01 21:44:29 +0000945 EXPECT_TRUE(status.isOk());
Ady Abrahamae12e382022-01-13 18:06:21 -0800946 EXPECT_NE(std::find(allowedDisplayOrientations.begin(), allowedDisplayOrientations.end(),
947 displayOrientation),
948 allowedDisplayOrientations.end());
949}
950
ramindani2740bac2021-11-24 22:58:32 +0000951TEST_P(GraphicsComposerAidlTest, SetClientTargetSlotCount) {
ramindani431aad42022-02-01 21:44:29 +0000952 EXPECT_TRUE(mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kBufferSlotCount)
953 .isOk());
ramindani2740bac2021-11-24 22:58:32 +0000954}
955
956TEST_P(GraphicsComposerAidlTest, SetActiveConfig) {
ramindani431aad42022-02-01 21:44:29 +0000957 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
958 EXPECT_TRUE(status.isOk());
959
960 for (const auto& config : configs) {
961 auto display = getEditablePrimaryDisplay();
962 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
963 const auto& [configStatus, config1] =
964 mComposerClient->getActiveConfig(getPrimaryDisplayId());
965 EXPECT_TRUE(configStatus.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000966 EXPECT_EQ(config, config1);
967 }
968}
969
970TEST_P(GraphicsComposerAidlTest, SetActiveConfigPowerCycle) {
ramindani431aad42022-02-01 21:44:29 +0000971 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
972 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000973
ramindani431aad42022-02-01 21:44:29 +0000974 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
975 EXPECT_TRUE(status.isOk());
976
977 for (const auto& config : configs) {
978 auto display = getEditablePrimaryDisplay();
979 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
980 const auto& [config1Status, config1] =
981 mComposerClient->getActiveConfig(getPrimaryDisplayId());
982 EXPECT_TRUE(config1Status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000983 EXPECT_EQ(config, config1);
984
ramindani431aad42022-02-01 21:44:29 +0000985 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
986 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
987 const auto& [config2Status, config2] =
988 mComposerClient->getActiveConfig(getPrimaryDisplayId());
989 EXPECT_TRUE(config2Status.isOk());
990 EXPECT_EQ(config, config2);
ramindani2740bac2021-11-24 22:58:32 +0000991 }
992}
993
ramindani2740bac2021-11-24 22:58:32 +0000994TEST_P(GraphicsComposerAidlTest, SetPowerModeUnsupported) {
ramindani431aad42022-02-01 21:44:29 +0000995 const auto& [status, capabilities] =
996 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
997 ASSERT_TRUE(status.isOk());
998
Ady Abraham6679baf2021-12-08 18:28:27 -0800999 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
1000 DisplayCapability::DOZE) != capabilities.end();
1001 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
1002 DisplayCapability::SUSPEND) != capabilities.end();
ramindani2740bac2021-11-24 22:58:32 +00001003
ramindani431aad42022-02-01 21:44:29 +00001004 if (!isDozeSupported) {
1005 const auto& powerModeDozeStatus =
1006 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE);
1007 EXPECT_FALSE(powerModeDozeStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +00001008 EXPECT_NO_FATAL_FAILURE(
1009 assertServiceSpecificError(powerModeDozeStatus, IComposerClient::EX_UNSUPPORTED));
ramindani431aad42022-02-01 21:44:29 +00001010
1011 const auto& powerModeDozeSuspendStatus =
1012 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
1013 EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +00001014 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeDozeSuspendStatus,
1015 IComposerClient::EX_UNSUPPORTED));
ramindani2740bac2021-11-24 22:58:32 +00001016 }
Ady Abraham6679baf2021-12-08 18:28:27 -08001017
1018 if (!isSuspendSupported) {
ramindani431aad42022-02-01 21:44:29 +00001019 const auto& powerModeSuspendStatus =
1020 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON_SUSPEND);
1021 EXPECT_FALSE(powerModeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +00001022 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeSuspendStatus,
1023 IComposerClient::EX_UNSUPPORTED));
Ady Abraham6679baf2021-12-08 18:28:27 -08001024
ramindani431aad42022-02-01 21:44:29 +00001025 const auto& powerModeDozeSuspendStatus =
1026 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
1027 EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +00001028 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeDozeSuspendStatus,
1029 IComposerClient::EX_UNSUPPORTED));
Ady Abraham6679baf2021-12-08 18:28:27 -08001030 }
ramindani2740bac2021-11-24 22:58:32 +00001031}
1032
1033TEST_P(GraphicsComposerAidlTest, SetVsyncEnabled) {
ramindani431aad42022-02-01 21:44:29 +00001034 mComposerClient->setVsyncAllowed(true);
ramindani2740bac2021-11-24 22:58:32 +00001035
ramindani431aad42022-02-01 21:44:29 +00001036 EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), true).isOk());
ramindani2740bac2021-11-24 22:58:32 +00001037 usleep(60 * 1000);
ramindani431aad42022-02-01 21:44:29 +00001038 EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), false).isOk());
ramindani2740bac2021-11-24 22:58:32 +00001039
ramindani431aad42022-02-01 21:44:29 +00001040 mComposerClient->setVsyncAllowed(false);
ramindani2740bac2021-11-24 22:58:32 +00001041}
1042
ramindanic2b8d082021-11-06 02:03:50 +00001043TEST_P(GraphicsComposerAidlTest, SetPowerMode) {
ramindani431aad42022-02-01 21:44:29 +00001044 const auto& [status, capabilities] =
1045 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
1046 ASSERT_TRUE(status.isOk());
1047
Ady Abraham6679baf2021-12-08 18:28:27 -08001048 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
1049 DisplayCapability::DOZE) != capabilities.end();
1050 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
1051 DisplayCapability::SUSPEND) != capabilities.end();
1052
ramindanic2b8d082021-11-06 02:03:50 +00001053 std::vector<PowerMode> modes;
1054 modes.push_back(PowerMode::OFF);
ramindanic2b8d082021-11-06 02:03:50 +00001055 modes.push_back(PowerMode::ON);
1056
Ady Abraham6679baf2021-12-08 18:28:27 -08001057 if (isSuspendSupported) {
1058 modes.push_back(PowerMode::ON_SUSPEND);
1059 }
1060
ramindani770d7082021-11-30 00:36:42 +00001061 if (isDozeSupported) {
1062 modes.push_back(PowerMode::DOZE);
Ady Abraham6679baf2021-12-08 18:28:27 -08001063 }
1064
1065 if (isSuspendSupported && isDozeSupported) {
ramindani770d7082021-11-30 00:36:42 +00001066 modes.push_back(PowerMode::DOZE_SUSPEND);
1067 }
1068
ramindanic2b8d082021-11-06 02:03:50 +00001069 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001070 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001071 }
1072}
1073
1074TEST_P(GraphicsComposerAidlTest, SetPowerModeVariations) {
ramindani431aad42022-02-01 21:44:29 +00001075 const auto& [status, capabilities] =
1076 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
1077 ASSERT_TRUE(status.isOk());
1078
Ady Abraham6679baf2021-12-08 18:28:27 -08001079 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
1080 DisplayCapability::DOZE) != capabilities.end();
1081 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
1082 DisplayCapability::SUSPEND) != capabilities.end();
1083
ramindanic2b8d082021-11-06 02:03:50 +00001084 std::vector<PowerMode> modes;
1085
1086 modes.push_back(PowerMode::OFF);
ramindani770d7082021-11-30 00:36:42 +00001087 modes.push_back(PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +00001088 modes.push_back(PowerMode::OFF);
ramindanic2b8d082021-11-06 02:03:50 +00001089 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001090 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001091 }
ramindani770d7082021-11-30 00:36:42 +00001092 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +00001093
ramindani770d7082021-11-30 00:36:42 +00001094 modes.push_back(PowerMode::OFF);
1095 modes.push_back(PowerMode::OFF);
1096 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001097 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindani770d7082021-11-30 00:36:42 +00001098 }
ramindanic2b8d082021-11-06 02:03:50 +00001099 modes.clear();
1100
1101 modes.push_back(PowerMode::ON);
1102 modes.push_back(PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +00001103 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001104 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001105 }
ramindanic2b8d082021-11-06 02:03:50 +00001106 modes.clear();
1107
Ady Abraham6679baf2021-12-08 18:28:27 -08001108 if (isSuspendSupported) {
1109 modes.push_back(PowerMode::ON_SUSPEND);
1110 modes.push_back(PowerMode::ON_SUSPEND);
1111 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001112 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
Ady Abraham6679baf2021-12-08 18:28:27 -08001113 }
1114 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +00001115 }
1116
ramindanic2b8d082021-11-06 02:03:50 +00001117 if (isDozeSupported) {
ramindanic2b8d082021-11-06 02:03:50 +00001118 modes.push_back(PowerMode::DOZE);
1119 modes.push_back(PowerMode::DOZE);
ramindanic2b8d082021-11-06 02:03:50 +00001120 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001121 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001122 }
ramindanic2b8d082021-11-06 02:03:50 +00001123 modes.clear();
Ady Abraham6679baf2021-12-08 18:28:27 -08001124 }
ramindanic2b8d082021-11-06 02:03:50 +00001125
Ady Abraham6679baf2021-12-08 18:28:27 -08001126 if (isSuspendSupported && isDozeSupported) {
ramindanic2b8d082021-11-06 02:03:50 +00001127 modes.push_back(PowerMode::DOZE_SUSPEND);
1128 modes.push_back(PowerMode::DOZE_SUSPEND);
ramindanic2b8d082021-11-06 02:03:50 +00001129 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001130 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001131 }
Ady Abraham6679baf2021-12-08 18:28:27 -08001132 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +00001133 }
1134}
1135
ramindani431aad42022-02-01 21:44:29 +00001136TEST_P(GraphicsComposerAidlTest, SetPowerMode_BadDisplay) {
1137 const auto& status = mComposerClient->setPowerMode(getInvalidDisplayId(), PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +00001138
ramindani431aad42022-02-01 21:44:29 +00001139 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001140 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindanic2b8d082021-11-06 02:03:50 +00001141}
1142
ramindani431aad42022-02-01 21:44:29 +00001143TEST_P(GraphicsComposerAidlTest, SetPowerMode_BadParameter) {
1144 const auto& status =
1145 mComposerClient->setPowerMode(getPrimaryDisplayId(), static_cast<PowerMode>(-1));
ramindanic2b8d082021-11-06 02:03:50 +00001146
ramindani431aad42022-02-01 21:44:29 +00001147 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001148 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanic2b8d082021-11-06 02:03:50 +00001149}
1150
ramindanic2b8d082021-11-06 02:03:50 +00001151TEST_P(GraphicsComposerAidlTest, GetDataspaceSaturationMatrix) {
ramindani431aad42022-02-01 21:44:29 +00001152 const auto& [status, matrix] =
1153 mComposerClient->getDataspaceSaturationMatrix(common::Dataspace::SRGB_LINEAR);
1154 ASSERT_TRUE(status.isOk());
1155 ASSERT_EQ(16, matrix.size()); // matrix should not be empty if call succeeded.
ramindanideb059e2021-11-18 01:57:25 +00001156
ramindanic2b8d082021-11-06 02:03:50 +00001157 // the last row is known
ramindani431aad42022-02-01 21:44:29 +00001158 EXPECT_EQ(0.0f, matrix[12]);
1159 EXPECT_EQ(0.0f, matrix[13]);
1160 EXPECT_EQ(0.0f, matrix[14]);
1161 EXPECT_EQ(1.0f, matrix[15]);
ramindanic2b8d082021-11-06 02:03:50 +00001162}
1163
ramindani431aad42022-02-01 21:44:29 +00001164TEST_P(GraphicsComposerAidlTest, GetDataspaceSaturationMatrix_BadParameter) {
1165 const auto& [status, matrix] =
1166 mComposerClient->getDataspaceSaturationMatrix(common::Dataspace::UNKNOWN);
ramindanic2b8d082021-11-06 02:03:50 +00001167
ramindani431aad42022-02-01 21:44:29 +00001168 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001169 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanic2b8d082021-11-06 02:03:50 +00001170}
1171
ramindanidcfe3a82021-11-29 17:00:31 +00001172// Tests for Command.
1173class GraphicsComposerAidlCommandTest : public GraphicsComposerAidlTest {
1174 protected:
ramindanidcfe3a82021-11-29 17:00:31 +00001175 void TearDown() override {
Ady Abraham3192f3d2021-12-03 16:08:56 -08001176 const auto errors = mReader.takeErrors();
1177 ASSERT_TRUE(mReader.takeErrors().empty());
ramindani431aad42022-02-01 21:44:29 +00001178 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001179
ramindanidcfe3a82021-11-29 17:00:31 +00001180 ASSERT_NO_FATAL_FAILURE(GraphicsComposerAidlTest::TearDown());
1181 }
1182
1183 void execute() {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001184 std::vector<CommandResultPayload> payloads;
1185 for (auto& [_, writer] : mWriters) {
Huihong Luo651806f2023-04-21 18:48:48 +00001186 auto commands = writer.takePendingCommands();
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001187 if (commands.empty()) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001188 continue;
1189 }
1190
1191 auto [status, results] = mComposerClient->executeCommands(commands);
1192 ASSERT_TRUE(status.isOk()) << "executeCommands failed " << status.getDescription();
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001193
1194 payloads.reserve(payloads.size() + results.size());
1195 payloads.insert(payloads.end(), std::make_move_iterator(results.begin()),
1196 std::make_move_iterator(results.end()));
ramindanidcfe3a82021-11-29 17:00:31 +00001197 }
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001198 mReader.parse(std::move(payloads));
ramindanidcfe3a82021-11-29 17:00:31 +00001199 }
1200
1201 static inline auto toTimePoint(nsecs_t time) {
1202 return std::chrono::time_point<std::chrono::steady_clock>(std::chrono::nanoseconds(time));
1203 }
1204
ramindanidcfe3a82021-11-29 17:00:31 +00001205 void forEachTwoConfigs(int64_t display, std::function<void(int32_t, int32_t)> func) {
ramindani431aad42022-02-01 21:44:29 +00001206 const auto& [status, displayConfigs] = mComposerClient->getDisplayConfigs(display);
1207 ASSERT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001208 for (const int32_t config1 : displayConfigs) {
1209 for (const int32_t config2 : displayConfigs) {
1210 if (config1 != config2) {
1211 func(config1, config2);
1212 }
1213 }
1214 }
1215 }
1216
1217 void waitForVsyncPeriodChange(int64_t display, const VsyncPeriodChangeTimeline& timeline,
1218 int64_t desiredTimeNanos, int64_t oldPeriodNanos,
1219 int64_t newPeriodNanos) {
1220 const auto kChangeDeadline = toTimePoint(timeline.newVsyncAppliedTimeNanos) + 100ms;
1221 while (std::chrono::steady_clock::now() <= kChangeDeadline) {
ramindani431aad42022-02-01 21:44:29 +00001222 const auto& [status, vsyncPeriodNanos] =
1223 mComposerClient->getDisplayVsyncPeriod(display);
1224 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001225 if (systemTime() <= desiredTimeNanos) {
1226 EXPECT_EQ(vsyncPeriodNanos, oldPeriodNanos);
1227 } else if (vsyncPeriodNanos == newPeriodNanos) {
1228 break;
1229 }
1230 std::this_thread::sleep_for(std::chrono::nanoseconds(oldPeriodNanos));
1231 }
1232 }
1233
ramindani9dd8c482023-02-21 18:07:56 -08001234 bool checkIfCallbackRefreshRateChangedDebugEnabledReceived(
1235 std::function<bool(RefreshRateChangedDebugData)> filter) {
1236 const auto list = mComposerClient->takeListOfRefreshRateChangedDebugData();
1237 return std::any_of(list.begin(), list.end(), [&](auto refreshRateChangedDebugData) {
1238 return filter(refreshRateChangedDebugData);
1239 });
1240 }
1241
Brian Lindahl25e0d092022-12-09 00:32:11 -07001242 sp<GraphicBuffer> allocate(uint32_t width, uint32_t height,
1243 ::android::PixelFormat pixelFormat) {
Brian Lindahl14bd07b2023-01-17 14:54:39 -07001244 return sp<GraphicBuffer>::make(
Brian Lindahl25e0d092022-12-09 00:32:11 -07001245 width, height, pixelFormat, /*layerCount*/ 1U,
1246 static_cast<uint64_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
1247 static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
1248 static_cast<uint64_t>(common::BufferUsage::COMPOSER_OVERLAY),
Brian Lindahl14bd07b2023-01-17 14:54:39 -07001249 "VtsHalGraphicsComposer3_TargetTest");
Brian Lindahlca3eef22022-12-09 00:32:11 -07001250 }
1251
Brian Lindahl25e0d092022-12-09 00:32:11 -07001252 sp<GraphicBuffer> allocate(::android::PixelFormat pixelFormat) {
1253 return allocate(static_cast<uint32_t>(getPrimaryDisplay().getDisplayWidth()),
1254 static_cast<uint32_t>(getPrimaryDisplay().getDisplayHeight()), pixelFormat);
1255 }
1256
ramindanidcfe3a82021-11-29 17:00:31 +00001257 void sendRefreshFrame(const VtsDisplay& display, const VsyncPeriodChangeTimeline* timeline) {
1258 if (timeline != nullptr) {
1259 // Refresh time should be before newVsyncAppliedTimeNanos
1260 EXPECT_LT(timeline->refreshTimeNanos, timeline->newVsyncAppliedTimeNanos);
1261
1262 std::this_thread::sleep_until(toTimePoint(timeline->refreshTimeNanos));
1263 }
1264
ramindani431aad42022-02-01 21:44:29 +00001265 EXPECT_TRUE(mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::ON).isOk());
1266 EXPECT_TRUE(mComposerClient
1267 ->setColorMode(display.getDisplayId(), ColorMode::NATIVE,
1268 RenderIntent::COLORIMETRIC)
1269 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001270
ramindani431aad42022-02-01 21:44:29 +00001271 const auto& [status, layer] =
1272 mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount);
1273 EXPECT_TRUE(status.isOk());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001274 auto& writer = getWriter(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001275 {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001276 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindanidcfe3a82021-11-29 17:00:31 +00001277 ASSERT_NE(nullptr, buffer);
1278 ASSERT_EQ(::android::OK, buffer->initCheck());
1279 ASSERT_NE(nullptr, buffer->handle);
1280
ramindani431aad42022-02-01 21:44:29 +00001281 configureLayer(display, layer, Composition::DEVICE, display.getFrameRect(),
1282 display.getCrop());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001283 writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer->handle,
1284 /*acquireFence*/ -1);
1285 writer.setLayerDataspace(display.getDisplayId(), layer, common::Dataspace::UNKNOWN);
ramindanidcfe3a82021-11-29 17:00:31 +00001286
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001287 writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001288 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001289 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001290
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001291 writer.presentDisplay(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001292 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001293 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001294 }
1295
1296 {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001297 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindanidcfe3a82021-11-29 17:00:31 +00001298 ASSERT_NE(nullptr, buffer->handle);
1299
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001300 writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer->handle,
1301 /*acquireFence*/ -1);
1302 writer.setLayerSurfaceDamage(display.getDisplayId(), layer,
1303 std::vector<Rect>(1, {0, 0, 10, 10}));
1304 writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001305 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001306 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001307
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001308 writer.presentDisplay(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001309 execute();
1310 }
1311
ramindani431aad42022-02-01 21:44:29 +00001312 EXPECT_TRUE(mComposerClient->destroyLayer(display.getDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001313 }
1314
Ady Abraham72c5b502021-12-10 17:23:39 -08001315 sp<::android::Fence> presentAndGetFence(
1316 std::optional<ClockMonotonicTimestamp> expectedPresentTime) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001317 auto& writer = getWriter(getPrimaryDisplayId());
1318 writer.validateDisplay(getPrimaryDisplayId(), expectedPresentTime);
Ady Abraham72c5b502021-12-10 17:23:39 -08001319 execute();
1320 EXPECT_TRUE(mReader.takeErrors().empty());
1321
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001322 writer.presentDisplay(getPrimaryDisplayId());
Ady Abraham72c5b502021-12-10 17:23:39 -08001323 execute();
1324 EXPECT_TRUE(mReader.takeErrors().empty());
1325
ramindani431aad42022-02-01 21:44:29 +00001326 auto presentFence = mReader.takePresentFence(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -08001327 // take ownership
1328 const int fenceOwner = presentFence.get();
1329 *presentFence.getR() = -1;
1330 EXPECT_NE(-1, fenceOwner);
1331 return sp<::android::Fence>::make(fenceOwner);
Ady Abraham72c5b502021-12-10 17:23:39 -08001332 }
1333
1334 int32_t getVsyncPeriod() {
ramindani431aad42022-02-01 21:44:29 +00001335 const auto& [status, activeConfig] =
1336 mComposerClient->getActiveConfig(getPrimaryDisplayId());
1337 EXPECT_TRUE(status.isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001338
ramindani431aad42022-02-01 21:44:29 +00001339 const auto& [vsyncPeriodStatus, vsyncPeriod] = mComposerClient->getDisplayAttribute(
1340 getPrimaryDisplayId(), activeConfig, DisplayAttribute::VSYNC_PERIOD);
1341 EXPECT_TRUE(vsyncPeriodStatus.isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001342 return vsyncPeriod;
1343 }
1344
ramindani9dd8c482023-02-21 18:07:56 -08001345 int64_t createOnScreenLayer(Composition composition = Composition::DEVICE) {
ramindani431aad42022-02-01 21:44:29 +00001346 const auto& [status, layer] =
1347 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1348 EXPECT_TRUE(status.isOk());
1349 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1350 getPrimaryDisplay().getDisplayHeight()};
1351 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1352 (float)getPrimaryDisplay().getDisplayHeight()};
ramindani9dd8c482023-02-21 18:07:56 -08001353 configureLayer(getPrimaryDisplay(), layer, composition, displayFrame, cropRect);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001354 auto& writer = getWriter(getPrimaryDisplayId());
1355 writer.setLayerDataspace(getPrimaryDisplayId(), layer, common::Dataspace::UNKNOWN);
Ady Abraham72c5b502021-12-10 17:23:39 -08001356 return layer;
1357 }
1358
ramindani9dd8c482023-02-21 18:07:56 -08001359 void sendBufferUpdate(int64_t layer) {
1360 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1361 ASSERT_NE(nullptr, buffer->handle);
1362
1363 auto& writer = getWriter(getPrimaryDisplayId());
1364 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer->handle,
1365 /*acquireFence*/ -1);
1366
1367 const sp<::android::Fence> presentFence =
1368 presentAndGetFence(ComposerClientWriter::kNoTimestamp);
1369 presentFence->waitForever(LOG_TAG);
1370 }
1371
Midas Chiena0b56bd2022-01-13 23:27:33 +08001372 bool hasDisplayCapability(int64_t display, DisplayCapability cap) {
ramindani431aad42022-02-01 21:44:29 +00001373 const auto& [status, capabilities] = mComposerClient->getDisplayCapabilities(display);
1374 EXPECT_TRUE(status.isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08001375
1376 return std::find(capabilities.begin(), capabilities.end(), cap) != capabilities.end();
1377 }
1378
ramindanidcfe3a82021-11-29 17:00:31 +00001379 void Test_setActiveConfigWithConstraints(const TestParameters& params) {
1380 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00001381 forEachTwoConfigs(display.getDisplayId(), [&](int32_t config1, int32_t config2) {
1382 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001383 sendRefreshFrame(display, nullptr);
1384
ramindani431aad42022-02-01 21:44:29 +00001385 const auto displayConfigGroup1 = display.getDisplayConfig(config1);
1386 int32_t vsyncPeriod1 = displayConfigGroup1.vsyncPeriod;
1387 int32_t configGroup1 = displayConfigGroup1.configGroup;
1388
1389 const auto displayConfigGroup2 = display.getDisplayConfig(config2);
1390 int32_t vsyncPeriod2 = displayConfigGroup2.vsyncPeriod;
1391 int32_t configGroup2 = displayConfigGroup2.configGroup;
ramindanidcfe3a82021-11-29 17:00:31 +00001392
1393 if (vsyncPeriod1 == vsyncPeriod2) {
1394 return; // continue
1395 }
1396
1397 // We don't allow delayed change when changing config groups
1398 if (params.delayForChange > 0 && configGroup1 != configGroup2) {
1399 return; // continue
1400 }
1401
ramindanidcfe3a82021-11-29 17:00:31 +00001402 VsyncPeriodChangeConstraints constraints = {
1403 .desiredTimeNanos = systemTime() + params.delayForChange,
1404 .seamlessRequired = false};
ramindani431aad42022-02-01 21:44:29 +00001405 const auto& [status, timeline] = mComposerClient->setActiveConfigWithConstraints(
1406 &display, config2, constraints);
1407 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001408
1409 EXPECT_TRUE(timeline.newVsyncAppliedTimeNanos >= constraints.desiredTimeNanos);
1410 // Refresh rate should change within a reasonable time
1411 constexpr std::chrono::nanoseconds kReasonableTimeForChange = 1s; // 1 second
1412 EXPECT_TRUE(timeline.newVsyncAppliedTimeNanos - constraints.desiredTimeNanos <=
1413 kReasonableTimeForChange.count());
1414
1415 if (timeline.refreshRequired) {
1416 if (params.refreshMiss) {
1417 // Miss the refresh frame on purpose to make sure the implementation sends a
1418 // callback
1419 std::this_thread::sleep_until(toTimePoint(timeline.refreshTimeNanos) +
1420 100ms);
1421 }
1422 sendRefreshFrame(display, &timeline);
1423 }
ramindani431aad42022-02-01 21:44:29 +00001424 waitForVsyncPeriodChange(display.getDisplayId(), timeline,
1425 constraints.desiredTimeNanos, vsyncPeriod1, vsyncPeriod2);
ramindanidcfe3a82021-11-29 17:00:31 +00001426
1427 // At this point the refresh rate should have changed already, however in rare
1428 // cases the implementation might have missed the deadline. In this case a new
1429 // timeline should have been provided.
ramindani431aad42022-02-01 21:44:29 +00001430 auto newTimeline = mComposerClient->takeLastVsyncPeriodChangeTimeline();
ramindanidcfe3a82021-11-29 17:00:31 +00001431 if (timeline.refreshRequired && params.refreshMiss) {
1432 EXPECT_TRUE(newTimeline.has_value());
1433 }
1434
1435 if (newTimeline.has_value()) {
1436 if (newTimeline->refreshRequired) {
1437 sendRefreshFrame(display, &newTimeline.value());
1438 }
ramindani431aad42022-02-01 21:44:29 +00001439 waitForVsyncPeriodChange(display.getDisplayId(), newTimeline.value(),
ramindanidcfe3a82021-11-29 17:00:31 +00001440 constraints.desiredTimeNanos, vsyncPeriod1,
1441 vsyncPeriod2);
1442 }
1443
ramindani431aad42022-02-01 21:44:29 +00001444 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanos] =
1445 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
1446 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001447 EXPECT_EQ(vsyncPeriodNanos, vsyncPeriod2);
1448 });
1449 }
1450 }
1451
Ady Abraham72c5b502021-12-10 17:23:39 -08001452 void Test_expectedPresentTime(std::optional<int> framesDelay) {
Jason Macnak325e8232022-01-24 14:48:55 -08001453 if (hasCapability(Capability::PRESENT_FENCE_IS_NOT_RELIABLE)) {
1454 GTEST_SUCCEED() << "Device has unreliable present fences capability, skipping";
1455 return;
1456 }
1457
ramindani431aad42022-02-01 21:44:29 +00001458 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001459
1460 const auto vsyncPeriod = getVsyncPeriod();
1461
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001462 const auto buffer1 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1463 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
Ady Abraham72c5b502021-12-10 17:23:39 -08001464 ASSERT_NE(nullptr, buffer1);
1465 ASSERT_NE(nullptr, buffer2);
1466
1467 const auto layer = createOnScreenLayer();
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001468 auto& writer = getWriter(getPrimaryDisplayId());
1469 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer1->handle,
1470 /*acquireFence*/ -1);
Ady Abraham72c5b502021-12-10 17:23:39 -08001471 const sp<::android::Fence> presentFence1 =
1472 presentAndGetFence(ComposerClientWriter::kNoTimestamp);
1473 presentFence1->waitForever(LOG_TAG);
1474
1475 auto expectedPresentTime = presentFence1->getSignalTime() + vsyncPeriod;
1476 if (framesDelay.has_value()) {
1477 expectedPresentTime += *framesDelay * vsyncPeriod;
1478 }
1479
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001480 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer2->handle,
1481 /*acquireFence*/ -1);
Ady Abraham72c5b502021-12-10 17:23:39 -08001482 const auto setExpectedPresentTime = [&]() -> std::optional<ClockMonotonicTimestamp> {
1483 if (!framesDelay.has_value()) {
1484 return ComposerClientWriter::kNoTimestamp;
1485 } else if (*framesDelay == 0) {
1486 return ClockMonotonicTimestamp{0};
1487 }
1488 return ClockMonotonicTimestamp{expectedPresentTime};
1489 }();
1490
1491 const sp<::android::Fence> presentFence2 = presentAndGetFence(setExpectedPresentTime);
1492 presentFence2->waitForever(LOG_TAG);
1493
1494 const auto actualPresentTime = presentFence2->getSignalTime();
Ady Abrahamdf084f32022-01-10 14:10:23 -08001495 EXPECT_GE(actualPresentTime, expectedPresentTime - vsyncPeriod / 2);
Ady Abraham72c5b502021-12-10 17:23:39 -08001496
ramindani431aad42022-02-01 21:44:29 +00001497 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001498 }
1499
ramindani431aad42022-02-01 21:44:29 +00001500 void configureLayer(const VtsDisplay& display, int64_t layer, Composition composition,
1501 const Rect& displayFrame, const FRect& cropRect) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001502 auto& writer = getWriter(display.getDisplayId());
1503 writer.setLayerCompositionType(display.getDisplayId(), layer, composition);
1504 writer.setLayerDisplayFrame(display.getDisplayId(), layer, displayFrame);
1505 writer.setLayerPlaneAlpha(display.getDisplayId(), layer, /*alpha*/ 1);
1506 writer.setLayerSourceCrop(display.getDisplayId(), layer, cropRect);
1507 writer.setLayerTransform(display.getDisplayId(), layer, static_cast<Transform>(0));
1508 writer.setLayerVisibleRegion(display.getDisplayId(), layer,
1509 std::vector<Rect>(1, displayFrame));
1510 writer.setLayerZOrder(display.getDisplayId(), layer, /*z*/ 10);
1511 writer.setLayerBlendMode(display.getDisplayId(), layer, BlendMode::NONE);
1512 writer.setLayerSurfaceDamage(display.getDisplayId(), layer,
1513 std::vector<Rect>(1, displayFrame));
ramindani431aad42022-02-01 21:44:29 +00001514 }
ramindanidcfe3a82021-11-29 17:00:31 +00001515 // clang-format off
1516 const std::array<float, 16> kIdentity = {{
1517 1.0f, 0.0f, 0.0f, 0.0f,
1518 0.0f, 1.0f, 0.0f, 0.0f,
1519 0.0f, 0.0f, 1.0f, 0.0f,
1520 0.0f, 0.0f, 0.0f, 1.0f,
1521 }};
1522 // clang-format on
1523
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001524 ComposerClientWriter& getWriter(int64_t display) {
1525 auto [it, _] = mWriters.try_emplace(display, display);
1526 return it->second;
1527 }
1528
Ady Abraham91c9d1a2021-12-15 18:14:45 -08001529 ComposerClientReader mReader;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001530
1531 private:
1532 std::unordered_map<int64_t, ComposerClientWriter> mWriters;
ramindanidcfe3a82021-11-29 17:00:31 +00001533};
1534
ramindani431aad42022-02-01 21:44:29 +00001535TEST_P(GraphicsComposerAidlCommandTest, SetColorTransform) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001536 auto& writer = getWriter(getPrimaryDisplayId());
1537 writer.setColorTransform(getPrimaryDisplayId(), kIdentity.data());
ramindanidcfe3a82021-11-29 17:00:31 +00001538 execute();
1539}
1540
1541TEST_P(GraphicsComposerAidlCommandTest, SetLayerColorTransform) {
ramindani431aad42022-02-01 21:44:29 +00001542 const auto& [status, layer] =
1543 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1544 EXPECT_TRUE(status.isOk());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001545 auto& writer = getWriter(getPrimaryDisplayId());
1546 writer.setLayerColorTransform(getPrimaryDisplayId(), layer, kIdentity.data());
ramindanidcfe3a82021-11-29 17:00:31 +00001547 execute();
1548
Ady Abraham3192f3d2021-12-03 16:08:56 -08001549 const auto errors = mReader.takeErrors();
Jason Macnak062bc9a2022-01-20 15:00:09 -08001550 if (errors.size() == 1 && errors[0].errorCode == IComposerClient::EX_UNSUPPORTED) {
ramindanidcfe3a82021-11-29 17:00:31 +00001551 GTEST_SUCCEED() << "setLayerColorTransform is not supported";
1552 return;
1553 }
1554}
1555
Alec Mouri60564e12021-12-09 18:48:20 -08001556TEST_P(GraphicsComposerAidlCommandTest, SetDisplayBrightness) {
ramindani431aad42022-02-01 21:44:29 +00001557 const auto& [status, capabilities] =
1558 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
1559 ASSERT_TRUE(status.isOk());
Alec Mouri60564e12021-12-09 18:48:20 -08001560 bool brightnessSupport = std::find(capabilities.begin(), capabilities.end(),
1561 DisplayCapability::BRIGHTNESS) != capabilities.end();
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001562 auto& writer = getWriter(getPrimaryDisplayId());
Alec Mouri60564e12021-12-09 18:48:20 -08001563 if (!brightnessSupport) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001564 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.5f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001565 execute();
1566 const auto errors = mReader.takeErrors();
1567 EXPECT_EQ(1, errors.size());
Jason Macnak062bc9a2022-01-20 15:00:09 -08001568 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, errors[0].errorCode);
Alec Mouri60564e12021-12-09 18:48:20 -08001569 GTEST_SUCCEED() << "SetDisplayBrightness is not supported";
1570 return;
1571 }
1572
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001573 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001574 execute();
1575 EXPECT_TRUE(mReader.takeErrors().empty());
1576
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001577 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.5f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001578 execute();
1579 EXPECT_TRUE(mReader.takeErrors().empty());
1580
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001581 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 1.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001582 execute();
1583 EXPECT_TRUE(mReader.takeErrors().empty());
1584
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001585 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ -1.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001586 execute();
1587 EXPECT_TRUE(mReader.takeErrors().empty());
1588
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001589 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 2.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001590 execute();
1591 {
1592 const auto errors = mReader.takeErrors();
ramindanib3bdf052022-01-12 18:27:05 +00001593 ASSERT_EQ(1, errors.size());
Alec Mouri60564e12021-12-09 18:48:20 -08001594 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1595 }
1596
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001597 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ -2.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001598 execute();
1599 {
1600 const auto errors = mReader.takeErrors();
ramindanib3bdf052022-01-12 18:27:05 +00001601 ASSERT_EQ(1, errors.size());
Alec Mouri60564e12021-12-09 18:48:20 -08001602 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1603 }
1604}
1605
ramindani431aad42022-02-01 21:44:29 +00001606TEST_P(GraphicsComposerAidlCommandTest, SetClientTarget) {
1607 EXPECT_TRUE(mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kBufferSlotCount)
1608 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001609
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001610 auto& writer = getWriter(getPrimaryDisplayId());
1611 writer.setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, nullptr, /*acquireFence*/ -1,
1612 Dataspace::UNKNOWN, std::vector<Rect>());
ramindanidcfe3a82021-11-29 17:00:31 +00001613
1614 execute();
1615}
1616
ramindani431aad42022-02-01 21:44:29 +00001617TEST_P(GraphicsComposerAidlCommandTest, SetOutputBuffer) {
1618 const auto& [status, virtualDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
1619 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001620 if (virtualDisplayCount == 0) {
1621 GTEST_SUCCEED() << "no virtual display support";
1622 return;
1623 }
1624
ramindani431aad42022-02-01 21:44:29 +00001625 const auto& [displayStatus, display] = mComposerClient->createVirtualDisplay(
1626 /*width*/ 64, /*height*/ 64, common::PixelFormat::IMPLEMENTATION_DEFINED,
1627 kBufferSlotCount);
1628 EXPECT_TRUE(displayStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001629
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001630 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001631 const auto handle = buffer->handle;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001632 auto& writer = getWriter(display.display);
1633 writer.setOutputBuffer(display.display, /*slot*/ 0, handle, /*releaseFence*/ -1);
ramindanidcfe3a82021-11-29 17:00:31 +00001634 execute();
1635}
1636
ramindani431aad42022-02-01 21:44:29 +00001637TEST_P(GraphicsComposerAidlCommandTest, ValidDisplay) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001638 auto& writer = getWriter(getPrimaryDisplayId());
1639 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001640 execute();
1641}
1642
ramindani431aad42022-02-01 21:44:29 +00001643TEST_P(GraphicsComposerAidlCommandTest, AcceptDisplayChanges) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001644 auto& writer = getWriter(getPrimaryDisplayId());
1645 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1646 writer.acceptDisplayChanges(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001647 execute();
1648}
1649
ramindani431aad42022-02-01 21:44:29 +00001650TEST_P(GraphicsComposerAidlCommandTest, PresentDisplay) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001651 auto& writer = getWriter(getPrimaryDisplayId());
1652 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1653 writer.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001654 execute();
1655}
1656
1657/**
1658 * Test IComposerClient::Command::PRESENT_DISPLAY
1659 *
1660 * Test that IComposerClient::Command::PRESENT_DISPLAY works without
1661 * additional call to validateDisplay when only the layer buffer handle and
1662 * surface damage have been set
1663 */
ramindani431aad42022-02-01 21:44:29 +00001664TEST_P(GraphicsComposerAidlCommandTest, PresentDisplayNoLayerStateChanges) {
Jason Macnak325e8232022-01-24 14:48:55 -08001665 if (!hasCapability(Capability::SKIP_VALIDATE)) {
ramindanidcfe3a82021-11-29 17:00:31 +00001666 GTEST_SUCCEED() << "Device does not have skip validate capability, skipping";
1667 return;
1668 }
ramindani431aad42022-02-01 21:44:29 +00001669 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001670
ramindani431aad42022-02-01 21:44:29 +00001671 const auto& [renderIntentsStatus, renderIntents] =
1672 mComposerClient->getRenderIntents(getPrimaryDisplayId(), ColorMode::NATIVE);
1673 EXPECT_TRUE(renderIntentsStatus.isOk());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001674 auto& writer = getWriter(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001675 for (auto intent : renderIntents) {
ramindani431aad42022-02-01 21:44:29 +00001676 EXPECT_TRUE(mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE, intent)
1677 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001678
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001679 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001680 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001681 ASSERT_NE(nullptr, handle);
1682
ramindani431aad42022-02-01 21:44:29 +00001683 const auto& [layerStatus, layer] =
1684 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1685 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001686
ramindani431aad42022-02-01 21:44:29 +00001687 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1688 getPrimaryDisplay().getDisplayHeight()};
1689 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1690 (float)getPrimaryDisplay().getDisplayHeight()};
1691 configureLayer(getPrimaryDisplay(), layer, Composition::CURSOR, displayFrame, cropRect);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001692 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle,
1693 /*acquireFence*/ -1);
1694 writer.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1695 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001696 execute();
ramindani431aad42022-02-01 21:44:29 +00001697 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanidcfe3a82021-11-29 17:00:31 +00001698 GTEST_SUCCEED() << "Composition change requested, skipping test";
1699 return;
1700 }
1701
Ady Abraham3192f3d2021-12-03 16:08:56 -08001702 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001703 writer.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001704 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001705 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001706
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001707 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001708 const auto handle2 = buffer2->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001709 ASSERT_NE(nullptr, handle2);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001710 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle2,
1711 /*acquireFence*/ -1);
1712 writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer,
1713 std::vector<Rect>(1, {0, 0, 10, 10}));
1714 writer.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001715 execute();
1716 }
1717}
1718
ramindani431aad42022-02-01 21:44:29 +00001719TEST_P(GraphicsComposerAidlCommandTest, SetLayerCursorPosition) {
1720 const auto& [layerStatus, layer] =
1721 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1722 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001723
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001724 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001725 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001726 ASSERT_NE(nullptr, handle);
ramindanidcfe3a82021-11-29 17:00:31 +00001727
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001728 auto& writer = getWriter(getPrimaryDisplayId());
1729 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
ramindani431aad42022-02-01 21:44:29 +00001730
1731 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1732 getPrimaryDisplay().getDisplayHeight()};
1733 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1734 (float)getPrimaryDisplay().getDisplayHeight()};
1735 configureLayer(getPrimaryDisplay(), layer, Composition::CURSOR, displayFrame, cropRect);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001736 writer.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1737 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001738
1739 execute();
Ady Abraham46219f52021-12-20 09:44:31 -08001740
ramindani431aad42022-02-01 21:44:29 +00001741 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanidcfe3a82021-11-29 17:00:31 +00001742 GTEST_SUCCEED() << "Composition change requested, skipping test";
1743 return;
1744 }
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001745 writer.presentDisplay(getPrimaryDisplayId());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001746 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001747
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001748 writer.setLayerCursorPosition(getPrimaryDisplayId(), layer, /*x*/ 1, /*y*/ 1);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001749 execute();
1750
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001751 writer.setLayerCursorPosition(getPrimaryDisplayId(), layer, /*x*/ 0, /*y*/ 0);
1752 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1753 writer.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001754 execute();
1755}
1756
ramindani431aad42022-02-01 21:44:29 +00001757TEST_P(GraphicsComposerAidlCommandTest, SetLayerBuffer) {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001758 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001759 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001760 ASSERT_NE(nullptr, handle);
1761
ramindani431aad42022-02-01 21:44:29 +00001762 const auto& [layerStatus, layer] =
1763 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1764 EXPECT_TRUE(layerStatus.isOk());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001765 auto& writer = getWriter(getPrimaryDisplayId());
1766 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
ramindanidcfe3a82021-11-29 17:00:31 +00001767 execute();
1768}
1769
Brian Lindahl25e0d092022-12-09 00:32:11 -07001770TEST_P(GraphicsComposerAidlCommandTest, SetLayerBufferSlotsToClear) {
1771 // Older HAL versions use a backwards compatible way of clearing buffer slots
1772 const auto& [versionStatus, version] = mComposerClient->getInterfaceVersion();
1773 ASSERT_TRUE(versionStatus.isOk());
1774 if (version <= 1) {
1775 GTEST_SUCCEED() << "HAL at version 1 or lower does not have "
1776 "LayerCommand::bufferSlotsToClear.";
1777 return;
1778 }
1779
1780 const auto& [layerStatus, layer] =
1781 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1782 EXPECT_TRUE(layerStatus.isOk());
1783 auto& writer = getWriter(getPrimaryDisplayId());
1784
1785 // setup 3 buffers in the buffer cache, with the last buffer being active
1786 // then emulate the Android platform code that clears all 3 buffer slots
1787
1788 const auto buffer1 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1789 ASSERT_NE(nullptr, buffer1);
1790 const auto handle1 = buffer1->handle;
1791 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle1, /*acquireFence*/ -1);
1792 execute();
1793 ASSERT_TRUE(mReader.takeErrors().empty());
1794
1795 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1796 ASSERT_NE(nullptr, buffer2);
1797 const auto handle2 = buffer2->handle;
1798 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 1, handle2, /*acquireFence*/ -1);
1799 execute();
1800 ASSERT_TRUE(mReader.takeErrors().empty());
1801
1802 const auto buffer3 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1803 ASSERT_NE(nullptr, buffer3);
1804 const auto handle3 = buffer3->handle;
1805 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 2, handle3, /*acquireFence*/ -1);
1806 execute();
1807 ASSERT_TRUE(mReader.takeErrors().empty());
1808
1809 // Ensure we can clear all 3 buffer slots, even the active buffer - it is assumed the
1810 // current active buffer's slot will be cleared, but still remain the active buffer and no
1811 // errors will occur.
1812 writer.setLayerBufferSlotsToClear(getPrimaryDisplayId(), layer, {0, 1, 2});
1813 execute();
1814 ASSERT_TRUE(mReader.takeErrors().empty());
1815}
1816
1817TEST_P(GraphicsComposerAidlCommandTest, SetLayerBufferMultipleTimes) {
1818 const auto& [layerStatus, layer] =
1819 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1820 EXPECT_TRUE(layerStatus.isOk());
1821 auto& writer = getWriter(getPrimaryDisplayId());
1822
1823 // Setup 3 buffers in the buffer cache, with the last buffer being active. Then, emulate the
1824 // Android platform code that clears all 3 buffer slots by setting all but the active buffer
1825 // slot to a placeholder buffer, and then restoring the active buffer.
1826
1827 // This is used on HALs that don't support setLayerBufferSlotsToClear (version <= 3.1).
1828
1829 const auto buffer1 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1830 ASSERT_NE(nullptr, buffer1);
1831 const auto handle1 = buffer1->handle;
1832 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle1, /*acquireFence*/ -1);
1833 execute();
1834 ASSERT_TRUE(mReader.takeErrors().empty());
1835
1836 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1837 ASSERT_NE(nullptr, buffer2);
1838 const auto handle2 = buffer2->handle;
1839 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 1, handle2, /*acquireFence*/ -1);
1840 execute();
1841 ASSERT_TRUE(mReader.takeErrors().empty());
1842
1843 const auto buffer3 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1844 ASSERT_NE(nullptr, buffer3);
1845 const auto handle3 = buffer3->handle;
1846 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 2, handle3, /*acquireFence*/ -1);
1847 execute();
1848 ASSERT_TRUE(mReader.takeErrors().empty());
1849
1850 // Older versions of the HAL clear all but the active buffer slot with a placeholder buffer,
1851 // and then restoring the current active buffer at the end
1852 auto clearSlotBuffer = allocate(1u, 1u, ::android::PIXEL_FORMAT_RGB_888);
1853 ASSERT_NE(nullptr, clearSlotBuffer);
1854 auto clearSlotBufferHandle = clearSlotBuffer->handle;
1855
1856 // clear buffer slots 0 and 1 with new layer commands... and then...
1857 writer.setLayerBufferWithNewCommand(getPrimaryDisplayId(), layer, /* slot */ 0,
1858 clearSlotBufferHandle, /*acquireFence*/ -1);
1859 writer.setLayerBufferWithNewCommand(getPrimaryDisplayId(), layer, /* slot */ 1,
1860 clearSlotBufferHandle, /*acquireFence*/ -1);
1861 // ...reset the layer buffer to the current active buffer slot with a final new command
1862 writer.setLayerBufferWithNewCommand(getPrimaryDisplayId(), layer, /*slot*/ 2, nullptr,
1863 /*acquireFence*/ -1);
1864 execute();
1865 ASSERT_TRUE(mReader.takeErrors().empty());
1866}
1867
ramindani431aad42022-02-01 21:44:29 +00001868TEST_P(GraphicsComposerAidlCommandTest, SetLayerSurfaceDamage) {
1869 const auto& [layerStatus, layer] =
1870 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1871 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001872
1873 Rect empty{0, 0, 0, 0};
1874 Rect unit{0, 0, 1, 1};
1875
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001876 auto& writer = getWriter(getPrimaryDisplayId());
1877 writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
ramindanidcfe3a82021-11-29 17:00:31 +00001878 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001879 ASSERT_TRUE(mReader.takeErrors().empty());
1880
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001881 writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001882 execute();
1883 ASSERT_TRUE(mReader.takeErrors().empty());
1884
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001885 writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001886 execute();
1887 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001888}
1889
ramindani431aad42022-02-01 21:44:29 +00001890TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlockingRegion) {
1891 const auto& [layerStatus, layer] =
1892 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1893 EXPECT_TRUE(layerStatus.isOk());
Leon Scroggins III03318152022-01-13 12:24:19 -05001894
1895 Rect empty{0, 0, 0, 0};
1896 Rect unit{0, 0, 1, 1};
1897
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001898 auto& writer = getWriter(getPrimaryDisplayId());
1899 writer.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
Leon Scroggins III03318152022-01-13 12:24:19 -05001900 execute();
1901 ASSERT_TRUE(mReader.takeErrors().empty());
1902
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001903 writer.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Leon Scroggins III03318152022-01-13 12:24:19 -05001904 execute();
1905 ASSERT_TRUE(mReader.takeErrors().empty());
1906
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001907 writer.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
Leon Scroggins III03318152022-01-13 12:24:19 -05001908 execute();
1909 ASSERT_TRUE(mReader.takeErrors().empty());
1910}
1911
ramindani431aad42022-02-01 21:44:29 +00001912TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlendMode) {
1913 const auto& [layerStatus, layer] =
1914 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1915 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001916
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001917 auto& writer = getWriter(getPrimaryDisplayId());
1918 writer.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::NONE);
ramindanidcfe3a82021-11-29 17:00:31 +00001919 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001920 ASSERT_TRUE(mReader.takeErrors().empty());
1921
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001922 writer.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::PREMULTIPLIED);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001923 execute();
1924 ASSERT_TRUE(mReader.takeErrors().empty());
1925
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001926 writer.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::COVERAGE);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001927 execute();
1928 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001929}
1930
ramindani431aad42022-02-01 21:44:29 +00001931TEST_P(GraphicsComposerAidlCommandTest, SetLayerColor) {
1932 const auto& [layerStatus, layer] =
1933 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1934 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001935
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001936 auto& writer = getWriter(getPrimaryDisplayId());
1937 writer.setLayerColor(getPrimaryDisplayId(), layer, Color{1.0f, 1.0f, 1.0f, 1.0f});
ramindanidcfe3a82021-11-29 17:00:31 +00001938 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001939 ASSERT_TRUE(mReader.takeErrors().empty());
1940
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001941 writer.setLayerColor(getPrimaryDisplayId(), layer, Color{0.0f, 0.0f, 0.0f, 0.0f});
Ady Abraham3192f3d2021-12-03 16:08:56 -08001942 execute();
1943 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001944}
1945
ramindani431aad42022-02-01 21:44:29 +00001946TEST_P(GraphicsComposerAidlCommandTest, SetLayerCompositionType) {
1947 const auto& [layerStatus, layer] =
1948 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1949 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001950
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001951 auto& writer = getWriter(getPrimaryDisplayId());
1952 writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CLIENT);
ramindanidcfe3a82021-11-29 17:00:31 +00001953 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001954 ASSERT_TRUE(mReader.takeErrors().empty());
1955
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001956 writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::DEVICE);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001957 execute();
1958 ASSERT_TRUE(mReader.takeErrors().empty());
1959
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001960 writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::SOLID_COLOR);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001961 execute();
1962 ASSERT_TRUE(mReader.takeErrors().empty());
1963
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001964 writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CURSOR);
ramindani431aad42022-02-01 21:44:29 +00001965 execute();
1966}
1967
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001968TEST_P(GraphicsComposerAidlCommandTest, DisplayDecoration) {
1969 for (VtsDisplay& display : mDisplays) {
1970 const auto [layerStatus, layer] =
1971 mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount);
1972 EXPECT_TRUE(layerStatus.isOk());
1973
1974 const auto [error, support] =
1975 mComposerClient->getDisplayDecorationSupport(display.getDisplayId());
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001976
Leon Scroggins III91590872022-02-23 09:51:21 -05001977 const auto format = (error.isOk() && support) ? support->format
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001978 : aidl::android::hardware::graphics::common::PixelFormat::RGBA_8888;
1979 const auto decorBuffer = allocate(static_cast<::android::PixelFormat>(format));
1980 ASSERT_NE(nullptr, decorBuffer);
1981 if (::android::OK != decorBuffer->initCheck()) {
1982 if (support) {
1983 FAIL() << "Device advertised display decoration support with format "
1984 << aidl::android::hardware::graphics::common::toString(format)
1985 << " but failed to allocate it!";
1986 } else {
1987 FAIL() << "Device advertised NO display decoration support, but it should "
1988 << "still be able to allocate "
1989 << aidl::android::hardware::graphics::common::toString(format);
1990 }
1991 }
1992
Midas Chien7d55d422022-06-07 02:32:28 +08001993 configureLayer(display, layer, Composition::DISPLAY_DECORATION, display.getFrameRect(),
1994 display.getCrop());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001995 auto& writer = getWriter(display.getDisplayId());
1996 writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, decorBuffer->handle,
1997 /*acquireFence*/ -1);
1998 writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001999 execute();
2000 if (support) {
2001 ASSERT_TRUE(mReader.takeErrors().empty());
2002 } else {
2003 const auto errors = mReader.takeErrors();
2004 ASSERT_EQ(1, errors.size());
Leon Scroggins III6455e792022-02-24 12:18:58 -05002005 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, errors[0].errorCode);
Leon Scroggins IIIde057582022-01-13 12:26:00 -05002006 }
2007 }
2008}
2009
ramindani431aad42022-02-01 21:44:29 +00002010TEST_P(GraphicsComposerAidlCommandTest, SetLayerDataspace) {
2011 const auto& [layerStatus, layer] =
2012 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2013 EXPECT_TRUE(layerStatus.isOk());
2014
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002015 auto& writer = getWriter(getPrimaryDisplayId());
2016 writer.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
ramindani431aad42022-02-01 21:44:29 +00002017 execute();
2018}
2019
2020TEST_P(GraphicsComposerAidlCommandTest, SetLayerDisplayFrame) {
2021 const auto& [layerStatus, layer] =
2022 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2023 EXPECT_TRUE(layerStatus.isOk());
2024
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002025 auto& writer = getWriter(getPrimaryDisplayId());
2026 writer.setLayerDisplayFrame(getPrimaryDisplayId(), layer, Rect{0, 0, 1, 1});
ramindani431aad42022-02-01 21:44:29 +00002027 execute();
2028}
2029
2030TEST_P(GraphicsComposerAidlCommandTest, SetLayerPlaneAlpha) {
2031 const auto& [layerStatus, layer] =
2032 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2033 EXPECT_TRUE(layerStatus.isOk());
2034
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002035 auto& writer = getWriter(getPrimaryDisplayId());
2036 writer.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 0.0f);
ramindani431aad42022-02-01 21:44:29 +00002037 execute();
2038 ASSERT_TRUE(mReader.takeErrors().empty());
2039
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002040 writer.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 1.0f);
Ady Abraham3192f3d2021-12-03 16:08:56 -08002041 execute();
2042 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00002043}
2044
ramindani431aad42022-02-01 21:44:29 +00002045TEST_P(GraphicsComposerAidlCommandTest, SetLayerSidebandStream) {
Jason Macnak325e8232022-01-24 14:48:55 -08002046 if (!hasCapability(Capability::SIDEBAND_STREAM)) {
ramindanidcfe3a82021-11-29 17:00:31 +00002047 GTEST_SUCCEED() << "no sideband stream support";
2048 return;
2049 }
2050
Leon Scroggins IIIde057582022-01-13 12:26:00 -05002051 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00002052 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00002053 ASSERT_NE(nullptr, handle);
2054
ramindani431aad42022-02-01 21:44:29 +00002055 const auto& [layerStatus, layer] =
2056 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2057 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002058
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002059 auto& writer = getWriter(getPrimaryDisplayId());
2060 writer.setLayerSidebandStream(getPrimaryDisplayId(), layer, handle);
ramindanidcfe3a82021-11-29 17:00:31 +00002061 execute();
2062}
2063
ramindani431aad42022-02-01 21:44:29 +00002064TEST_P(GraphicsComposerAidlCommandTest, SetLayerSourceCrop) {
2065 const auto& [layerStatus, layer] =
2066 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2067 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002068
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002069 auto& writer = getWriter(getPrimaryDisplayId());
2070 writer.setLayerSourceCrop(getPrimaryDisplayId(), layer, FRect{0.0f, 0.0f, 1.0f, 1.0f});
ramindanidcfe3a82021-11-29 17:00:31 +00002071 execute();
2072}
2073
ramindani431aad42022-02-01 21:44:29 +00002074TEST_P(GraphicsComposerAidlCommandTest, SetLayerTransform) {
2075 const auto& [layerStatus, layer] =
2076 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2077 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002078
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002079 auto& writer = getWriter(getPrimaryDisplayId());
2080 writer.setLayerTransform(getPrimaryDisplayId(), layer, static_cast<Transform>(0));
ramindanidcfe3a82021-11-29 17:00:31 +00002081 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08002082 ASSERT_TRUE(mReader.takeErrors().empty());
2083
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002084 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_H);
Ady Abraham3192f3d2021-12-03 16:08:56 -08002085 execute();
2086 ASSERT_TRUE(mReader.takeErrors().empty());
2087
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002088 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_V);
Ady Abraham3192f3d2021-12-03 16:08:56 -08002089 execute();
2090 ASSERT_TRUE(mReader.takeErrors().empty());
2091
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002092 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_90);
Ady Abraham3192f3d2021-12-03 16:08:56 -08002093 execute();
2094 ASSERT_TRUE(mReader.takeErrors().empty());
2095
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002096 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_180);
Ady Abraham3192f3d2021-12-03 16:08:56 -08002097 execute();
2098 ASSERT_TRUE(mReader.takeErrors().empty());
2099
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002100 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_270);
Ady Abraham3192f3d2021-12-03 16:08:56 -08002101 execute();
2102 ASSERT_TRUE(mReader.takeErrors().empty());
2103
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002104 writer.setLayerTransform(getPrimaryDisplayId(), layer,
2105 static_cast<Transform>(static_cast<int>(Transform::FLIP_H) |
2106 static_cast<int>(Transform::ROT_90)));
Ady Abraham3192f3d2021-12-03 16:08:56 -08002107 execute();
2108 ASSERT_TRUE(mReader.takeErrors().empty());
2109
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002110 writer.setLayerTransform(getPrimaryDisplayId(), layer,
2111 static_cast<Transform>(static_cast<int>(Transform::FLIP_V) |
2112 static_cast<int>(Transform::ROT_90)));
Ady Abraham3192f3d2021-12-03 16:08:56 -08002113 execute();
2114 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00002115}
2116
ramindani431aad42022-02-01 21:44:29 +00002117TEST_P(GraphicsComposerAidlCommandTest, SetLayerVisibleRegion) {
2118 const auto& [layerStatus, layer] =
2119 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2120 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002121
2122 Rect empty{0, 0, 0, 0};
2123 Rect unit{0, 0, 1, 1};
2124
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002125 auto& writer = getWriter(getPrimaryDisplayId());
2126 writer.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
ramindanidcfe3a82021-11-29 17:00:31 +00002127 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08002128 ASSERT_TRUE(mReader.takeErrors().empty());
2129
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002130 writer.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Ady Abraham3192f3d2021-12-03 16:08:56 -08002131 execute();
2132 ASSERT_TRUE(mReader.takeErrors().empty());
2133
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002134 writer.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
Ady Abraham3192f3d2021-12-03 16:08:56 -08002135 execute();
2136 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00002137}
2138
ramindani431aad42022-02-01 21:44:29 +00002139TEST_P(GraphicsComposerAidlCommandTest, SetLayerZOrder) {
2140 const auto& [layerStatus, layer] =
2141 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2142 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002143
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002144 auto& writer = getWriter(getPrimaryDisplayId());
2145 writer.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 10);
ramindanidcfe3a82021-11-29 17:00:31 +00002146 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08002147 ASSERT_TRUE(mReader.takeErrors().empty());
2148
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002149 writer.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 0);
Ady Abraham3192f3d2021-12-03 16:08:56 -08002150 execute();
2151 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00002152}
2153
ramindani431aad42022-02-01 21:44:29 +00002154TEST_P(GraphicsComposerAidlCommandTest, SetLayerPerFrameMetadata) {
2155 const auto& [layerStatus, layer] =
2156 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2157 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002158
ramindanidcfe3a82021-11-29 17:00:31 +00002159 /**
2160 * DISPLAY_P3 is a color space that uses the DCI_P3 primaries,
2161 * the D65 white point and the SRGB transfer functions.
2162 * Rendering Intent: Colorimetric
2163 * Primaries:
2164 * x y
2165 * green 0.265 0.690
2166 * blue 0.150 0.060
2167 * red 0.680 0.320
2168 * white (D65) 0.3127 0.3290
2169 */
2170
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002171 auto& writer = getWriter(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00002172 std::vector<PerFrameMetadata> aidlMetadata;
2173 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X, 0.680f});
2174 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y, 0.320f});
2175 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_X, 0.265f});
2176 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_Y, 0.690f});
2177 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_X, 0.150f});
2178 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_Y, 0.060f});
2179 aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_X, 0.3127f});
2180 aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_Y, 0.3290f});
2181 aidlMetadata.push_back({PerFrameMetadataKey::MAX_LUMINANCE, 100.0f});
2182 aidlMetadata.push_back({PerFrameMetadataKey::MIN_LUMINANCE, 0.1f});
2183 aidlMetadata.push_back({PerFrameMetadataKey::MAX_CONTENT_LIGHT_LEVEL, 78.0});
2184 aidlMetadata.push_back({PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL, 62.0});
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002185 writer.setLayerPerFrameMetadata(getPrimaryDisplayId(), layer, aidlMetadata);
ramindanidcfe3a82021-11-29 17:00:31 +00002186 execute();
2187
Ady Abraham3192f3d2021-12-03 16:08:56 -08002188 const auto errors = mReader.takeErrors();
2189 if (errors.size() == 1 && errors[0].errorCode == EX_UNSUPPORTED_OPERATION) {
ramindanidcfe3a82021-11-29 17:00:31 +00002190 GTEST_SUCCEED() << "SetLayerPerFrameMetadata is not supported";
ramindani431aad42022-02-01 21:44:29 +00002191 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002192 return;
2193 }
2194
ramindani431aad42022-02-01 21:44:29 +00002195 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002196}
2197
Alec Mourib1f16722022-02-07 13:03:44 -08002198TEST_P(GraphicsComposerAidlCommandTest, setLayerBrightness) {
ramindani431aad42022-02-01 21:44:29 +00002199 const auto& [layerStatus, layer] =
2200 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
Alec Mouri95e490b2022-01-06 13:46:58 -08002201
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002202 auto& writer = getWriter(getPrimaryDisplayId());
2203 writer.setLayerBrightness(getPrimaryDisplayId(), layer, 0.2f);
Alec Mouri95e490b2022-01-06 13:46:58 -08002204 execute();
2205 ASSERT_TRUE(mReader.takeErrors().empty());
2206
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002207 writer.setLayerBrightness(getPrimaryDisplayId(), layer, 1.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08002208 execute();
2209 ASSERT_TRUE(mReader.takeErrors().empty());
2210
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002211 writer.setLayerBrightness(getPrimaryDisplayId(), layer, 0.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08002212 execute();
2213 ASSERT_TRUE(mReader.takeErrors().empty());
2214
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002215 writer.setLayerBrightness(getPrimaryDisplayId(), layer, -1.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08002216 execute();
Alec Mourib1f16722022-02-07 13:03:44 -08002217 {
2218 const auto errors = mReader.takeErrors();
2219 ASSERT_EQ(1, errors.size());
2220 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
2221 }
2222
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002223 writer.setLayerBrightness(getPrimaryDisplayId(), layer, std::nanf(""));
Alec Mourib1f16722022-02-07 13:03:44 -08002224 execute();
2225 {
2226 const auto errors = mReader.takeErrors();
2227 ASSERT_EQ(1, errors.size());
2228 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
2229 }
Alec Mouri95e490b2022-01-06 13:46:58 -08002230}
2231
ramindani431aad42022-02-01 21:44:29 +00002232TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints) {
ramindanidcfe3a82021-11-29 17:00:31 +00002233 Test_setActiveConfigWithConstraints({.delayForChange = 0, .refreshMiss = false});
2234}
2235
ramindani431aad42022-02-01 21:44:29 +00002236TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_Delayed) {
ramindanidcfe3a82021-11-29 17:00:31 +00002237 Test_setActiveConfigWithConstraints({.delayForChange = 300'000'000, // 300ms
2238 .refreshMiss = false});
2239}
2240
ramindani431aad42022-02-01 21:44:29 +00002241TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_MissRefresh) {
ramindanidcfe3a82021-11-29 17:00:31 +00002242 Test_setActiveConfigWithConstraints({.delayForChange = 0, .refreshMiss = true});
2243}
2244
ramindani431aad42022-02-01 21:44:29 +00002245TEST_P(GraphicsComposerAidlCommandTest, GetDisplayVsyncPeriod) {
ramindanidcfe3a82021-11-29 17:00:31 +00002246 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00002247 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
2248 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002249
ramindani431aad42022-02-01 21:44:29 +00002250 for (int32_t config : configs) {
2251 int32_t expectedVsyncPeriodNanos = display.getDisplayConfig(config).vsyncPeriod;
2252
ramindanidcfe3a82021-11-29 17:00:31 +00002253 VsyncPeriodChangeConstraints constraints;
2254
2255 constraints.desiredTimeNanos = systemTime();
2256 constraints.seamlessRequired = false;
ramindani431aad42022-02-01 21:44:29 +00002257
2258 const auto& [timelineStatus, timeline] =
2259 mComposerClient->setActiveConfigWithConstraints(&display, config, constraints);
2260 EXPECT_TRUE(timelineStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002261
2262 if (timeline.refreshRequired) {
2263 sendRefreshFrame(display, &timeline);
2264 }
ramindani431aad42022-02-01 21:44:29 +00002265 waitForVsyncPeriodChange(display.getDisplayId(), timeline, constraints.desiredTimeNanos,
2266 /*odPeriodNanos*/ 0, expectedVsyncPeriodNanos);
ramindanidcfe3a82021-11-29 17:00:31 +00002267
2268 int32_t vsyncPeriodNanos;
2269 int retryCount = 100;
2270 do {
2271 std::this_thread::sleep_for(10ms);
ramindani431aad42022-02-01 21:44:29 +00002272 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanosValue] =
2273 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
2274
2275 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
2276 vsyncPeriodNanos = vsyncPeriodNanosValue;
ramindanidcfe3a82021-11-29 17:00:31 +00002277 --retryCount;
2278 } while (vsyncPeriodNanos != expectedVsyncPeriodNanos && retryCount > 0);
2279
2280 EXPECT_EQ(vsyncPeriodNanos, expectedVsyncPeriodNanos);
2281
2282 // Make sure that the vsync period stays the same if the active config is not
2283 // changed.
2284 auto timeout = 1ms;
2285 for (int i = 0; i < 10; i++) {
2286 std::this_thread::sleep_for(timeout);
2287 timeout *= 2;
2288 vsyncPeriodNanos = 0;
ramindani431aad42022-02-01 21:44:29 +00002289 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanosValue] =
2290 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
2291
2292 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
2293 vsyncPeriodNanos = vsyncPeriodNanosValue;
ramindanidcfe3a82021-11-29 17:00:31 +00002294 EXPECT_EQ(vsyncPeriodNanos, expectedVsyncPeriodNanos);
2295 }
2296 }
2297 }
2298}
2299
ramindani431aad42022-02-01 21:44:29 +00002300TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_SeamlessNotAllowed) {
ramindanidcfe3a82021-11-29 17:00:31 +00002301 VsyncPeriodChangeConstraints constraints;
ramindanidcfe3a82021-11-29 17:00:31 +00002302 constraints.seamlessRequired = true;
2303 constraints.desiredTimeNanos = systemTime();
2304
2305 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00002306 forEachTwoConfigs(display.getDisplayId(), [&](int32_t config1, int32_t config2) {
2307 int32_t configGroup1 = display.getDisplayConfig(config1).configGroup;
2308 int32_t configGroup2 = display.getDisplayConfig(config2).configGroup;
ramindanidcfe3a82021-11-29 17:00:31 +00002309 if (configGroup1 != configGroup2) {
ramindani431aad42022-02-01 21:44:29 +00002310 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002311 sendRefreshFrame(display, nullptr);
ramindani431aad42022-02-01 21:44:29 +00002312 const auto& [status, _] = mComposerClient->setActiveConfigWithConstraints(
2313 &display, config2, constraints);
2314 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002315 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(
2316 status, IComposerClient::EX_SEAMLESS_NOT_ALLOWED));
ramindanidcfe3a82021-11-29 17:00:31 +00002317 }
2318 });
2319 }
2320}
2321
ramindani431aad42022-02-01 21:44:29 +00002322TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_NoTimestamp) {
2323 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ std::nullopt));
Ady Abraham72c5b502021-12-10 17:23:39 -08002324}
2325
ramindani431aad42022-02-01 21:44:29 +00002326TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_0) {
2327 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ 0));
Ady Abraham72c5b502021-12-10 17:23:39 -08002328}
2329
ramindani431aad42022-02-01 21:44:29 +00002330TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_5) {
2331 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ 5));
Ady Abraham72c5b502021-12-10 17:23:39 -08002332}
2333
ramindani431aad42022-02-01 21:44:29 +00002334TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Unsupported) {
2335 const bool hasDisplayIdleTimerSupport =
2336 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002337 if (!hasDisplayIdleTimerSupport) {
ramindani431aad42022-02-01 21:44:29 +00002338 const auto& status =
2339 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0);
2340 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002341 EXPECT_NO_FATAL_FAILURE(
2342 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
Midas Chiena0b56bd2022-01-13 23:27:33 +08002343 }
2344}
2345
ramindani431aad42022-02-01 21:44:29 +00002346TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_BadParameter) {
2347 const bool hasDisplayIdleTimerSupport =
2348 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002349 if (!hasDisplayIdleTimerSupport) {
2350 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2351 return;
2352 }
2353
ramindani431aad42022-02-01 21:44:29 +00002354 const auto& status =
2355 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ -1);
2356 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002357 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
Midas Chiena0b56bd2022-01-13 23:27:33 +08002358}
2359
ramindani431aad42022-02-01 21:44:29 +00002360TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Disable) {
2361 const bool hasDisplayIdleTimerSupport =
2362 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002363 if (!hasDisplayIdleTimerSupport) {
2364 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2365 return;
2366 }
2367
ramindani431aad42022-02-01 21:44:29 +00002368 EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002369 std::this_thread::sleep_for(1s);
ramindani431aad42022-02-01 21:44:29 +00002370 EXPECT_EQ(0, mComposerClient->getVsyncIdleCount());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002371}
2372
ramindani431aad42022-02-01 21:44:29 +00002373TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Timeout_2) {
2374 const bool hasDisplayIdleTimerSupport =
2375 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002376 if (!hasDisplayIdleTimerSupport) {
2377 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2378 return;
2379 }
2380
ramindani431aad42022-02-01 21:44:29 +00002381 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
2382 EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002383
Leon Scroggins IIIde057582022-01-13 12:26:00 -05002384 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002385 ASSERT_NE(nullptr, buffer->handle);
2386
2387 const auto layer = createOnScreenLayer();
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002388 auto& writer = getWriter(getPrimaryDisplayId());
2389 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer->handle,
2390 /*acquireFence*/ -1);
ramindani431aad42022-02-01 21:44:29 +00002391 int32_t vsyncIdleCount = mComposerClient->getVsyncIdleCount();
Midas Chiena0b56bd2022-01-13 23:27:33 +08002392 auto earlyVsyncIdleTime = systemTime() + std::chrono::nanoseconds(2s).count();
ramindani431aad42022-02-01 21:44:29 +00002393 EXPECT_TRUE(
2394 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 2000).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002395
2396 const sp<::android::Fence> presentFence =
ramindani431aad42022-02-01 21:44:29 +00002397 presentAndGetFence(ComposerClientWriter::kNoTimestamp);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002398 presentFence->waitForever(LOG_TAG);
2399
2400 std::this_thread::sleep_for(3s);
ramindani431aad42022-02-01 21:44:29 +00002401 if (vsyncIdleCount < mComposerClient->getVsyncIdleCount()) {
2402 EXPECT_GE(mComposerClient->getVsyncIdleTime(), earlyVsyncIdleTime);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002403 }
2404
ramindani431aad42022-02-01 21:44:29 +00002405 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002406}
2407
ramindani9dd8c482023-02-21 18:07:56 -08002408TEST_P(GraphicsComposerAidlCommandTest, SetRefreshRateChangedCallbackDebug_Unsupported) {
ramindani17c71102023-03-20 10:51:14 -07002409 if (getInterfaceVersion() <= 1) {
2410 GTEST_SUCCEED() << "Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG is "
2411 "not supported on older version of the service";
2412 return;
2413 }
ramindani9dd8c482023-02-21 18:07:56 -08002414 if (!hasCapability(Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG)) {
2415 auto status = mComposerClient->setRefreshRateChangedCallbackDebugEnabled(
2416 getPrimaryDisplayId(), /*enabled*/ true);
2417 EXPECT_FALSE(status.isOk());
2418 EXPECT_NO_FATAL_FAILURE(
2419 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
2420
2421 status = mComposerClient->setRefreshRateChangedCallbackDebugEnabled(getPrimaryDisplayId(),
2422 /*enabled*/ false);
2423 EXPECT_FALSE(status.isOk());
2424 EXPECT_NO_FATAL_FAILURE(
2425 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
2426 }
2427}
2428
2429TEST_P(GraphicsComposerAidlCommandTest, SetRefreshRateChangedCallbackDebug_Enabled) {
ramindani17c71102023-03-20 10:51:14 -07002430 if (getInterfaceVersion() <= 1) {
2431 GTEST_SUCCEED() << "Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG is "
2432 "not supported on older version of the service";
2433 return;
2434 }
ramindani9dd8c482023-02-21 18:07:56 -08002435 if (!hasCapability(Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG)) {
2436 GTEST_SUCCEED() << "Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG is not supported";
2437 return;
2438 }
2439
2440 const auto displayId = getPrimaryDisplayId();
2441 EXPECT_TRUE(mComposerClient->setPowerMode(displayId, PowerMode::ON).isOk());
2442 // Enable the callback
2443 ASSERT_TRUE(mComposerClient
2444 ->setRefreshRateChangedCallbackDebugEnabled(displayId,
2445 /*enabled*/ true)
2446 .isOk());
2447 std::this_thread::sleep_for(100ms);
2448
ramindani91518892023-03-03 16:55:09 +00002449 const auto displayFilter = [displayId](auto refreshRateChangedDebugData) {
2450 return displayId == refreshRateChangedDebugData.display;
2451 };
ramindani9dd8c482023-02-21 18:07:56 -08002452
2453 // Check that we immediately got a callback
ramindani91518892023-03-03 16:55:09 +00002454 EXPECT_TRUE(checkIfCallbackRefreshRateChangedDebugEnabledReceived(displayFilter));
ramindani9dd8c482023-02-21 18:07:56 -08002455
2456 ASSERT_TRUE(mComposerClient
2457 ->setRefreshRateChangedCallbackDebugEnabled(displayId,
2458 /*enabled*/ false)
2459 .isOk());
2460}
2461
2462TEST_P(GraphicsComposerAidlCommandTest,
2463 SetRefreshRateChangedCallbackDebugEnabled_noCallbackWhenIdle) {
ramindani17c71102023-03-20 10:51:14 -07002464 if (getInterfaceVersion() <= 1) {
2465 GTEST_SUCCEED() << "Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG is "
2466 "not supported on older version of the service";
2467 return;
2468 }
ramindani9dd8c482023-02-21 18:07:56 -08002469 if (!hasCapability(Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG)) {
2470 GTEST_SUCCEED() << "Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG is not supported";
2471 return;
2472 }
2473
2474 auto display = getEditablePrimaryDisplay();
2475 const auto displayId = display.getDisplayId();
2476
2477 if (!hasDisplayCapability(displayId, DisplayCapability::DISPLAY_IDLE_TIMER)) {
2478 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2479 return;
2480 }
2481
2482 EXPECT_TRUE(mComposerClient->setPowerMode(displayId, PowerMode::ON).isOk());
2483 EXPECT_TRUE(mComposerClient->setPeakRefreshRateConfig(&display).isOk());
2484
2485 ASSERT_TRUE(mComposerClient->setIdleTimerEnabled(displayId, /*timeoutMs*/ 500).isOk());
2486 // Enable the callback
2487 ASSERT_TRUE(mComposerClient
2488 ->setRefreshRateChangedCallbackDebugEnabled(displayId,
2489 /*enabled*/ true)
2490 .isOk());
2491
ramindani91518892023-03-03 16:55:09 +00002492 const auto displayFilter = [displayId](auto refreshRateChangedDebugData) {
2493 return displayId == refreshRateChangedDebugData.display;
2494 };
ramindani9dd8c482023-02-21 18:07:56 -08002495
2496 int retryCount = 3;
2497 do {
2498 // Wait for 1s so that we enter the idle state
2499 std::this_thread::sleep_for(1s);
ramindani91518892023-03-03 16:55:09 +00002500 if (!checkIfCallbackRefreshRateChangedDebugEnabledReceived(displayFilter)) {
ramindani9dd8c482023-02-21 18:07:56 -08002501 // DID NOT receive a callback, we are in the idle state.
2502 break;
2503 }
2504 } while (--retryCount > 0);
2505
2506 if (retryCount == 0) {
2507 GTEST_SUCCEED() << "Unable to enter the idle mode";
2508 return;
2509 }
2510
2511 // Send the REFRESH_RATE_INDICATOR update
2512 ASSERT_NO_FATAL_FAILURE(
2513 sendBufferUpdate(createOnScreenLayer(Composition::REFRESH_RATE_INDICATOR)));
2514 std::this_thread::sleep_for(1s);
ramindani91518892023-03-03 16:55:09 +00002515 EXPECT_FALSE(checkIfCallbackRefreshRateChangedDebugEnabledReceived(displayFilter))
ramindani9dd8c482023-02-21 18:07:56 -08002516 << "A callback should not be received for REFRESH_RATE_INDICATOR";
2517
2518 EXPECT_TRUE(mComposerClient
2519 ->setRefreshRateChangedCallbackDebugEnabled(displayId,
2520 /*enabled*/ false)
2521 .isOk());
2522}
2523
2524TEST_P(GraphicsComposerAidlCommandTest,
2525 SetRefreshRateChangedCallbackDebugEnabled_SetActiveConfigWithConstraints) {
ramindani17c71102023-03-20 10:51:14 -07002526 if (getInterfaceVersion() <= 1) {
2527 GTEST_SUCCEED() << "Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG is "
2528 "not supported on older version of the service";
2529 return;
2530 }
ramindani9dd8c482023-02-21 18:07:56 -08002531 if (!hasCapability(Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG)) {
2532 GTEST_SUCCEED() << "Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG is not supported";
2533 return;
2534 }
2535
2536 VsyncPeriodChangeConstraints constraints;
2537 constraints.seamlessRequired = false;
2538 constraints.desiredTimeNanos = systemTime();
2539
2540 for (VtsDisplay& display : mDisplays) {
2541 const auto displayId = display.getDisplayId();
2542 EXPECT_TRUE(mComposerClient->setPowerMode(displayId, PowerMode::ON).isOk());
2543
2544 // Enable the callback
2545 ASSERT_TRUE(mComposerClient
2546 ->setRefreshRateChangedCallbackDebugEnabled(displayId, /*enabled*/ true)
2547 .isOk());
2548
2549 forEachTwoConfigs(displayId, [&](int32_t config1, int32_t config2) {
2550 const int32_t vsyncPeriod1 = display.getDisplayConfig(config1).vsyncPeriod;
2551 const int32_t vsyncPeriod2 = display.getDisplayConfig(config2).vsyncPeriod;
2552
2553 if (vsyncPeriod1 == vsyncPeriod2) {
2554 return; // continue
2555 }
2556
2557 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
2558 sendRefreshFrame(display, nullptr);
2559
2560 const auto& [status, timeline] =
2561 mComposerClient->setActiveConfigWithConstraints(&display, config2, constraints);
2562 EXPECT_TRUE(status.isOk());
2563
2564 if (timeline.refreshRequired) {
2565 sendRefreshFrame(display, &timeline);
2566 }
2567
ramindani91518892023-03-03 16:55:09 +00002568 const auto callbackFilter = [displayId,
2569 vsyncPeriod2](auto refreshRateChangedDebugData) {
2570 constexpr int kVsyncThreshold = 1000;
2571 return displayId == refreshRateChangedDebugData.display &&
2572 std::abs(vsyncPeriod2 - refreshRateChangedDebugData.vsyncPeriodNanos) <=
2573 kVsyncThreshold;
2574 };
ramindani9dd8c482023-02-21 18:07:56 -08002575
2576 int retryCount = 3;
2577 do {
2578 std::this_thread::sleep_for(100ms);
ramindani91518892023-03-03 16:55:09 +00002579 if (checkIfCallbackRefreshRateChangedDebugEnabledReceived(callbackFilter)) {
ramindani9dd8c482023-02-21 18:07:56 -08002580 GTEST_SUCCEED() << "Received a callback successfully";
2581 break;
2582 }
2583 } while (--retryCount > 0);
2584
2585 if (retryCount == 0) {
2586 GTEST_FAIL() << "failed to get a callback for the display " << displayId
2587 << " with config " << config2;
2588 }
2589 });
2590
2591 EXPECT_TRUE(
2592 mComposerClient
2593 ->setRefreshRateChangedCallbackDebugEnabled(displayId, /*enabled*/ false)
2594 .isOk());
2595 }
2596}
2597
Kriti Dang4efe8602022-05-03 16:55:59 +02002598/*
2599 * Test that no two display configs are exactly the same.
2600 */
2601TEST_P(GraphicsComposerAidlTest, GetDisplayConfigNoRepetitions) {
2602 for (const auto& display : mDisplays) {
2603 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
2604 for (std::vector<int>::size_type i = 0; i < configs.size(); i++) {
2605 for (std::vector<int>::size_type j = i + 1; j < configs.size(); j++) {
2606 const auto& [widthStatus1, width1] = mComposerClient->getDisplayAttribute(
2607 display.getDisplayId(), configs[i], DisplayAttribute::WIDTH);
2608 const auto& [heightStatus1, height1] = mComposerClient->getDisplayAttribute(
2609 display.getDisplayId(), configs[i], DisplayAttribute::HEIGHT);
2610 const auto& [vsyncPeriodStatus1, vsyncPeriod1] =
2611 mComposerClient->getDisplayAttribute(display.getDisplayId(), configs[i],
2612 DisplayAttribute::VSYNC_PERIOD);
2613 const auto& [groupStatus1, group1] = mComposerClient->getDisplayAttribute(
2614 display.getDisplayId(), configs[i], DisplayAttribute::CONFIG_GROUP);
2615
2616 const auto& [widthStatus2, width2] = mComposerClient->getDisplayAttribute(
2617 display.getDisplayId(), configs[j], DisplayAttribute::WIDTH);
2618 const auto& [heightStatus2, height2] = mComposerClient->getDisplayAttribute(
2619 display.getDisplayId(), configs[j], DisplayAttribute::HEIGHT);
2620 const auto& [vsyncPeriodStatus2, vsyncPeriod2] =
2621 mComposerClient->getDisplayAttribute(display.getDisplayId(), configs[j],
2622 DisplayAttribute::VSYNC_PERIOD);
2623 const auto& [groupStatus2, group2] = mComposerClient->getDisplayAttribute(
2624 display.getDisplayId(), configs[j], DisplayAttribute::CONFIG_GROUP);
2625
2626 ASSERT_FALSE(width1 == width2 && height1 == height2 &&
2627 vsyncPeriod1 == vsyncPeriod2 && group1 == group2);
2628 }
2629 }
2630 }
2631}
2632
Carlos Martinez Romerocd043612023-01-05 22:28:05 +00002633/**
2634 * Test Capability::SKIP_VALIDATE
2635 *
2636 * Capability::SKIP_VALIDATE has been deprecated and should not be enabled.
2637 */
2638TEST_P(GraphicsComposerAidlCommandTest, SkipValidateDeprecatedTest) {
ramindani17c71102023-03-20 10:51:14 -07002639 if (getInterfaceVersion() <= 1) {
Carlos Martinez Romerocd043612023-01-05 22:28:05 +00002640 GTEST_SUCCEED() << "HAL at version 1 or lower can contain Capability::SKIP_VALIDATE.";
2641 return;
2642 }
2643 ASSERT_FALSE(hasCapability(Capability::SKIP_VALIDATE))
2644 << "Found Capability::SKIP_VALIDATE capability.";
2645}
2646
ramindanidcfe3a82021-11-29 17:00:31 +00002647GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlCommandTest);
2648INSTANTIATE_TEST_SUITE_P(
2649 PerInstance, GraphicsComposerAidlCommandTest,
2650 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
2651 ::android::PrintInstanceNameToString);
2652
ramindanid32ae8e2021-10-01 18:48:39 +00002653GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlTest);
2654INSTANTIATE_TEST_SUITE_P(
2655 PerInstance, GraphicsComposerAidlTest,
2656 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
2657 ::android::PrintInstanceNameToString);
2658} // namespace
2659} // namespace aidl::android::hardware::graphics::composer3::vts
2660
2661int main(int argc, char** argv) {
2662 ::testing::InitGoogleTest(&argc, argv);
2663
2664 using namespace std::chrono_literals;
2665 if (!android::base::WaitForProperty("init.svc.surfaceflinger", "stopped", 10s)) {
2666 ALOGE("Failed to stop init.svc.surfaceflinger");
2667 return -1;
2668 }
ramindanibeea10e2021-12-07 21:02:49 +00002669
2670 android::ProcessState::self()->setThreadPoolMaxThreadCount(4);
2671
2672 // The binder threadpool we start will inherit sched policy and priority
2673 // of (this) creating thread. We want the binder thread pool to have
2674 // SCHED_FIFO policy and priority 1 (lowest RT priority)
2675 // Once the pool is created we reset this thread's priority back to
2676 // original.
2677 // This thread policy is based on what we do in the SurfaceFlinger while starting
2678 // the thread pool and we need to replicate that for the VTS tests.
2679 int newPriority = 0;
2680 int origPolicy = sched_getscheduler(0);
2681 struct sched_param origSchedParam;
2682
2683 int errorInPriorityModification = sched_getparam(0, &origSchedParam);
2684 if (errorInPriorityModification == 0) {
2685 int policy = SCHED_FIFO;
2686 newPriority = sched_get_priority_min(policy);
2687
2688 struct sched_param param;
2689 param.sched_priority = newPriority;
2690
2691 errorInPriorityModification = sched_setscheduler(0, policy, &param);
2692 }
2693
2694 // start the thread pool
2695 android::ProcessState::self()->startThreadPool();
2696
2697 // Reset current thread's policy and priority
2698 if (errorInPriorityModification == 0) {
2699 errorInPriorityModification = sched_setscheduler(0, origPolicy, &origSchedParam);
2700 } else {
2701 ALOGE("Failed to set VtsHalGraphicsComposer3_TargetTest binder threadpool priority to "
2702 "SCHED_FIFO");
2703 }
2704
ramindanid32ae8e2021-10-01 18:48:39 +00002705 return RUN_ALL_TESTS();
Leon Scroggins III45095052023-03-23 18:23:15 -04002706}