blob: 55e0a13c0c4da295efd6116cbb0629db6d08eb86 [file] [log] [blame]
ramindani431aad42022-02-01 21:44:29 +00001/**
2 * Copyright (c) 2022, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Sally Qi2600d342022-08-16 12:46:17 -070016
ramindanid32ae8e2021-10-01 18:48:39 +000017#include <aidl/Gtest.h>
18#include <aidl/Vintf.h>
Ady Abraham3192f3d2021-12-03 16:08:56 -080019#include <aidl/android/hardware/graphics/common/BlendMode.h>
ramindani3335f7a2021-10-25 17:22:35 +000020#include <aidl/android/hardware/graphics/common/BufferUsage.h>
21#include <aidl/android/hardware/graphics/common/FRect.h>
Leon Scroggins IIIde057582022-01-13 12:26:00 -050022#include <aidl/android/hardware/graphics/common/PixelFormat.h>
ramindani3335f7a2021-10-25 17:22:35 +000023#include <aidl/android/hardware/graphics/common/Rect.h>
ramindani3335f7a2021-10-25 17:22:35 +000024#include <aidl/android/hardware/graphics/composer3/Composition.h>
ramindanid32ae8e2021-10-01 18:48:39 +000025#include <aidl/android/hardware/graphics/composer3/IComposer.h>
26#include <android-base/properties.h>
ramindania9780262021-10-01 18:48:39 +000027#include <android/binder_process.h>
Ady Abraham91c9d1a2021-12-15 18:14:45 -080028#include <android/hardware/graphics/composer3/ComposerClientReader.h>
29#include <android/hardware/graphics/composer3/ComposerClientWriter.h>
ramindanid32ae8e2021-10-01 18:48:39 +000030#include <binder/ProcessState.h>
31#include <gtest/gtest.h>
Ady Abraham72c5b502021-12-10 17:23:39 -080032#include <ui/Fence.h>
ramindani3335f7a2021-10-25 17:22:35 +000033#include <ui/GraphicBuffer.h>
34#include <ui/PixelFormat.h>
ramindani0291f112021-11-04 03:45:46 +000035#include <algorithm>
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -040036#include <iterator>
ramindani592b6512021-10-08 21:15:19 +000037#include <numeric>
ramindanid32ae8e2021-10-01 18:48:39 +000038#include <string>
ramindani1cb794e2021-10-13 20:45:23 +000039#include <thread>
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -040040#include <unordered_map>
ramindani458e53e2022-02-23 17:30:16 +000041#include "GraphicsComposerCallback.h"
42#include "VtsComposerClient.h"
ramindani3335f7a2021-10-25 17:22:35 +000043
ramindanid32ae8e2021-10-01 18:48:39 +000044#undef LOG_TAG
45#define LOG_TAG "VtsHalGraphicsComposer3_TargetTest"
46
47namespace aidl::android::hardware::graphics::composer3::vts {
48namespace {
49
ramindani1cb794e2021-10-13 20:45:23 +000050using namespace std::chrono_literals;
51
ramindanidcfe3a82021-11-29 17:00:31 +000052using ::android::GraphicBuffer;
53using ::android::sp;
54
ramindanid32ae8e2021-10-01 18:48:39 +000055class GraphicsComposerAidlTest : public ::testing::TestWithParam<std::string> {
ramindania9780262021-10-01 18:48:39 +000056 protected:
57 void SetUp() override {
ramindani431aad42022-02-01 21:44:29 +000058 mComposerClient = std::make_unique<VtsComposerClient>(GetParam());
59 ASSERT_TRUE(mComposerClient->createClient().isOk());
Jason Macnake531a092022-01-20 08:49:09 -080060
ramindani431aad42022-02-01 21:44:29 +000061 const auto& [status, displays] = mComposerClient->getDisplays();
Jason Macnake531a092022-01-20 08:49:09 -080062 ASSERT_TRUE(status.isOk());
ramindani431aad42022-02-01 21:44:29 +000063 mDisplays = displays;
ramindanidcfe3a82021-11-29 17:00:31 +000064
ramindani3335f7a2021-10-25 17:22:35 +000065 // explicitly disable vsync
66 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +000067 EXPECT_TRUE(mComposerClient->setVsync(display.getDisplayId(), false).isOk());
ramindani3335f7a2021-10-25 17:22:35 +000068 }
ramindani431aad42022-02-01 21:44:29 +000069 mComposerClient->setVsyncAllowed(false);
ramindania9780262021-10-01 18:48:39 +000070 }
71
ramindani3335f7a2021-10-25 17:22:35 +000072 void TearDown() override {
ramindani431aad42022-02-01 21:44:29 +000073 ASSERT_TRUE(mComposerClient->tearDown());
74 mComposerClient.reset();
ramindani3335f7a2021-10-25 17:22:35 +000075 }
ramindanic2b8d082021-11-06 02:03:50 +000076
ramindanid5751092022-04-22 22:30:20 +000077 void assertServiceSpecificError(const ScopedAStatus& status, int32_t serviceSpecificError) {
78 ASSERT_EQ(status.getExceptionCode(), EX_SERVICE_SPECIFIC);
79 ASSERT_EQ(status.getServiceSpecificError(), serviceSpecificError);
80 }
81
ramindani431aad42022-02-01 21:44:29 +000082 void Test_setContentTypeForDisplay(int64_t display,
83 const std::vector<ContentType>& supportedContentTypes,
84 ContentType contentType, const char* contentTypeStr) {
85 const bool contentTypeSupport =
86 std::find(supportedContentTypes.begin(), supportedContentTypes.end(),
87 contentType) != supportedContentTypes.end();
ramindanidcfe3a82021-11-29 17:00:31 +000088
89 if (!contentTypeSupport) {
ramindani431aad42022-02-01 21:44:29 +000090 const auto& status = mComposerClient->setContentType(display, contentType);
91 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +000092 EXPECT_NO_FATAL_FAILURE(
93 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindanidcfe3a82021-11-29 17:00:31 +000094 GTEST_SUCCEED() << contentTypeStr << " content type is not supported on display "
95 << std::to_string(display) << ", skipping test";
96 return;
97 }
98
99 EXPECT_TRUE(mComposerClient->setContentType(display, contentType).isOk());
100 EXPECT_TRUE(mComposerClient->setContentType(display, ContentType::NONE).isOk());
101 }
102
ramindani431aad42022-02-01 21:44:29 +0000103 void Test_setContentType(ContentType contentType, const char* contentTypeStr) {
ramindanidcfe3a82021-11-29 17:00:31 +0000104 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000105 const auto& [status, supportedContentTypes] =
106 mComposerClient->getSupportedContentTypes(display.getDisplayId());
107 EXPECT_TRUE(status.isOk());
108 Test_setContentTypeForDisplay(display.getDisplayId(), supportedContentTypes,
109 contentType, contentTypeStr);
ramindanidcfe3a82021-11-29 17:00:31 +0000110 }
111 }
112
Jason Macnak325e8232022-01-24 14:48:55 -0800113 bool hasCapability(Capability capability) {
ramindani431aad42022-02-01 21:44:29 +0000114 const auto& [status, capabilities] = mComposerClient->getCapabilities();
115 EXPECT_TRUE(status.isOk());
Jason Macnak325e8232022-01-24 14:48:55 -0800116 return std::any_of(
117 capabilities.begin(), capabilities.end(),
118 [&](const Capability& activeCapability) { return activeCapability == capability; });
119 }
120
ramindani431aad42022-02-01 21:44:29 +0000121 const VtsDisplay& getPrimaryDisplay() const { return mDisplays[0]; }
ramindania9780262021-10-01 18:48:39 +0000122
ramindani431aad42022-02-01 21:44:29 +0000123 int64_t getPrimaryDisplayId() const { return getPrimaryDisplay().getDisplayId(); }
ramindania9780262021-10-01 18:48:39 +0000124
ramindani431aad42022-02-01 21:44:29 +0000125 int64_t getInvalidDisplayId() const { return mComposerClient->getInvalidDisplayId(); }
ramindani1cb794e2021-10-13 20:45:23 +0000126
ramindani431aad42022-02-01 21:44:29 +0000127 VtsDisplay& getEditablePrimaryDisplay() { return mDisplays[0]; }
ramindani0291f112021-11-04 03:45:46 +0000128
ramindani3335f7a2021-10-25 17:22:35 +0000129 struct TestParameters {
130 nsecs_t delayForChange;
131 bool refreshMiss;
132 };
133
ramindani431aad42022-02-01 21:44:29 +0000134 std::unique_ptr<VtsComposerClient> mComposerClient;
ramindani1cb794e2021-10-13 20:45:23 +0000135 std::vector<VtsDisplay> mDisplays;
ramindani3335f7a2021-10-25 17:22:35 +0000136 // use the slot count usually set by SF
137 static constexpr uint32_t kBufferSlotCount = 64;
ramindanid32ae8e2021-10-01 18:48:39 +0000138};
139
ramindani431aad42022-02-01 21:44:29 +0000140TEST_P(GraphicsComposerAidlTest, GetDisplayCapabilities_BadDisplay) {
141 const auto& [status, _] = mComposerClient->getDisplayCapabilities(getInvalidDisplayId());
ramindani5f696942021-10-14 16:24:18 +0000142
ramindani431aad42022-02-01 21:44:29 +0000143 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000144 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindania9780262021-10-01 18:48:39 +0000145}
146
ramindani431aad42022-02-01 21:44:29 +0000147TEST_P(GraphicsComposerAidlTest, GetDisplayCapabilities) {
ramindania9780262021-10-01 18:48:39 +0000148 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000149 const auto& [status, capabilities] =
150 mComposerClient->getDisplayCapabilities(display.getDisplayId());
ramindania9780262021-10-01 18:48:39 +0000151
ramindani431aad42022-02-01 21:44:29 +0000152 EXPECT_TRUE(status.isOk());
ramindania9780262021-10-01 18:48:39 +0000153 }
ramindanid32ae8e2021-10-01 18:48:39 +0000154}
155
ramindani2740bac2021-11-24 22:58:32 +0000156TEST_P(GraphicsComposerAidlTest, DumpDebugInfo) {
ramindani431aad42022-02-01 21:44:29 +0000157 ASSERT_TRUE(mComposerClient->dumpDebugInfo().isOk());
ramindani2740bac2021-11-24 22:58:32 +0000158}
159
160TEST_P(GraphicsComposerAidlTest, CreateClientSingleton) {
161 std::shared_ptr<IComposerClient> composerClient;
ramindani431aad42022-02-01 21:44:29 +0000162 const auto& status = mComposerClient->createClient();
ramindani2740bac2021-11-24 22:58:32 +0000163
ramindani431aad42022-02-01 21:44:29 +0000164 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000165 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_NO_RESOURCES));
ramindani2740bac2021-11-24 22:58:32 +0000166}
167
ramindani592b6512021-10-08 21:15:19 +0000168TEST_P(GraphicsComposerAidlTest, GetDisplayIdentificationData) {
ramindani431aad42022-02-01 21:44:29 +0000169 const auto& [status0, displayIdentification0] =
170 mComposerClient->getDisplayIdentificationData(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000171 if (!status0.isOk() && status0.getExceptionCode() == EX_SERVICE_SPECIFIC &&
172 status0.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani431aad42022-02-01 21:44:29 +0000173 GTEST_SUCCEED() << "Display identification data not supported, skipping test";
ramindani592b6512021-10-08 21:15:19 +0000174 return;
175 }
ramindani431aad42022-02-01 21:44:29 +0000176 ASSERT_TRUE(status0.isOk()) << "failed to get display identification data";
ramindani592b6512021-10-08 21:15:19 +0000177 ASSERT_FALSE(displayIdentification0.data.empty());
178
179 constexpr size_t kEdidBlockSize = 128;
180 ASSERT_TRUE(displayIdentification0.data.size() % kEdidBlockSize == 0)
181 << "EDID blob length is not a multiple of " << kEdidBlockSize;
182
183 const uint8_t kEdidHeader[] = {0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00};
184 ASSERT_TRUE(std::equal(std::begin(kEdidHeader), std::end(kEdidHeader),
185 displayIdentification0.data.begin()))
186 << "EDID blob doesn't start with the fixed EDID header";
187 ASSERT_EQ(0, std::accumulate(displayIdentification0.data.begin(),
188 displayIdentification0.data.begin() + kEdidBlockSize,
189 static_cast<uint8_t>(0)))
190 << "EDID base block doesn't checksum";
191
ramindani431aad42022-02-01 21:44:29 +0000192 const auto& [status1, displayIdentification1] =
193 mComposerClient->getDisplayIdentificationData(getPrimaryDisplayId());
194 ASSERT_TRUE(status1.isOk());
ramindani592b6512021-10-08 21:15:19 +0000195
196 ASSERT_EQ(displayIdentification0.port, displayIdentification1.port) << "ports are not stable";
197 ASSERT_TRUE(displayIdentification0.data.size() == displayIdentification1.data.size() &&
198 std::equal(displayIdentification0.data.begin(), displayIdentification0.data.end(),
199 displayIdentification1.data.begin()))
200 << "data is not stable";
201}
202
203TEST_P(GraphicsComposerAidlTest, GetHdrCapabilities) {
ramindani431aad42022-02-01 21:44:29 +0000204 const auto& [status, hdrCapabilities] =
205 mComposerClient->getHdrCapabilities(getPrimaryDisplayId());
ramindani592b6512021-10-08 21:15:19 +0000206
ramindani431aad42022-02-01 21:44:29 +0000207 ASSERT_TRUE(status.isOk());
208 EXPECT_TRUE(hdrCapabilities.maxLuminance >= hdrCapabilities.minLuminance);
ramindani592b6512021-10-08 21:15:19 +0000209}
210
211TEST_P(GraphicsComposerAidlTest, GetPerFrameMetadataKeys) {
ramindani431aad42022-02-01 21:44:29 +0000212 const auto& [status, keys] = mComposerClient->getPerFrameMetadataKeys(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000213 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
214 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindanic2b8d082021-11-06 02:03:50 +0000215 GTEST_SUCCEED() << "getPerFrameMetadataKeys is not supported";
216 return;
ramindani592b6512021-10-08 21:15:19 +0000217 }
ramindani431aad42022-02-01 21:44:29 +0000218
219 ASSERT_TRUE(status.isOk());
220 EXPECT_TRUE(keys.size() >= 0);
ramindani592b6512021-10-08 21:15:19 +0000221}
222
223TEST_P(GraphicsComposerAidlTest, GetReadbackBufferAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000224 const auto& [status, _] = mComposerClient->getReadbackBufferAttributes(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000225 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
226 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani431aad42022-02-01 21:44:29 +0000227 GTEST_SUCCEED() << "getReadbackBufferAttributes is not supported";
228 return;
ramindani592b6512021-10-08 21:15:19 +0000229 }
ramindani431aad42022-02-01 21:44:29 +0000230
231 ASSERT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000232}
233
234TEST_P(GraphicsComposerAidlTest, GetRenderIntents) {
ramindani431aad42022-02-01 21:44:29 +0000235 const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
236 EXPECT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000237
ramindani431aad42022-02-01 21:44:29 +0000238 for (auto mode : modes) {
239 const auto& [intentStatus, intents] =
240 mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
241 EXPECT_TRUE(intentStatus.isOk());
ramindani592b6512021-10-08 21:15:19 +0000242 bool isHdr;
243 switch (mode) {
244 case ColorMode::BT2100_PQ:
245 case ColorMode::BT2100_HLG:
246 isHdr = true;
247 break;
248 default:
249 isHdr = false;
250 break;
251 }
252 RenderIntent requiredIntent =
253 isHdr ? RenderIntent::TONE_MAP_COLORIMETRIC : RenderIntent::COLORIMETRIC;
254
ramindani431aad42022-02-01 21:44:29 +0000255 const auto iter = std::find(intents.cbegin(), intents.cend(), requiredIntent);
ramindani592b6512021-10-08 21:15:19 +0000256 EXPECT_NE(intents.cend(), iter);
257 }
258}
259
ramindani431aad42022-02-01 21:44:29 +0000260TEST_P(GraphicsComposerAidlTest, GetRenderIntents_BadDisplay) {
261 const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
262 ASSERT_TRUE(status.isOk());
263
ramindani592b6512021-10-08 21:15:19 +0000264 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000265 const auto& [intentStatus, _] =
266 mComposerClient->getRenderIntents(getInvalidDisplayId(), mode);
267
268 EXPECT_FALSE(intentStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000269 EXPECT_NO_FATAL_FAILURE(
270 assertServiceSpecificError(intentStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani592b6512021-10-08 21:15:19 +0000271 }
272}
273
ramindani431aad42022-02-01 21:44:29 +0000274TEST_P(GraphicsComposerAidlTest, GetRenderIntents_BadParameter) {
275 const auto& [status, _] =
276 mComposerClient->getRenderIntents(getPrimaryDisplayId(), static_cast<ColorMode>(-1));
277
278 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000279 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindani592b6512021-10-08 21:15:19 +0000280}
281
282TEST_P(GraphicsComposerAidlTest, GetColorModes) {
ramindani431aad42022-02-01 21:44:29 +0000283 const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
284 ASSERT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000285
ramindani431aad42022-02-01 21:44:29 +0000286 const auto native = std::find(colorModes.cbegin(), colorModes.cend(), ColorMode::NATIVE);
287 EXPECT_NE(colorModes.cend(), native);
ramindani592b6512021-10-08 21:15:19 +0000288}
289
ramindani431aad42022-02-01 21:44:29 +0000290TEST_P(GraphicsComposerAidlTest, GetColorMode_BadDisplay) {
291 const auto& [status, _] = mComposerClient->getColorModes(getInvalidDisplayId());
ramindani592b6512021-10-08 21:15:19 +0000292
ramindani431aad42022-02-01 21:44:29 +0000293 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000294 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani592b6512021-10-08 21:15:19 +0000295}
296
297TEST_P(GraphicsComposerAidlTest, SetColorMode) {
ramindani431aad42022-02-01 21:44:29 +0000298 const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
299 EXPECT_TRUE(status.isOk());
300
ramindani592b6512021-10-08 21:15:19 +0000301 for (auto mode : colorModes) {
ramindani431aad42022-02-01 21:44:29 +0000302 const auto& [intentStatus, intents] =
303 mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
304 EXPECT_TRUE(intentStatus.isOk()) << "failed to get render intents";
305
ramindani592b6512021-10-08 21:15:19 +0000306 for (auto intent : intents) {
ramindani431aad42022-02-01 21:44:29 +0000307 const auto modeStatus =
308 mComposerClient->setColorMode(getPrimaryDisplayId(), mode, intent);
309 EXPECT_TRUE(modeStatus.isOk() ||
ramindanid5751092022-04-22 22:30:20 +0000310 (modeStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
311 IComposerClient::EX_UNSUPPORTED == modeStatus.getServiceSpecificError()))
ramindani592b6512021-10-08 21:15:19 +0000312 << "failed to set color mode";
313 }
314 }
315
ramindani431aad42022-02-01 21:44:29 +0000316 const auto modeStatus = mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE,
317 RenderIntent::COLORIMETRIC);
318 EXPECT_TRUE(modeStatus.isOk() ||
ramindanid5751092022-04-22 22:30:20 +0000319 (modeStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
320 IComposerClient::EX_UNSUPPORTED == modeStatus.getServiceSpecificError()))
ramindani592b6512021-10-08 21:15:19 +0000321 << "failed to set color mode";
322}
323
ramindani431aad42022-02-01 21:44:29 +0000324TEST_P(GraphicsComposerAidlTest, SetColorMode_BadDisplay) {
325 const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
326 ASSERT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000327
ramindani431aad42022-02-01 21:44:29 +0000328 for (auto mode : colorModes) {
329 const auto& [intentStatus, intents] =
330 mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
331 ASSERT_TRUE(intentStatus.isOk()) << "failed to get render intents";
332
333 for (auto intent : intents) {
334 auto const modeStatus =
335 mComposerClient->setColorMode(getInvalidDisplayId(), mode, intent);
336
337 EXPECT_FALSE(modeStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000338 EXPECT_NO_FATAL_FAILURE(
339 assertServiceSpecificError(modeStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani770d7082021-11-30 00:36:42 +0000340 }
341 }
ramindani592b6512021-10-08 21:15:19 +0000342}
343
ramindani431aad42022-02-01 21:44:29 +0000344TEST_P(GraphicsComposerAidlTest, SetColorMode_BadParameter) {
345 auto status = mComposerClient->setColorMode(getPrimaryDisplayId(), static_cast<ColorMode>(-1),
346 RenderIntent::COLORIMETRIC);
ramindani592b6512021-10-08 21:15:19 +0000347
ramindani431aad42022-02-01 21:44:29 +0000348 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000349 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindani592b6512021-10-08 21:15:19 +0000350
ramindani431aad42022-02-01 21:44:29 +0000351 status = mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE,
352 static_cast<RenderIntent>(-1));
ramindani592b6512021-10-08 21:15:19 +0000353
ramindani431aad42022-02-01 21:44:29 +0000354 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000355 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindani592b6512021-10-08 21:15:19 +0000356}
357
358TEST_P(GraphicsComposerAidlTest, GetDisplayedContentSamplingAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000359 int constexpr kInvalid = -1;
360 const auto& [status, format] =
361 mComposerClient->getDisplayedContentSamplingAttributes(getPrimaryDisplayId());
ramindani592b6512021-10-08 21:15:19 +0000362
ramindanid5751092022-04-22 22:30:20 +0000363 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
364 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani592b6512021-10-08 21:15:19 +0000365 SUCCEED() << "Device does not support optional extension. Test skipped";
366 return;
367 }
368
ramindani431aad42022-02-01 21:44:29 +0000369 ASSERT_TRUE(status.isOk());
370 EXPECT_NE(kInvalid, static_cast<int>(format.format));
371 EXPECT_NE(kInvalid, static_cast<int>(format.dataspace));
372 EXPECT_NE(kInvalid, static_cast<int>(format.componentMask));
ramindani592b6512021-10-08 21:15:19 +0000373};
374
375TEST_P(GraphicsComposerAidlTest, SetDisplayedContentSamplingEnabled) {
ramindani431aad42022-02-01 21:44:29 +0000376 int constexpr kMaxFrames = 10;
ramindani592b6512021-10-08 21:15:19 +0000377 FormatColorComponent enableAllComponents = FormatColorComponent::FORMAT_COMPONENT_0;
ramindani431aad42022-02-01 21:44:29 +0000378 auto status = mComposerClient->setDisplayedContentSamplingEnabled(
379 getPrimaryDisplayId(), /*isEnabled*/ true, enableAllComponents, kMaxFrames);
ramindanid5751092022-04-22 22:30:20 +0000380 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
381 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani592b6512021-10-08 21:15:19 +0000382 SUCCEED() << "Device does not support optional extension. Test skipped";
383 return;
384 }
ramindani431aad42022-02-01 21:44:29 +0000385 EXPECT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000386
ramindani431aad42022-02-01 21:44:29 +0000387 status = mComposerClient->setDisplayedContentSamplingEnabled(
388 getPrimaryDisplayId(), /*isEnabled*/ false, enableAllComponents, kMaxFrames);
389 EXPECT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000390}
391
392TEST_P(GraphicsComposerAidlTest, GetDisplayedContentSample) {
ramindani431aad42022-02-01 21:44:29 +0000393 const auto& [status, displayContentSamplingAttributes] =
394 mComposerClient->getDisplayedContentSamplingAttributes(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000395 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
396 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindanideb059e2021-11-18 01:57:25 +0000397 SUCCEED() << "Sampling attributes aren't supported on this device, test skipped";
398 return;
399 }
ramindani592b6512021-10-08 21:15:19 +0000400
ramindani431aad42022-02-01 21:44:29 +0000401 int64_t constexpr kMaxFrames = 10;
402 int64_t constexpr kTimestamp = 0;
403 const auto& [sampleStatus, displayContentSample] = mComposerClient->getDisplayedContentSample(
404 getPrimaryDisplayId(), kMaxFrames, kTimestamp);
ramindanid5751092022-04-22 22:30:20 +0000405 if (!sampleStatus.isOk() && sampleStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
ramindani431aad42022-02-01 21:44:29 +0000406 sampleStatus.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani592b6512021-10-08 21:15:19 +0000407 SUCCEED() << "Device does not support optional extension. Test skipped";
408 return;
409 }
410
ramindani431aad42022-02-01 21:44:29 +0000411 EXPECT_TRUE(sampleStatus.isOk());
412 const std::vector<std::vector<int64_t>> histogram = {
ramindani592b6512021-10-08 21:15:19 +0000413 displayContentSample.sampleComponent0, displayContentSample.sampleComponent1,
414 displayContentSample.sampleComponent2, displayContentSample.sampleComponent3};
415
ramindani3335f7a2021-10-25 17:22:35 +0000416 for (size_t i = 0; i < histogram.size(); i++) {
417 const bool shouldHaveHistogram =
418 static_cast<int>(displayContentSamplingAttributes.componentMask) & (1 << i);
419 EXPECT_EQ(shouldHaveHistogram, !histogram[i].empty());
ramindani592b6512021-10-08 21:15:19 +0000420 }
421}
422
ramindani431aad42022-02-01 21:44:29 +0000423TEST_P(GraphicsComposerAidlTest, GetDisplayConnectionType) {
424 const auto& [status, type] = mComposerClient->getDisplayConnectionType(getInvalidDisplayId());
425
426 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000427 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani431aad42022-02-01 21:44:29 +0000428
ramindani0291f112021-11-04 03:45:46 +0000429 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000430 const auto& [connectionTypeStatus, _] =
431 mComposerClient->getDisplayConnectionType(display.getDisplayId());
432 EXPECT_TRUE(connectionTypeStatus.isOk());
ramindani0291f112021-11-04 03:45:46 +0000433 }
434}
435
ramindani431aad42022-02-01 21:44:29 +0000436TEST_P(GraphicsComposerAidlTest, GetDisplayAttribute) {
ramindani0291f112021-11-04 03:45:46 +0000437 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000438 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
439 EXPECT_TRUE(status.isOk());
440
ramindani0291f112021-11-04 03:45:46 +0000441 for (const auto& config : configs) {
442 const std::array<DisplayAttribute, 4> requiredAttributes = {{
443 DisplayAttribute::WIDTH,
444 DisplayAttribute::HEIGHT,
445 DisplayAttribute::VSYNC_PERIOD,
446 DisplayAttribute::CONFIG_GROUP,
447 }};
ramindani0291f112021-11-04 03:45:46 +0000448 for (const auto& attribute : requiredAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000449 const auto& [attribStatus, value] = mComposerClient->getDisplayAttribute(
450 display.getDisplayId(), config, attribute);
451 EXPECT_TRUE(attribStatus.isOk());
ramindani0291f112021-11-04 03:45:46 +0000452 EXPECT_NE(-1, value);
453 }
454
455 const std::array<DisplayAttribute, 2> optionalAttributes = {{
456 DisplayAttribute::DPI_X,
457 DisplayAttribute::DPI_Y,
458 }};
459 for (const auto& attribute : optionalAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000460 const auto& [attribStatus, value] = mComposerClient->getDisplayAttribute(
461 display.getDisplayId(), config, attribute);
ramindanid5751092022-04-22 22:30:20 +0000462 EXPECT_TRUE(attribStatus.isOk() ||
463 (attribStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
464 IComposerClient::EX_UNSUPPORTED ==
465 attribStatus.getServiceSpecificError()));
ramindani0291f112021-11-04 03:45:46 +0000466 }
467 }
468 }
469}
470
ramindani431aad42022-02-01 21:44:29 +0000471TEST_P(GraphicsComposerAidlTest, CheckConfigsAreValid) {
ramindani0291f112021-11-04 03:45:46 +0000472 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000473 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
474 EXPECT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000475
476 EXPECT_FALSE(std::any_of(configs.begin(), configs.end(), [](auto config) {
477 return config == IComposerClient::INVALID_CONFIGURATION;
478 }));
479 }
480}
481
ramindani431aad42022-02-01 21:44:29 +0000482TEST_P(GraphicsComposerAidlTest, GetDisplayVsyncPeriod_BadDisplay) {
483 const auto& [status, vsyncPeriodNanos] =
484 mComposerClient->getDisplayVsyncPeriod(getInvalidDisplayId());
485
486 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000487 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000488}
489
ramindani431aad42022-02-01 21:44:29 +0000490TEST_P(GraphicsComposerAidlTest, SetActiveConfigWithConstraints_BadDisplay) {
ramindani0291f112021-11-04 03:45:46 +0000491 VsyncPeriodChangeConstraints constraints;
ramindani0291f112021-11-04 03:45:46 +0000492 constraints.seamlessRequired = false;
493 constraints.desiredTimeNanos = systemTime();
ramindani431aad42022-02-01 21:44:29 +0000494 auto invalidDisplay = VtsDisplay(getInvalidDisplayId());
ramindani0291f112021-11-04 03:45:46 +0000495
ramindani431aad42022-02-01 21:44:29 +0000496 const auto& [status, timeline] = mComposerClient->setActiveConfigWithConstraints(
497 &invalidDisplay, /*config*/ 0, constraints);
498
499 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000500 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000501}
502
ramindani431aad42022-02-01 21:44:29 +0000503TEST_P(GraphicsComposerAidlTest, SetActiveConfigWithConstraints_BadConfig) {
ramindani0291f112021-11-04 03:45:46 +0000504 VsyncPeriodChangeConstraints constraints;
ramindani0291f112021-11-04 03:45:46 +0000505 constraints.seamlessRequired = false;
506 constraints.desiredTimeNanos = systemTime();
507
508 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000509 int32_t constexpr kInvalidConfigId = IComposerClient::INVALID_CONFIGURATION;
510 const auto& [status, _] = mComposerClient->setActiveConfigWithConstraints(
511 &display, kInvalidConfigId, constraints);
512
513 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000514 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_CONFIG));
ramindani0291f112021-11-04 03:45:46 +0000515 }
516}
517
ramindani431aad42022-02-01 21:44:29 +0000518TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig_BadDisplay) {
ramindani476314c2022-03-16 00:17:08 +0000519 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
520 GTEST_SUCCEED() << "Boot Display Config not supported";
521 return;
522 }
ramindani431aad42022-02-01 21:44:29 +0000523 const auto& status = mComposerClient->setBootDisplayConfig(getInvalidDisplayId(), /*config*/ 0);
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100524
ramindani431aad42022-02-01 21:44:29 +0000525 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000526 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100527}
528
ramindani431aad42022-02-01 21:44:29 +0000529TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig_BadConfig) {
ramindani476314c2022-03-16 00:17:08 +0000530 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
531 GTEST_SUCCEED() << "Boot Display Config not supported";
532 return;
533 }
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100534 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000535 int32_t constexpr kInvalidConfigId = IComposerClient::INVALID_CONFIGURATION;
536 const auto& status =
537 mComposerClient->setBootDisplayConfig(display.getDisplayId(), kInvalidConfigId);
538
539 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000540 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_CONFIG));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100541 }
542}
543
ramindani431aad42022-02-01 21:44:29 +0000544TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig) {
ramindani476314c2022-03-16 00:17:08 +0000545 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
546 GTEST_SUCCEED() << "Boot Display Config not supported";
547 return;
548 }
ramindani431aad42022-02-01 21:44:29 +0000549 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
550 EXPECT_TRUE(status.isOk());
551 for (const auto& config : configs) {
552 EXPECT_TRUE(mComposerClient->setBootDisplayConfig(getPrimaryDisplayId(), config).isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100553 }
554}
555
ramindani431aad42022-02-01 21:44:29 +0000556TEST_P(GraphicsComposerAidlTest, ClearBootDisplayConfig_BadDisplay) {
ramindani476314c2022-03-16 00:17:08 +0000557 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
558 GTEST_SUCCEED() << "Boot Display Config not supported";
559 return;
560 }
ramindani431aad42022-02-01 21:44:29 +0000561 const auto& status = mComposerClient->clearBootDisplayConfig(getInvalidDisplayId());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100562
ramindani431aad42022-02-01 21:44:29 +0000563 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000564 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100565}
566
ramindani431aad42022-02-01 21:44:29 +0000567TEST_P(GraphicsComposerAidlTest, ClearBootDisplayConfig) {
ramindani476314c2022-03-16 00:17:08 +0000568 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
569 GTEST_SUCCEED() << "Boot Display Config not supported";
570 return;
571 }
ramindani431aad42022-02-01 21:44:29 +0000572 EXPECT_TRUE(mComposerClient->clearBootDisplayConfig(getPrimaryDisplayId()).isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100573}
574
ramindani431aad42022-02-01 21:44:29 +0000575TEST_P(GraphicsComposerAidlTest, GetPreferredBootDisplayConfig_BadDisplay) {
ramindani476314c2022-03-16 00:17:08 +0000576 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
577 GTEST_SUCCEED() << "Boot Display Config not supported";
578 return;
579 }
ramindani431aad42022-02-01 21:44:29 +0000580 const auto& [status, _] = mComposerClient->getPreferredBootDisplayConfig(getInvalidDisplayId());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100581
ramindani431aad42022-02-01 21:44:29 +0000582 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000583 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100584}
585
ramindani431aad42022-02-01 21:44:29 +0000586TEST_P(GraphicsComposerAidlTest, GetPreferredBootDisplayConfig) {
ramindani476314c2022-03-16 00:17:08 +0000587 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
588 GTEST_SUCCEED() << "Boot Display Config not supported";
589 return;
590 }
ramindani431aad42022-02-01 21:44:29 +0000591 const auto& [status, preferredDisplayConfig] =
592 mComposerClient->getPreferredBootDisplayConfig(getPrimaryDisplayId());
593 EXPECT_TRUE(status.isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100594
ramindani431aad42022-02-01 21:44:29 +0000595 const auto& [configStatus, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
596
597 EXPECT_TRUE(configStatus.isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100598 EXPECT_NE(configs.end(), std::find(configs.begin(), configs.end(), preferredDisplayConfig));
599}
600
ramindani476314c2022-03-16 00:17:08 +0000601TEST_P(GraphicsComposerAidlTest, BootDisplayConfig_Unsupported) {
602 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
603 const auto& [configStatus, config] =
604 mComposerClient->getActiveConfig(getPrimaryDisplayId());
605 EXPECT_TRUE(configStatus.isOk());
606
607 auto status = mComposerClient->setBootDisplayConfig(getPrimaryDisplayId(), config);
608 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000609 EXPECT_NO_FATAL_FAILURE(
610 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani476314c2022-03-16 00:17:08 +0000611
612 status = mComposerClient->getPreferredBootDisplayConfig(getPrimaryDisplayId()).first;
613 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000614 EXPECT_NO_FATAL_FAILURE(
615 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani476314c2022-03-16 00:17:08 +0000616
617 status = mComposerClient->clearBootDisplayConfig(getPrimaryDisplayId());
618 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000619 EXPECT_NO_FATAL_FAILURE(
620 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani476314c2022-03-16 00:17:08 +0000621 }
622}
623
Kriti Dang3793ebd2022-12-05 13:03:49 +0100624TEST_P(GraphicsComposerAidlTest, GetHdrConversionCapabilities) {
625 if (!hasCapability(Capability::HDR_OUTPUT_CONVERSION_CONFIG)) {
626 GTEST_SUCCEED() << "HDR output conversion not supported";
627 return;
628 }
629 const auto& [status, conversionCapabilities] = mComposerClient->getHdrConversionCapabilities();
630 EXPECT_TRUE(status.isOk());
631}
632
633TEST_P(GraphicsComposerAidlTest, SetHdrConversionStrategy_Passthrough) {
634 if (!hasCapability(Capability::HDR_OUTPUT_CONVERSION_CONFIG)) {
635 GTEST_SUCCEED() << "HDR output conversion not supported";
636 return;
637 }
638 common::HdrConversionStrategy hdrConversionStrategy;
639 hdrConversionStrategy.set<common::HdrConversionStrategy::Tag::passthrough>(true);
640 const auto& status = mComposerClient->setHdrConversionStrategy(hdrConversionStrategy);
641 EXPECT_TRUE(status.isOk());
642}
643
644TEST_P(GraphicsComposerAidlTest, SetHdrConversionStrategy_Force) {
645 if (!hasCapability(Capability::HDR_OUTPUT_CONVERSION_CONFIG)) {
646 GTEST_SUCCEED() << "HDR output conversion not supported";
647 return;
648 }
649 const auto& [status, conversionCapabilities] = mComposerClient->getHdrConversionCapabilities();
650 for (auto conversionCapability : conversionCapabilities) {
651 if (conversionCapability.outputType) {
652 common::HdrConversionStrategy hdrConversionStrategy;
653 hdrConversionStrategy.set<common::HdrConversionStrategy::Tag::forceHdrConversion>(
654 conversionCapability.outputType->hdr);
655 const auto& statusSet =
656 mComposerClient->setHdrConversionStrategy(hdrConversionStrategy);
657 EXPECT_TRUE(status.isOk());
658 }
659 }
660}
661
662TEST_P(GraphicsComposerAidlTest, SetHdrConversionStrategy_Auto) {
663 if (!hasCapability(Capability::HDR_OUTPUT_CONVERSION_CONFIG)) {
664 GTEST_SUCCEED() << "HDR output conversion not supported";
665 return;
666 }
667 const auto& [status, conversionCapabilities] = mComposerClient->getHdrConversionCapabilities();
668 std::vector<aidl::android::hardware::graphics::common::Hdr> autoHdrTypes;
669 for (auto conversionCapability : conversionCapabilities) {
670 if (conversionCapability.outputType) {
671 autoHdrTypes.push_back(conversionCapability.outputType->hdr);
672 }
673 }
674 common::HdrConversionStrategy hdrConversionStrategy;
675 hdrConversionStrategy.set<common::HdrConversionStrategy::Tag::autoAllowedHdrTypes>(
676 autoHdrTypes);
677 const auto& statusSet = mComposerClient->setHdrConversionStrategy(hdrConversionStrategy);
678 EXPECT_TRUE(status.isOk());
679}
680
ramindani431aad42022-02-01 21:44:29 +0000681TEST_P(GraphicsComposerAidlTest, SetAutoLowLatencyMode_BadDisplay) {
682 auto status = mComposerClient->setAutoLowLatencyMode(getInvalidDisplayId(), /*isEnabled*/ true);
683 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000684 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani431aad42022-02-01 21:44:29 +0000685
686 status = mComposerClient->setAutoLowLatencyMode(getInvalidDisplayId(), /*isEnabled*/ false);
687 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000688 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000689}
690
ramindani431aad42022-02-01 21:44:29 +0000691TEST_P(GraphicsComposerAidlTest, SetAutoLowLatencyMode) {
ramindani0291f112021-11-04 03:45:46 +0000692 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000693 const auto& [status, capabilities] =
694 mComposerClient->getDisplayCapabilities(display.getDisplayId());
695 ASSERT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000696
697 const bool allmSupport =
698 std::find(capabilities.begin(), capabilities.end(),
699 DisplayCapability::AUTO_LOW_LATENCY_MODE) != capabilities.end();
700
701 if (!allmSupport) {
ramindani431aad42022-02-01 21:44:29 +0000702 const auto& statusIsOn = mComposerClient->setAutoLowLatencyMode(display.getDisplayId(),
703 /*isEnabled*/ true);
704 EXPECT_FALSE(statusIsOn.isOk());
ramindanid5751092022-04-22 22:30:20 +0000705 EXPECT_NO_FATAL_FAILURE(
706 assertServiceSpecificError(statusIsOn, IComposerClient::EX_UNSUPPORTED));
ramindani431aad42022-02-01 21:44:29 +0000707 const auto& statusIsOff = mComposerClient->setAutoLowLatencyMode(display.getDisplayId(),
708 /*isEnabled*/ false);
709 EXPECT_FALSE(statusIsOff.isOk());
ramindanid5751092022-04-22 22:30:20 +0000710 EXPECT_NO_FATAL_FAILURE(
711 assertServiceSpecificError(statusIsOff, IComposerClient::EX_UNSUPPORTED));
ramindani0291f112021-11-04 03:45:46 +0000712 GTEST_SUCCEED() << "Auto Low Latency Mode is not supported on display "
ramindani431aad42022-02-01 21:44:29 +0000713 << std::to_string(display.getDisplayId()) << ", skipping test";
ramindani0291f112021-11-04 03:45:46 +0000714 return;
715 }
716
ramindani431aad42022-02-01 21:44:29 +0000717 EXPECT_TRUE(mComposerClient->setAutoLowLatencyMode(display.getDisplayId(), true).isOk());
718 EXPECT_TRUE(mComposerClient->setAutoLowLatencyMode(display.getDisplayId(), false).isOk());
ramindani0291f112021-11-04 03:45:46 +0000719 }
720}
721
ramindani431aad42022-02-01 21:44:29 +0000722TEST_P(GraphicsComposerAidlTest, GetSupportedContentTypes_BadDisplay) {
723 const auto& [status, _] = mComposerClient->getSupportedContentTypes(getInvalidDisplayId());
724
725 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000726 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000727}
728
ramindani431aad42022-02-01 21:44:29 +0000729TEST_P(GraphicsComposerAidlTest, GetSupportedContentTypes) {
ramindani0291f112021-11-04 03:45:46 +0000730 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000731 const auto& [status, supportedContentTypes] =
732 mComposerClient->getSupportedContentTypes(display.getDisplayId());
733 ASSERT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000734
735 const bool noneSupported =
736 std::find(supportedContentTypes.begin(), supportedContentTypes.end(),
737 ContentType::NONE) != supportedContentTypes.end();
ramindani431aad42022-02-01 21:44:29 +0000738
ramindani0291f112021-11-04 03:45:46 +0000739 EXPECT_FALSE(noneSupported);
740 }
741}
742
ramindani431aad42022-02-01 21:44:29 +0000743TEST_P(GraphicsComposerAidlTest, SetContentTypeNoneAlwaysAccepted) {
ramindani0291f112021-11-04 03:45:46 +0000744 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000745 EXPECT_TRUE(
746 mComposerClient->setContentType(display.getDisplayId(), ContentType::NONE).isOk());
ramindani0291f112021-11-04 03:45:46 +0000747 }
748}
749
ramindani431aad42022-02-01 21:44:29 +0000750TEST_P(GraphicsComposerAidlTest, SetContentType_BadDisplay) {
ramindani0291f112021-11-04 03:45:46 +0000751 constexpr ContentType types[] = {ContentType::NONE, ContentType::GRAPHICS, ContentType::PHOTO,
752 ContentType::CINEMA, ContentType::GAME};
753 for (const auto& type : types) {
ramindani431aad42022-02-01 21:44:29 +0000754 const auto& status = mComposerClient->setContentType(getInvalidDisplayId(), type);
ramindani0291f112021-11-04 03:45:46 +0000755
ramindani431aad42022-02-01 21:44:29 +0000756 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000757 EXPECT_NO_FATAL_FAILURE(
758 assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000759 }
760}
761
ramindani431aad42022-02-01 21:44:29 +0000762TEST_P(GraphicsComposerAidlTest, SetGraphicsContentType) {
ramindani0291f112021-11-04 03:45:46 +0000763 Test_setContentType(ContentType::GRAPHICS, "GRAPHICS");
764}
765
ramindani431aad42022-02-01 21:44:29 +0000766TEST_P(GraphicsComposerAidlTest, SetPhotoContentType) {
ramindani0291f112021-11-04 03:45:46 +0000767 Test_setContentType(ContentType::PHOTO, "PHOTO");
768}
769
ramindani431aad42022-02-01 21:44:29 +0000770TEST_P(GraphicsComposerAidlTest, SetCinemaContentType) {
ramindani0291f112021-11-04 03:45:46 +0000771 Test_setContentType(ContentType::CINEMA, "CINEMA");
772}
773
ramindani431aad42022-02-01 21:44:29 +0000774TEST_P(GraphicsComposerAidlTest, SetGameContentType) {
ramindani0291f112021-11-04 03:45:46 +0000775 Test_setContentType(ContentType::GAME, "GAME");
776}
777
ramindanic2b8d082021-11-06 02:03:50 +0000778TEST_P(GraphicsComposerAidlTest, CreateVirtualDisplay) {
ramindani431aad42022-02-01 21:44:29 +0000779 const auto& [status, maxVirtualDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
780 EXPECT_TRUE(status.isOk());
781
ramindanic2b8d082021-11-06 02:03:50 +0000782 if (maxVirtualDisplayCount == 0) {
783 GTEST_SUCCEED() << "no virtual display support";
784 return;
785 }
786
ramindani431aad42022-02-01 21:44:29 +0000787 const auto& [virtualDisplayStatus, virtualDisplay] = mComposerClient->createVirtualDisplay(
788 /*width*/ 64, /*height*/ 64, common::PixelFormat::IMPLEMENTATION_DEFINED,
789 kBufferSlotCount);
ramindanic2b8d082021-11-06 02:03:50 +0000790
ramindani431aad42022-02-01 21:44:29 +0000791 ASSERT_TRUE(virtualDisplayStatus.isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000792 EXPECT_TRUE(mComposerClient->destroyVirtualDisplay(virtualDisplay.display).isOk());
793}
794
ramindani431aad42022-02-01 21:44:29 +0000795TEST_P(GraphicsComposerAidlTest, DestroyVirtualDisplay_BadDisplay) {
796 const auto& [status, maxDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
797 EXPECT_TRUE(status.isOk());
798
ramindani2740bac2021-11-24 22:58:32 +0000799 if (maxDisplayCount == 0) {
800 GTEST_SUCCEED() << "no virtual display support";
801 return;
802 }
ramindani2740bac2021-11-24 22:58:32 +0000803
ramindani431aad42022-02-01 21:44:29 +0000804 const auto& destroyStatus = mComposerClient->destroyVirtualDisplay(getInvalidDisplayId());
805
806 EXPECT_FALSE(destroyStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000807 EXPECT_NO_FATAL_FAILURE(
808 assertServiceSpecificError(destroyStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000809}
810
811TEST_P(GraphicsComposerAidlTest, CreateLayer) {
ramindani431aad42022-02-01 21:44:29 +0000812 const auto& [status, layer] =
813 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
ramindani2740bac2021-11-24 22:58:32 +0000814
ramindani431aad42022-02-01 21:44:29 +0000815 EXPECT_TRUE(status.isOk());
816 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000817}
818
ramindani431aad42022-02-01 21:44:29 +0000819TEST_P(GraphicsComposerAidlTest, CreateLayer_BadDisplay) {
820 const auto& [status, _] = mComposerClient->createLayer(getInvalidDisplayId(), kBufferSlotCount);
ramindani2740bac2021-11-24 22:58:32 +0000821
ramindani431aad42022-02-01 21:44:29 +0000822 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000823 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000824}
825
ramindani431aad42022-02-01 21:44:29 +0000826TEST_P(GraphicsComposerAidlTest, DestroyLayer_BadDisplay) {
827 const auto& [status, layer] =
828 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
829 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000830
ramindani431aad42022-02-01 21:44:29 +0000831 const auto& destroyStatus = mComposerClient->destroyLayer(getInvalidDisplayId(), layer);
ramindani2740bac2021-11-24 22:58:32 +0000832
ramindani431aad42022-02-01 21:44:29 +0000833 EXPECT_FALSE(destroyStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000834 EXPECT_NO_FATAL_FAILURE(
835 assertServiceSpecificError(destroyStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani431aad42022-02-01 21:44:29 +0000836 ASSERT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000837}
838
ramindani431aad42022-02-01 21:44:29 +0000839TEST_P(GraphicsComposerAidlTest, DestroyLayer_BadLayerError) {
ramindani2740bac2021-11-24 22:58:32 +0000840 // We haven't created any layers yet, so any id should be invalid
ramindani431aad42022-02-01 21:44:29 +0000841 const auto& status = mComposerClient->destroyLayer(getPrimaryDisplayId(), /*layer*/ 1);
ramindani2740bac2021-11-24 22:58:32 +0000842
ramindani431aad42022-02-01 21:44:29 +0000843 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000844 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_LAYER));
ramindani2740bac2021-11-24 22:58:32 +0000845}
846
ramindani431aad42022-02-01 21:44:29 +0000847TEST_P(GraphicsComposerAidlTest, GetActiveConfig_BadDisplay) {
848 const auto& [status, _] = mComposerClient->getActiveConfig(getInvalidDisplayId());
ramindani2740bac2021-11-24 22:58:32 +0000849
ramindani431aad42022-02-01 21:44:29 +0000850 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000851 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000852}
853
854TEST_P(GraphicsComposerAidlTest, GetDisplayConfig) {
ramindani431aad42022-02-01 21:44:29 +0000855 const auto& [status, _] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
856 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000857}
858
ramindani431aad42022-02-01 21:44:29 +0000859TEST_P(GraphicsComposerAidlTest, GetDisplayConfig_BadDisplay) {
860 const auto& [status, _] = mComposerClient->getDisplayConfigs(getInvalidDisplayId());
ramindani2740bac2021-11-24 22:58:32 +0000861
ramindani431aad42022-02-01 21:44:29 +0000862 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000863 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000864}
865
866TEST_P(GraphicsComposerAidlTest, GetDisplayName) {
ramindani431aad42022-02-01 21:44:29 +0000867 const auto& [status, _] = mComposerClient->getDisplayName(getPrimaryDisplayId());
868 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000869}
870
Sally Qi8ec063f2022-11-12 11:18:56 -0800871TEST_P(GraphicsComposerAidlTest, GetOverlaySupport) {
Sally Qic2c392f2023-01-13 14:50:20 -0800872 const auto& [status, properties] = mComposerClient->getOverlaySupport();
Sally Qi2600d342022-08-16 12:46:17 -0700873 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
874 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
875 GTEST_SUCCEED() << "getOverlaySupport is not supported";
876 return;
877 }
878
879 ASSERT_TRUE(status.isOk());
Sally Qic2c392f2023-01-13 14:50:20 -0800880 for (const auto& i : properties.combinations) {
881 for (const auto standard : i.standards) {
882 const auto val = static_cast<int32_t>(standard) &
883 static_cast<int32_t>(common::Dataspace::STANDARD_MASK);
884 ASSERT_TRUE(val == static_cast<int32_t>(standard));
885 }
886 for (const auto transfer : i.transfers) {
887 const auto val = static_cast<int32_t>(transfer) &
888 static_cast<int32_t>(common::Dataspace::TRANSFER_MASK);
889 ASSERT_TRUE(val == static_cast<int32_t>(transfer));
890 }
891 for (const auto range : i.ranges) {
892 const auto val = static_cast<int32_t>(range) &
893 static_cast<int32_t>(common::Dataspace::RANGE_MASK);
894 ASSERT_TRUE(val == static_cast<int32_t>(range));
895 }
896 }
Sally Qi2600d342022-08-16 12:46:17 -0700897}
898
ramindani431aad42022-02-01 21:44:29 +0000899TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation_BadDisplay) {
900 const auto& [status, _] = mComposerClient->getDisplayPhysicalOrientation(getInvalidDisplayId());
Ady Abrahamae12e382022-01-13 18:06:21 -0800901
ramindani431aad42022-02-01 21:44:29 +0000902 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000903 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Ady Abrahamae12e382022-01-13 18:06:21 -0800904}
905
906TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation) {
907 const auto allowedDisplayOrientations = std::array<Transform, 4>{
908 Transform::NONE,
909 Transform::ROT_90,
910 Transform::ROT_180,
911 Transform::ROT_270,
912 };
913
ramindani431aad42022-02-01 21:44:29 +0000914 const auto& [status, displayOrientation] =
915 mComposerClient->getDisplayPhysicalOrientation(getPrimaryDisplayId());
Ady Abrahamae12e382022-01-13 18:06:21 -0800916
ramindani431aad42022-02-01 21:44:29 +0000917 EXPECT_TRUE(status.isOk());
Ady Abrahamae12e382022-01-13 18:06:21 -0800918 EXPECT_NE(std::find(allowedDisplayOrientations.begin(), allowedDisplayOrientations.end(),
919 displayOrientation),
920 allowedDisplayOrientations.end());
921}
922
ramindani2740bac2021-11-24 22:58:32 +0000923TEST_P(GraphicsComposerAidlTest, SetClientTargetSlotCount) {
ramindani431aad42022-02-01 21:44:29 +0000924 EXPECT_TRUE(mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kBufferSlotCount)
925 .isOk());
ramindani2740bac2021-11-24 22:58:32 +0000926}
927
928TEST_P(GraphicsComposerAidlTest, SetActiveConfig) {
ramindani431aad42022-02-01 21:44:29 +0000929 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
930 EXPECT_TRUE(status.isOk());
931
932 for (const auto& config : configs) {
933 auto display = getEditablePrimaryDisplay();
934 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
935 const auto& [configStatus, config1] =
936 mComposerClient->getActiveConfig(getPrimaryDisplayId());
937 EXPECT_TRUE(configStatus.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000938 EXPECT_EQ(config, config1);
939 }
940}
941
942TEST_P(GraphicsComposerAidlTest, SetActiveConfigPowerCycle) {
ramindani431aad42022-02-01 21:44:29 +0000943 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
944 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000945
ramindani431aad42022-02-01 21:44:29 +0000946 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
947 EXPECT_TRUE(status.isOk());
948
949 for (const auto& config : configs) {
950 auto display = getEditablePrimaryDisplay();
951 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
952 const auto& [config1Status, config1] =
953 mComposerClient->getActiveConfig(getPrimaryDisplayId());
954 EXPECT_TRUE(config1Status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000955 EXPECT_EQ(config, config1);
956
ramindani431aad42022-02-01 21:44:29 +0000957 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
958 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
959 const auto& [config2Status, config2] =
960 mComposerClient->getActiveConfig(getPrimaryDisplayId());
961 EXPECT_TRUE(config2Status.isOk());
962 EXPECT_EQ(config, config2);
ramindani2740bac2021-11-24 22:58:32 +0000963 }
964}
965
ramindani2740bac2021-11-24 22:58:32 +0000966TEST_P(GraphicsComposerAidlTest, SetPowerModeUnsupported) {
ramindani431aad42022-02-01 21:44:29 +0000967 const auto& [status, capabilities] =
968 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
969 ASSERT_TRUE(status.isOk());
970
Ady Abraham6679baf2021-12-08 18:28:27 -0800971 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
972 DisplayCapability::DOZE) != capabilities.end();
973 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
974 DisplayCapability::SUSPEND) != capabilities.end();
ramindani2740bac2021-11-24 22:58:32 +0000975
ramindani431aad42022-02-01 21:44:29 +0000976 if (!isDozeSupported) {
977 const auto& powerModeDozeStatus =
978 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE);
979 EXPECT_FALSE(powerModeDozeStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000980 EXPECT_NO_FATAL_FAILURE(
981 assertServiceSpecificError(powerModeDozeStatus, IComposerClient::EX_UNSUPPORTED));
ramindani431aad42022-02-01 21:44:29 +0000982
983 const auto& powerModeDozeSuspendStatus =
984 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
985 EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000986 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeDozeSuspendStatus,
987 IComposerClient::EX_UNSUPPORTED));
ramindani2740bac2021-11-24 22:58:32 +0000988 }
Ady Abraham6679baf2021-12-08 18:28:27 -0800989
990 if (!isSuspendSupported) {
ramindani431aad42022-02-01 21:44:29 +0000991 const auto& powerModeSuspendStatus =
992 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON_SUSPEND);
993 EXPECT_FALSE(powerModeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000994 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeSuspendStatus,
995 IComposerClient::EX_UNSUPPORTED));
Ady Abraham6679baf2021-12-08 18:28:27 -0800996
ramindani431aad42022-02-01 21:44:29 +0000997 const auto& powerModeDozeSuspendStatus =
998 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
999 EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +00001000 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeDozeSuspendStatus,
1001 IComposerClient::EX_UNSUPPORTED));
Ady Abraham6679baf2021-12-08 18:28:27 -08001002 }
ramindani2740bac2021-11-24 22:58:32 +00001003}
1004
1005TEST_P(GraphicsComposerAidlTest, SetVsyncEnabled) {
ramindani431aad42022-02-01 21:44:29 +00001006 mComposerClient->setVsyncAllowed(true);
ramindani2740bac2021-11-24 22:58:32 +00001007
ramindani431aad42022-02-01 21:44:29 +00001008 EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), true).isOk());
ramindani2740bac2021-11-24 22:58:32 +00001009 usleep(60 * 1000);
ramindani431aad42022-02-01 21:44:29 +00001010 EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), false).isOk());
ramindani2740bac2021-11-24 22:58:32 +00001011
ramindani431aad42022-02-01 21:44:29 +00001012 mComposerClient->setVsyncAllowed(false);
ramindani2740bac2021-11-24 22:58:32 +00001013}
1014
ramindanic2b8d082021-11-06 02:03:50 +00001015TEST_P(GraphicsComposerAidlTest, SetPowerMode) {
ramindani431aad42022-02-01 21:44:29 +00001016 const auto& [status, capabilities] =
1017 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
1018 ASSERT_TRUE(status.isOk());
1019
Ady Abraham6679baf2021-12-08 18:28:27 -08001020 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
1021 DisplayCapability::DOZE) != capabilities.end();
1022 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
1023 DisplayCapability::SUSPEND) != capabilities.end();
1024
ramindanic2b8d082021-11-06 02:03:50 +00001025 std::vector<PowerMode> modes;
1026 modes.push_back(PowerMode::OFF);
ramindanic2b8d082021-11-06 02:03:50 +00001027 modes.push_back(PowerMode::ON);
1028
Ady Abraham6679baf2021-12-08 18:28:27 -08001029 if (isSuspendSupported) {
1030 modes.push_back(PowerMode::ON_SUSPEND);
1031 }
1032
ramindani770d7082021-11-30 00:36:42 +00001033 if (isDozeSupported) {
1034 modes.push_back(PowerMode::DOZE);
Ady Abraham6679baf2021-12-08 18:28:27 -08001035 }
1036
1037 if (isSuspendSupported && isDozeSupported) {
ramindani770d7082021-11-30 00:36:42 +00001038 modes.push_back(PowerMode::DOZE_SUSPEND);
1039 }
1040
ramindanic2b8d082021-11-06 02:03:50 +00001041 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001042 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001043 }
1044}
1045
1046TEST_P(GraphicsComposerAidlTest, SetPowerModeVariations) {
ramindani431aad42022-02-01 21:44:29 +00001047 const auto& [status, capabilities] =
1048 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
1049 ASSERT_TRUE(status.isOk());
1050
Ady Abraham6679baf2021-12-08 18:28:27 -08001051 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
1052 DisplayCapability::DOZE) != capabilities.end();
1053 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
1054 DisplayCapability::SUSPEND) != capabilities.end();
1055
ramindanic2b8d082021-11-06 02:03:50 +00001056 std::vector<PowerMode> modes;
1057
1058 modes.push_back(PowerMode::OFF);
ramindani770d7082021-11-30 00:36:42 +00001059 modes.push_back(PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +00001060 modes.push_back(PowerMode::OFF);
ramindanic2b8d082021-11-06 02:03:50 +00001061 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001062 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001063 }
ramindani770d7082021-11-30 00:36:42 +00001064 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +00001065
ramindani770d7082021-11-30 00:36:42 +00001066 modes.push_back(PowerMode::OFF);
1067 modes.push_back(PowerMode::OFF);
1068 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001069 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindani770d7082021-11-30 00:36:42 +00001070 }
ramindanic2b8d082021-11-06 02:03:50 +00001071 modes.clear();
1072
1073 modes.push_back(PowerMode::ON);
1074 modes.push_back(PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +00001075 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001076 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001077 }
ramindanic2b8d082021-11-06 02:03:50 +00001078 modes.clear();
1079
Ady Abraham6679baf2021-12-08 18:28:27 -08001080 if (isSuspendSupported) {
1081 modes.push_back(PowerMode::ON_SUSPEND);
1082 modes.push_back(PowerMode::ON_SUSPEND);
1083 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001084 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
Ady Abraham6679baf2021-12-08 18:28:27 -08001085 }
1086 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +00001087 }
1088
ramindanic2b8d082021-11-06 02:03:50 +00001089 if (isDozeSupported) {
ramindanic2b8d082021-11-06 02:03:50 +00001090 modes.push_back(PowerMode::DOZE);
1091 modes.push_back(PowerMode::DOZE);
ramindanic2b8d082021-11-06 02:03:50 +00001092 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001093 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001094 }
ramindanic2b8d082021-11-06 02:03:50 +00001095 modes.clear();
Ady Abraham6679baf2021-12-08 18:28:27 -08001096 }
ramindanic2b8d082021-11-06 02:03:50 +00001097
Ady Abraham6679baf2021-12-08 18:28:27 -08001098 if (isSuspendSupported && isDozeSupported) {
ramindanic2b8d082021-11-06 02:03:50 +00001099 modes.push_back(PowerMode::DOZE_SUSPEND);
1100 modes.push_back(PowerMode::DOZE_SUSPEND);
ramindanic2b8d082021-11-06 02:03:50 +00001101 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001102 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001103 }
Ady Abraham6679baf2021-12-08 18:28:27 -08001104 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +00001105 }
1106}
1107
ramindani431aad42022-02-01 21:44:29 +00001108TEST_P(GraphicsComposerAidlTest, SetPowerMode_BadDisplay) {
1109 const auto& status = mComposerClient->setPowerMode(getInvalidDisplayId(), PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +00001110
ramindani431aad42022-02-01 21:44:29 +00001111 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001112 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindanic2b8d082021-11-06 02:03:50 +00001113}
1114
ramindani431aad42022-02-01 21:44:29 +00001115TEST_P(GraphicsComposerAidlTest, SetPowerMode_BadParameter) {
1116 const auto& status =
1117 mComposerClient->setPowerMode(getPrimaryDisplayId(), static_cast<PowerMode>(-1));
ramindanic2b8d082021-11-06 02:03:50 +00001118
ramindani431aad42022-02-01 21:44:29 +00001119 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001120 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanic2b8d082021-11-06 02:03:50 +00001121}
1122
ramindanic2b8d082021-11-06 02:03:50 +00001123TEST_P(GraphicsComposerAidlTest, GetDataspaceSaturationMatrix) {
ramindani431aad42022-02-01 21:44:29 +00001124 const auto& [status, matrix] =
1125 mComposerClient->getDataspaceSaturationMatrix(common::Dataspace::SRGB_LINEAR);
1126 ASSERT_TRUE(status.isOk());
1127 ASSERT_EQ(16, matrix.size()); // matrix should not be empty if call succeeded.
ramindanideb059e2021-11-18 01:57:25 +00001128
ramindanic2b8d082021-11-06 02:03:50 +00001129 // the last row is known
ramindani431aad42022-02-01 21:44:29 +00001130 EXPECT_EQ(0.0f, matrix[12]);
1131 EXPECT_EQ(0.0f, matrix[13]);
1132 EXPECT_EQ(0.0f, matrix[14]);
1133 EXPECT_EQ(1.0f, matrix[15]);
ramindanic2b8d082021-11-06 02:03:50 +00001134}
1135
ramindani431aad42022-02-01 21:44:29 +00001136TEST_P(GraphicsComposerAidlTest, GetDataspaceSaturationMatrix_BadParameter) {
1137 const auto& [status, matrix] =
1138 mComposerClient->getDataspaceSaturationMatrix(common::Dataspace::UNKNOWN);
ramindanic2b8d082021-11-06 02:03:50 +00001139
ramindani431aad42022-02-01 21:44:29 +00001140 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001141 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanic2b8d082021-11-06 02:03:50 +00001142}
1143
ramindanidcfe3a82021-11-29 17:00:31 +00001144// Tests for Command.
1145class GraphicsComposerAidlCommandTest : public GraphicsComposerAidlTest {
1146 protected:
ramindanidcfe3a82021-11-29 17:00:31 +00001147 void TearDown() override {
Ady Abraham3192f3d2021-12-03 16:08:56 -08001148 const auto errors = mReader.takeErrors();
1149 ASSERT_TRUE(mReader.takeErrors().empty());
ramindani431aad42022-02-01 21:44:29 +00001150 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001151
ramindanidcfe3a82021-11-29 17:00:31 +00001152 ASSERT_NO_FATAL_FAILURE(GraphicsComposerAidlTest::TearDown());
1153 }
1154
1155 void execute() {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001156 std::vector<CommandResultPayload> payloads;
1157 for (auto& [_, writer] : mWriters) {
1158 const auto& commands = writer.getPendingCommands();
1159 if (commands.empty()) {
1160 writer.reset();
1161 continue;
1162 }
1163
1164 auto [status, results] = mComposerClient->executeCommands(commands);
1165 ASSERT_TRUE(status.isOk()) << "executeCommands failed " << status.getDescription();
1166 writer.reset();
1167
1168 payloads.reserve(payloads.size() + results.size());
1169 payloads.insert(payloads.end(), std::make_move_iterator(results.begin()),
1170 std::make_move_iterator(results.end()));
ramindanidcfe3a82021-11-29 17:00:31 +00001171 }
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001172 mReader.parse(std::move(payloads));
ramindanidcfe3a82021-11-29 17:00:31 +00001173 }
1174
1175 static inline auto toTimePoint(nsecs_t time) {
1176 return std::chrono::time_point<std::chrono::steady_clock>(std::chrono::nanoseconds(time));
1177 }
1178
ramindanidcfe3a82021-11-29 17:00:31 +00001179 void forEachTwoConfigs(int64_t display, std::function<void(int32_t, int32_t)> func) {
ramindani431aad42022-02-01 21:44:29 +00001180 const auto& [status, displayConfigs] = mComposerClient->getDisplayConfigs(display);
1181 ASSERT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001182 for (const int32_t config1 : displayConfigs) {
1183 for (const int32_t config2 : displayConfigs) {
1184 if (config1 != config2) {
1185 func(config1, config2);
1186 }
1187 }
1188 }
1189 }
1190
1191 void waitForVsyncPeriodChange(int64_t display, const VsyncPeriodChangeTimeline& timeline,
1192 int64_t desiredTimeNanos, int64_t oldPeriodNanos,
1193 int64_t newPeriodNanos) {
1194 const auto kChangeDeadline = toTimePoint(timeline.newVsyncAppliedTimeNanos) + 100ms;
1195 while (std::chrono::steady_clock::now() <= kChangeDeadline) {
ramindani431aad42022-02-01 21:44:29 +00001196 const auto& [status, vsyncPeriodNanos] =
1197 mComposerClient->getDisplayVsyncPeriod(display);
1198 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001199 if (systemTime() <= desiredTimeNanos) {
1200 EXPECT_EQ(vsyncPeriodNanos, oldPeriodNanos);
1201 } else if (vsyncPeriodNanos == newPeriodNanos) {
1202 break;
1203 }
1204 std::this_thread::sleep_for(std::chrono::nanoseconds(oldPeriodNanos));
1205 }
1206 }
1207
Brian Lindahlca3eef22022-12-09 00:32:11 -07001208 sp<GraphicBuffer> allocate(::android::PixelFormat pixelFormat) {
Brian Lindahl14bd07b2023-01-17 14:54:39 -07001209 return sp<GraphicBuffer>::make(
1210 static_cast<uint32_t>(getPrimaryDisplay().getDisplayWidth()),
1211 static_cast<uint32_t>(getPrimaryDisplay().getDisplayHeight()), pixelFormat,
1212 /*layerCount*/ 1U,
1213 (static_cast<uint64_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
1214 static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
1215 static_cast<uint64_t>(common::BufferUsage::COMPOSER_OVERLAY)),
1216 "VtsHalGraphicsComposer3_TargetTest");
Brian Lindahlca3eef22022-12-09 00:32:11 -07001217 }
1218
ramindanidcfe3a82021-11-29 17:00:31 +00001219 void sendRefreshFrame(const VtsDisplay& display, const VsyncPeriodChangeTimeline* timeline) {
1220 if (timeline != nullptr) {
1221 // Refresh time should be before newVsyncAppliedTimeNanos
1222 EXPECT_LT(timeline->refreshTimeNanos, timeline->newVsyncAppliedTimeNanos);
1223
1224 std::this_thread::sleep_until(toTimePoint(timeline->refreshTimeNanos));
1225 }
1226
ramindani431aad42022-02-01 21:44:29 +00001227 EXPECT_TRUE(mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::ON).isOk());
1228 EXPECT_TRUE(mComposerClient
1229 ->setColorMode(display.getDisplayId(), ColorMode::NATIVE,
1230 RenderIntent::COLORIMETRIC)
1231 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001232
ramindani431aad42022-02-01 21:44:29 +00001233 const auto& [status, layer] =
1234 mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount);
1235 EXPECT_TRUE(status.isOk());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001236 auto& writer = getWriter(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001237 {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001238 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindanidcfe3a82021-11-29 17:00:31 +00001239 ASSERT_NE(nullptr, buffer);
1240 ASSERT_EQ(::android::OK, buffer->initCheck());
1241 ASSERT_NE(nullptr, buffer->handle);
1242
ramindani431aad42022-02-01 21:44:29 +00001243 configureLayer(display, layer, Composition::DEVICE, display.getFrameRect(),
1244 display.getCrop());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001245 writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer->handle,
1246 /*acquireFence*/ -1);
1247 writer.setLayerDataspace(display.getDisplayId(), layer, common::Dataspace::UNKNOWN);
ramindanidcfe3a82021-11-29 17:00:31 +00001248
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001249 writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001250 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001251 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001252
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001253 writer.presentDisplay(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001254 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001255 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001256 }
1257
1258 {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001259 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindanidcfe3a82021-11-29 17:00:31 +00001260 ASSERT_NE(nullptr, buffer->handle);
1261
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001262 writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer->handle,
1263 /*acquireFence*/ -1);
1264 writer.setLayerSurfaceDamage(display.getDisplayId(), layer,
1265 std::vector<Rect>(1, {0, 0, 10, 10}));
1266 writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001267 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001268 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001269
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001270 writer.presentDisplay(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001271 execute();
1272 }
1273
ramindani431aad42022-02-01 21:44:29 +00001274 EXPECT_TRUE(mComposerClient->destroyLayer(display.getDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001275 }
1276
Ady Abraham72c5b502021-12-10 17:23:39 -08001277 sp<::android::Fence> presentAndGetFence(
1278 std::optional<ClockMonotonicTimestamp> expectedPresentTime) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001279 auto& writer = getWriter(getPrimaryDisplayId());
1280 writer.validateDisplay(getPrimaryDisplayId(), expectedPresentTime);
Ady Abraham72c5b502021-12-10 17:23:39 -08001281 execute();
1282 EXPECT_TRUE(mReader.takeErrors().empty());
1283
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001284 writer.presentDisplay(getPrimaryDisplayId());
Ady Abraham72c5b502021-12-10 17:23:39 -08001285 execute();
1286 EXPECT_TRUE(mReader.takeErrors().empty());
1287
ramindani431aad42022-02-01 21:44:29 +00001288 auto presentFence = mReader.takePresentFence(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -08001289 // take ownership
1290 const int fenceOwner = presentFence.get();
1291 *presentFence.getR() = -1;
1292 EXPECT_NE(-1, fenceOwner);
1293 return sp<::android::Fence>::make(fenceOwner);
Ady Abraham72c5b502021-12-10 17:23:39 -08001294 }
1295
1296 int32_t getVsyncPeriod() {
ramindani431aad42022-02-01 21:44:29 +00001297 const auto& [status, activeConfig] =
1298 mComposerClient->getActiveConfig(getPrimaryDisplayId());
1299 EXPECT_TRUE(status.isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001300
ramindani431aad42022-02-01 21:44:29 +00001301 const auto& [vsyncPeriodStatus, vsyncPeriod] = mComposerClient->getDisplayAttribute(
1302 getPrimaryDisplayId(), activeConfig, DisplayAttribute::VSYNC_PERIOD);
1303 EXPECT_TRUE(vsyncPeriodStatus.isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001304 return vsyncPeriod;
1305 }
1306
1307 int64_t createOnScreenLayer() {
ramindani431aad42022-02-01 21:44:29 +00001308 const auto& [status, layer] =
1309 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1310 EXPECT_TRUE(status.isOk());
1311 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1312 getPrimaryDisplay().getDisplayHeight()};
1313 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1314 (float)getPrimaryDisplay().getDisplayHeight()};
1315 configureLayer(getPrimaryDisplay(), layer, Composition::DEVICE, displayFrame, cropRect);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001316 auto& writer = getWriter(getPrimaryDisplayId());
1317 writer.setLayerDataspace(getPrimaryDisplayId(), layer, common::Dataspace::UNKNOWN);
Ady Abraham72c5b502021-12-10 17:23:39 -08001318 return layer;
1319 }
1320
Midas Chiena0b56bd2022-01-13 23:27:33 +08001321 bool hasDisplayCapability(int64_t display, DisplayCapability cap) {
ramindani431aad42022-02-01 21:44:29 +00001322 const auto& [status, capabilities] = mComposerClient->getDisplayCapabilities(display);
1323 EXPECT_TRUE(status.isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08001324
1325 return std::find(capabilities.begin(), capabilities.end(), cap) != capabilities.end();
1326 }
1327
ramindanidcfe3a82021-11-29 17:00:31 +00001328 void Test_setActiveConfigWithConstraints(const TestParameters& params) {
1329 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00001330 forEachTwoConfigs(display.getDisplayId(), [&](int32_t config1, int32_t config2) {
1331 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001332 sendRefreshFrame(display, nullptr);
1333
ramindani431aad42022-02-01 21:44:29 +00001334 const auto displayConfigGroup1 = display.getDisplayConfig(config1);
1335 int32_t vsyncPeriod1 = displayConfigGroup1.vsyncPeriod;
1336 int32_t configGroup1 = displayConfigGroup1.configGroup;
1337
1338 const auto displayConfigGroup2 = display.getDisplayConfig(config2);
1339 int32_t vsyncPeriod2 = displayConfigGroup2.vsyncPeriod;
1340 int32_t configGroup2 = displayConfigGroup2.configGroup;
ramindanidcfe3a82021-11-29 17:00:31 +00001341
1342 if (vsyncPeriod1 == vsyncPeriod2) {
1343 return; // continue
1344 }
1345
1346 // We don't allow delayed change when changing config groups
1347 if (params.delayForChange > 0 && configGroup1 != configGroup2) {
1348 return; // continue
1349 }
1350
ramindanidcfe3a82021-11-29 17:00:31 +00001351 VsyncPeriodChangeConstraints constraints = {
1352 .desiredTimeNanos = systemTime() + params.delayForChange,
1353 .seamlessRequired = false};
ramindani431aad42022-02-01 21:44:29 +00001354 const auto& [status, timeline] = mComposerClient->setActiveConfigWithConstraints(
1355 &display, config2, constraints);
1356 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001357
1358 EXPECT_TRUE(timeline.newVsyncAppliedTimeNanos >= constraints.desiredTimeNanos);
1359 // Refresh rate should change within a reasonable time
1360 constexpr std::chrono::nanoseconds kReasonableTimeForChange = 1s; // 1 second
1361 EXPECT_TRUE(timeline.newVsyncAppliedTimeNanos - constraints.desiredTimeNanos <=
1362 kReasonableTimeForChange.count());
1363
1364 if (timeline.refreshRequired) {
1365 if (params.refreshMiss) {
1366 // Miss the refresh frame on purpose to make sure the implementation sends a
1367 // callback
1368 std::this_thread::sleep_until(toTimePoint(timeline.refreshTimeNanos) +
1369 100ms);
1370 }
1371 sendRefreshFrame(display, &timeline);
1372 }
ramindani431aad42022-02-01 21:44:29 +00001373 waitForVsyncPeriodChange(display.getDisplayId(), timeline,
1374 constraints.desiredTimeNanos, vsyncPeriod1, vsyncPeriod2);
ramindanidcfe3a82021-11-29 17:00:31 +00001375
1376 // At this point the refresh rate should have changed already, however in rare
1377 // cases the implementation might have missed the deadline. In this case a new
1378 // timeline should have been provided.
ramindani431aad42022-02-01 21:44:29 +00001379 auto newTimeline = mComposerClient->takeLastVsyncPeriodChangeTimeline();
ramindanidcfe3a82021-11-29 17:00:31 +00001380 if (timeline.refreshRequired && params.refreshMiss) {
1381 EXPECT_TRUE(newTimeline.has_value());
1382 }
1383
1384 if (newTimeline.has_value()) {
1385 if (newTimeline->refreshRequired) {
1386 sendRefreshFrame(display, &newTimeline.value());
1387 }
ramindani431aad42022-02-01 21:44:29 +00001388 waitForVsyncPeriodChange(display.getDisplayId(), newTimeline.value(),
ramindanidcfe3a82021-11-29 17:00:31 +00001389 constraints.desiredTimeNanos, vsyncPeriod1,
1390 vsyncPeriod2);
1391 }
1392
ramindani431aad42022-02-01 21:44:29 +00001393 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanos] =
1394 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
1395 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001396 EXPECT_EQ(vsyncPeriodNanos, vsyncPeriod2);
1397 });
1398 }
1399 }
1400
Ady Abraham72c5b502021-12-10 17:23:39 -08001401 void Test_expectedPresentTime(std::optional<int> framesDelay) {
Jason Macnak325e8232022-01-24 14:48:55 -08001402 if (hasCapability(Capability::PRESENT_FENCE_IS_NOT_RELIABLE)) {
1403 GTEST_SUCCEED() << "Device has unreliable present fences capability, skipping";
1404 return;
1405 }
1406
ramindani431aad42022-02-01 21:44:29 +00001407 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001408
1409 const auto vsyncPeriod = getVsyncPeriod();
1410
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001411 const auto buffer1 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1412 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
Ady Abraham72c5b502021-12-10 17:23:39 -08001413 ASSERT_NE(nullptr, buffer1);
1414 ASSERT_NE(nullptr, buffer2);
1415
1416 const auto layer = createOnScreenLayer();
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001417 auto& writer = getWriter(getPrimaryDisplayId());
1418 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer1->handle,
1419 /*acquireFence*/ -1);
Ady Abraham72c5b502021-12-10 17:23:39 -08001420 const sp<::android::Fence> presentFence1 =
1421 presentAndGetFence(ComposerClientWriter::kNoTimestamp);
1422 presentFence1->waitForever(LOG_TAG);
1423
1424 auto expectedPresentTime = presentFence1->getSignalTime() + vsyncPeriod;
1425 if (framesDelay.has_value()) {
1426 expectedPresentTime += *framesDelay * vsyncPeriod;
1427 }
1428
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001429 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer2->handle,
1430 /*acquireFence*/ -1);
Ady Abraham72c5b502021-12-10 17:23:39 -08001431 const auto setExpectedPresentTime = [&]() -> std::optional<ClockMonotonicTimestamp> {
1432 if (!framesDelay.has_value()) {
1433 return ComposerClientWriter::kNoTimestamp;
1434 } else if (*framesDelay == 0) {
1435 return ClockMonotonicTimestamp{0};
1436 }
1437 return ClockMonotonicTimestamp{expectedPresentTime};
1438 }();
1439
1440 const sp<::android::Fence> presentFence2 = presentAndGetFence(setExpectedPresentTime);
1441 presentFence2->waitForever(LOG_TAG);
1442
1443 const auto actualPresentTime = presentFence2->getSignalTime();
Ady Abrahamdf084f32022-01-10 14:10:23 -08001444 EXPECT_GE(actualPresentTime, expectedPresentTime - vsyncPeriod / 2);
Ady Abraham72c5b502021-12-10 17:23:39 -08001445
ramindani431aad42022-02-01 21:44:29 +00001446 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001447 }
1448
ramindani431aad42022-02-01 21:44:29 +00001449 void configureLayer(const VtsDisplay& display, int64_t layer, Composition composition,
1450 const Rect& displayFrame, const FRect& cropRect) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001451 auto& writer = getWriter(display.getDisplayId());
1452 writer.setLayerCompositionType(display.getDisplayId(), layer, composition);
1453 writer.setLayerDisplayFrame(display.getDisplayId(), layer, displayFrame);
1454 writer.setLayerPlaneAlpha(display.getDisplayId(), layer, /*alpha*/ 1);
1455 writer.setLayerSourceCrop(display.getDisplayId(), layer, cropRect);
1456 writer.setLayerTransform(display.getDisplayId(), layer, static_cast<Transform>(0));
1457 writer.setLayerVisibleRegion(display.getDisplayId(), layer,
1458 std::vector<Rect>(1, displayFrame));
1459 writer.setLayerZOrder(display.getDisplayId(), layer, /*z*/ 10);
1460 writer.setLayerBlendMode(display.getDisplayId(), layer, BlendMode::NONE);
1461 writer.setLayerSurfaceDamage(display.getDisplayId(), layer,
1462 std::vector<Rect>(1, displayFrame));
ramindani431aad42022-02-01 21:44:29 +00001463 }
ramindanidcfe3a82021-11-29 17:00:31 +00001464 // clang-format off
1465 const std::array<float, 16> kIdentity = {{
1466 1.0f, 0.0f, 0.0f, 0.0f,
1467 0.0f, 1.0f, 0.0f, 0.0f,
1468 0.0f, 0.0f, 1.0f, 0.0f,
1469 0.0f, 0.0f, 0.0f, 1.0f,
1470 }};
1471 // clang-format on
1472
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001473 ComposerClientWriter& getWriter(int64_t display) {
1474 auto [it, _] = mWriters.try_emplace(display, display);
1475 return it->second;
1476 }
1477
Ady Abraham91c9d1a2021-12-15 18:14:45 -08001478 ComposerClientReader mReader;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001479
1480 private:
1481 std::unordered_map<int64_t, ComposerClientWriter> mWriters;
ramindanidcfe3a82021-11-29 17:00:31 +00001482};
1483
ramindani431aad42022-02-01 21:44:29 +00001484TEST_P(GraphicsComposerAidlCommandTest, SetColorTransform) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001485 auto& writer = getWriter(getPrimaryDisplayId());
1486 writer.setColorTransform(getPrimaryDisplayId(), kIdentity.data());
ramindanidcfe3a82021-11-29 17:00:31 +00001487 execute();
1488}
1489
1490TEST_P(GraphicsComposerAidlCommandTest, SetLayerColorTransform) {
ramindani431aad42022-02-01 21:44:29 +00001491 const auto& [status, layer] =
1492 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1493 EXPECT_TRUE(status.isOk());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001494 auto& writer = getWriter(getPrimaryDisplayId());
1495 writer.setLayerColorTransform(getPrimaryDisplayId(), layer, kIdentity.data());
ramindanidcfe3a82021-11-29 17:00:31 +00001496 execute();
1497
Ady Abraham3192f3d2021-12-03 16:08:56 -08001498 const auto errors = mReader.takeErrors();
Jason Macnak062bc9a2022-01-20 15:00:09 -08001499 if (errors.size() == 1 && errors[0].errorCode == IComposerClient::EX_UNSUPPORTED) {
ramindanidcfe3a82021-11-29 17:00:31 +00001500 GTEST_SUCCEED() << "setLayerColorTransform is not supported";
1501 return;
1502 }
1503}
1504
Alec Mouri60564e12021-12-09 18:48:20 -08001505TEST_P(GraphicsComposerAidlCommandTest, SetDisplayBrightness) {
ramindani431aad42022-02-01 21:44:29 +00001506 const auto& [status, capabilities] =
1507 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
1508 ASSERT_TRUE(status.isOk());
Alec Mouri60564e12021-12-09 18:48:20 -08001509 bool brightnessSupport = std::find(capabilities.begin(), capabilities.end(),
1510 DisplayCapability::BRIGHTNESS) != capabilities.end();
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001511 auto& writer = getWriter(getPrimaryDisplayId());
Alec Mouri60564e12021-12-09 18:48:20 -08001512 if (!brightnessSupport) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001513 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.5f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001514 execute();
1515 const auto errors = mReader.takeErrors();
1516 EXPECT_EQ(1, errors.size());
Jason Macnak062bc9a2022-01-20 15:00:09 -08001517 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, errors[0].errorCode);
Alec Mouri60564e12021-12-09 18:48:20 -08001518 GTEST_SUCCEED() << "SetDisplayBrightness is not supported";
1519 return;
1520 }
1521
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001522 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001523 execute();
1524 EXPECT_TRUE(mReader.takeErrors().empty());
1525
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001526 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.5f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001527 execute();
1528 EXPECT_TRUE(mReader.takeErrors().empty());
1529
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001530 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 1.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001531 execute();
1532 EXPECT_TRUE(mReader.takeErrors().empty());
1533
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001534 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ -1.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001535 execute();
1536 EXPECT_TRUE(mReader.takeErrors().empty());
1537
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001538 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 2.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001539 execute();
1540 {
1541 const auto errors = mReader.takeErrors();
ramindanib3bdf052022-01-12 18:27:05 +00001542 ASSERT_EQ(1, errors.size());
Alec Mouri60564e12021-12-09 18:48:20 -08001543 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1544 }
1545
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001546 writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ -2.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001547 execute();
1548 {
1549 const auto errors = mReader.takeErrors();
ramindanib3bdf052022-01-12 18:27:05 +00001550 ASSERT_EQ(1, errors.size());
Alec Mouri60564e12021-12-09 18:48:20 -08001551 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1552 }
1553}
1554
ramindani431aad42022-02-01 21:44:29 +00001555TEST_P(GraphicsComposerAidlCommandTest, SetClientTarget) {
1556 EXPECT_TRUE(mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kBufferSlotCount)
1557 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001558
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001559 auto& writer = getWriter(getPrimaryDisplayId());
1560 writer.setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, nullptr, /*acquireFence*/ -1,
1561 Dataspace::UNKNOWN, std::vector<Rect>());
ramindanidcfe3a82021-11-29 17:00:31 +00001562
1563 execute();
1564}
1565
ramindani431aad42022-02-01 21:44:29 +00001566TEST_P(GraphicsComposerAidlCommandTest, SetOutputBuffer) {
1567 const auto& [status, virtualDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
1568 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001569 if (virtualDisplayCount == 0) {
1570 GTEST_SUCCEED() << "no virtual display support";
1571 return;
1572 }
1573
ramindani431aad42022-02-01 21:44:29 +00001574 const auto& [displayStatus, display] = mComposerClient->createVirtualDisplay(
1575 /*width*/ 64, /*height*/ 64, common::PixelFormat::IMPLEMENTATION_DEFINED,
1576 kBufferSlotCount);
1577 EXPECT_TRUE(displayStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001578
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001579 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001580 const auto handle = buffer->handle;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001581 auto& writer = getWriter(display.display);
1582 writer.setOutputBuffer(display.display, /*slot*/ 0, handle, /*releaseFence*/ -1);
ramindanidcfe3a82021-11-29 17:00:31 +00001583 execute();
1584}
1585
ramindani431aad42022-02-01 21:44:29 +00001586TEST_P(GraphicsComposerAidlCommandTest, ValidDisplay) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001587 auto& writer = getWriter(getPrimaryDisplayId());
1588 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001589 execute();
1590}
1591
ramindani431aad42022-02-01 21:44:29 +00001592TEST_P(GraphicsComposerAidlCommandTest, AcceptDisplayChanges) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001593 auto& writer = getWriter(getPrimaryDisplayId());
1594 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1595 writer.acceptDisplayChanges(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001596 execute();
1597}
1598
ramindani431aad42022-02-01 21:44:29 +00001599TEST_P(GraphicsComposerAidlCommandTest, PresentDisplay) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001600 auto& writer = getWriter(getPrimaryDisplayId());
1601 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1602 writer.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001603 execute();
1604}
1605
1606/**
1607 * Test IComposerClient::Command::PRESENT_DISPLAY
1608 *
1609 * Test that IComposerClient::Command::PRESENT_DISPLAY works without
1610 * additional call to validateDisplay when only the layer buffer handle and
1611 * surface damage have been set
1612 */
ramindani431aad42022-02-01 21:44:29 +00001613TEST_P(GraphicsComposerAidlCommandTest, PresentDisplayNoLayerStateChanges) {
Jason Macnak325e8232022-01-24 14:48:55 -08001614 if (!hasCapability(Capability::SKIP_VALIDATE)) {
ramindanidcfe3a82021-11-29 17:00:31 +00001615 GTEST_SUCCEED() << "Device does not have skip validate capability, skipping";
1616 return;
1617 }
ramindani431aad42022-02-01 21:44:29 +00001618 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001619
ramindani431aad42022-02-01 21:44:29 +00001620 const auto& [renderIntentsStatus, renderIntents] =
1621 mComposerClient->getRenderIntents(getPrimaryDisplayId(), ColorMode::NATIVE);
1622 EXPECT_TRUE(renderIntentsStatus.isOk());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001623 auto& writer = getWriter(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001624 for (auto intent : renderIntents) {
ramindani431aad42022-02-01 21:44:29 +00001625 EXPECT_TRUE(mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE, intent)
1626 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001627
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001628 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001629 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001630 ASSERT_NE(nullptr, handle);
1631
ramindani431aad42022-02-01 21:44:29 +00001632 const auto& [layerStatus, layer] =
1633 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1634 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001635
ramindani431aad42022-02-01 21:44:29 +00001636 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1637 getPrimaryDisplay().getDisplayHeight()};
1638 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1639 (float)getPrimaryDisplay().getDisplayHeight()};
1640 configureLayer(getPrimaryDisplay(), layer, Composition::CURSOR, displayFrame, cropRect);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001641 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle,
1642 /*acquireFence*/ -1);
1643 writer.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1644 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001645 execute();
ramindani431aad42022-02-01 21:44:29 +00001646 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanidcfe3a82021-11-29 17:00:31 +00001647 GTEST_SUCCEED() << "Composition change requested, skipping test";
1648 return;
1649 }
1650
Ady Abraham3192f3d2021-12-03 16:08:56 -08001651 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001652 writer.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001653 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001654 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001655
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001656 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001657 const auto handle2 = buffer2->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001658 ASSERT_NE(nullptr, handle2);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001659 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle2,
1660 /*acquireFence*/ -1);
1661 writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer,
1662 std::vector<Rect>(1, {0, 0, 10, 10}));
1663 writer.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001664 execute();
1665 }
1666}
1667
ramindani431aad42022-02-01 21:44:29 +00001668TEST_P(GraphicsComposerAidlCommandTest, SetLayerCursorPosition) {
1669 const auto& [layerStatus, layer] =
1670 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1671 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001672
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001673 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001674 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001675 ASSERT_NE(nullptr, handle);
ramindanidcfe3a82021-11-29 17:00:31 +00001676
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001677 auto& writer = getWriter(getPrimaryDisplayId());
1678 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
ramindani431aad42022-02-01 21:44:29 +00001679
1680 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1681 getPrimaryDisplay().getDisplayHeight()};
1682 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1683 (float)getPrimaryDisplay().getDisplayHeight()};
1684 configureLayer(getPrimaryDisplay(), layer, Composition::CURSOR, displayFrame, cropRect);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001685 writer.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1686 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001687
1688 execute();
Ady Abraham46219f52021-12-20 09:44:31 -08001689
ramindani431aad42022-02-01 21:44:29 +00001690 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanidcfe3a82021-11-29 17:00:31 +00001691 GTEST_SUCCEED() << "Composition change requested, skipping test";
1692 return;
1693 }
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001694 writer.presentDisplay(getPrimaryDisplayId());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001695 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001696
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001697 writer.setLayerCursorPosition(getPrimaryDisplayId(), layer, /*x*/ 1, /*y*/ 1);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001698 execute();
1699
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001700 writer.setLayerCursorPosition(getPrimaryDisplayId(), layer, /*x*/ 0, /*y*/ 0);
1701 writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1702 writer.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001703 execute();
1704}
1705
ramindani431aad42022-02-01 21:44:29 +00001706TEST_P(GraphicsComposerAidlCommandTest, SetLayerBuffer) {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001707 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001708 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001709 ASSERT_NE(nullptr, handle);
1710
ramindani431aad42022-02-01 21:44:29 +00001711 const auto& [layerStatus, layer] =
1712 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1713 EXPECT_TRUE(layerStatus.isOk());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001714 auto& writer = getWriter(getPrimaryDisplayId());
1715 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
ramindanidcfe3a82021-11-29 17:00:31 +00001716 execute();
1717}
1718
ramindani431aad42022-02-01 21:44:29 +00001719TEST_P(GraphicsComposerAidlCommandTest, SetLayerSurfaceDamage) {
1720 const auto& [layerStatus, layer] =
1721 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1722 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001723
1724 Rect empty{0, 0, 0, 0};
1725 Rect unit{0, 0, 1, 1};
1726
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001727 auto& writer = getWriter(getPrimaryDisplayId());
1728 writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
ramindanidcfe3a82021-11-29 17:00:31 +00001729 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001730 ASSERT_TRUE(mReader.takeErrors().empty());
1731
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001732 writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001733 execute();
1734 ASSERT_TRUE(mReader.takeErrors().empty());
1735
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001736 writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001737 execute();
1738 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001739}
1740
ramindani431aad42022-02-01 21:44:29 +00001741TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlockingRegion) {
1742 const auto& [layerStatus, layer] =
1743 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1744 EXPECT_TRUE(layerStatus.isOk());
Leon Scroggins III03318152022-01-13 12:24:19 -05001745
1746 Rect empty{0, 0, 0, 0};
1747 Rect unit{0, 0, 1, 1};
1748
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001749 auto& writer = getWriter(getPrimaryDisplayId());
1750 writer.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
Leon Scroggins III03318152022-01-13 12:24:19 -05001751 execute();
1752 ASSERT_TRUE(mReader.takeErrors().empty());
1753
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001754 writer.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Leon Scroggins III03318152022-01-13 12:24:19 -05001755 execute();
1756 ASSERT_TRUE(mReader.takeErrors().empty());
1757
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001758 writer.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
Leon Scroggins III03318152022-01-13 12:24:19 -05001759 execute();
1760 ASSERT_TRUE(mReader.takeErrors().empty());
1761}
1762
ramindani431aad42022-02-01 21:44:29 +00001763TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlendMode) {
1764 const auto& [layerStatus, layer] =
1765 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1766 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001767
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001768 auto& writer = getWriter(getPrimaryDisplayId());
1769 writer.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::NONE);
ramindanidcfe3a82021-11-29 17:00:31 +00001770 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001771 ASSERT_TRUE(mReader.takeErrors().empty());
1772
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001773 writer.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::PREMULTIPLIED);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001774 execute();
1775 ASSERT_TRUE(mReader.takeErrors().empty());
1776
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001777 writer.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::COVERAGE);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001778 execute();
1779 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001780}
1781
ramindani431aad42022-02-01 21:44:29 +00001782TEST_P(GraphicsComposerAidlCommandTest, SetLayerColor) {
1783 const auto& [layerStatus, layer] =
1784 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1785 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001786
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001787 auto& writer = getWriter(getPrimaryDisplayId());
1788 writer.setLayerColor(getPrimaryDisplayId(), layer, Color{1.0f, 1.0f, 1.0f, 1.0f});
ramindanidcfe3a82021-11-29 17:00:31 +00001789 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001790 ASSERT_TRUE(mReader.takeErrors().empty());
1791
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001792 writer.setLayerColor(getPrimaryDisplayId(), layer, Color{0.0f, 0.0f, 0.0f, 0.0f});
Ady Abraham3192f3d2021-12-03 16:08:56 -08001793 execute();
1794 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001795}
1796
ramindani431aad42022-02-01 21:44:29 +00001797TEST_P(GraphicsComposerAidlCommandTest, SetLayerCompositionType) {
1798 const auto& [layerStatus, layer] =
1799 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1800 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001801
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001802 auto& writer = getWriter(getPrimaryDisplayId());
1803 writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CLIENT);
ramindanidcfe3a82021-11-29 17:00:31 +00001804 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001805 ASSERT_TRUE(mReader.takeErrors().empty());
1806
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001807 writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::DEVICE);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001808 execute();
1809 ASSERT_TRUE(mReader.takeErrors().empty());
1810
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001811 writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::SOLID_COLOR);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001812 execute();
1813 ASSERT_TRUE(mReader.takeErrors().empty());
1814
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001815 writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CURSOR);
ramindani431aad42022-02-01 21:44:29 +00001816 execute();
1817}
1818
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001819TEST_P(GraphicsComposerAidlCommandTest, DisplayDecoration) {
1820 for (VtsDisplay& display : mDisplays) {
1821 const auto [layerStatus, layer] =
1822 mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount);
1823 EXPECT_TRUE(layerStatus.isOk());
1824
1825 const auto [error, support] =
1826 mComposerClient->getDisplayDecorationSupport(display.getDisplayId());
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001827
Leon Scroggins III91590872022-02-23 09:51:21 -05001828 const auto format = (error.isOk() && support) ? support->format
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001829 : aidl::android::hardware::graphics::common::PixelFormat::RGBA_8888;
1830 const auto decorBuffer = allocate(static_cast<::android::PixelFormat>(format));
1831 ASSERT_NE(nullptr, decorBuffer);
1832 if (::android::OK != decorBuffer->initCheck()) {
1833 if (support) {
1834 FAIL() << "Device advertised display decoration support with format "
1835 << aidl::android::hardware::graphics::common::toString(format)
1836 << " but failed to allocate it!";
1837 } else {
1838 FAIL() << "Device advertised NO display decoration support, but it should "
1839 << "still be able to allocate "
1840 << aidl::android::hardware::graphics::common::toString(format);
1841 }
1842 }
1843
Midas Chien7d55d422022-06-07 02:32:28 +08001844 configureLayer(display, layer, Composition::DISPLAY_DECORATION, display.getFrameRect(),
1845 display.getCrop());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001846 auto& writer = getWriter(display.getDisplayId());
1847 writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, decorBuffer->handle,
1848 /*acquireFence*/ -1);
1849 writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001850 execute();
1851 if (support) {
1852 ASSERT_TRUE(mReader.takeErrors().empty());
1853 } else {
1854 const auto errors = mReader.takeErrors();
1855 ASSERT_EQ(1, errors.size());
Leon Scroggins III6455e792022-02-24 12:18:58 -05001856 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, errors[0].errorCode);
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001857 }
1858 }
1859}
1860
ramindani431aad42022-02-01 21:44:29 +00001861TEST_P(GraphicsComposerAidlCommandTest, SetLayerDataspace) {
1862 const auto& [layerStatus, layer] =
1863 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1864 EXPECT_TRUE(layerStatus.isOk());
1865
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001866 auto& writer = getWriter(getPrimaryDisplayId());
1867 writer.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
ramindani431aad42022-02-01 21:44:29 +00001868 execute();
1869}
1870
1871TEST_P(GraphicsComposerAidlCommandTest, SetLayerDisplayFrame) {
1872 const auto& [layerStatus, layer] =
1873 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1874 EXPECT_TRUE(layerStatus.isOk());
1875
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001876 auto& writer = getWriter(getPrimaryDisplayId());
1877 writer.setLayerDisplayFrame(getPrimaryDisplayId(), layer, Rect{0, 0, 1, 1});
ramindani431aad42022-02-01 21:44:29 +00001878 execute();
1879}
1880
1881TEST_P(GraphicsComposerAidlCommandTest, SetLayerPlaneAlpha) {
1882 const auto& [layerStatus, layer] =
1883 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1884 EXPECT_TRUE(layerStatus.isOk());
1885
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001886 auto& writer = getWriter(getPrimaryDisplayId());
1887 writer.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 0.0f);
ramindani431aad42022-02-01 21:44:29 +00001888 execute();
1889 ASSERT_TRUE(mReader.takeErrors().empty());
1890
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001891 writer.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 1.0f);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001892 execute();
1893 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001894}
1895
ramindani431aad42022-02-01 21:44:29 +00001896TEST_P(GraphicsComposerAidlCommandTest, SetLayerSidebandStream) {
Jason Macnak325e8232022-01-24 14:48:55 -08001897 if (!hasCapability(Capability::SIDEBAND_STREAM)) {
ramindanidcfe3a82021-11-29 17:00:31 +00001898 GTEST_SUCCEED() << "no sideband stream support";
1899 return;
1900 }
1901
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001902 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001903 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001904 ASSERT_NE(nullptr, handle);
1905
ramindani431aad42022-02-01 21:44:29 +00001906 const auto& [layerStatus, layer] =
1907 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1908 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001909
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001910 auto& writer = getWriter(getPrimaryDisplayId());
1911 writer.setLayerSidebandStream(getPrimaryDisplayId(), layer, handle);
ramindanidcfe3a82021-11-29 17:00:31 +00001912 execute();
1913}
1914
ramindani431aad42022-02-01 21:44:29 +00001915TEST_P(GraphicsComposerAidlCommandTest, SetLayerSourceCrop) {
1916 const auto& [layerStatus, layer] =
1917 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1918 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001919
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001920 auto& writer = getWriter(getPrimaryDisplayId());
1921 writer.setLayerSourceCrop(getPrimaryDisplayId(), layer, FRect{0.0f, 0.0f, 1.0f, 1.0f});
ramindanidcfe3a82021-11-29 17:00:31 +00001922 execute();
1923}
1924
ramindani431aad42022-02-01 21:44:29 +00001925TEST_P(GraphicsComposerAidlCommandTest, SetLayerTransform) {
1926 const auto& [layerStatus, layer] =
1927 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1928 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001929
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001930 auto& writer = getWriter(getPrimaryDisplayId());
1931 writer.setLayerTransform(getPrimaryDisplayId(), layer, static_cast<Transform>(0));
ramindanidcfe3a82021-11-29 17:00:31 +00001932 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001933 ASSERT_TRUE(mReader.takeErrors().empty());
1934
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001935 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_H);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001936 execute();
1937 ASSERT_TRUE(mReader.takeErrors().empty());
1938
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001939 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_V);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001940 execute();
1941 ASSERT_TRUE(mReader.takeErrors().empty());
1942
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001943 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_90);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001944 execute();
1945 ASSERT_TRUE(mReader.takeErrors().empty());
1946
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001947 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_180);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001948 execute();
1949 ASSERT_TRUE(mReader.takeErrors().empty());
1950
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001951 writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_270);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001952 execute();
1953 ASSERT_TRUE(mReader.takeErrors().empty());
1954
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001955 writer.setLayerTransform(getPrimaryDisplayId(), layer,
1956 static_cast<Transform>(static_cast<int>(Transform::FLIP_H) |
1957 static_cast<int>(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,
1962 static_cast<Transform>(static_cast<int>(Transform::FLIP_V) |
1963 static_cast<int>(Transform::ROT_90)));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001964 execute();
1965 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001966}
1967
ramindani431aad42022-02-01 21:44:29 +00001968TEST_P(GraphicsComposerAidlCommandTest, SetLayerVisibleRegion) {
1969 const auto& [layerStatus, layer] =
1970 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1971 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001972
1973 Rect empty{0, 0, 0, 0};
1974 Rect unit{0, 0, 1, 1};
1975
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001976 auto& writer = getWriter(getPrimaryDisplayId());
1977 writer.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
ramindanidcfe3a82021-11-29 17:00:31 +00001978 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001979 ASSERT_TRUE(mReader.takeErrors().empty());
1980
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001981 writer.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001982 execute();
1983 ASSERT_TRUE(mReader.takeErrors().empty());
1984
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001985 writer.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001986 execute();
1987 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001988}
1989
ramindani431aad42022-02-01 21:44:29 +00001990TEST_P(GraphicsComposerAidlCommandTest, SetLayerZOrder) {
1991 const auto& [layerStatus, layer] =
1992 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1993 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001994
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001995 auto& writer = getWriter(getPrimaryDisplayId());
1996 writer.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 10);
ramindanidcfe3a82021-11-29 17:00:31 +00001997 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001998 ASSERT_TRUE(mReader.takeErrors().empty());
1999
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002000 writer.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 0);
Ady Abraham3192f3d2021-12-03 16:08:56 -08002001 execute();
2002 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00002003}
2004
ramindani431aad42022-02-01 21:44:29 +00002005TEST_P(GraphicsComposerAidlCommandTest, SetLayerPerFrameMetadata) {
2006 const auto& [layerStatus, layer] =
2007 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
2008 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002009
ramindanidcfe3a82021-11-29 17:00:31 +00002010 /**
2011 * DISPLAY_P3 is a color space that uses the DCI_P3 primaries,
2012 * the D65 white point and the SRGB transfer functions.
2013 * Rendering Intent: Colorimetric
2014 * Primaries:
2015 * x y
2016 * green 0.265 0.690
2017 * blue 0.150 0.060
2018 * red 0.680 0.320
2019 * white (D65) 0.3127 0.3290
2020 */
2021
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002022 auto& writer = getWriter(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00002023 std::vector<PerFrameMetadata> aidlMetadata;
2024 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X, 0.680f});
2025 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y, 0.320f});
2026 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_X, 0.265f});
2027 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_Y, 0.690f});
2028 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_X, 0.150f});
2029 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_Y, 0.060f});
2030 aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_X, 0.3127f});
2031 aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_Y, 0.3290f});
2032 aidlMetadata.push_back({PerFrameMetadataKey::MAX_LUMINANCE, 100.0f});
2033 aidlMetadata.push_back({PerFrameMetadataKey::MIN_LUMINANCE, 0.1f});
2034 aidlMetadata.push_back({PerFrameMetadataKey::MAX_CONTENT_LIGHT_LEVEL, 78.0});
2035 aidlMetadata.push_back({PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL, 62.0});
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002036 writer.setLayerPerFrameMetadata(getPrimaryDisplayId(), layer, aidlMetadata);
ramindanidcfe3a82021-11-29 17:00:31 +00002037 execute();
2038
Ady Abraham3192f3d2021-12-03 16:08:56 -08002039 const auto errors = mReader.takeErrors();
2040 if (errors.size() == 1 && errors[0].errorCode == EX_UNSUPPORTED_OPERATION) {
ramindanidcfe3a82021-11-29 17:00:31 +00002041 GTEST_SUCCEED() << "SetLayerPerFrameMetadata is not supported";
ramindani431aad42022-02-01 21:44:29 +00002042 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002043 return;
2044 }
2045
ramindani431aad42022-02-01 21:44:29 +00002046 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002047}
2048
Alec Mourib1f16722022-02-07 13:03:44 -08002049TEST_P(GraphicsComposerAidlCommandTest, setLayerBrightness) {
ramindani431aad42022-02-01 21:44:29 +00002050 const auto& [layerStatus, layer] =
2051 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
Alec Mouri95e490b2022-01-06 13:46:58 -08002052
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002053 auto& writer = getWriter(getPrimaryDisplayId());
2054 writer.setLayerBrightness(getPrimaryDisplayId(), layer, 0.2f);
Alec Mouri95e490b2022-01-06 13:46:58 -08002055 execute();
2056 ASSERT_TRUE(mReader.takeErrors().empty());
2057
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002058 writer.setLayerBrightness(getPrimaryDisplayId(), layer, 1.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08002059 execute();
2060 ASSERT_TRUE(mReader.takeErrors().empty());
2061
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002062 writer.setLayerBrightness(getPrimaryDisplayId(), layer, 0.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08002063 execute();
2064 ASSERT_TRUE(mReader.takeErrors().empty());
2065
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002066 writer.setLayerBrightness(getPrimaryDisplayId(), layer, -1.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08002067 execute();
Alec Mourib1f16722022-02-07 13:03:44 -08002068 {
2069 const auto errors = mReader.takeErrors();
2070 ASSERT_EQ(1, errors.size());
2071 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
2072 }
2073
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002074 writer.setLayerBrightness(getPrimaryDisplayId(), layer, std::nanf(""));
Alec Mourib1f16722022-02-07 13:03:44 -08002075 execute();
2076 {
2077 const auto errors = mReader.takeErrors();
2078 ASSERT_EQ(1, errors.size());
2079 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
2080 }
Alec Mouri95e490b2022-01-06 13:46:58 -08002081}
2082
ramindani431aad42022-02-01 21:44:29 +00002083TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints) {
ramindanidcfe3a82021-11-29 17:00:31 +00002084 Test_setActiveConfigWithConstraints({.delayForChange = 0, .refreshMiss = false});
2085}
2086
ramindani431aad42022-02-01 21:44:29 +00002087TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_Delayed) {
ramindanidcfe3a82021-11-29 17:00:31 +00002088 Test_setActiveConfigWithConstraints({.delayForChange = 300'000'000, // 300ms
2089 .refreshMiss = false});
2090}
2091
ramindani431aad42022-02-01 21:44:29 +00002092TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_MissRefresh) {
ramindanidcfe3a82021-11-29 17:00:31 +00002093 Test_setActiveConfigWithConstraints({.delayForChange = 0, .refreshMiss = true});
2094}
2095
ramindani431aad42022-02-01 21:44:29 +00002096TEST_P(GraphicsComposerAidlCommandTest, GetDisplayVsyncPeriod) {
ramindanidcfe3a82021-11-29 17:00:31 +00002097 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00002098 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
2099 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002100
ramindani431aad42022-02-01 21:44:29 +00002101 for (int32_t config : configs) {
2102 int32_t expectedVsyncPeriodNanos = display.getDisplayConfig(config).vsyncPeriod;
2103
ramindanidcfe3a82021-11-29 17:00:31 +00002104 VsyncPeriodChangeConstraints constraints;
2105
2106 constraints.desiredTimeNanos = systemTime();
2107 constraints.seamlessRequired = false;
ramindani431aad42022-02-01 21:44:29 +00002108
2109 const auto& [timelineStatus, timeline] =
2110 mComposerClient->setActiveConfigWithConstraints(&display, config, constraints);
2111 EXPECT_TRUE(timelineStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002112
2113 if (timeline.refreshRequired) {
2114 sendRefreshFrame(display, &timeline);
2115 }
ramindani431aad42022-02-01 21:44:29 +00002116 waitForVsyncPeriodChange(display.getDisplayId(), timeline, constraints.desiredTimeNanos,
2117 /*odPeriodNanos*/ 0, expectedVsyncPeriodNanos);
ramindanidcfe3a82021-11-29 17:00:31 +00002118
2119 int32_t vsyncPeriodNanos;
2120 int retryCount = 100;
2121 do {
2122 std::this_thread::sleep_for(10ms);
ramindani431aad42022-02-01 21:44:29 +00002123 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanosValue] =
2124 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
2125
2126 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
2127 vsyncPeriodNanos = vsyncPeriodNanosValue;
ramindanidcfe3a82021-11-29 17:00:31 +00002128 --retryCount;
2129 } while (vsyncPeriodNanos != expectedVsyncPeriodNanos && retryCount > 0);
2130
2131 EXPECT_EQ(vsyncPeriodNanos, expectedVsyncPeriodNanos);
2132
2133 // Make sure that the vsync period stays the same if the active config is not
2134 // changed.
2135 auto timeout = 1ms;
2136 for (int i = 0; i < 10; i++) {
2137 std::this_thread::sleep_for(timeout);
2138 timeout *= 2;
2139 vsyncPeriodNanos = 0;
ramindani431aad42022-02-01 21:44:29 +00002140 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanosValue] =
2141 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
2142
2143 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
2144 vsyncPeriodNanos = vsyncPeriodNanosValue;
ramindanidcfe3a82021-11-29 17:00:31 +00002145 EXPECT_EQ(vsyncPeriodNanos, expectedVsyncPeriodNanos);
2146 }
2147 }
2148 }
2149}
2150
ramindani431aad42022-02-01 21:44:29 +00002151TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_SeamlessNotAllowed) {
ramindanidcfe3a82021-11-29 17:00:31 +00002152 VsyncPeriodChangeConstraints constraints;
ramindanidcfe3a82021-11-29 17:00:31 +00002153 constraints.seamlessRequired = true;
2154 constraints.desiredTimeNanos = systemTime();
2155
2156 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00002157 forEachTwoConfigs(display.getDisplayId(), [&](int32_t config1, int32_t config2) {
2158 int32_t configGroup1 = display.getDisplayConfig(config1).configGroup;
2159 int32_t configGroup2 = display.getDisplayConfig(config2).configGroup;
ramindanidcfe3a82021-11-29 17:00:31 +00002160 if (configGroup1 != configGroup2) {
ramindani431aad42022-02-01 21:44:29 +00002161 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002162 sendRefreshFrame(display, nullptr);
ramindani431aad42022-02-01 21:44:29 +00002163 const auto& [status, _] = mComposerClient->setActiveConfigWithConstraints(
2164 &display, config2, constraints);
2165 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002166 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(
2167 status, IComposerClient::EX_SEAMLESS_NOT_ALLOWED));
ramindanidcfe3a82021-11-29 17:00:31 +00002168 }
2169 });
2170 }
2171}
2172
ramindani431aad42022-02-01 21:44:29 +00002173TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_NoTimestamp) {
2174 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ std::nullopt));
Ady Abraham72c5b502021-12-10 17:23:39 -08002175}
2176
ramindani431aad42022-02-01 21:44:29 +00002177TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_0) {
2178 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ 0));
Ady Abraham72c5b502021-12-10 17:23:39 -08002179}
2180
ramindani431aad42022-02-01 21:44:29 +00002181TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_5) {
2182 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ 5));
Ady Abraham72c5b502021-12-10 17:23:39 -08002183}
2184
ramindani431aad42022-02-01 21:44:29 +00002185TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Unsupported) {
2186 const bool hasDisplayIdleTimerSupport =
2187 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002188 if (!hasDisplayIdleTimerSupport) {
ramindani431aad42022-02-01 21:44:29 +00002189 const auto& status =
2190 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0);
2191 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002192 EXPECT_NO_FATAL_FAILURE(
2193 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
Midas Chiena0b56bd2022-01-13 23:27:33 +08002194 }
2195}
2196
ramindani431aad42022-02-01 21:44:29 +00002197TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_BadParameter) {
2198 const bool hasDisplayIdleTimerSupport =
2199 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002200 if (!hasDisplayIdleTimerSupport) {
2201 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2202 return;
2203 }
2204
ramindani431aad42022-02-01 21:44:29 +00002205 const auto& status =
2206 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ -1);
2207 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002208 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
Midas Chiena0b56bd2022-01-13 23:27:33 +08002209}
2210
ramindani431aad42022-02-01 21:44:29 +00002211TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Disable) {
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 EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002220 std::this_thread::sleep_for(1s);
ramindani431aad42022-02-01 21:44:29 +00002221 EXPECT_EQ(0, mComposerClient->getVsyncIdleCount());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002222}
2223
ramindani431aad42022-02-01 21:44:29 +00002224TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Timeout_2) {
2225 const bool hasDisplayIdleTimerSupport =
2226 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002227 if (!hasDisplayIdleTimerSupport) {
2228 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2229 return;
2230 }
2231
ramindani431aad42022-02-01 21:44:29 +00002232 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
2233 EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002234
Leon Scroggins IIIde057582022-01-13 12:26:00 -05002235 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002236 ASSERT_NE(nullptr, buffer->handle);
2237
2238 const auto layer = createOnScreenLayer();
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04002239 auto& writer = getWriter(getPrimaryDisplayId());
2240 writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer->handle,
2241 /*acquireFence*/ -1);
ramindani431aad42022-02-01 21:44:29 +00002242 int32_t vsyncIdleCount = mComposerClient->getVsyncIdleCount();
Midas Chiena0b56bd2022-01-13 23:27:33 +08002243 auto earlyVsyncIdleTime = systemTime() + std::chrono::nanoseconds(2s).count();
ramindani431aad42022-02-01 21:44:29 +00002244 EXPECT_TRUE(
2245 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 2000).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002246
2247 const sp<::android::Fence> presentFence =
ramindani431aad42022-02-01 21:44:29 +00002248 presentAndGetFence(ComposerClientWriter::kNoTimestamp);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002249 presentFence->waitForever(LOG_TAG);
2250
2251 std::this_thread::sleep_for(3s);
ramindani431aad42022-02-01 21:44:29 +00002252 if (vsyncIdleCount < mComposerClient->getVsyncIdleCount()) {
2253 EXPECT_GE(mComposerClient->getVsyncIdleTime(), earlyVsyncIdleTime);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002254 }
2255
ramindani431aad42022-02-01 21:44:29 +00002256 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002257}
2258
Kriti Dang4efe8602022-05-03 16:55:59 +02002259/*
2260 * Test that no two display configs are exactly the same.
2261 */
2262TEST_P(GraphicsComposerAidlTest, GetDisplayConfigNoRepetitions) {
2263 for (const auto& display : mDisplays) {
2264 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
2265 for (std::vector<int>::size_type i = 0; i < configs.size(); i++) {
2266 for (std::vector<int>::size_type j = i + 1; j < configs.size(); j++) {
2267 const auto& [widthStatus1, width1] = mComposerClient->getDisplayAttribute(
2268 display.getDisplayId(), configs[i], DisplayAttribute::WIDTH);
2269 const auto& [heightStatus1, height1] = mComposerClient->getDisplayAttribute(
2270 display.getDisplayId(), configs[i], DisplayAttribute::HEIGHT);
2271 const auto& [vsyncPeriodStatus1, vsyncPeriod1] =
2272 mComposerClient->getDisplayAttribute(display.getDisplayId(), configs[i],
2273 DisplayAttribute::VSYNC_PERIOD);
2274 const auto& [groupStatus1, group1] = mComposerClient->getDisplayAttribute(
2275 display.getDisplayId(), configs[i], DisplayAttribute::CONFIG_GROUP);
2276
2277 const auto& [widthStatus2, width2] = mComposerClient->getDisplayAttribute(
2278 display.getDisplayId(), configs[j], DisplayAttribute::WIDTH);
2279 const auto& [heightStatus2, height2] = mComposerClient->getDisplayAttribute(
2280 display.getDisplayId(), configs[j], DisplayAttribute::HEIGHT);
2281 const auto& [vsyncPeriodStatus2, vsyncPeriod2] =
2282 mComposerClient->getDisplayAttribute(display.getDisplayId(), configs[j],
2283 DisplayAttribute::VSYNC_PERIOD);
2284 const auto& [groupStatus2, group2] = mComposerClient->getDisplayAttribute(
2285 display.getDisplayId(), configs[j], DisplayAttribute::CONFIG_GROUP);
2286
2287 ASSERT_FALSE(width1 == width2 && height1 == height2 &&
2288 vsyncPeriod1 == vsyncPeriod2 && group1 == group2);
2289 }
2290 }
2291 }
2292}
2293
Leon Scroggins IIIb3e336e2022-10-06 12:32:16 -04002294TEST_P(GraphicsComposerAidlCommandTest, MultiThreadedPresent) {
2295 std::vector<VtsDisplay*> displays;
2296 for (auto& display : mDisplays) {
2297 if (hasDisplayCapability(display.getDisplayId(),
2298 DisplayCapability::MULTI_THREADED_PRESENT)) {
2299 displays.push_back(&display);
2300 }
2301 }
2302 if (displays.size() <= 1u) {
2303 return;
2304 }
2305 // TODO(b/251842321): Try to present on multiple threads.
2306}
2307
Carlos Martinez Romerocd043612023-01-05 22:28:05 +00002308/**
2309 * Test Capability::SKIP_VALIDATE
2310 *
2311 * Capability::SKIP_VALIDATE has been deprecated and should not be enabled.
2312 */
2313TEST_P(GraphicsComposerAidlCommandTest, SkipValidateDeprecatedTest) {
2314 const auto& [versionStatus, version] = mComposerClient->getInterfaceVersion();
2315 ASSERT_TRUE(versionStatus.isOk());
2316 if (version <= 1) {
2317 GTEST_SUCCEED() << "HAL at version 1 or lower can contain Capability::SKIP_VALIDATE.";
2318 return;
2319 }
2320 ASSERT_FALSE(hasCapability(Capability::SKIP_VALIDATE))
2321 << "Found Capability::SKIP_VALIDATE capability.";
2322}
2323
ramindanidcfe3a82021-11-29 17:00:31 +00002324GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlCommandTest);
2325INSTANTIATE_TEST_SUITE_P(
2326 PerInstance, GraphicsComposerAidlCommandTest,
2327 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
2328 ::android::PrintInstanceNameToString);
2329
ramindanid32ae8e2021-10-01 18:48:39 +00002330GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlTest);
2331INSTANTIATE_TEST_SUITE_P(
2332 PerInstance, GraphicsComposerAidlTest,
2333 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
2334 ::android::PrintInstanceNameToString);
2335} // namespace
2336} // namespace aidl::android::hardware::graphics::composer3::vts
2337
2338int main(int argc, char** argv) {
2339 ::testing::InitGoogleTest(&argc, argv);
2340
2341 using namespace std::chrono_literals;
2342 if (!android::base::WaitForProperty("init.svc.surfaceflinger", "stopped", 10s)) {
2343 ALOGE("Failed to stop init.svc.surfaceflinger");
2344 return -1;
2345 }
ramindanibeea10e2021-12-07 21:02:49 +00002346
2347 android::ProcessState::self()->setThreadPoolMaxThreadCount(4);
2348
2349 // The binder threadpool we start will inherit sched policy and priority
2350 // of (this) creating thread. We want the binder thread pool to have
2351 // SCHED_FIFO policy and priority 1 (lowest RT priority)
2352 // Once the pool is created we reset this thread's priority back to
2353 // original.
2354 // This thread policy is based on what we do in the SurfaceFlinger while starting
2355 // the thread pool and we need to replicate that for the VTS tests.
2356 int newPriority = 0;
2357 int origPolicy = sched_getscheduler(0);
2358 struct sched_param origSchedParam;
2359
2360 int errorInPriorityModification = sched_getparam(0, &origSchedParam);
2361 if (errorInPriorityModification == 0) {
2362 int policy = SCHED_FIFO;
2363 newPriority = sched_get_priority_min(policy);
2364
2365 struct sched_param param;
2366 param.sched_priority = newPriority;
2367
2368 errorInPriorityModification = sched_setscheduler(0, policy, &param);
2369 }
2370
2371 // start the thread pool
2372 android::ProcessState::self()->startThreadPool();
2373
2374 // Reset current thread's policy and priority
2375 if (errorInPriorityModification == 0) {
2376 errorInPriorityModification = sched_setscheduler(0, origPolicy, &origSchedParam);
2377 } else {
2378 ALOGE("Failed to set VtsHalGraphicsComposer3_TargetTest binder threadpool priority to "
2379 "SCHED_FIFO");
2380 }
2381
ramindanid32ae8e2021-10-01 18:48:39 +00002382 return RUN_ALL_TESTS();
Carlos Martinez Romerocd043612023-01-05 22:28:05 +00002383}