blob: 7b852e029d8aed9ac3b9a80c94a1461db21a1ce9 [file] [log] [blame]
ramindani431aad42022-02-01 21:44:29 +00001/**
2 * Copyright (c) 2022, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Sally Qi2600d342022-08-16 12:46:17 -070016
ramindanid32ae8e2021-10-01 18:48:39 +000017#include <aidl/Gtest.h>
18#include <aidl/Vintf.h>
Ady Abraham3192f3d2021-12-03 16:08:56 -080019#include <aidl/android/hardware/graphics/common/BlendMode.h>
ramindani3335f7a2021-10-25 17:22:35 +000020#include <aidl/android/hardware/graphics/common/BufferUsage.h>
21#include <aidl/android/hardware/graphics/common/FRect.h>
Leon Scroggins IIIde057582022-01-13 12:26:00 -050022#include <aidl/android/hardware/graphics/common/PixelFormat.h>
ramindani3335f7a2021-10-25 17:22:35 +000023#include <aidl/android/hardware/graphics/common/Rect.h>
ramindani3335f7a2021-10-25 17:22:35 +000024#include <aidl/android/hardware/graphics/composer3/Composition.h>
ramindanid32ae8e2021-10-01 18:48:39 +000025#include <aidl/android/hardware/graphics/composer3/IComposer.h>
26#include <android-base/properties.h>
ramindania9780262021-10-01 18:48:39 +000027#include <android/binder_process.h>
Ady Abraham91c9d1a2021-12-15 18:14:45 -080028#include <android/hardware/graphics/composer3/ComposerClientReader.h>
29#include <android/hardware/graphics/composer3/ComposerClientWriter.h>
ramindanid32ae8e2021-10-01 18:48:39 +000030#include <binder/ProcessState.h>
31#include <gtest/gtest.h>
Ady Abraham72c5b502021-12-10 17:23:39 -080032#include <ui/Fence.h>
ramindani3335f7a2021-10-25 17:22:35 +000033#include <ui/GraphicBuffer.h>
34#include <ui/PixelFormat.h>
ramindani0291f112021-11-04 03:45:46 +000035#include <algorithm>
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -040036#include <iterator>
ramindani592b6512021-10-08 21:15:19 +000037#include <numeric>
ramindanid32ae8e2021-10-01 18:48:39 +000038#include <string>
ramindani1cb794e2021-10-13 20:45:23 +000039#include <thread>
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -040040#include <unordered_map>
ramindani458e53e2022-02-23 17:30:16 +000041#include "GraphicsComposerCallback.h"
42#include "VtsComposerClient.h"
ramindani3335f7a2021-10-25 17:22:35 +000043
ramindanid32ae8e2021-10-01 18:48:39 +000044#undef LOG_TAG
45#define LOG_TAG "VtsHalGraphicsComposer3_TargetTest"
46
47namespace aidl::android::hardware::graphics::composer3::vts {
48namespace {
49
ramindani1cb794e2021-10-13 20:45:23 +000050using namespace std::chrono_literals;
51
ramindanidcfe3a82021-11-29 17:00:31 +000052using ::android::GraphicBuffer;
53using ::android::sp;
54
ramindanid32ae8e2021-10-01 18:48:39 +000055class GraphicsComposerAidlTest : public ::testing::TestWithParam<std::string> {
ramindania9780262021-10-01 18:48:39 +000056 protected:
57 void SetUp() override {
ramindani431aad42022-02-01 21:44:29 +000058 mComposerClient = std::make_unique<VtsComposerClient>(GetParam());
59 ASSERT_TRUE(mComposerClient->createClient().isOk());
Jason Macnake531a092022-01-20 08:49:09 -080060
ramindani431aad42022-02-01 21:44:29 +000061 const auto& [status, displays] = mComposerClient->getDisplays();
Jason Macnake531a092022-01-20 08:49:09 -080062 ASSERT_TRUE(status.isOk());
ramindani431aad42022-02-01 21:44:29 +000063 mDisplays = displays;
ramindanidcfe3a82021-11-29 17:00:31 +000064
ramindani3335f7a2021-10-25 17:22:35 +000065 // explicitly disable vsync
66 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +000067 EXPECT_TRUE(mComposerClient->setVsync(display.getDisplayId(), false).isOk());
ramindani3335f7a2021-10-25 17:22:35 +000068 }
ramindani431aad42022-02-01 21:44:29 +000069 mComposerClient->setVsyncAllowed(false);
ramindania9780262021-10-01 18:48:39 +000070 }
71
ramindani3335f7a2021-10-25 17:22:35 +000072 void TearDown() override {
ramindani431aad42022-02-01 21:44:29 +000073 ASSERT_TRUE(mComposerClient->tearDown());
74 mComposerClient.reset();
ramindani3335f7a2021-10-25 17:22:35 +000075 }
ramindanic2b8d082021-11-06 02:03:50 +000076
ramindanid5751092022-04-22 22:30:20 +000077 void assertServiceSpecificError(const ScopedAStatus& status, int32_t serviceSpecificError) {
78 ASSERT_EQ(status.getExceptionCode(), EX_SERVICE_SPECIFIC);
79 ASSERT_EQ(status.getServiceSpecificError(), serviceSpecificError);
80 }
81
ramindani431aad42022-02-01 21:44:29 +000082 void Test_setContentTypeForDisplay(int64_t display,
83 const std::vector<ContentType>& supportedContentTypes,
84 ContentType contentType, const char* contentTypeStr) {
85 const bool contentTypeSupport =
86 std::find(supportedContentTypes.begin(), supportedContentTypes.end(),
87 contentType) != supportedContentTypes.end();
ramindanidcfe3a82021-11-29 17:00:31 +000088
89 if (!contentTypeSupport) {
ramindani431aad42022-02-01 21:44:29 +000090 const auto& status = mComposerClient->setContentType(display, contentType);
91 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +000092 EXPECT_NO_FATAL_FAILURE(
93 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindanidcfe3a82021-11-29 17:00:31 +000094 GTEST_SUCCEED() << contentTypeStr << " content type is not supported on display "
95 << std::to_string(display) << ", skipping test";
96 return;
97 }
98
99 EXPECT_TRUE(mComposerClient->setContentType(display, contentType).isOk());
100 EXPECT_TRUE(mComposerClient->setContentType(display, ContentType::NONE).isOk());
101 }
102
ramindani431aad42022-02-01 21:44:29 +0000103 void Test_setContentType(ContentType contentType, const char* contentTypeStr) {
ramindanidcfe3a82021-11-29 17:00:31 +0000104 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000105 const auto& [status, supportedContentTypes] =
106 mComposerClient->getSupportedContentTypes(display.getDisplayId());
107 EXPECT_TRUE(status.isOk());
108 Test_setContentTypeForDisplay(display.getDisplayId(), supportedContentTypes,
109 contentType, contentTypeStr);
ramindanidcfe3a82021-11-29 17:00:31 +0000110 }
111 }
112
Jason Macnak325e8232022-01-24 14:48:55 -0800113 bool hasCapability(Capability capability) {
ramindani431aad42022-02-01 21:44:29 +0000114 const auto& [status, capabilities] = mComposerClient->getCapabilities();
115 EXPECT_TRUE(status.isOk());
Jason Macnak325e8232022-01-24 14:48:55 -0800116 return std::any_of(
117 capabilities.begin(), capabilities.end(),
118 [&](const Capability& activeCapability) { return activeCapability == capability; });
119 }
120
ramindani431aad42022-02-01 21:44:29 +0000121 const VtsDisplay& getPrimaryDisplay() const { return mDisplays[0]; }
ramindania9780262021-10-01 18:48:39 +0000122
ramindani431aad42022-02-01 21:44:29 +0000123 int64_t getPrimaryDisplayId() const { return getPrimaryDisplay().getDisplayId(); }
ramindania9780262021-10-01 18:48:39 +0000124
ramindani431aad42022-02-01 21:44:29 +0000125 int64_t getInvalidDisplayId() const { return mComposerClient->getInvalidDisplayId(); }
ramindani1cb794e2021-10-13 20:45:23 +0000126
ramindani431aad42022-02-01 21:44:29 +0000127 VtsDisplay& getEditablePrimaryDisplay() { return mDisplays[0]; }
ramindani0291f112021-11-04 03:45:46 +0000128
ramindani3335f7a2021-10-25 17:22:35 +0000129 struct TestParameters {
130 nsecs_t delayForChange;
131 bool refreshMiss;
132 };
133
ramindani431aad42022-02-01 21:44:29 +0000134 std::unique_ptr<VtsComposerClient> mComposerClient;
ramindani1cb794e2021-10-13 20:45:23 +0000135 std::vector<VtsDisplay> mDisplays;
ramindani3335f7a2021-10-25 17:22:35 +0000136 // use the slot count usually set by SF
137 static constexpr uint32_t kBufferSlotCount = 64;
ramindanid32ae8e2021-10-01 18:48:39 +0000138};
139
ramindani431aad42022-02-01 21:44:29 +0000140TEST_P(GraphicsComposerAidlTest, GetDisplayCapabilities_BadDisplay) {
141 const auto& [status, _] = mComposerClient->getDisplayCapabilities(getInvalidDisplayId());
ramindani5f696942021-10-14 16:24:18 +0000142
ramindani431aad42022-02-01 21:44:29 +0000143 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000144 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindania9780262021-10-01 18:48:39 +0000145}
146
ramindani431aad42022-02-01 21:44:29 +0000147TEST_P(GraphicsComposerAidlTest, GetDisplayCapabilities) {
ramindania9780262021-10-01 18:48:39 +0000148 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000149 const auto& [status, capabilities] =
150 mComposerClient->getDisplayCapabilities(display.getDisplayId());
ramindania9780262021-10-01 18:48:39 +0000151
ramindani431aad42022-02-01 21:44:29 +0000152 EXPECT_TRUE(status.isOk());
ramindania9780262021-10-01 18:48:39 +0000153 }
ramindanid32ae8e2021-10-01 18:48:39 +0000154}
155
ramindani2740bac2021-11-24 22:58:32 +0000156TEST_P(GraphicsComposerAidlTest, DumpDebugInfo) {
ramindani431aad42022-02-01 21:44:29 +0000157 ASSERT_TRUE(mComposerClient->dumpDebugInfo().isOk());
ramindani2740bac2021-11-24 22:58:32 +0000158}
159
160TEST_P(GraphicsComposerAidlTest, CreateClientSingleton) {
161 std::shared_ptr<IComposerClient> composerClient;
ramindani431aad42022-02-01 21:44:29 +0000162 const auto& status = mComposerClient->createClient();
ramindani2740bac2021-11-24 22:58:32 +0000163
ramindani431aad42022-02-01 21:44:29 +0000164 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000165 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_NO_RESOURCES));
ramindani2740bac2021-11-24 22:58:32 +0000166}
167
ramindani592b6512021-10-08 21:15:19 +0000168TEST_P(GraphicsComposerAidlTest, GetDisplayIdentificationData) {
ramindani431aad42022-02-01 21:44:29 +0000169 const auto& [status0, displayIdentification0] =
170 mComposerClient->getDisplayIdentificationData(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000171 if (!status0.isOk() && status0.getExceptionCode() == EX_SERVICE_SPECIFIC &&
172 status0.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani431aad42022-02-01 21:44:29 +0000173 GTEST_SUCCEED() << "Display identification data not supported, skipping test";
ramindani592b6512021-10-08 21:15:19 +0000174 return;
175 }
ramindani431aad42022-02-01 21:44:29 +0000176 ASSERT_TRUE(status0.isOk()) << "failed to get display identification data";
ramindani592b6512021-10-08 21:15:19 +0000177 ASSERT_FALSE(displayIdentification0.data.empty());
178
179 constexpr size_t kEdidBlockSize = 128;
180 ASSERT_TRUE(displayIdentification0.data.size() % kEdidBlockSize == 0)
181 << "EDID blob length is not a multiple of " << kEdidBlockSize;
182
183 const uint8_t kEdidHeader[] = {0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00};
184 ASSERT_TRUE(std::equal(std::begin(kEdidHeader), std::end(kEdidHeader),
185 displayIdentification0.data.begin()))
186 << "EDID blob doesn't start with the fixed EDID header";
187 ASSERT_EQ(0, std::accumulate(displayIdentification0.data.begin(),
188 displayIdentification0.data.begin() + kEdidBlockSize,
189 static_cast<uint8_t>(0)))
190 << "EDID base block doesn't checksum";
191
ramindani431aad42022-02-01 21:44:29 +0000192 const auto& [status1, displayIdentification1] =
193 mComposerClient->getDisplayIdentificationData(getPrimaryDisplayId());
194 ASSERT_TRUE(status1.isOk());
ramindani592b6512021-10-08 21:15:19 +0000195
196 ASSERT_EQ(displayIdentification0.port, displayIdentification1.port) << "ports are not stable";
197 ASSERT_TRUE(displayIdentification0.data.size() == displayIdentification1.data.size() &&
198 std::equal(displayIdentification0.data.begin(), displayIdentification0.data.end(),
199 displayIdentification1.data.begin()))
200 << "data is not stable";
201}
202
203TEST_P(GraphicsComposerAidlTest, GetHdrCapabilities) {
ramindani431aad42022-02-01 21:44:29 +0000204 const auto& [status, hdrCapabilities] =
205 mComposerClient->getHdrCapabilities(getPrimaryDisplayId());
ramindani592b6512021-10-08 21:15:19 +0000206
ramindani431aad42022-02-01 21:44:29 +0000207 ASSERT_TRUE(status.isOk());
208 EXPECT_TRUE(hdrCapabilities.maxLuminance >= hdrCapabilities.minLuminance);
ramindani592b6512021-10-08 21:15:19 +0000209}
210
211TEST_P(GraphicsComposerAidlTest, GetPerFrameMetadataKeys) {
ramindani431aad42022-02-01 21:44:29 +0000212 const auto& [status, keys] = mComposerClient->getPerFrameMetadataKeys(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000213 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
214 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindanic2b8d082021-11-06 02:03:50 +0000215 GTEST_SUCCEED() << "getPerFrameMetadataKeys is not supported";
216 return;
ramindani592b6512021-10-08 21:15:19 +0000217 }
ramindani431aad42022-02-01 21:44:29 +0000218
219 ASSERT_TRUE(status.isOk());
220 EXPECT_TRUE(keys.size() >= 0);
ramindani592b6512021-10-08 21:15:19 +0000221}
222
223TEST_P(GraphicsComposerAidlTest, GetReadbackBufferAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000224 const auto& [status, _] = mComposerClient->getReadbackBufferAttributes(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000225 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
226 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani431aad42022-02-01 21:44:29 +0000227 GTEST_SUCCEED() << "getReadbackBufferAttributes is not supported";
228 return;
ramindani592b6512021-10-08 21:15:19 +0000229 }
ramindani431aad42022-02-01 21:44:29 +0000230
231 ASSERT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000232}
233
234TEST_P(GraphicsComposerAidlTest, GetRenderIntents) {
ramindani431aad42022-02-01 21:44:29 +0000235 const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
236 EXPECT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000237
ramindani431aad42022-02-01 21:44:29 +0000238 for (auto mode : modes) {
239 const auto& [intentStatus, intents] =
240 mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
241 EXPECT_TRUE(intentStatus.isOk());
ramindani592b6512021-10-08 21:15:19 +0000242 bool isHdr;
243 switch (mode) {
244 case ColorMode::BT2100_PQ:
245 case ColorMode::BT2100_HLG:
246 isHdr = true;
247 break;
248 default:
249 isHdr = false;
250 break;
251 }
252 RenderIntent requiredIntent =
253 isHdr ? RenderIntent::TONE_MAP_COLORIMETRIC : RenderIntent::COLORIMETRIC;
254
ramindani431aad42022-02-01 21:44:29 +0000255 const auto iter = std::find(intents.cbegin(), intents.cend(), requiredIntent);
ramindani592b6512021-10-08 21:15:19 +0000256 EXPECT_NE(intents.cend(), iter);
257 }
258}
259
ramindani431aad42022-02-01 21:44:29 +0000260TEST_P(GraphicsComposerAidlTest, GetRenderIntents_BadDisplay) {
261 const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
262 ASSERT_TRUE(status.isOk());
263
ramindani592b6512021-10-08 21:15:19 +0000264 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000265 const auto& [intentStatus, _] =
266 mComposerClient->getRenderIntents(getInvalidDisplayId(), mode);
267
268 EXPECT_FALSE(intentStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000269 EXPECT_NO_FATAL_FAILURE(
270 assertServiceSpecificError(intentStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani592b6512021-10-08 21:15:19 +0000271 }
272}
273
ramindani431aad42022-02-01 21:44:29 +0000274TEST_P(GraphicsComposerAidlTest, GetRenderIntents_BadParameter) {
275 const auto& [status, _] =
276 mComposerClient->getRenderIntents(getPrimaryDisplayId(), static_cast<ColorMode>(-1));
277
278 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000279 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindani592b6512021-10-08 21:15:19 +0000280}
281
282TEST_P(GraphicsComposerAidlTest, GetColorModes) {
ramindani431aad42022-02-01 21:44:29 +0000283 const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
284 ASSERT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000285
ramindani431aad42022-02-01 21:44:29 +0000286 const auto native = std::find(colorModes.cbegin(), colorModes.cend(), ColorMode::NATIVE);
287 EXPECT_NE(colorModes.cend(), native);
ramindani592b6512021-10-08 21:15:19 +0000288}
289
ramindani431aad42022-02-01 21:44:29 +0000290TEST_P(GraphicsComposerAidlTest, GetColorMode_BadDisplay) {
291 const auto& [status, _] = mComposerClient->getColorModes(getInvalidDisplayId());
ramindani592b6512021-10-08 21:15:19 +0000292
ramindani431aad42022-02-01 21:44:29 +0000293 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000294 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani592b6512021-10-08 21:15:19 +0000295}
296
297TEST_P(GraphicsComposerAidlTest, SetColorMode) {
ramindani431aad42022-02-01 21:44:29 +0000298 const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
299 EXPECT_TRUE(status.isOk());
300
ramindani592b6512021-10-08 21:15:19 +0000301 for (auto mode : colorModes) {
ramindani431aad42022-02-01 21:44:29 +0000302 const auto& [intentStatus, intents] =
303 mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
304 EXPECT_TRUE(intentStatus.isOk()) << "failed to get render intents";
305
ramindani592b6512021-10-08 21:15:19 +0000306 for (auto intent : intents) {
ramindani431aad42022-02-01 21:44:29 +0000307 const auto modeStatus =
308 mComposerClient->setColorMode(getPrimaryDisplayId(), mode, intent);
309 EXPECT_TRUE(modeStatus.isOk() ||
ramindanid5751092022-04-22 22:30:20 +0000310 (modeStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
311 IComposerClient::EX_UNSUPPORTED == modeStatus.getServiceSpecificError()))
ramindani592b6512021-10-08 21:15:19 +0000312 << "failed to set color mode";
313 }
314 }
315
ramindani431aad42022-02-01 21:44:29 +0000316 const auto modeStatus = mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE,
317 RenderIntent::COLORIMETRIC);
318 EXPECT_TRUE(modeStatus.isOk() ||
ramindanid5751092022-04-22 22:30:20 +0000319 (modeStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
320 IComposerClient::EX_UNSUPPORTED == modeStatus.getServiceSpecificError()))
ramindani592b6512021-10-08 21:15:19 +0000321 << "failed to set color mode";
322}
323
ramindani431aad42022-02-01 21:44:29 +0000324TEST_P(GraphicsComposerAidlTest, SetColorMode_BadDisplay) {
325 const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
326 ASSERT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000327
ramindani431aad42022-02-01 21:44:29 +0000328 for (auto mode : colorModes) {
329 const auto& [intentStatus, intents] =
330 mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
331 ASSERT_TRUE(intentStatus.isOk()) << "failed to get render intents";
332
333 for (auto intent : intents) {
334 auto const modeStatus =
335 mComposerClient->setColorMode(getInvalidDisplayId(), mode, intent);
336
337 EXPECT_FALSE(modeStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000338 EXPECT_NO_FATAL_FAILURE(
339 assertServiceSpecificError(modeStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani770d7082021-11-30 00:36:42 +0000340 }
341 }
ramindani592b6512021-10-08 21:15:19 +0000342}
343
ramindani431aad42022-02-01 21:44:29 +0000344TEST_P(GraphicsComposerAidlTest, SetColorMode_BadParameter) {
345 auto status = mComposerClient->setColorMode(getPrimaryDisplayId(), static_cast<ColorMode>(-1),
346 RenderIntent::COLORIMETRIC);
ramindani592b6512021-10-08 21:15:19 +0000347
ramindani431aad42022-02-01 21:44:29 +0000348 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000349 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindani592b6512021-10-08 21:15:19 +0000350
ramindani431aad42022-02-01 21:44:29 +0000351 status = mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE,
352 static_cast<RenderIntent>(-1));
ramindani592b6512021-10-08 21:15:19 +0000353
ramindani431aad42022-02-01 21:44:29 +0000354 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000355 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindani592b6512021-10-08 21:15:19 +0000356}
357
358TEST_P(GraphicsComposerAidlTest, GetDisplayedContentSamplingAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000359 int constexpr kInvalid = -1;
360 const auto& [status, format] =
361 mComposerClient->getDisplayedContentSamplingAttributes(getPrimaryDisplayId());
ramindani592b6512021-10-08 21:15:19 +0000362
ramindanid5751092022-04-22 22:30:20 +0000363 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
364 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani592b6512021-10-08 21:15:19 +0000365 SUCCEED() << "Device does not support optional extension. Test skipped";
366 return;
367 }
368
ramindani431aad42022-02-01 21:44:29 +0000369 ASSERT_TRUE(status.isOk());
370 EXPECT_NE(kInvalid, static_cast<int>(format.format));
371 EXPECT_NE(kInvalid, static_cast<int>(format.dataspace));
372 EXPECT_NE(kInvalid, static_cast<int>(format.componentMask));
ramindani592b6512021-10-08 21:15:19 +0000373};
374
375TEST_P(GraphicsComposerAidlTest, SetDisplayedContentSamplingEnabled) {
ramindani431aad42022-02-01 21:44:29 +0000376 int constexpr kMaxFrames = 10;
ramindani592b6512021-10-08 21:15:19 +0000377 FormatColorComponent enableAllComponents = FormatColorComponent::FORMAT_COMPONENT_0;
ramindani431aad42022-02-01 21:44:29 +0000378 auto status = mComposerClient->setDisplayedContentSamplingEnabled(
379 getPrimaryDisplayId(), /*isEnabled*/ true, enableAllComponents, kMaxFrames);
ramindanid5751092022-04-22 22:30:20 +0000380 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
381 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani592b6512021-10-08 21:15:19 +0000382 SUCCEED() << "Device does not support optional extension. Test skipped";
383 return;
384 }
ramindani431aad42022-02-01 21:44:29 +0000385 EXPECT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000386
ramindani431aad42022-02-01 21:44:29 +0000387 status = mComposerClient->setDisplayedContentSamplingEnabled(
388 getPrimaryDisplayId(), /*isEnabled*/ false, enableAllComponents, kMaxFrames);
389 EXPECT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000390}
391
392TEST_P(GraphicsComposerAidlTest, GetDisplayedContentSample) {
ramindani431aad42022-02-01 21:44:29 +0000393 const auto& [status, displayContentSamplingAttributes] =
394 mComposerClient->getDisplayedContentSamplingAttributes(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000395 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
396 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindanideb059e2021-11-18 01:57:25 +0000397 SUCCEED() << "Sampling attributes aren't supported on this device, test skipped";
398 return;
399 }
ramindani592b6512021-10-08 21:15:19 +0000400
ramindani431aad42022-02-01 21:44:29 +0000401 int64_t constexpr kMaxFrames = 10;
402 int64_t constexpr kTimestamp = 0;
403 const auto& [sampleStatus, displayContentSample] = mComposerClient->getDisplayedContentSample(
404 getPrimaryDisplayId(), kMaxFrames, kTimestamp);
ramindanid5751092022-04-22 22:30:20 +0000405 if (!sampleStatus.isOk() && sampleStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
ramindani431aad42022-02-01 21:44:29 +0000406 sampleStatus.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani592b6512021-10-08 21:15:19 +0000407 SUCCEED() << "Device does not support optional extension. Test skipped";
408 return;
409 }
410
ramindani431aad42022-02-01 21:44:29 +0000411 EXPECT_TRUE(sampleStatus.isOk());
412 const std::vector<std::vector<int64_t>> histogram = {
ramindani592b6512021-10-08 21:15:19 +0000413 displayContentSample.sampleComponent0, displayContentSample.sampleComponent1,
414 displayContentSample.sampleComponent2, displayContentSample.sampleComponent3};
415
ramindani3335f7a2021-10-25 17:22:35 +0000416 for (size_t i = 0; i < histogram.size(); i++) {
417 const bool shouldHaveHistogram =
418 static_cast<int>(displayContentSamplingAttributes.componentMask) & (1 << i);
419 EXPECT_EQ(shouldHaveHistogram, !histogram[i].empty());
ramindani592b6512021-10-08 21:15:19 +0000420 }
421}
422
ramindani431aad42022-02-01 21:44:29 +0000423TEST_P(GraphicsComposerAidlTest, GetDisplayConnectionType) {
424 const auto& [status, type] = mComposerClient->getDisplayConnectionType(getInvalidDisplayId());
425
426 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000427 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani431aad42022-02-01 21:44:29 +0000428
ramindani0291f112021-11-04 03:45:46 +0000429 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000430 const auto& [connectionTypeStatus, _] =
431 mComposerClient->getDisplayConnectionType(display.getDisplayId());
432 EXPECT_TRUE(connectionTypeStatus.isOk());
ramindani0291f112021-11-04 03:45:46 +0000433 }
434}
435
ramindani431aad42022-02-01 21:44:29 +0000436TEST_P(GraphicsComposerAidlTest, GetDisplayAttribute) {
ramindani0291f112021-11-04 03:45:46 +0000437 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000438 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
439 EXPECT_TRUE(status.isOk());
440
ramindani0291f112021-11-04 03:45:46 +0000441 for (const auto& config : configs) {
442 const std::array<DisplayAttribute, 4> requiredAttributes = {{
443 DisplayAttribute::WIDTH,
444 DisplayAttribute::HEIGHT,
445 DisplayAttribute::VSYNC_PERIOD,
446 DisplayAttribute::CONFIG_GROUP,
447 }};
ramindani0291f112021-11-04 03:45:46 +0000448 for (const auto& attribute : requiredAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000449 const auto& [attribStatus, value] = mComposerClient->getDisplayAttribute(
450 display.getDisplayId(), config, attribute);
451 EXPECT_TRUE(attribStatus.isOk());
ramindani0291f112021-11-04 03:45:46 +0000452 EXPECT_NE(-1, value);
453 }
454
455 const std::array<DisplayAttribute, 2> optionalAttributes = {{
456 DisplayAttribute::DPI_X,
457 DisplayAttribute::DPI_Y,
458 }};
459 for (const auto& attribute : optionalAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000460 const auto& [attribStatus, value] = mComposerClient->getDisplayAttribute(
461 display.getDisplayId(), config, attribute);
ramindanid5751092022-04-22 22:30:20 +0000462 EXPECT_TRUE(attribStatus.isOk() ||
463 (attribStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
464 IComposerClient::EX_UNSUPPORTED ==
465 attribStatus.getServiceSpecificError()));
ramindani0291f112021-11-04 03:45:46 +0000466 }
467 }
468 }
469}
470
ramindani431aad42022-02-01 21:44:29 +0000471TEST_P(GraphicsComposerAidlTest, CheckConfigsAreValid) {
ramindani0291f112021-11-04 03:45:46 +0000472 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000473 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
474 EXPECT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000475
476 EXPECT_FALSE(std::any_of(configs.begin(), configs.end(), [](auto config) {
477 return config == IComposerClient::INVALID_CONFIGURATION;
478 }));
479 }
480}
481
ramindani431aad42022-02-01 21:44:29 +0000482TEST_P(GraphicsComposerAidlTest, GetDisplayVsyncPeriod_BadDisplay) {
483 const auto& [status, vsyncPeriodNanos] =
484 mComposerClient->getDisplayVsyncPeriod(getInvalidDisplayId());
485
486 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000487 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000488}
489
ramindani431aad42022-02-01 21:44:29 +0000490TEST_P(GraphicsComposerAidlTest, SetActiveConfigWithConstraints_BadDisplay) {
ramindani0291f112021-11-04 03:45:46 +0000491 VsyncPeriodChangeConstraints constraints;
ramindani0291f112021-11-04 03:45:46 +0000492 constraints.seamlessRequired = false;
493 constraints.desiredTimeNanos = systemTime();
ramindani431aad42022-02-01 21:44:29 +0000494 auto invalidDisplay = VtsDisplay(getInvalidDisplayId());
ramindani0291f112021-11-04 03:45:46 +0000495
ramindani431aad42022-02-01 21:44:29 +0000496 const auto& [status, timeline] = mComposerClient->setActiveConfigWithConstraints(
497 &invalidDisplay, /*config*/ 0, constraints);
498
499 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000500 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000501}
502
ramindani431aad42022-02-01 21:44:29 +0000503TEST_P(GraphicsComposerAidlTest, SetActiveConfigWithConstraints_BadConfig) {
ramindani0291f112021-11-04 03:45:46 +0000504 VsyncPeriodChangeConstraints constraints;
ramindani0291f112021-11-04 03:45:46 +0000505 constraints.seamlessRequired = false;
506 constraints.desiredTimeNanos = systemTime();
507
508 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000509 int32_t constexpr kInvalidConfigId = IComposerClient::INVALID_CONFIGURATION;
510 const auto& [status, _] = mComposerClient->setActiveConfigWithConstraints(
511 &display, kInvalidConfigId, constraints);
512
513 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000514 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_CONFIG));
ramindani0291f112021-11-04 03:45:46 +0000515 }
516}
517
ramindani431aad42022-02-01 21:44:29 +0000518TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig_BadDisplay) {
ramindani476314c2022-03-16 00:17:08 +0000519 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
520 GTEST_SUCCEED() << "Boot Display Config not supported";
521 return;
522 }
ramindani431aad42022-02-01 21:44:29 +0000523 const auto& status = mComposerClient->setBootDisplayConfig(getInvalidDisplayId(), /*config*/ 0);
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100524
ramindani431aad42022-02-01 21:44:29 +0000525 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000526 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100527}
528
ramindani431aad42022-02-01 21:44:29 +0000529TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig_BadConfig) {
ramindani476314c2022-03-16 00:17:08 +0000530 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
531 GTEST_SUCCEED() << "Boot Display Config not supported";
532 return;
533 }
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100534 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000535 int32_t constexpr kInvalidConfigId = IComposerClient::INVALID_CONFIGURATION;
536 const auto& status =
537 mComposerClient->setBootDisplayConfig(display.getDisplayId(), kInvalidConfigId);
538
539 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000540 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_CONFIG));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100541 }
542}
543
ramindani431aad42022-02-01 21:44:29 +0000544TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig) {
ramindani476314c2022-03-16 00:17:08 +0000545 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
546 GTEST_SUCCEED() << "Boot Display Config not supported";
547 return;
548 }
ramindani431aad42022-02-01 21:44:29 +0000549 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
550 EXPECT_TRUE(status.isOk());
551 for (const auto& config : configs) {
552 EXPECT_TRUE(mComposerClient->setBootDisplayConfig(getPrimaryDisplayId(), config).isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100553 }
554}
555
ramindani431aad42022-02-01 21:44:29 +0000556TEST_P(GraphicsComposerAidlTest, ClearBootDisplayConfig_BadDisplay) {
ramindani476314c2022-03-16 00:17:08 +0000557 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
558 GTEST_SUCCEED() << "Boot Display Config not supported";
559 return;
560 }
ramindani431aad42022-02-01 21:44:29 +0000561 const auto& status = mComposerClient->clearBootDisplayConfig(getInvalidDisplayId());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100562
ramindani431aad42022-02-01 21:44:29 +0000563 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000564 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100565}
566
ramindani431aad42022-02-01 21:44:29 +0000567TEST_P(GraphicsComposerAidlTest, ClearBootDisplayConfig) {
ramindani476314c2022-03-16 00:17:08 +0000568 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
569 GTEST_SUCCEED() << "Boot Display Config not supported";
570 return;
571 }
ramindani431aad42022-02-01 21:44:29 +0000572 EXPECT_TRUE(mComposerClient->clearBootDisplayConfig(getPrimaryDisplayId()).isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100573}
574
ramindani431aad42022-02-01 21:44:29 +0000575TEST_P(GraphicsComposerAidlTest, GetPreferredBootDisplayConfig_BadDisplay) {
ramindani476314c2022-03-16 00:17:08 +0000576 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
577 GTEST_SUCCEED() << "Boot Display Config not supported";
578 return;
579 }
ramindani431aad42022-02-01 21:44:29 +0000580 const auto& [status, _] = mComposerClient->getPreferredBootDisplayConfig(getInvalidDisplayId());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100581
ramindani431aad42022-02-01 21:44:29 +0000582 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000583 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100584}
585
ramindani431aad42022-02-01 21:44:29 +0000586TEST_P(GraphicsComposerAidlTest, GetPreferredBootDisplayConfig) {
ramindani476314c2022-03-16 00:17:08 +0000587 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
588 GTEST_SUCCEED() << "Boot Display Config not supported";
589 return;
590 }
ramindani431aad42022-02-01 21:44:29 +0000591 const auto& [status, preferredDisplayConfig] =
592 mComposerClient->getPreferredBootDisplayConfig(getPrimaryDisplayId());
593 EXPECT_TRUE(status.isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100594
ramindani431aad42022-02-01 21:44:29 +0000595 const auto& [configStatus, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
596
597 EXPECT_TRUE(configStatus.isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100598 EXPECT_NE(configs.end(), std::find(configs.begin(), configs.end(), preferredDisplayConfig));
599}
600
ramindani476314c2022-03-16 00:17:08 +0000601TEST_P(GraphicsComposerAidlTest, BootDisplayConfig_Unsupported) {
602 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
603 const auto& [configStatus, config] =
604 mComposerClient->getActiveConfig(getPrimaryDisplayId());
605 EXPECT_TRUE(configStatus.isOk());
606
607 auto status = mComposerClient->setBootDisplayConfig(getPrimaryDisplayId(), config);
608 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000609 EXPECT_NO_FATAL_FAILURE(
610 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani476314c2022-03-16 00:17:08 +0000611
612 status = mComposerClient->getPreferredBootDisplayConfig(getPrimaryDisplayId()).first;
613 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000614 EXPECT_NO_FATAL_FAILURE(
615 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani476314c2022-03-16 00:17:08 +0000616
617 status = mComposerClient->clearBootDisplayConfig(getPrimaryDisplayId());
618 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000619 EXPECT_NO_FATAL_FAILURE(
620 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani476314c2022-03-16 00:17:08 +0000621 }
622}
623
ramindani431aad42022-02-01 21:44:29 +0000624TEST_P(GraphicsComposerAidlTest, SetAutoLowLatencyMode_BadDisplay) {
625 auto status = mComposerClient->setAutoLowLatencyMode(getInvalidDisplayId(), /*isEnabled*/ true);
626 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000627 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani431aad42022-02-01 21:44:29 +0000628
629 status = mComposerClient->setAutoLowLatencyMode(getInvalidDisplayId(), /*isEnabled*/ false);
630 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000631 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000632}
633
ramindani431aad42022-02-01 21:44:29 +0000634TEST_P(GraphicsComposerAidlTest, SetAutoLowLatencyMode) {
ramindani0291f112021-11-04 03:45:46 +0000635 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000636 const auto& [status, capabilities] =
637 mComposerClient->getDisplayCapabilities(display.getDisplayId());
638 ASSERT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000639
640 const bool allmSupport =
641 std::find(capabilities.begin(), capabilities.end(),
642 DisplayCapability::AUTO_LOW_LATENCY_MODE) != capabilities.end();
643
644 if (!allmSupport) {
ramindani431aad42022-02-01 21:44:29 +0000645 const auto& statusIsOn = mComposerClient->setAutoLowLatencyMode(display.getDisplayId(),
646 /*isEnabled*/ true);
647 EXPECT_FALSE(statusIsOn.isOk());
ramindanid5751092022-04-22 22:30:20 +0000648 EXPECT_NO_FATAL_FAILURE(
649 assertServiceSpecificError(statusIsOn, IComposerClient::EX_UNSUPPORTED));
ramindani431aad42022-02-01 21:44:29 +0000650 const auto& statusIsOff = mComposerClient->setAutoLowLatencyMode(display.getDisplayId(),
651 /*isEnabled*/ false);
652 EXPECT_FALSE(statusIsOff.isOk());
ramindanid5751092022-04-22 22:30:20 +0000653 EXPECT_NO_FATAL_FAILURE(
654 assertServiceSpecificError(statusIsOff, IComposerClient::EX_UNSUPPORTED));
ramindani0291f112021-11-04 03:45:46 +0000655 GTEST_SUCCEED() << "Auto Low Latency Mode is not supported on display "
ramindani431aad42022-02-01 21:44:29 +0000656 << std::to_string(display.getDisplayId()) << ", skipping test";
ramindani0291f112021-11-04 03:45:46 +0000657 return;
658 }
659
ramindani431aad42022-02-01 21:44:29 +0000660 EXPECT_TRUE(mComposerClient->setAutoLowLatencyMode(display.getDisplayId(), true).isOk());
661 EXPECT_TRUE(mComposerClient->setAutoLowLatencyMode(display.getDisplayId(), false).isOk());
ramindani0291f112021-11-04 03:45:46 +0000662 }
663}
664
ramindani431aad42022-02-01 21:44:29 +0000665TEST_P(GraphicsComposerAidlTest, GetSupportedContentTypes_BadDisplay) {
666 const auto& [status, _] = mComposerClient->getSupportedContentTypes(getInvalidDisplayId());
667
668 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000669 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000670}
671
ramindani431aad42022-02-01 21:44:29 +0000672TEST_P(GraphicsComposerAidlTest, GetSupportedContentTypes) {
ramindani0291f112021-11-04 03:45:46 +0000673 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000674 const auto& [status, supportedContentTypes] =
675 mComposerClient->getSupportedContentTypes(display.getDisplayId());
676 ASSERT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000677
678 const bool noneSupported =
679 std::find(supportedContentTypes.begin(), supportedContentTypes.end(),
680 ContentType::NONE) != supportedContentTypes.end();
ramindani431aad42022-02-01 21:44:29 +0000681
ramindani0291f112021-11-04 03:45:46 +0000682 EXPECT_FALSE(noneSupported);
683 }
684}
685
ramindani431aad42022-02-01 21:44:29 +0000686TEST_P(GraphicsComposerAidlTest, SetContentTypeNoneAlwaysAccepted) {
ramindani0291f112021-11-04 03:45:46 +0000687 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000688 EXPECT_TRUE(
689 mComposerClient->setContentType(display.getDisplayId(), ContentType::NONE).isOk());
ramindani0291f112021-11-04 03:45:46 +0000690 }
691}
692
ramindani431aad42022-02-01 21:44:29 +0000693TEST_P(GraphicsComposerAidlTest, SetContentType_BadDisplay) {
ramindani0291f112021-11-04 03:45:46 +0000694 constexpr ContentType types[] = {ContentType::NONE, ContentType::GRAPHICS, ContentType::PHOTO,
695 ContentType::CINEMA, ContentType::GAME};
696 for (const auto& type : types) {
ramindani431aad42022-02-01 21:44:29 +0000697 const auto& status = mComposerClient->setContentType(getInvalidDisplayId(), type);
ramindani0291f112021-11-04 03:45:46 +0000698
ramindani431aad42022-02-01 21:44:29 +0000699 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000700 EXPECT_NO_FATAL_FAILURE(
701 assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000702 }
703}
704
ramindani431aad42022-02-01 21:44:29 +0000705TEST_P(GraphicsComposerAidlTest, SetGraphicsContentType) {
ramindani0291f112021-11-04 03:45:46 +0000706 Test_setContentType(ContentType::GRAPHICS, "GRAPHICS");
707}
708
ramindani431aad42022-02-01 21:44:29 +0000709TEST_P(GraphicsComposerAidlTest, SetPhotoContentType) {
ramindani0291f112021-11-04 03:45:46 +0000710 Test_setContentType(ContentType::PHOTO, "PHOTO");
711}
712
ramindani431aad42022-02-01 21:44:29 +0000713TEST_P(GraphicsComposerAidlTest, SetCinemaContentType) {
ramindani0291f112021-11-04 03:45:46 +0000714 Test_setContentType(ContentType::CINEMA, "CINEMA");
715}
716
ramindani431aad42022-02-01 21:44:29 +0000717TEST_P(GraphicsComposerAidlTest, SetGameContentType) {
ramindani0291f112021-11-04 03:45:46 +0000718 Test_setContentType(ContentType::GAME, "GAME");
719}
720
ramindanic2b8d082021-11-06 02:03:50 +0000721TEST_P(GraphicsComposerAidlTest, CreateVirtualDisplay) {
ramindani431aad42022-02-01 21:44:29 +0000722 const auto& [status, maxVirtualDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
723 EXPECT_TRUE(status.isOk());
724
ramindanic2b8d082021-11-06 02:03:50 +0000725 if (maxVirtualDisplayCount == 0) {
726 GTEST_SUCCEED() << "no virtual display support";
727 return;
728 }
729
ramindani431aad42022-02-01 21:44:29 +0000730 const auto& [virtualDisplayStatus, virtualDisplay] = mComposerClient->createVirtualDisplay(
731 /*width*/ 64, /*height*/ 64, common::PixelFormat::IMPLEMENTATION_DEFINED,
732 kBufferSlotCount);
ramindanic2b8d082021-11-06 02:03:50 +0000733
ramindani431aad42022-02-01 21:44:29 +0000734 ASSERT_TRUE(virtualDisplayStatus.isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000735 EXPECT_TRUE(mComposerClient->destroyVirtualDisplay(virtualDisplay.display).isOk());
736}
737
ramindani431aad42022-02-01 21:44:29 +0000738TEST_P(GraphicsComposerAidlTest, DestroyVirtualDisplay_BadDisplay) {
739 const auto& [status, maxDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
740 EXPECT_TRUE(status.isOk());
741
ramindani2740bac2021-11-24 22:58:32 +0000742 if (maxDisplayCount == 0) {
743 GTEST_SUCCEED() << "no virtual display support";
744 return;
745 }
ramindani2740bac2021-11-24 22:58:32 +0000746
ramindani431aad42022-02-01 21:44:29 +0000747 const auto& destroyStatus = mComposerClient->destroyVirtualDisplay(getInvalidDisplayId());
748
749 EXPECT_FALSE(destroyStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000750 EXPECT_NO_FATAL_FAILURE(
751 assertServiceSpecificError(destroyStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000752}
753
754TEST_P(GraphicsComposerAidlTest, CreateLayer) {
ramindani431aad42022-02-01 21:44:29 +0000755 const auto& [status, layer] =
756 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
ramindani2740bac2021-11-24 22:58:32 +0000757
ramindani431aad42022-02-01 21:44:29 +0000758 EXPECT_TRUE(status.isOk());
759 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000760}
761
ramindani431aad42022-02-01 21:44:29 +0000762TEST_P(GraphicsComposerAidlTest, CreateLayer_BadDisplay) {
763 const auto& [status, _] = mComposerClient->createLayer(getInvalidDisplayId(), kBufferSlotCount);
ramindani2740bac2021-11-24 22:58:32 +0000764
ramindani431aad42022-02-01 21:44:29 +0000765 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000766 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000767}
768
ramindani431aad42022-02-01 21:44:29 +0000769TEST_P(GraphicsComposerAidlTest, DestroyLayer_BadDisplay) {
770 const auto& [status, layer] =
771 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
772 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000773
ramindani431aad42022-02-01 21:44:29 +0000774 const auto& destroyStatus = mComposerClient->destroyLayer(getInvalidDisplayId(), layer);
ramindani2740bac2021-11-24 22:58:32 +0000775
ramindani431aad42022-02-01 21:44:29 +0000776 EXPECT_FALSE(destroyStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000777 EXPECT_NO_FATAL_FAILURE(
778 assertServiceSpecificError(destroyStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani431aad42022-02-01 21:44:29 +0000779 ASSERT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000780}
781
ramindani431aad42022-02-01 21:44:29 +0000782TEST_P(GraphicsComposerAidlTest, DestroyLayer_BadLayerError) {
ramindani2740bac2021-11-24 22:58:32 +0000783 // We haven't created any layers yet, so any id should be invalid
ramindani431aad42022-02-01 21:44:29 +0000784 const auto& status = mComposerClient->destroyLayer(getPrimaryDisplayId(), /*layer*/ 1);
ramindani2740bac2021-11-24 22:58:32 +0000785
ramindani431aad42022-02-01 21:44:29 +0000786 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000787 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_LAYER));
ramindani2740bac2021-11-24 22:58:32 +0000788}
789
ramindani431aad42022-02-01 21:44:29 +0000790TEST_P(GraphicsComposerAidlTest, GetActiveConfig_BadDisplay) {
791 const auto& [status, _] = mComposerClient->getActiveConfig(getInvalidDisplayId());
ramindani2740bac2021-11-24 22:58:32 +0000792
ramindani431aad42022-02-01 21:44:29 +0000793 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000794 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000795}
796
797TEST_P(GraphicsComposerAidlTest, GetDisplayConfig) {
ramindani431aad42022-02-01 21:44:29 +0000798 const auto& [status, _] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
799 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000800}
801
ramindani431aad42022-02-01 21:44:29 +0000802TEST_P(GraphicsComposerAidlTest, GetDisplayConfig_BadDisplay) {
803 const auto& [status, _] = mComposerClient->getDisplayConfigs(getInvalidDisplayId());
ramindani2740bac2021-11-24 22:58:32 +0000804
ramindani431aad42022-02-01 21:44:29 +0000805 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000806 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000807}
808
809TEST_P(GraphicsComposerAidlTest, GetDisplayName) {
ramindani431aad42022-02-01 21:44:29 +0000810 const auto& [status, _] = mComposerClient->getDisplayName(getPrimaryDisplayId());
811 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000812}
813
Sally Qi8ec063f2022-11-12 11:18:56 -0800814TEST_P(GraphicsComposerAidlTest, GetOverlaySupport) {
Sally Qi2600d342022-08-16 12:46:17 -0700815 const auto& [status, _] = mComposerClient->getOverlaySupport();
816 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
817 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
818 GTEST_SUCCEED() << "getOverlaySupport is not supported";
819 return;
820 }
821
822 ASSERT_TRUE(status.isOk());
823}
824
ramindani431aad42022-02-01 21:44:29 +0000825TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation_BadDisplay) {
826 const auto& [status, _] = mComposerClient->getDisplayPhysicalOrientation(getInvalidDisplayId());
Ady Abrahamae12e382022-01-13 18:06:21 -0800827
ramindani431aad42022-02-01 21:44:29 +0000828 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000829 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Ady Abrahamae12e382022-01-13 18:06:21 -0800830}
831
832TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation) {
833 const auto allowedDisplayOrientations = std::array<Transform, 4>{
834 Transform::NONE,
835 Transform::ROT_90,
836 Transform::ROT_180,
837 Transform::ROT_270,
838 };
839
ramindani431aad42022-02-01 21:44:29 +0000840 const auto& [status, displayOrientation] =
841 mComposerClient->getDisplayPhysicalOrientation(getPrimaryDisplayId());
Ady Abrahamae12e382022-01-13 18:06:21 -0800842
ramindani431aad42022-02-01 21:44:29 +0000843 EXPECT_TRUE(status.isOk());
Ady Abrahamae12e382022-01-13 18:06:21 -0800844 EXPECT_NE(std::find(allowedDisplayOrientations.begin(), allowedDisplayOrientations.end(),
845 displayOrientation),
846 allowedDisplayOrientations.end());
847}
848
ramindani2740bac2021-11-24 22:58:32 +0000849TEST_P(GraphicsComposerAidlTest, SetClientTargetSlotCount) {
ramindani431aad42022-02-01 21:44:29 +0000850 EXPECT_TRUE(mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kBufferSlotCount)
851 .isOk());
ramindani2740bac2021-11-24 22:58:32 +0000852}
853
854TEST_P(GraphicsComposerAidlTest, SetActiveConfig) {
ramindani431aad42022-02-01 21:44:29 +0000855 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
856 EXPECT_TRUE(status.isOk());
857
858 for (const auto& config : configs) {
859 auto display = getEditablePrimaryDisplay();
860 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
861 const auto& [configStatus, config1] =
862 mComposerClient->getActiveConfig(getPrimaryDisplayId());
863 EXPECT_TRUE(configStatus.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000864 EXPECT_EQ(config, config1);
865 }
866}
867
868TEST_P(GraphicsComposerAidlTest, SetActiveConfigPowerCycle) {
ramindani431aad42022-02-01 21:44:29 +0000869 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
870 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000871
ramindani431aad42022-02-01 21:44:29 +0000872 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
873 EXPECT_TRUE(status.isOk());
874
875 for (const auto& config : configs) {
876 auto display = getEditablePrimaryDisplay();
877 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
878 const auto& [config1Status, config1] =
879 mComposerClient->getActiveConfig(getPrimaryDisplayId());
880 EXPECT_TRUE(config1Status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000881 EXPECT_EQ(config, config1);
882
ramindani431aad42022-02-01 21:44:29 +0000883 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
884 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
885 const auto& [config2Status, config2] =
886 mComposerClient->getActiveConfig(getPrimaryDisplayId());
887 EXPECT_TRUE(config2Status.isOk());
888 EXPECT_EQ(config, config2);
ramindani2740bac2021-11-24 22:58:32 +0000889 }
890}
891
ramindani2740bac2021-11-24 22:58:32 +0000892TEST_P(GraphicsComposerAidlTest, SetPowerModeUnsupported) {
ramindani431aad42022-02-01 21:44:29 +0000893 const auto& [status, capabilities] =
894 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
895 ASSERT_TRUE(status.isOk());
896
Ady Abraham6679baf2021-12-08 18:28:27 -0800897 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
898 DisplayCapability::DOZE) != capabilities.end();
899 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
900 DisplayCapability::SUSPEND) != capabilities.end();
ramindani2740bac2021-11-24 22:58:32 +0000901
ramindani431aad42022-02-01 21:44:29 +0000902 if (!isDozeSupported) {
903 const auto& powerModeDozeStatus =
904 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE);
905 EXPECT_FALSE(powerModeDozeStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000906 EXPECT_NO_FATAL_FAILURE(
907 assertServiceSpecificError(powerModeDozeStatus, IComposerClient::EX_UNSUPPORTED));
ramindani431aad42022-02-01 21:44:29 +0000908
909 const auto& powerModeDozeSuspendStatus =
910 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
911 EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000912 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeDozeSuspendStatus,
913 IComposerClient::EX_UNSUPPORTED));
ramindani2740bac2021-11-24 22:58:32 +0000914 }
Ady Abraham6679baf2021-12-08 18:28:27 -0800915
916 if (!isSuspendSupported) {
ramindani431aad42022-02-01 21:44:29 +0000917 const auto& powerModeSuspendStatus =
918 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON_SUSPEND);
919 EXPECT_FALSE(powerModeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000920 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeSuspendStatus,
921 IComposerClient::EX_UNSUPPORTED));
Ady Abraham6679baf2021-12-08 18:28:27 -0800922
ramindani431aad42022-02-01 21:44:29 +0000923 const auto& powerModeDozeSuspendStatus =
924 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
925 EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000926 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeDozeSuspendStatus,
927 IComposerClient::EX_UNSUPPORTED));
Ady Abraham6679baf2021-12-08 18:28:27 -0800928 }
ramindani2740bac2021-11-24 22:58:32 +0000929}
930
931TEST_P(GraphicsComposerAidlTest, SetVsyncEnabled) {
ramindani431aad42022-02-01 21:44:29 +0000932 mComposerClient->setVsyncAllowed(true);
ramindani2740bac2021-11-24 22:58:32 +0000933
ramindani431aad42022-02-01 21:44:29 +0000934 EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), true).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000935 usleep(60 * 1000);
ramindani431aad42022-02-01 21:44:29 +0000936 EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), false).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000937
ramindani431aad42022-02-01 21:44:29 +0000938 mComposerClient->setVsyncAllowed(false);
ramindani2740bac2021-11-24 22:58:32 +0000939}
940
ramindanic2b8d082021-11-06 02:03:50 +0000941TEST_P(GraphicsComposerAidlTest, SetPowerMode) {
ramindani431aad42022-02-01 21:44:29 +0000942 const auto& [status, capabilities] =
943 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
944 ASSERT_TRUE(status.isOk());
945
Ady Abraham6679baf2021-12-08 18:28:27 -0800946 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
947 DisplayCapability::DOZE) != capabilities.end();
948 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
949 DisplayCapability::SUSPEND) != capabilities.end();
950
ramindanic2b8d082021-11-06 02:03:50 +0000951 std::vector<PowerMode> modes;
952 modes.push_back(PowerMode::OFF);
ramindanic2b8d082021-11-06 02:03:50 +0000953 modes.push_back(PowerMode::ON);
954
Ady Abraham6679baf2021-12-08 18:28:27 -0800955 if (isSuspendSupported) {
956 modes.push_back(PowerMode::ON_SUSPEND);
957 }
958
ramindani770d7082021-11-30 00:36:42 +0000959 if (isDozeSupported) {
960 modes.push_back(PowerMode::DOZE);
Ady Abraham6679baf2021-12-08 18:28:27 -0800961 }
962
963 if (isSuspendSupported && isDozeSupported) {
ramindani770d7082021-11-30 00:36:42 +0000964 modes.push_back(PowerMode::DOZE_SUSPEND);
965 }
966
ramindanic2b8d082021-11-06 02:03:50 +0000967 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000968 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000969 }
970}
971
972TEST_P(GraphicsComposerAidlTest, SetPowerModeVariations) {
ramindani431aad42022-02-01 21:44:29 +0000973 const auto& [status, capabilities] =
974 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
975 ASSERT_TRUE(status.isOk());
976
Ady Abraham6679baf2021-12-08 18:28:27 -0800977 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
978 DisplayCapability::DOZE) != capabilities.end();
979 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
980 DisplayCapability::SUSPEND) != capabilities.end();
981
ramindanic2b8d082021-11-06 02:03:50 +0000982 std::vector<PowerMode> modes;
983
984 modes.push_back(PowerMode::OFF);
ramindani770d7082021-11-30 00:36:42 +0000985 modes.push_back(PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +0000986 modes.push_back(PowerMode::OFF);
ramindanic2b8d082021-11-06 02:03:50 +0000987 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000988 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000989 }
ramindani770d7082021-11-30 00:36:42 +0000990 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +0000991
ramindani770d7082021-11-30 00:36:42 +0000992 modes.push_back(PowerMode::OFF);
993 modes.push_back(PowerMode::OFF);
994 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000995 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindani770d7082021-11-30 00:36:42 +0000996 }
ramindanic2b8d082021-11-06 02:03:50 +0000997 modes.clear();
998
999 modes.push_back(PowerMode::ON);
1000 modes.push_back(PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +00001001 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001002 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001003 }
ramindanic2b8d082021-11-06 02:03:50 +00001004 modes.clear();
1005
Ady Abraham6679baf2021-12-08 18:28:27 -08001006 if (isSuspendSupported) {
1007 modes.push_back(PowerMode::ON_SUSPEND);
1008 modes.push_back(PowerMode::ON_SUSPEND);
1009 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001010 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
Ady Abraham6679baf2021-12-08 18:28:27 -08001011 }
1012 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +00001013 }
1014
ramindanic2b8d082021-11-06 02:03:50 +00001015 if (isDozeSupported) {
ramindanic2b8d082021-11-06 02:03:50 +00001016 modes.push_back(PowerMode::DOZE);
1017 modes.push_back(PowerMode::DOZE);
ramindanic2b8d082021-11-06 02:03:50 +00001018 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001019 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001020 }
ramindanic2b8d082021-11-06 02:03:50 +00001021 modes.clear();
Ady Abraham6679baf2021-12-08 18:28:27 -08001022 }
ramindanic2b8d082021-11-06 02:03:50 +00001023
Ady Abraham6679baf2021-12-08 18:28:27 -08001024 if (isSuspendSupported && isDozeSupported) {
ramindanic2b8d082021-11-06 02:03:50 +00001025 modes.push_back(PowerMode::DOZE_SUSPEND);
1026 modes.push_back(PowerMode::DOZE_SUSPEND);
ramindanic2b8d082021-11-06 02:03:50 +00001027 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001028 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001029 }
Ady Abraham6679baf2021-12-08 18:28:27 -08001030 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +00001031 }
1032}
1033
ramindani431aad42022-02-01 21:44:29 +00001034TEST_P(GraphicsComposerAidlTest, SetPowerMode_BadDisplay) {
1035 const auto& status = mComposerClient->setPowerMode(getInvalidDisplayId(), PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +00001036
ramindani431aad42022-02-01 21:44:29 +00001037 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001038 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindanic2b8d082021-11-06 02:03:50 +00001039}
1040
ramindani431aad42022-02-01 21:44:29 +00001041TEST_P(GraphicsComposerAidlTest, SetPowerMode_BadParameter) {
1042 const auto& status =
1043 mComposerClient->setPowerMode(getPrimaryDisplayId(), static_cast<PowerMode>(-1));
ramindanic2b8d082021-11-06 02:03:50 +00001044
ramindani431aad42022-02-01 21:44:29 +00001045 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001046 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanic2b8d082021-11-06 02:03:50 +00001047}
1048
ramindanic2b8d082021-11-06 02:03:50 +00001049TEST_P(GraphicsComposerAidlTest, GetDataspaceSaturationMatrix) {
ramindani431aad42022-02-01 21:44:29 +00001050 const auto& [status, matrix] =
1051 mComposerClient->getDataspaceSaturationMatrix(common::Dataspace::SRGB_LINEAR);
1052 ASSERT_TRUE(status.isOk());
1053 ASSERT_EQ(16, matrix.size()); // matrix should not be empty if call succeeded.
ramindanideb059e2021-11-18 01:57:25 +00001054
ramindanic2b8d082021-11-06 02:03:50 +00001055 // the last row is known
ramindani431aad42022-02-01 21:44:29 +00001056 EXPECT_EQ(0.0f, matrix[12]);
1057 EXPECT_EQ(0.0f, matrix[13]);
1058 EXPECT_EQ(0.0f, matrix[14]);
1059 EXPECT_EQ(1.0f, matrix[15]);
ramindanic2b8d082021-11-06 02:03:50 +00001060}
1061
ramindani431aad42022-02-01 21:44:29 +00001062TEST_P(GraphicsComposerAidlTest, GetDataspaceSaturationMatrix_BadParameter) {
1063 const auto& [status, matrix] =
1064 mComposerClient->getDataspaceSaturationMatrix(common::Dataspace::UNKNOWN);
ramindanic2b8d082021-11-06 02:03:50 +00001065
ramindani431aad42022-02-01 21:44:29 +00001066 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001067 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanic2b8d082021-11-06 02:03:50 +00001068}
1069
ramindanidcfe3a82021-11-29 17:00:31 +00001070// Tests for Command.
1071class GraphicsComposerAidlCommandTest : public GraphicsComposerAidlTest {
1072 protected:
ramindanidcfe3a82021-11-29 17:00:31 +00001073 void TearDown() override {
Ady Abraham3192f3d2021-12-03 16:08:56 -08001074 const auto errors = mReader.takeErrors();
1075 ASSERT_TRUE(mReader.takeErrors().empty());
ramindani431aad42022-02-01 21:44:29 +00001076 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001077
ramindanidcfe3a82021-11-29 17:00:31 +00001078 ASSERT_NO_FATAL_FAILURE(GraphicsComposerAidlTest::TearDown());
1079 }
1080
1081 void execute() {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001082 std::vector<CommandResultPayload> payloads;
1083 for (auto& [_, writer] : mWriters) {
1084 const auto& commands = writer.getPendingCommands();
1085 if (commands.empty()) {
1086 writer.reset();
1087 continue;
1088 }
1089
1090 auto [status, results] = mComposerClient->executeCommands(commands);
1091 ASSERT_TRUE(status.isOk()) << "executeCommands failed " << status.getDescription();
1092 writer.reset();
1093
1094 payloads.reserve(payloads.size() + results.size());
1095 payloads.insert(payloads.end(), std::make_move_iterator(results.begin()),
1096 std::make_move_iterator(results.end()));
ramindanidcfe3a82021-11-29 17:00:31 +00001097 }
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001098 mReader.parse(std::move(payloads));
ramindanidcfe3a82021-11-29 17:00:31 +00001099 }
1100
1101 static inline auto toTimePoint(nsecs_t time) {
1102 return std::chrono::time_point<std::chrono::steady_clock>(std::chrono::nanoseconds(time));
1103 }
1104
ramindanidcfe3a82021-11-29 17:00:31 +00001105 void forEachTwoConfigs(int64_t display, std::function<void(int32_t, int32_t)> func) {
ramindani431aad42022-02-01 21:44:29 +00001106 const auto& [status, displayConfigs] = mComposerClient->getDisplayConfigs(display);
1107 ASSERT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001108 for (const int32_t config1 : displayConfigs) {
1109 for (const int32_t config2 : displayConfigs) {
1110 if (config1 != config2) {
1111 func(config1, config2);
1112 }
1113 }
1114 }
1115 }
1116
1117 void waitForVsyncPeriodChange(int64_t display, const VsyncPeriodChangeTimeline& timeline,
1118 int64_t desiredTimeNanos, int64_t oldPeriodNanos,
1119 int64_t newPeriodNanos) {
1120 const auto kChangeDeadline = toTimePoint(timeline.newVsyncAppliedTimeNanos) + 100ms;
1121 while (std::chrono::steady_clock::now() <= kChangeDeadline) {
ramindani431aad42022-02-01 21:44:29 +00001122 const auto& [status, vsyncPeriodNanos] =
1123 mComposerClient->getDisplayVsyncPeriod(display);
1124 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001125 if (systemTime() <= desiredTimeNanos) {
1126 EXPECT_EQ(vsyncPeriodNanos, oldPeriodNanos);
1127 } else if (vsyncPeriodNanos == newPeriodNanos) {
1128 break;
1129 }
1130 std::this_thread::sleep_for(std::chrono::nanoseconds(oldPeriodNanos));
1131 }
1132 }
1133
Brian Lindahlca3eef22022-12-09 00:32:11 -07001134 sp<GraphicBuffer> allocate(uint32_t width, uint32_t height,
1135 ::android::PixelFormat pixelFormat) {
ramindanidcfe3a82021-11-29 17:00:31 +00001136 return sp<GraphicBuffer>::make(
Brian Lindahlca3eef22022-12-09 00:32:11 -07001137 width, height, pixelFormat, /*layerCount*/ 1U,
1138 static_cast<uint64_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
1139 static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
1140 static_cast<uint64_t>(common::BufferUsage::COMPOSER_OVERLAY),
ramindanidcfe3a82021-11-29 17:00:31 +00001141 "VtsHalGraphicsComposer3_TargetTest");
1142 }
1143
Brian Lindahlca3eef22022-12-09 00:32:11 -07001144 sp<GraphicBuffer> allocate(::android::PixelFormat pixelFormat) {
1145 return allocate(static_cast<uint32_t>(getPrimaryDisplay().getDisplayWidth()),
1146 static_cast<uint32_t>(getPrimaryDisplay().getDisplayHeight()), pixelFormat);
1147 }
1148
ramindanidcfe3a82021-11-29 17:00:31 +00001149 void sendRefreshFrame(const VtsDisplay& display, const VsyncPeriodChangeTimeline* timeline) {
1150 if (timeline != nullptr) {
1151 // Refresh time should be before newVsyncAppliedTimeNanos
1152 EXPECT_LT(timeline->refreshTimeNanos, timeline->newVsyncAppliedTimeNanos);
1153
1154 std::this_thread::sleep_until(toTimePoint(timeline->refreshTimeNanos));
1155 }
1156
ramindani431aad42022-02-01 21:44:29 +00001157 EXPECT_TRUE(mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::ON).isOk());
1158 EXPECT_TRUE(mComposerClient
1159 ->setColorMode(display.getDisplayId(), ColorMode::NATIVE,
1160 RenderIntent::COLORIMETRIC)
1161 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001162
ramindani431aad42022-02-01 21:44:29 +00001163 const auto& [status, layer] =
1164 mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount);
1165 EXPECT_TRUE(status.isOk());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001166 auto& writer = getWriter(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001167 {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001168 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindanidcfe3a82021-11-29 17:00:31 +00001169 ASSERT_NE(nullptr, buffer);
1170 ASSERT_EQ(::android::OK, buffer->initCheck());
1171 ASSERT_NE(nullptr, buffer->handle);
1172
ramindani431aad42022-02-01 21:44:29 +00001173 configureLayer(display, layer, Composition::DEVICE, display.getFrameRect(),
1174 display.getCrop());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001175 writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer->handle,
1176 /*acquireFence*/ -1);
1177 writer.setLayerDataspace(display.getDisplayId(), layer, common::Dataspace::UNKNOWN);
ramindanidcfe3a82021-11-29 17:00:31 +00001178
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001179 writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001180 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001181 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001182
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001183 writer.presentDisplay(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001184 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001185 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001186 }
1187
1188 {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001189 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindanidcfe3a82021-11-29 17:00:31 +00001190 ASSERT_NE(nullptr, buffer->handle);
1191
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001192 writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer->handle,
1193 /*acquireFence*/ -1);
1194 writer.setLayerSurfaceDamage(display.getDisplayId(), layer,
1195 std::vector<Rect>(1, {0, 0, 10, 10}));
1196 writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001197 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001198 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001199
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001200 writer.presentDisplay(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001201 execute();
1202 }
1203
ramindani431aad42022-02-01 21:44:29 +00001204 EXPECT_TRUE(mComposerClient->destroyLayer(display.getDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001205 }
1206
Ady Abraham72c5b502021-12-10 17:23:39 -08001207 sp<::android::Fence> presentAndGetFence(
1208 std::optional<ClockMonotonicTimestamp> expectedPresentTime) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001209 auto& writer = getWriter(getPrimaryDisplayId());
1210 writer.validateDisplay(getPrimaryDisplayId(), expectedPresentTime);
Ady Abraham72c5b502021-12-10 17:23:39 -08001211 execute();
1212 EXPECT_TRUE(mReader.takeErrors().empty());
1213
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001214 writer.presentDisplay(getPrimaryDisplayId());
Ady Abraham72c5b502021-12-10 17:23:39 -08001215 execute();
1216 EXPECT_TRUE(mReader.takeErrors().empty());
1217
ramindani431aad42022-02-01 21:44:29 +00001218 auto presentFence = mReader.takePresentFence(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -08001219 // take ownership
1220 const int fenceOwner = presentFence.get();
1221 *presentFence.getR() = -1;
1222 EXPECT_NE(-1, fenceOwner);
1223 return sp<::android::Fence>::make(fenceOwner);
Ady Abraham72c5b502021-12-10 17:23:39 -08001224 }
1225
1226 int32_t getVsyncPeriod() {
ramindani431aad42022-02-01 21:44:29 +00001227 const auto& [status, activeConfig] =
1228 mComposerClient->getActiveConfig(getPrimaryDisplayId());
1229 EXPECT_TRUE(status.isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001230
ramindani431aad42022-02-01 21:44:29 +00001231 const auto& [vsyncPeriodStatus, vsyncPeriod] = mComposerClient->getDisplayAttribute(
1232 getPrimaryDisplayId(), activeConfig, DisplayAttribute::VSYNC_PERIOD);
1233 EXPECT_TRUE(vsyncPeriodStatus.isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001234 return vsyncPeriod;
1235 }
1236
1237 int64_t createOnScreenLayer() {
ramindani431aad42022-02-01 21:44:29 +00001238 const auto& [status, layer] =
1239 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1240 EXPECT_TRUE(status.isOk());
1241 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1242 getPrimaryDisplay().getDisplayHeight()};
1243 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1244 (float)getPrimaryDisplay().getDisplayHeight()};
1245 configureLayer(getPrimaryDisplay(), layer, Composition::DEVICE, displayFrame, cropRect);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001246 auto& writer = getWriter(getPrimaryDisplayId());
1247 writer.setLayerDataspace(getPrimaryDisplayId(), layer, common::Dataspace::UNKNOWN);
Ady Abraham72c5b502021-12-10 17:23:39 -08001248 return layer;
1249 }
1250
Midas Chiena0b56bd2022-01-13 23:27:33 +08001251 bool hasDisplayCapability(int64_t display, DisplayCapability cap) {
ramindani431aad42022-02-01 21:44:29 +00001252 const auto& [status, capabilities] = mComposerClient->getDisplayCapabilities(display);
1253 EXPECT_TRUE(status.isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08001254
1255 return std::find(capabilities.begin(), capabilities.end(), cap) != capabilities.end();
1256 }
1257
ramindanidcfe3a82021-11-29 17:00:31 +00001258 void Test_setActiveConfigWithConstraints(const TestParameters& params) {
1259 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00001260 forEachTwoConfigs(display.getDisplayId(), [&](int32_t config1, int32_t config2) {
1261 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001262 sendRefreshFrame(display, nullptr);
1263
ramindani431aad42022-02-01 21:44:29 +00001264 const auto displayConfigGroup1 = display.getDisplayConfig(config1);
1265 int32_t vsyncPeriod1 = displayConfigGroup1.vsyncPeriod;
1266 int32_t configGroup1 = displayConfigGroup1.configGroup;
1267
1268 const auto displayConfigGroup2 = display.getDisplayConfig(config2);
1269 int32_t vsyncPeriod2 = displayConfigGroup2.vsyncPeriod;
1270 int32_t configGroup2 = displayConfigGroup2.configGroup;
ramindanidcfe3a82021-11-29 17:00:31 +00001271
1272 if (vsyncPeriod1 == vsyncPeriod2) {
1273 return; // continue
1274 }
1275
1276 // We don't allow delayed change when changing config groups
1277 if (params.delayForChange > 0 && configGroup1 != configGroup2) {
1278 return; // continue
1279 }
1280
ramindanidcfe3a82021-11-29 17:00:31 +00001281 VsyncPeriodChangeConstraints constraints = {
1282 .desiredTimeNanos = systemTime() + params.delayForChange,
1283 .seamlessRequired = false};
ramindani431aad42022-02-01 21:44:29 +00001284 const auto& [status, timeline] = mComposerClient->setActiveConfigWithConstraints(
1285 &display, config2, constraints);
1286 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001287
1288 EXPECT_TRUE(timeline.newVsyncAppliedTimeNanos >= constraints.desiredTimeNanos);
1289 // Refresh rate should change within a reasonable time
1290 constexpr std::chrono::nanoseconds kReasonableTimeForChange = 1s; // 1 second
1291 EXPECT_TRUE(timeline.newVsyncAppliedTimeNanos - constraints.desiredTimeNanos <=
1292 kReasonableTimeForChange.count());
1293
1294 if (timeline.refreshRequired) {
1295 if (params.refreshMiss) {
1296 // Miss the refresh frame on purpose to make sure the implementation sends a
1297 // callback
1298 std::this_thread::sleep_until(toTimePoint(timeline.refreshTimeNanos) +
1299 100ms);
1300 }
1301 sendRefreshFrame(display, &timeline);
1302 }
ramindani431aad42022-02-01 21:44:29 +00001303 waitForVsyncPeriodChange(display.getDisplayId(), timeline,
1304 constraints.desiredTimeNanos, vsyncPeriod1, vsyncPeriod2);
ramindanidcfe3a82021-11-29 17:00:31 +00001305
1306 // At this point the refresh rate should have changed already, however in rare
1307 // cases the implementation might have missed the deadline. In this case a new
1308 // timeline should have been provided.
ramindani431aad42022-02-01 21:44:29 +00001309 auto newTimeline = mComposerClient->takeLastVsyncPeriodChangeTimeline();
ramindanidcfe3a82021-11-29 17:00:31 +00001310 if (timeline.refreshRequired && params.refreshMiss) {
1311 EXPECT_TRUE(newTimeline.has_value());
1312 }
1313
1314 if (newTimeline.has_value()) {
1315 if (newTimeline->refreshRequired) {
1316 sendRefreshFrame(display, &newTimeline.value());
1317 }
ramindani431aad42022-02-01 21:44:29 +00001318 waitForVsyncPeriodChange(display.getDisplayId(), newTimeline.value(),
ramindanidcfe3a82021-11-29 17:00:31 +00001319 constraints.desiredTimeNanos, vsyncPeriod1,
1320 vsyncPeriod2);
1321 }
1322
ramindani431aad42022-02-01 21:44:29 +00001323 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanos] =
1324 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
1325 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001326 EXPECT_EQ(vsyncPeriodNanos, vsyncPeriod2);
1327 });
1328 }
1329 }
1330
Ady Abraham72c5b502021-12-10 17:23:39 -08001331 void Test_expectedPresentTime(std::optional<int> framesDelay) {
Jason Macnak325e8232022-01-24 14:48:55 -08001332 if (hasCapability(Capability::PRESENT_FENCE_IS_NOT_RELIABLE)) {
1333 GTEST_SUCCEED() << "Device has unreliable present fences capability, skipping";
1334 return;
1335 }
1336
ramindani431aad42022-02-01 21:44:29 +00001337 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001338
1339 const auto vsyncPeriod = getVsyncPeriod();
1340
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001341 const auto buffer1 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1342 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
Ady Abraham72c5b502021-12-10 17:23:39 -08001343 ASSERT_NE(nullptr, buffer1);
1344 ASSERT_NE(nullptr, buffer2);
1345
1346 const auto layer = createOnScreenLayer();
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001347 auto& writer = getWriter(getPrimaryDisplayId());
1348 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer1->handle,
1349 /*acquireFence*/ -1);
Ady Abraham72c5b502021-12-10 17:23:39 -08001350 const sp<::android::Fence> presentFence1 =
1351 presentAndGetFence(ComposerClientWriter::kNoTimestamp);
1352 presentFence1->waitForever(LOG_TAG);
1353
1354 auto expectedPresentTime = presentFence1->getSignalTime() + vsyncPeriod;
1355 if (framesDelay.has_value()) {
1356 expectedPresentTime += *framesDelay * vsyncPeriod;
1357 }
1358
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001359 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer2->handle,
1360 /*acquireFence*/ -1);
Ady Abraham72c5b502021-12-10 17:23:39 -08001361 const auto setExpectedPresentTime = [&]() -> std::optional<ClockMonotonicTimestamp> {
1362 if (!framesDelay.has_value()) {
1363 return ComposerClientWriter::kNoTimestamp;
1364 } else if (*framesDelay == 0) {
1365 return ClockMonotonicTimestamp{0};
1366 }
1367 return ClockMonotonicTimestamp{expectedPresentTime};
1368 }();
1369
1370 const sp<::android::Fence> presentFence2 = presentAndGetFence(setExpectedPresentTime);
1371 presentFence2->waitForever(LOG_TAG);
1372
1373 const auto actualPresentTime = presentFence2->getSignalTime();
Ady Abrahamdf084f32022-01-10 14:10:23 -08001374 EXPECT_GE(actualPresentTime, expectedPresentTime - vsyncPeriod / 2);
Ady Abraham72c5b502021-12-10 17:23:39 -08001375
ramindani431aad42022-02-01 21:44:29 +00001376 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001377 }
1378
ramindani431aad42022-02-01 21:44:29 +00001379 void configureLayer(const VtsDisplay& display, int64_t layer, Composition composition,
1380 const Rect& displayFrame, const FRect& cropRect) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001381 auto& writer = getWriter(display.getDisplayId());
1382 writer.setLayerCompositionType(display.getDisplayId(), layer, composition);
1383 writer.setLayerDisplayFrame(display.getDisplayId(), layer, displayFrame);
1384 writer.setLayerPlaneAlpha(display.getDisplayId(), layer, /*alpha*/ 1);
1385 writer.setLayerSourceCrop(display.getDisplayId(), layer, cropRect);
1386 writer.setLayerTransform(display.getDisplayId(), layer, static_cast<Transform>(0));
1387 writer.setLayerVisibleRegion(display.getDisplayId(), layer,
1388 std::vector<Rect>(1, displayFrame));
1389 writer.setLayerZOrder(display.getDisplayId(), layer, /*z*/ 10);
1390 writer.setLayerBlendMode(display.getDisplayId(), layer, BlendMode::NONE);
1391 writer.setLayerSurfaceDamage(display.getDisplayId(), layer,
1392 std::vector<Rect>(1, displayFrame));
ramindani431aad42022-02-01 21:44:29 +00001393 }
ramindanidcfe3a82021-11-29 17:00:31 +00001394 // clang-format off
1395 const std::array<float, 16> kIdentity = {{
1396 1.0f, 0.0f, 0.0f, 0.0f,
1397 0.0f, 1.0f, 0.0f, 0.0f,
1398 0.0f, 0.0f, 1.0f, 0.0f,
1399 0.0f, 0.0f, 0.0f, 1.0f,
1400 }};
1401 // clang-format on
1402
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001403 ComposerClientWriter& getWriter(int64_t display) {
1404 auto [it, _] = mWriters.try_emplace(display, display);
1405 return it->second;
1406 }
1407
Ady Abraham91c9d1a2021-12-15 18:14:45 -08001408 ComposerClientReader mReader;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001409
1410 private:
1411 std::unordered_map<int64_t, ComposerClientWriter> mWriters;
ramindanidcfe3a82021-11-29 17:00:31 +00001412};
1413
ramindani431aad42022-02-01 21:44:29 +00001414TEST_P(GraphicsComposerAidlCommandTest, SetColorTransform) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001415 auto& writer = getWriter(getPrimaryDisplayId());
1416 writer.setColorTransform(getPrimaryDisplayId(), kIdentity.data());
ramindanidcfe3a82021-11-29 17:00:31 +00001417 execute();
1418}
1419
1420TEST_P(GraphicsComposerAidlCommandTest, SetLayerColorTransform) {
ramindani431aad42022-02-01 21:44:29 +00001421 const auto& [status, layer] =
1422 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1423 EXPECT_TRUE(status.isOk());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001424 auto& writer = getWriter(getPrimaryDisplayId());
1425 writer.setLayerColorTransform(getPrimaryDisplayId(), layer, kIdentity.data());
ramindanidcfe3a82021-11-29 17:00:31 +00001426 execute();
1427
Ady Abraham3192f3d2021-12-03 16:08:56 -08001428 const auto errors = mReader.takeErrors();
Jason Macnak062bc9a2022-01-20 15:00:09 -08001429 if (errors.size() == 1 && errors[0].errorCode == IComposerClient::EX_UNSUPPORTED) {
ramindanidcfe3a82021-11-29 17:00:31 +00001430 GTEST_SUCCEED() << "setLayerColorTransform is not supported";
1431 return;
1432 }
1433}
1434
Alec Mouri60564e12021-12-09 18:48:20 -08001435TEST_P(GraphicsComposerAidlCommandTest, SetDisplayBrightness) {
ramindani431aad42022-02-01 21:44:29 +00001436 const auto& [status, capabilities] =
1437 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
1438 ASSERT_TRUE(status.isOk());
Alec Mouri60564e12021-12-09 18:48:20 -08001439 bool brightnessSupport = std::find(capabilities.begin(), capabilities.end(),
1440 DisplayCapability::BRIGHTNESS) != capabilities.end();
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001441 auto& writer = getWriter(getPrimaryDisplayId());
Alec Mouri60564e12021-12-09 18:48:20 -08001442 if (!brightnessSupport) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001443 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.5f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001444 execute();
1445 const auto errors = mReader.takeErrors();
1446 EXPECT_EQ(1, errors.size());
Jason Macnak062bc9a2022-01-20 15:00:09 -08001447 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, errors[0].errorCode);
Alec Mouri60564e12021-12-09 18:48:20 -08001448 GTEST_SUCCEED() << "SetDisplayBrightness is not supported";
1449 return;
1450 }
1451
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001452 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001453 execute();
1454 EXPECT_TRUE(mReader.takeErrors().empty());
1455
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001456 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.5f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001457 execute();
1458 EXPECT_TRUE(mReader.takeErrors().empty());
1459
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001460 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 1.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001461 execute();
1462 EXPECT_TRUE(mReader.takeErrors().empty());
1463
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001464 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ -1.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001465 execute();
1466 EXPECT_TRUE(mReader.takeErrors().empty());
1467
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001468 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 2.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001469 execute();
1470 {
1471 const auto errors = mReader.takeErrors();
ramindanib3bdf052022-01-12 18:27:05 +00001472 ASSERT_EQ(1, errors.size());
Alec Mouri60564e12021-12-09 18:48:20 -08001473 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1474 }
1475
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001476 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ -2.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001477 execute();
1478 {
1479 const auto errors = mReader.takeErrors();
ramindanib3bdf052022-01-12 18:27:05 +00001480 ASSERT_EQ(1, errors.size());
Alec Mouri60564e12021-12-09 18:48:20 -08001481 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1482 }
1483}
1484
ramindani431aad42022-02-01 21:44:29 +00001485TEST_P(GraphicsComposerAidlCommandTest, SetClientTarget) {
1486 EXPECT_TRUE(mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kBufferSlotCount)
1487 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001488
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001489 auto& writer = getWriter(getPrimaryDisplayId());
1490 writer.setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, nullptr, /*acquireFence*/ -1,
1491 Dataspace::UNKNOWN, std::vector<Rect>());
ramindanidcfe3a82021-11-29 17:00:31 +00001492
1493 execute();
1494}
1495
ramindani431aad42022-02-01 21:44:29 +00001496TEST_P(GraphicsComposerAidlCommandTest, SetOutputBuffer) {
1497 const auto& [status, virtualDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
1498 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001499 if (virtualDisplayCount == 0) {
1500 GTEST_SUCCEED() << "no virtual display support";
1501 return;
1502 }
1503
ramindani431aad42022-02-01 21:44:29 +00001504 const auto& [displayStatus, display] = mComposerClient->createVirtualDisplay(
1505 /*width*/ 64, /*height*/ 64, common::PixelFormat::IMPLEMENTATION_DEFINED,
1506 kBufferSlotCount);
1507 EXPECT_TRUE(displayStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001508
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001509 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001510 const auto handle = buffer->handle;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001511 auto& writer = getWriter(display.display);
1512 writer.setOutputBuffer(display.display, /*slot*/ 0, handle, /*releaseFence*/ -1);
ramindanidcfe3a82021-11-29 17:00:31 +00001513 execute();
1514}
1515
ramindani431aad42022-02-01 21:44:29 +00001516TEST_P(GraphicsComposerAidlCommandTest, ValidDisplay) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001517 auto& writer = getWriter(getPrimaryDisplayId());
1518 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001519 execute();
1520}
1521
ramindani431aad42022-02-01 21:44:29 +00001522TEST_P(GraphicsComposerAidlCommandTest, AcceptDisplayChanges) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001523 auto& writer = getWriter(getPrimaryDisplayId());
1524 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1525 writer.acceptDisplayChanges(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001526 execute();
1527}
1528
ramindani431aad42022-02-01 21:44:29 +00001529TEST_P(GraphicsComposerAidlCommandTest, PresentDisplay) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001530 auto& writer = getWriter(getPrimaryDisplayId());
1531 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1532 writer.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001533 execute();
1534}
1535
1536/**
1537 * Test IComposerClient::Command::PRESENT_DISPLAY
1538 *
1539 * Test that IComposerClient::Command::PRESENT_DISPLAY works without
1540 * additional call to validateDisplay when only the layer buffer handle and
1541 * surface damage have been set
1542 */
ramindani431aad42022-02-01 21:44:29 +00001543TEST_P(GraphicsComposerAidlCommandTest, PresentDisplayNoLayerStateChanges) {
Jason Macnak325e8232022-01-24 14:48:55 -08001544 if (!hasCapability(Capability::SKIP_VALIDATE)) {
ramindanidcfe3a82021-11-29 17:00:31 +00001545 GTEST_SUCCEED() << "Device does not have skip validate capability, skipping";
1546 return;
1547 }
ramindani431aad42022-02-01 21:44:29 +00001548 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001549
ramindani431aad42022-02-01 21:44:29 +00001550 const auto& [renderIntentsStatus, renderIntents] =
1551 mComposerClient->getRenderIntents(getPrimaryDisplayId(), ColorMode::NATIVE);
1552 EXPECT_TRUE(renderIntentsStatus.isOk());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001553 auto& writer = getWriter(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001554 for (auto intent : renderIntents) {
ramindani431aad42022-02-01 21:44:29 +00001555 EXPECT_TRUE(mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE, intent)
1556 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001557
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001558 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001559 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001560 ASSERT_NE(nullptr, handle);
1561
ramindani431aad42022-02-01 21:44:29 +00001562 const auto& [layerStatus, layer] =
1563 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1564 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001565
ramindani431aad42022-02-01 21:44:29 +00001566 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1567 getPrimaryDisplay().getDisplayHeight()};
1568 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1569 (float)getPrimaryDisplay().getDisplayHeight()};
1570 configureLayer(getPrimaryDisplay(), layer, Composition::CURSOR, displayFrame, cropRect);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001571 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle,
1572 /*acquireFence*/ -1);
1573 writer.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1574 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001575 execute();
ramindani431aad42022-02-01 21:44:29 +00001576 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanidcfe3a82021-11-29 17:00:31 +00001577 GTEST_SUCCEED() << "Composition change requested, skipping test";
1578 return;
1579 }
1580
Ady Abraham3192f3d2021-12-03 16:08:56 -08001581 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001582 writer.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001583 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001584 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001585
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001586 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001587 const auto handle2 = buffer2->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001588 ASSERT_NE(nullptr, handle2);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001589 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle2,
1590 /*acquireFence*/ -1);
1591 writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer,
1592 std::vector<Rect>(1, {0, 0, 10, 10}));
1593 writer.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001594 execute();
1595 }
1596}
1597
ramindani431aad42022-02-01 21:44:29 +00001598TEST_P(GraphicsComposerAidlCommandTest, SetLayerCursorPosition) {
1599 const auto& [layerStatus, layer] =
1600 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1601 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001602
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001603 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001604 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001605 ASSERT_NE(nullptr, handle);
ramindanidcfe3a82021-11-29 17:00:31 +00001606
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001607 auto& writer = getWriter(getPrimaryDisplayId());
1608 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
ramindani431aad42022-02-01 21:44:29 +00001609
1610 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1611 getPrimaryDisplay().getDisplayHeight()};
1612 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1613 (float)getPrimaryDisplay().getDisplayHeight()};
1614 configureLayer(getPrimaryDisplay(), layer, Composition::CURSOR, displayFrame, cropRect);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001615 writer.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1616 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001617
1618 execute();
Ady Abraham46219f52021-12-20 09:44:31 -08001619
ramindani431aad42022-02-01 21:44:29 +00001620 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanidcfe3a82021-11-29 17:00:31 +00001621 GTEST_SUCCEED() << "Composition change requested, skipping test";
1622 return;
1623 }
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001624 writer.presentDisplay(getPrimaryDisplayId());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001625 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001626
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001627 writer.setLayerCursorPosition(getPrimaryDisplayId(), layer, /*x*/ 1, /*y*/ 1);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001628 execute();
1629
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001630 writer.setLayerCursorPosition(getPrimaryDisplayId(), layer, /*x*/ 0, /*y*/ 0);
1631 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1632 writer.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001633 execute();
1634}
1635
ramindani431aad42022-02-01 21:44:29 +00001636TEST_P(GraphicsComposerAidlCommandTest, SetLayerBuffer) {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001637 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001638 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001639 ASSERT_NE(nullptr, handle);
1640
ramindani431aad42022-02-01 21:44:29 +00001641 const auto& [layerStatus, layer] =
1642 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1643 EXPECT_TRUE(layerStatus.isOk());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001644 auto& writer = getWriter(getPrimaryDisplayId());
1645 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
ramindanidcfe3a82021-11-29 17:00:31 +00001646 execute();
1647}
1648
Brian Lindahlca3eef22022-12-09 00:32:11 -07001649TEST_P(GraphicsComposerAidlCommandTest, SetLayerBufferWithSlotsToClear) {
Brian Lindahl78ff2d62022-12-18 11:21:41 -07001650 const auto& [versionStatus, version] = mComposerClient->getInterfaceVersion();
1651 ASSERT_TRUE(versionStatus.isOk());
1652 if (version == 1) {
1653 GTEST_SUCCEED() << "Device does not support the new API for clearing buffer slots";
1654 return;
1655 }
1656
1657 const auto& [layerStatus, layer] =
1658 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1659 EXPECT_TRUE(layerStatus.isOk());
1660
1661 auto& writer = getWriter(getPrimaryDisplayId());
Brian Lindahlca3eef22022-12-09 00:32:11 -07001662
1663 const auto buffer1 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1664 ASSERT_NE(nullptr, buffer1);
1665 const auto handle1 = buffer1->handle;
Brian Lindahlca3eef22022-12-09 00:32:11 -07001666 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle1, /*acquireFence*/ -1);
1667 execute();
1668 ASSERT_TRUE(mReader.takeErrors().empty());
1669
Brian Lindahlca3eef22022-12-09 00:32:11 -07001670 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1671 ASSERT_NE(nullptr, buffer2);
1672 const auto handle2 = buffer2->handle;
Brian Lindahl78ff2d62022-12-18 11:21:41 -07001673 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 1, handle2, /*acquireFence*/ -1);
1674 execute();
1675 ASSERT_TRUE(mReader.takeErrors().empty());
1676
1677 // Ensure we can clear the buffer slots and then set the active slot with a new buffer
1678 const auto buffer3 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1679 ASSERT_NE(nullptr, buffer3);
1680 const auto handle3 = buffer3->handle;
1681 writer.setLayerBufferSlotsToClear(getPrimaryDisplayId(), layer, /*slotsToClear*/ {0, 1});
1682 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 1, handle3, /*acquireFence*/ -1);
1683 execute();
1684 ASSERT_TRUE(mReader.takeErrors().empty());
1685}
1686
1687TEST_P(GraphicsComposerAidlCommandTest, SetLayerBufferWithSlotsToClear_backwardsCompatible) {
1688 const auto& [versionStatus, version] = mComposerClient->getInterfaceVersion();
1689 ASSERT_TRUE(versionStatus.isOk());
1690 if (version > 1) {
1691 GTEST_SUCCEED() << "Device does not need a backwards compatible way to clear buffer slots";
1692 return;
1693 }
1694
1695 auto clearSlotBuffer = allocate(1u, 1u, ::android::PIXEL_FORMAT_RGB_888);
1696 ASSERT_NE(nullptr, clearSlotBuffer);
1697 auto clearSlotBufferHandle = clearSlotBuffer->handle;
1698
1699 const auto& [layerStatus, layer] =
1700 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1701 EXPECT_TRUE(layerStatus.isOk());
1702
1703 auto& writer = getWriter(getPrimaryDisplayId());
1704
1705 const auto buffer1 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1706 ASSERT_NE(nullptr, buffer1);
1707 const auto handle1 = buffer1->handle;
1708 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle1, /*acquireFence*/ -1);
1709 execute();
1710 ASSERT_TRUE(mReader.takeErrors().empty());
1711
1712 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1713 ASSERT_NE(nullptr, buffer2);
1714 const auto handle2 = buffer2->handle;
1715 EXPECT_TRUE(layerStatus.isOk());
1716 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 1, handle2, /*acquireFence*/ -1);
1717 execute();
1718 ASSERT_TRUE(mReader.takeErrors().empty());
1719
1720 // Ensure we can clear a buffer slot and then set that same slot with a new buffer
1721 const auto buffer3 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1722 ASSERT_NE(nullptr, buffer3);
1723 const auto handle3 = buffer2->handle;
1724 // SurfaceFlinger will never clear the active buffer, instead it will clear non-active buffers
1725 // and then re-use the active buffer's slot for the new buffer
1726 writer.setLayerBufferWithNewCommand(getPrimaryDisplayId(), layer, /*slot*/ 0,
Brian Lindahlca3eef22022-12-09 00:32:11 -07001727 clearSlotBufferHandle, /*acquireFence*/ -1);
Brian Lindahl78ff2d62022-12-18 11:21:41 -07001728 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 1, handle3, /*acquireFence*/ -1);
Brian Lindahlca3eef22022-12-09 00:32:11 -07001729 execute();
1730 ASSERT_TRUE(mReader.takeErrors().empty());
1731}
1732
ramindani431aad42022-02-01 21:44:29 +00001733TEST_P(GraphicsComposerAidlCommandTest, SetLayerSurfaceDamage) {
1734 const auto& [layerStatus, layer] =
1735 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1736 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001737
1738 Rect empty{0, 0, 0, 0};
1739 Rect unit{0, 0, 1, 1};
1740
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001741 auto& writer = getWriter(getPrimaryDisplayId());
1742 writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
ramindanidcfe3a82021-11-29 17:00:31 +00001743 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001744 ASSERT_TRUE(mReader.takeErrors().empty());
1745
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001746 writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001747 execute();
1748 ASSERT_TRUE(mReader.takeErrors().empty());
1749
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001750 writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001751 execute();
1752 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001753}
1754
ramindani431aad42022-02-01 21:44:29 +00001755TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlockingRegion) {
1756 const auto& [layerStatus, layer] =
1757 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1758 EXPECT_TRUE(layerStatus.isOk());
Leon Scroggins III03318152022-01-13 12:24:19 -05001759
1760 Rect empty{0, 0, 0, 0};
1761 Rect unit{0, 0, 1, 1};
1762
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001763 auto& writer = getWriter(getPrimaryDisplayId());
1764 writer.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
Leon Scroggins III03318152022-01-13 12:24:19 -05001765 execute();
1766 ASSERT_TRUE(mReader.takeErrors().empty());
1767
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001768 writer.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Leon Scroggins III03318152022-01-13 12:24:19 -05001769 execute();
1770 ASSERT_TRUE(mReader.takeErrors().empty());
1771
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001772 writer.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
Leon Scroggins III03318152022-01-13 12:24:19 -05001773 execute();
1774 ASSERT_TRUE(mReader.takeErrors().empty());
1775}
1776
ramindani431aad42022-02-01 21:44:29 +00001777TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlendMode) {
1778 const auto& [layerStatus, layer] =
1779 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1780 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001781
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001782 auto& writer = getWriter(getPrimaryDisplayId());
1783 writer.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::NONE);
ramindanidcfe3a82021-11-29 17:00:31 +00001784 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001785 ASSERT_TRUE(mReader.takeErrors().empty());
1786
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001787 writer.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::PREMULTIPLIED);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001788 execute();
1789 ASSERT_TRUE(mReader.takeErrors().empty());
1790
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001791 writer.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::COVERAGE);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001792 execute();
1793 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001794}
1795
ramindani431aad42022-02-01 21:44:29 +00001796TEST_P(GraphicsComposerAidlCommandTest, SetLayerColor) {
1797 const auto& [layerStatus, layer] =
1798 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1799 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001800
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001801 auto& writer = getWriter(getPrimaryDisplayId());
1802 writer.setLayerColor(getPrimaryDisplayId(), layer, Color{1.0f, 1.0f, 1.0f, 1.0f});
ramindanidcfe3a82021-11-29 17:00:31 +00001803 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001804 ASSERT_TRUE(mReader.takeErrors().empty());
1805
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001806 writer.setLayerColor(getPrimaryDisplayId(), layer, Color{0.0f, 0.0f, 0.0f, 0.0f});
Ady Abraham3192f3d2021-12-03 16:08:56 -08001807 execute();
1808 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001809}
1810
ramindani431aad42022-02-01 21:44:29 +00001811TEST_P(GraphicsComposerAidlCommandTest, SetLayerCompositionType) {
1812 const auto& [layerStatus, layer] =
1813 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1814 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001815
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001816 auto& writer = getWriter(getPrimaryDisplayId());
1817 writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CLIENT);
ramindanidcfe3a82021-11-29 17:00:31 +00001818 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001819 ASSERT_TRUE(mReader.takeErrors().empty());
1820
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001821 writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::DEVICE);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001822 execute();
1823 ASSERT_TRUE(mReader.takeErrors().empty());
1824
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001825 writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::SOLID_COLOR);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001826 execute();
1827 ASSERT_TRUE(mReader.takeErrors().empty());
1828
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001829 writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CURSOR);
ramindani431aad42022-02-01 21:44:29 +00001830 execute();
1831}
1832
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001833TEST_P(GraphicsComposerAidlCommandTest, DisplayDecoration) {
1834 for (VtsDisplay& display : mDisplays) {
1835 const auto [layerStatus, layer] =
1836 mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount);
1837 EXPECT_TRUE(layerStatus.isOk());
1838
1839 const auto [error, support] =
1840 mComposerClient->getDisplayDecorationSupport(display.getDisplayId());
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001841
Leon Scroggins III91590872022-02-23 09:51:21 -05001842 const auto format = (error.isOk() && support) ? support->format
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001843 : aidl::android::hardware::graphics::common::PixelFormat::RGBA_8888;
1844 const auto decorBuffer = allocate(static_cast<::android::PixelFormat>(format));
1845 ASSERT_NE(nullptr, decorBuffer);
1846 if (::android::OK != decorBuffer->initCheck()) {
1847 if (support) {
1848 FAIL() << "Device advertised display decoration support with format "
1849 << aidl::android::hardware::graphics::common::toString(format)
1850 << " but failed to allocate it!";
1851 } else {
1852 FAIL() << "Device advertised NO display decoration support, but it should "
1853 << "still be able to allocate "
1854 << aidl::android::hardware::graphics::common::toString(format);
1855 }
1856 }
1857
Midas Chien7d55d422022-06-07 02:32:28 +08001858 configureLayer(display, layer, Composition::DISPLAY_DECORATION, display.getFrameRect(),
1859 display.getCrop());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001860 auto& writer = getWriter(display.getDisplayId());
1861 writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, decorBuffer->handle,
1862 /*acquireFence*/ -1);
1863 writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001864 execute();
1865 if (support) {
1866 ASSERT_TRUE(mReader.takeErrors().empty());
1867 } else {
1868 const auto errors = mReader.takeErrors();
1869 ASSERT_EQ(1, errors.size());
Leon Scroggins III6455e792022-02-24 12:18:58 -05001870 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, errors[0].errorCode);
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001871 }
1872 }
1873}
1874
ramindani431aad42022-02-01 21:44:29 +00001875TEST_P(GraphicsComposerAidlCommandTest, SetLayerDataspace) {
1876 const auto& [layerStatus, layer] =
1877 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1878 EXPECT_TRUE(layerStatus.isOk());
1879
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001880 auto& writer = getWriter(getPrimaryDisplayId());
1881 writer.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
ramindani431aad42022-02-01 21:44:29 +00001882 execute();
1883}
1884
1885TEST_P(GraphicsComposerAidlCommandTest, SetLayerDisplayFrame) {
1886 const auto& [layerStatus, layer] =
1887 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1888 EXPECT_TRUE(layerStatus.isOk());
1889
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001890 auto& writer = getWriter(getPrimaryDisplayId());
1891 writer.setLayerDisplayFrame(getPrimaryDisplayId(), layer, Rect{0, 0, 1, 1});
ramindani431aad42022-02-01 21:44:29 +00001892 execute();
1893}
1894
1895TEST_P(GraphicsComposerAidlCommandTest, SetLayerPlaneAlpha) {
1896 const auto& [layerStatus, layer] =
1897 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1898 EXPECT_TRUE(layerStatus.isOk());
1899
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001900 auto& writer = getWriter(getPrimaryDisplayId());
1901 writer.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 0.0f);
ramindani431aad42022-02-01 21:44:29 +00001902 execute();
1903 ASSERT_TRUE(mReader.takeErrors().empty());
1904
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001905 writer.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 1.0f);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001906 execute();
1907 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001908}
1909
ramindani431aad42022-02-01 21:44:29 +00001910TEST_P(GraphicsComposerAidlCommandTest, SetLayerSidebandStream) {
Jason Macnak325e8232022-01-24 14:48:55 -08001911 if (!hasCapability(Capability::SIDEBAND_STREAM)) {
ramindanidcfe3a82021-11-29 17:00:31 +00001912 GTEST_SUCCEED() << "no sideband stream support";
1913 return;
1914 }
1915
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001916 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001917 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001918 ASSERT_NE(nullptr, handle);
1919
ramindani431aad42022-02-01 21:44:29 +00001920 const auto& [layerStatus, layer] =
1921 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1922 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001923
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001924 auto& writer = getWriter(getPrimaryDisplayId());
1925 writer.setLayerSidebandStream(getPrimaryDisplayId(), layer, handle);
ramindanidcfe3a82021-11-29 17:00:31 +00001926 execute();
1927}
1928
ramindani431aad42022-02-01 21:44:29 +00001929TEST_P(GraphicsComposerAidlCommandTest, SetLayerSourceCrop) {
1930 const auto& [layerStatus, layer] =
1931 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1932 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001933
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001934 auto& writer = getWriter(getPrimaryDisplayId());
1935 writer.setLayerSourceCrop(getPrimaryDisplayId(), layer, FRect{0.0f, 0.0f, 1.0f, 1.0f});
ramindanidcfe3a82021-11-29 17:00:31 +00001936 execute();
1937}
1938
ramindani431aad42022-02-01 21:44:29 +00001939TEST_P(GraphicsComposerAidlCommandTest, SetLayerTransform) {
1940 const auto& [layerStatus, layer] =
1941 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1942 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001943
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001944 auto& writer = getWriter(getPrimaryDisplayId());
1945 writer.setLayerTransform(getPrimaryDisplayId(), layer, static_cast<Transform>(0));
ramindanidcfe3a82021-11-29 17:00:31 +00001946 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001947 ASSERT_TRUE(mReader.takeErrors().empty());
1948
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001949 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_H);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001950 execute();
1951 ASSERT_TRUE(mReader.takeErrors().empty());
1952
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001953 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_V);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001954 execute();
1955 ASSERT_TRUE(mReader.takeErrors().empty());
1956
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001957 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_90);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001958 execute();
1959 ASSERT_TRUE(mReader.takeErrors().empty());
1960
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001961 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_180);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001962 execute();
1963 ASSERT_TRUE(mReader.takeErrors().empty());
1964
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001965 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_270);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001966 execute();
1967 ASSERT_TRUE(mReader.takeErrors().empty());
1968
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001969 writer.setLayerTransform(getPrimaryDisplayId(), layer,
1970 static_cast<Transform>(static_cast<int>(Transform::FLIP_H) |
1971 static_cast<int>(Transform::ROT_90)));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001972 execute();
1973 ASSERT_TRUE(mReader.takeErrors().empty());
1974
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001975 writer.setLayerTransform(getPrimaryDisplayId(), layer,
1976 static_cast<Transform>(static_cast<int>(Transform::FLIP_V) |
1977 static_cast<int>(Transform::ROT_90)));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001978 execute();
1979 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001980}
1981
ramindani431aad42022-02-01 21:44:29 +00001982TEST_P(GraphicsComposerAidlCommandTest, SetLayerVisibleRegion) {
1983 const auto& [layerStatus, layer] =
1984 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1985 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001986
1987 Rect empty{0, 0, 0, 0};
1988 Rect unit{0, 0, 1, 1};
1989
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001990 auto& writer = getWriter(getPrimaryDisplayId());
1991 writer.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
ramindanidcfe3a82021-11-29 17:00:31 +00001992 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001993 ASSERT_TRUE(mReader.takeErrors().empty());
1994
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001995 writer.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001996 execute();
1997 ASSERT_TRUE(mReader.takeErrors().empty());
1998
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001999 writer.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
Ady Abraham3192f3d2021-12-03 16:08:56 -08002000 execute();
2001 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00002002}
2003
ramindani431aad42022-02-01 21:44:29 +00002004TEST_P(GraphicsComposerAidlCommandTest, SetLayerZOrder) {
2005 const auto& [layerStatus, layer] =
2006 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2007 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002008
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002009 auto& writer = getWriter(getPrimaryDisplayId());
2010 writer.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 10);
ramindanidcfe3a82021-11-29 17:00:31 +00002011 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08002012 ASSERT_TRUE(mReader.takeErrors().empty());
2013
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002014 writer.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 0);
Ady Abraham3192f3d2021-12-03 16:08:56 -08002015 execute();
2016 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00002017}
2018
ramindani431aad42022-02-01 21:44:29 +00002019TEST_P(GraphicsComposerAidlCommandTest, SetLayerPerFrameMetadata) {
2020 const auto& [layerStatus, layer] =
2021 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2022 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002023
ramindanidcfe3a82021-11-29 17:00:31 +00002024 /**
2025 * DISPLAY_P3 is a color space that uses the DCI_P3 primaries,
2026 * the D65 white point and the SRGB transfer functions.
2027 * Rendering Intent: Colorimetric
2028 * Primaries:
2029 * x y
2030 * green 0.265 0.690
2031 * blue 0.150 0.060
2032 * red 0.680 0.320
2033 * white (D65) 0.3127 0.3290
2034 */
2035
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002036 auto& writer = getWriter(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00002037 std::vector<PerFrameMetadata> aidlMetadata;
2038 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X, 0.680f});
2039 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y, 0.320f});
2040 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_X, 0.265f});
2041 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_Y, 0.690f});
2042 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_X, 0.150f});
2043 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_Y, 0.060f});
2044 aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_X, 0.3127f});
2045 aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_Y, 0.3290f});
2046 aidlMetadata.push_back({PerFrameMetadataKey::MAX_LUMINANCE, 100.0f});
2047 aidlMetadata.push_back({PerFrameMetadataKey::MIN_LUMINANCE, 0.1f});
2048 aidlMetadata.push_back({PerFrameMetadataKey::MAX_CONTENT_LIGHT_LEVEL, 78.0});
2049 aidlMetadata.push_back({PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL, 62.0});
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002050 writer.setLayerPerFrameMetadata(getPrimaryDisplayId(), layer, aidlMetadata);
ramindanidcfe3a82021-11-29 17:00:31 +00002051 execute();
2052
Ady Abraham3192f3d2021-12-03 16:08:56 -08002053 const auto errors = mReader.takeErrors();
2054 if (errors.size() == 1 && errors[0].errorCode == EX_UNSUPPORTED_OPERATION) {
ramindanidcfe3a82021-11-29 17:00:31 +00002055 GTEST_SUCCEED() << "SetLayerPerFrameMetadata is not supported";
ramindani431aad42022-02-01 21:44:29 +00002056 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002057 return;
2058 }
2059
ramindani431aad42022-02-01 21:44:29 +00002060 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002061}
2062
Alec Mourib1f16722022-02-07 13:03:44 -08002063TEST_P(GraphicsComposerAidlCommandTest, setLayerBrightness) {
ramindani431aad42022-02-01 21:44:29 +00002064 const auto& [layerStatus, layer] =
2065 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
Alec Mouri95e490b2022-01-06 13:46:58 -08002066
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002067 auto& writer = getWriter(getPrimaryDisplayId());
2068 writer.setLayerBrightness(getPrimaryDisplayId(), layer, 0.2f);
Alec Mouri95e490b2022-01-06 13:46:58 -08002069 execute();
2070 ASSERT_TRUE(mReader.takeErrors().empty());
2071
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002072 writer.setLayerBrightness(getPrimaryDisplayId(), layer, 1.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08002073 execute();
2074 ASSERT_TRUE(mReader.takeErrors().empty());
2075
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002076 writer.setLayerBrightness(getPrimaryDisplayId(), layer, 0.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08002077 execute();
2078 ASSERT_TRUE(mReader.takeErrors().empty());
2079
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002080 writer.setLayerBrightness(getPrimaryDisplayId(), layer, -1.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08002081 execute();
Alec Mourib1f16722022-02-07 13:03:44 -08002082 {
2083 const auto errors = mReader.takeErrors();
2084 ASSERT_EQ(1, errors.size());
2085 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
2086 }
2087
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002088 writer.setLayerBrightness(getPrimaryDisplayId(), layer, std::nanf(""));
Alec Mourib1f16722022-02-07 13:03:44 -08002089 execute();
2090 {
2091 const auto errors = mReader.takeErrors();
2092 ASSERT_EQ(1, errors.size());
2093 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
2094 }
Alec Mouri95e490b2022-01-06 13:46:58 -08002095}
2096
ramindani431aad42022-02-01 21:44:29 +00002097TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints) {
ramindanidcfe3a82021-11-29 17:00:31 +00002098 Test_setActiveConfigWithConstraints({.delayForChange = 0, .refreshMiss = false});
2099}
2100
ramindani431aad42022-02-01 21:44:29 +00002101TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_Delayed) {
ramindanidcfe3a82021-11-29 17:00:31 +00002102 Test_setActiveConfigWithConstraints({.delayForChange = 300'000'000, // 300ms
2103 .refreshMiss = false});
2104}
2105
ramindani431aad42022-02-01 21:44:29 +00002106TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_MissRefresh) {
ramindanidcfe3a82021-11-29 17:00:31 +00002107 Test_setActiveConfigWithConstraints({.delayForChange = 0, .refreshMiss = true});
2108}
2109
ramindani431aad42022-02-01 21:44:29 +00002110TEST_P(GraphicsComposerAidlCommandTest, GetDisplayVsyncPeriod) {
ramindanidcfe3a82021-11-29 17:00:31 +00002111 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00002112 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
2113 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002114
ramindani431aad42022-02-01 21:44:29 +00002115 for (int32_t config : configs) {
2116 int32_t expectedVsyncPeriodNanos = display.getDisplayConfig(config).vsyncPeriod;
2117
ramindanidcfe3a82021-11-29 17:00:31 +00002118 VsyncPeriodChangeConstraints constraints;
2119
2120 constraints.desiredTimeNanos = systemTime();
2121 constraints.seamlessRequired = false;
ramindani431aad42022-02-01 21:44:29 +00002122
2123 const auto& [timelineStatus, timeline] =
2124 mComposerClient->setActiveConfigWithConstraints(&display, config, constraints);
2125 EXPECT_TRUE(timelineStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002126
2127 if (timeline.refreshRequired) {
2128 sendRefreshFrame(display, &timeline);
2129 }
ramindani431aad42022-02-01 21:44:29 +00002130 waitForVsyncPeriodChange(display.getDisplayId(), timeline, constraints.desiredTimeNanos,
2131 /*odPeriodNanos*/ 0, expectedVsyncPeriodNanos);
ramindanidcfe3a82021-11-29 17:00:31 +00002132
2133 int32_t vsyncPeriodNanos;
2134 int retryCount = 100;
2135 do {
2136 std::this_thread::sleep_for(10ms);
ramindani431aad42022-02-01 21:44:29 +00002137 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanosValue] =
2138 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
2139
2140 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
2141 vsyncPeriodNanos = vsyncPeriodNanosValue;
ramindanidcfe3a82021-11-29 17:00:31 +00002142 --retryCount;
2143 } while (vsyncPeriodNanos != expectedVsyncPeriodNanos && retryCount > 0);
2144
2145 EXPECT_EQ(vsyncPeriodNanos, expectedVsyncPeriodNanos);
2146
2147 // Make sure that the vsync period stays the same if the active config is not
2148 // changed.
2149 auto timeout = 1ms;
2150 for (int i = 0; i < 10; i++) {
2151 std::this_thread::sleep_for(timeout);
2152 timeout *= 2;
2153 vsyncPeriodNanos = 0;
ramindani431aad42022-02-01 21:44:29 +00002154 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanosValue] =
2155 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
2156
2157 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
2158 vsyncPeriodNanos = vsyncPeriodNanosValue;
ramindanidcfe3a82021-11-29 17:00:31 +00002159 EXPECT_EQ(vsyncPeriodNanos, expectedVsyncPeriodNanos);
2160 }
2161 }
2162 }
2163}
2164
ramindani431aad42022-02-01 21:44:29 +00002165TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_SeamlessNotAllowed) {
ramindanidcfe3a82021-11-29 17:00:31 +00002166 VsyncPeriodChangeConstraints constraints;
ramindanidcfe3a82021-11-29 17:00:31 +00002167 constraints.seamlessRequired = true;
2168 constraints.desiredTimeNanos = systemTime();
2169
2170 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00002171 forEachTwoConfigs(display.getDisplayId(), [&](int32_t config1, int32_t config2) {
2172 int32_t configGroup1 = display.getDisplayConfig(config1).configGroup;
2173 int32_t configGroup2 = display.getDisplayConfig(config2).configGroup;
ramindanidcfe3a82021-11-29 17:00:31 +00002174 if (configGroup1 != configGroup2) {
ramindani431aad42022-02-01 21:44:29 +00002175 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002176 sendRefreshFrame(display, nullptr);
ramindani431aad42022-02-01 21:44:29 +00002177 const auto& [status, _] = mComposerClient->setActiveConfigWithConstraints(
2178 &display, config2, constraints);
2179 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002180 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(
2181 status, IComposerClient::EX_SEAMLESS_NOT_ALLOWED));
ramindanidcfe3a82021-11-29 17:00:31 +00002182 }
2183 });
2184 }
2185}
2186
ramindani431aad42022-02-01 21:44:29 +00002187TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_NoTimestamp) {
2188 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ std::nullopt));
Ady Abraham72c5b502021-12-10 17:23:39 -08002189}
2190
ramindani431aad42022-02-01 21:44:29 +00002191TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_0) {
2192 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ 0));
Ady Abraham72c5b502021-12-10 17:23:39 -08002193}
2194
ramindani431aad42022-02-01 21:44:29 +00002195TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_5) {
2196 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ 5));
Ady Abraham72c5b502021-12-10 17:23:39 -08002197}
2198
ramindani431aad42022-02-01 21:44:29 +00002199TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Unsupported) {
2200 const bool hasDisplayIdleTimerSupport =
2201 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002202 if (!hasDisplayIdleTimerSupport) {
ramindani431aad42022-02-01 21:44:29 +00002203 const auto& status =
2204 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0);
2205 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002206 EXPECT_NO_FATAL_FAILURE(
2207 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
Midas Chiena0b56bd2022-01-13 23:27:33 +08002208 }
2209}
2210
ramindani431aad42022-02-01 21:44:29 +00002211TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_BadParameter) {
2212 const bool hasDisplayIdleTimerSupport =
2213 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002214 if (!hasDisplayIdleTimerSupport) {
2215 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2216 return;
2217 }
2218
ramindani431aad42022-02-01 21:44:29 +00002219 const auto& status =
2220 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ -1);
2221 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002222 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
Midas Chiena0b56bd2022-01-13 23:27:33 +08002223}
2224
ramindani431aad42022-02-01 21:44:29 +00002225TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Disable) {
2226 const bool hasDisplayIdleTimerSupport =
2227 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002228 if (!hasDisplayIdleTimerSupport) {
2229 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2230 return;
2231 }
2232
ramindani431aad42022-02-01 21:44:29 +00002233 EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002234 std::this_thread::sleep_for(1s);
ramindani431aad42022-02-01 21:44:29 +00002235 EXPECT_EQ(0, mComposerClient->getVsyncIdleCount());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002236}
2237
ramindani431aad42022-02-01 21:44:29 +00002238TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Timeout_2) {
2239 const bool hasDisplayIdleTimerSupport =
2240 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002241 if (!hasDisplayIdleTimerSupport) {
2242 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2243 return;
2244 }
2245
ramindani431aad42022-02-01 21:44:29 +00002246 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
2247 EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002248
Leon Scroggins IIIde057582022-01-13 12:26:00 -05002249 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002250 ASSERT_NE(nullptr, buffer->handle);
2251
2252 const auto layer = createOnScreenLayer();
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002253 auto& writer = getWriter(getPrimaryDisplayId());
2254 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer->handle,
2255 /*acquireFence*/ -1);
ramindani431aad42022-02-01 21:44:29 +00002256 int32_t vsyncIdleCount = mComposerClient->getVsyncIdleCount();
Midas Chiena0b56bd2022-01-13 23:27:33 +08002257 auto earlyVsyncIdleTime = systemTime() + std::chrono::nanoseconds(2s).count();
ramindani431aad42022-02-01 21:44:29 +00002258 EXPECT_TRUE(
2259 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 2000).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002260
2261 const sp<::android::Fence> presentFence =
ramindani431aad42022-02-01 21:44:29 +00002262 presentAndGetFence(ComposerClientWriter::kNoTimestamp);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002263 presentFence->waitForever(LOG_TAG);
2264
2265 std::this_thread::sleep_for(3s);
ramindani431aad42022-02-01 21:44:29 +00002266 if (vsyncIdleCount < mComposerClient->getVsyncIdleCount()) {
2267 EXPECT_GE(mComposerClient->getVsyncIdleTime(), earlyVsyncIdleTime);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002268 }
2269
ramindani431aad42022-02-01 21:44:29 +00002270 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002271}
2272
Kriti Dang4efe8602022-05-03 16:55:59 +02002273/*
2274 * Test that no two display configs are exactly the same.
2275 */
2276TEST_P(GraphicsComposerAidlTest, GetDisplayConfigNoRepetitions) {
2277 for (const auto& display : mDisplays) {
2278 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
2279 for (std::vector<int>::size_type i = 0; i < configs.size(); i++) {
2280 for (std::vector<int>::size_type j = i + 1; j < configs.size(); j++) {
2281 const auto& [widthStatus1, width1] = mComposerClient->getDisplayAttribute(
2282 display.getDisplayId(), configs[i], DisplayAttribute::WIDTH);
2283 const auto& [heightStatus1, height1] = mComposerClient->getDisplayAttribute(
2284 display.getDisplayId(), configs[i], DisplayAttribute::HEIGHT);
2285 const auto& [vsyncPeriodStatus1, vsyncPeriod1] =
2286 mComposerClient->getDisplayAttribute(display.getDisplayId(), configs[i],
2287 DisplayAttribute::VSYNC_PERIOD);
2288 const auto& [groupStatus1, group1] = mComposerClient->getDisplayAttribute(
2289 display.getDisplayId(), configs[i], DisplayAttribute::CONFIG_GROUP);
2290
2291 const auto& [widthStatus2, width2] = mComposerClient->getDisplayAttribute(
2292 display.getDisplayId(), configs[j], DisplayAttribute::WIDTH);
2293 const auto& [heightStatus2, height2] = mComposerClient->getDisplayAttribute(
2294 display.getDisplayId(), configs[j], DisplayAttribute::HEIGHT);
2295 const auto& [vsyncPeriodStatus2, vsyncPeriod2] =
2296 mComposerClient->getDisplayAttribute(display.getDisplayId(), configs[j],
2297 DisplayAttribute::VSYNC_PERIOD);
2298 const auto& [groupStatus2, group2] = mComposerClient->getDisplayAttribute(
2299 display.getDisplayId(), configs[j], DisplayAttribute::CONFIG_GROUP);
2300
2301 ASSERT_FALSE(width1 == width2 && height1 == height2 &&
2302 vsyncPeriod1 == vsyncPeriod2 && group1 == group2);
2303 }
2304 }
2305 }
2306}
2307
Leon Scroggins IIIb3e336e2022-10-06 12:32:16 -04002308TEST_P(GraphicsComposerAidlCommandTest, MultiThreadedPresent) {
2309 std::vector<VtsDisplay*> displays;
2310 for (auto& display : mDisplays) {
2311 if (hasDisplayCapability(display.getDisplayId(),
2312 DisplayCapability::MULTI_THREADED_PRESENT)) {
2313 displays.push_back(&display);
2314 }
2315 }
2316 if (displays.size() <= 1u) {
2317 return;
2318 }
2319 // TODO(b/251842321): Try to present on multiple threads.
2320}
2321
ramindanidcfe3a82021-11-29 17:00:31 +00002322GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlCommandTest);
2323INSTANTIATE_TEST_SUITE_P(
2324 PerInstance, GraphicsComposerAidlCommandTest,
2325 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
2326 ::android::PrintInstanceNameToString);
2327
ramindanid32ae8e2021-10-01 18:48:39 +00002328GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlTest);
2329INSTANTIATE_TEST_SUITE_P(
2330 PerInstance, GraphicsComposerAidlTest,
2331 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
2332 ::android::PrintInstanceNameToString);
2333} // namespace
2334} // namespace aidl::android::hardware::graphics::composer3::vts
2335
2336int main(int argc, char** argv) {
2337 ::testing::InitGoogleTest(&argc, argv);
2338
2339 using namespace std::chrono_literals;
2340 if (!android::base::WaitForProperty("init.svc.surfaceflinger", "stopped", 10s)) {
2341 ALOGE("Failed to stop init.svc.surfaceflinger");
2342 return -1;
2343 }
ramindanibeea10e2021-12-07 21:02:49 +00002344
2345 android::ProcessState::self()->setThreadPoolMaxThreadCount(4);
2346
2347 // The binder threadpool we start will inherit sched policy and priority
2348 // of (this) creating thread. We want the binder thread pool to have
2349 // SCHED_FIFO policy and priority 1 (lowest RT priority)
2350 // Once the pool is created we reset this thread's priority back to
2351 // original.
2352 // This thread policy is based on what we do in the SurfaceFlinger while starting
2353 // the thread pool and we need to replicate that for the VTS tests.
2354 int newPriority = 0;
2355 int origPolicy = sched_getscheduler(0);
2356 struct sched_param origSchedParam;
2357
2358 int errorInPriorityModification = sched_getparam(0, &origSchedParam);
2359 if (errorInPriorityModification == 0) {
2360 int policy = SCHED_FIFO;
2361 newPriority = sched_get_priority_min(policy);
2362
2363 struct sched_param param;
2364 param.sched_priority = newPriority;
2365
2366 errorInPriorityModification = sched_setscheduler(0, policy, &param);
2367 }
2368
2369 // start the thread pool
2370 android::ProcessState::self()->startThreadPool();
2371
2372 // Reset current thread's policy and priority
2373 if (errorInPriorityModification == 0) {
2374 errorInPriorityModification = sched_setscheduler(0, origPolicy, &origSchedParam);
2375 } else {
2376 ALOGE("Failed to set VtsHalGraphicsComposer3_TargetTest binder threadpool priority to "
2377 "SCHED_FIFO");
2378 }
2379
ramindanid32ae8e2021-10-01 18:48:39 +00002380 return RUN_ALL_TESTS();
ramindania9780262021-10-01 18:48:39 +00002381}