blob: 2d08ac611bf232863abb312c104a9148bf0baf5b [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 */
ramindanid32ae8e2021-10-01 18:48:39 +000016#include <aidl/Gtest.h>
17#include <aidl/Vintf.h>
Ady Abraham3192f3d2021-12-03 16:08:56 -080018#include <aidl/android/hardware/graphics/common/BlendMode.h>
ramindani3335f7a2021-10-25 17:22:35 +000019#include <aidl/android/hardware/graphics/common/BufferUsage.h>
20#include <aidl/android/hardware/graphics/common/FRect.h>
Leon Scroggins IIIde057582022-01-13 12:26:00 -050021#include <aidl/android/hardware/graphics/common/PixelFormat.h>
ramindani3335f7a2021-10-25 17:22:35 +000022#include <aidl/android/hardware/graphics/common/Rect.h>
ramindani3335f7a2021-10-25 17:22:35 +000023#include <aidl/android/hardware/graphics/composer3/Composition.h>
ramindanid32ae8e2021-10-01 18:48:39 +000024#include <aidl/android/hardware/graphics/composer3/IComposer.h>
25#include <android-base/properties.h>
ramindania9780262021-10-01 18:48:39 +000026#include <android/binder_process.h>
Ady Abraham91c9d1a2021-12-15 18:14:45 -080027#include <android/hardware/graphics/composer3/ComposerClientReader.h>
28#include <android/hardware/graphics/composer3/ComposerClientWriter.h>
ramindanid32ae8e2021-10-01 18:48:39 +000029#include <binder/ProcessState.h>
30#include <gtest/gtest.h>
Ady Abraham72c5b502021-12-10 17:23:39 -080031#include <ui/Fence.h>
ramindani3335f7a2021-10-25 17:22:35 +000032#include <ui/GraphicBuffer.h>
33#include <ui/PixelFormat.h>
ramindani0291f112021-11-04 03:45:46 +000034#include <algorithm>
ramindani592b6512021-10-08 21:15:19 +000035#include <numeric>
ramindanid32ae8e2021-10-01 18:48:39 +000036#include <string>
ramindani1cb794e2021-10-13 20:45:23 +000037#include <thread>
ramindani458e53e2022-02-23 17:30:16 +000038#include "GraphicsComposerCallback.h"
39#include "VtsComposerClient.h"
ramindani3335f7a2021-10-25 17:22:35 +000040
ramindanid32ae8e2021-10-01 18:48:39 +000041#undef LOG_TAG
42#define LOG_TAG "VtsHalGraphicsComposer3_TargetTest"
43
44namespace aidl::android::hardware::graphics::composer3::vts {
45namespace {
46
ramindani1cb794e2021-10-13 20:45:23 +000047using namespace std::chrono_literals;
48
ramindanidcfe3a82021-11-29 17:00:31 +000049using ::android::GraphicBuffer;
50using ::android::sp;
51
ramindanid32ae8e2021-10-01 18:48:39 +000052class GraphicsComposerAidlTest : public ::testing::TestWithParam<std::string> {
ramindania9780262021-10-01 18:48:39 +000053 protected:
54 void SetUp() override {
ramindani431aad42022-02-01 21:44:29 +000055 mComposerClient = std::make_unique<VtsComposerClient>(GetParam());
56 ASSERT_TRUE(mComposerClient->createClient().isOk());
Jason Macnake531a092022-01-20 08:49:09 -080057
ramindani431aad42022-02-01 21:44:29 +000058 const auto& [status, displays] = mComposerClient->getDisplays();
Jason Macnake531a092022-01-20 08:49:09 -080059 ASSERT_TRUE(status.isOk());
ramindani431aad42022-02-01 21:44:29 +000060 mDisplays = displays;
ramindanidcfe3a82021-11-29 17:00:31 +000061
ramindani3335f7a2021-10-25 17:22:35 +000062 // explicitly disable vsync
63 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +000064 EXPECT_TRUE(mComposerClient->setVsync(display.getDisplayId(), false).isOk());
ramindani3335f7a2021-10-25 17:22:35 +000065 }
ramindani431aad42022-02-01 21:44:29 +000066 mComposerClient->setVsyncAllowed(false);
ramindania9780262021-10-01 18:48:39 +000067 }
68
ramindani3335f7a2021-10-25 17:22:35 +000069 void TearDown() override {
ramindani431aad42022-02-01 21:44:29 +000070 ASSERT_TRUE(mComposerClient->tearDown());
71 mComposerClient.reset();
ramindani3335f7a2021-10-25 17:22:35 +000072 }
ramindanic2b8d082021-11-06 02:03:50 +000073
ramindani431aad42022-02-01 21:44:29 +000074 void Test_setContentTypeForDisplay(int64_t display,
75 const std::vector<ContentType>& supportedContentTypes,
76 ContentType contentType, const char* contentTypeStr) {
77 const bool contentTypeSupport =
78 std::find(supportedContentTypes.begin(), supportedContentTypes.end(),
79 contentType) != supportedContentTypes.end();
ramindanidcfe3a82021-11-29 17:00:31 +000080
81 if (!contentTypeSupport) {
ramindani431aad42022-02-01 21:44:29 +000082 const auto& status = mComposerClient->setContentType(display, contentType);
83 EXPECT_FALSE(status.isOk());
84 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, status.getServiceSpecificError());
ramindanidcfe3a82021-11-29 17:00:31 +000085 GTEST_SUCCEED() << contentTypeStr << " content type is not supported on display "
86 << std::to_string(display) << ", skipping test";
87 return;
88 }
89
90 EXPECT_TRUE(mComposerClient->setContentType(display, contentType).isOk());
91 EXPECT_TRUE(mComposerClient->setContentType(display, ContentType::NONE).isOk());
92 }
93
ramindani431aad42022-02-01 21:44:29 +000094 void Test_setContentType(ContentType contentType, const char* contentTypeStr) {
ramindanidcfe3a82021-11-29 17:00:31 +000095 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +000096 const auto& [status, supportedContentTypes] =
97 mComposerClient->getSupportedContentTypes(display.getDisplayId());
98 EXPECT_TRUE(status.isOk());
99 Test_setContentTypeForDisplay(display.getDisplayId(), supportedContentTypes,
100 contentType, contentTypeStr);
ramindanidcfe3a82021-11-29 17:00:31 +0000101 }
102 }
103
Jason Macnak325e8232022-01-24 14:48:55 -0800104 bool hasCapability(Capability capability) {
ramindani431aad42022-02-01 21:44:29 +0000105 const auto& [status, capabilities] = mComposerClient->getCapabilities();
106 EXPECT_TRUE(status.isOk());
Jason Macnak325e8232022-01-24 14:48:55 -0800107 return std::any_of(
108 capabilities.begin(), capabilities.end(),
109 [&](const Capability& activeCapability) { return activeCapability == capability; });
110 }
111
ramindani431aad42022-02-01 21:44:29 +0000112 const VtsDisplay& getPrimaryDisplay() const { return mDisplays[0]; }
ramindania9780262021-10-01 18:48:39 +0000113
ramindani431aad42022-02-01 21:44:29 +0000114 int64_t getPrimaryDisplayId() const { return getPrimaryDisplay().getDisplayId(); }
ramindania9780262021-10-01 18:48:39 +0000115
ramindani431aad42022-02-01 21:44:29 +0000116 int64_t getInvalidDisplayId() const { return mComposerClient->getInvalidDisplayId(); }
ramindani1cb794e2021-10-13 20:45:23 +0000117
ramindani431aad42022-02-01 21:44:29 +0000118 VtsDisplay& getEditablePrimaryDisplay() { return mDisplays[0]; }
ramindani0291f112021-11-04 03:45:46 +0000119
ramindani3335f7a2021-10-25 17:22:35 +0000120 struct TestParameters {
121 nsecs_t delayForChange;
122 bool refreshMiss;
123 };
124
ramindani431aad42022-02-01 21:44:29 +0000125 std::unique_ptr<VtsComposerClient> mComposerClient;
ramindani1cb794e2021-10-13 20:45:23 +0000126 std::vector<VtsDisplay> mDisplays;
ramindani3335f7a2021-10-25 17:22:35 +0000127 // use the slot count usually set by SF
128 static constexpr uint32_t kBufferSlotCount = 64;
ramindanid32ae8e2021-10-01 18:48:39 +0000129};
130
ramindani431aad42022-02-01 21:44:29 +0000131TEST_P(GraphicsComposerAidlTest, GetDisplayCapabilities_BadDisplay) {
132 const auto& [status, _] = mComposerClient->getDisplayCapabilities(getInvalidDisplayId());
ramindani5f696942021-10-14 16:24:18 +0000133
ramindani431aad42022-02-01 21:44:29 +0000134 EXPECT_FALSE(status.isOk());
135 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
ramindania9780262021-10-01 18:48:39 +0000136}
137
ramindani431aad42022-02-01 21:44:29 +0000138TEST_P(GraphicsComposerAidlTest, GetDisplayCapabilities) {
ramindania9780262021-10-01 18:48:39 +0000139 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000140 const auto& [status, capabilities] =
141 mComposerClient->getDisplayCapabilities(display.getDisplayId());
ramindania9780262021-10-01 18:48:39 +0000142
ramindani431aad42022-02-01 21:44:29 +0000143 EXPECT_TRUE(status.isOk());
ramindania9780262021-10-01 18:48:39 +0000144 }
ramindanid32ae8e2021-10-01 18:48:39 +0000145}
146
ramindani2740bac2021-11-24 22:58:32 +0000147TEST_P(GraphicsComposerAidlTest, DumpDebugInfo) {
ramindani431aad42022-02-01 21:44:29 +0000148 ASSERT_TRUE(mComposerClient->dumpDebugInfo().isOk());
ramindani2740bac2021-11-24 22:58:32 +0000149}
150
151TEST_P(GraphicsComposerAidlTest, CreateClientSingleton) {
152 std::shared_ptr<IComposerClient> composerClient;
ramindani431aad42022-02-01 21:44:29 +0000153 const auto& status = mComposerClient->createClient();
ramindani2740bac2021-11-24 22:58:32 +0000154
ramindani431aad42022-02-01 21:44:29 +0000155 EXPECT_FALSE(status.isOk());
156 EXPECT_EQ(IComposerClient::EX_NO_RESOURCES, status.getServiceSpecificError());
ramindani2740bac2021-11-24 22:58:32 +0000157}
158
ramindani592b6512021-10-08 21:15:19 +0000159TEST_P(GraphicsComposerAidlTest, GetDisplayIdentificationData) {
ramindani431aad42022-02-01 21:44:29 +0000160 const auto& [status0, displayIdentification0] =
161 mComposerClient->getDisplayIdentificationData(getPrimaryDisplayId());
162 if (!status0.isOk() && status0.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
163 GTEST_SUCCEED() << "Display identification data not supported, skipping test";
ramindani592b6512021-10-08 21:15:19 +0000164 return;
165 }
ramindani431aad42022-02-01 21:44:29 +0000166 ASSERT_TRUE(status0.isOk()) << "failed to get display identification data";
ramindani592b6512021-10-08 21:15:19 +0000167 ASSERT_FALSE(displayIdentification0.data.empty());
168
169 constexpr size_t kEdidBlockSize = 128;
170 ASSERT_TRUE(displayIdentification0.data.size() % kEdidBlockSize == 0)
171 << "EDID blob length is not a multiple of " << kEdidBlockSize;
172
173 const uint8_t kEdidHeader[] = {0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00};
174 ASSERT_TRUE(std::equal(std::begin(kEdidHeader), std::end(kEdidHeader),
175 displayIdentification0.data.begin()))
176 << "EDID blob doesn't start with the fixed EDID header";
177 ASSERT_EQ(0, std::accumulate(displayIdentification0.data.begin(),
178 displayIdentification0.data.begin() + kEdidBlockSize,
179 static_cast<uint8_t>(0)))
180 << "EDID base block doesn't checksum";
181
ramindani431aad42022-02-01 21:44:29 +0000182 const auto& [status1, displayIdentification1] =
183 mComposerClient->getDisplayIdentificationData(getPrimaryDisplayId());
184 ASSERT_TRUE(status1.isOk());
ramindani592b6512021-10-08 21:15:19 +0000185
186 ASSERT_EQ(displayIdentification0.port, displayIdentification1.port) << "ports are not stable";
187 ASSERT_TRUE(displayIdentification0.data.size() == displayIdentification1.data.size() &&
188 std::equal(displayIdentification0.data.begin(), displayIdentification0.data.end(),
189 displayIdentification1.data.begin()))
190 << "data is not stable";
191}
192
193TEST_P(GraphicsComposerAidlTest, GetHdrCapabilities) {
ramindani431aad42022-02-01 21:44:29 +0000194 const auto& [status, hdrCapabilities] =
195 mComposerClient->getHdrCapabilities(getPrimaryDisplayId());
ramindani592b6512021-10-08 21:15:19 +0000196
ramindani431aad42022-02-01 21:44:29 +0000197 ASSERT_TRUE(status.isOk());
198 EXPECT_TRUE(hdrCapabilities.maxLuminance >= hdrCapabilities.minLuminance);
ramindani592b6512021-10-08 21:15:19 +0000199}
200
201TEST_P(GraphicsComposerAidlTest, GetPerFrameMetadataKeys) {
ramindani431aad42022-02-01 21:44:29 +0000202 const auto& [status, keys] = mComposerClient->getPerFrameMetadataKeys(getPrimaryDisplayId());
203 if (!status.isOk() && status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindanic2b8d082021-11-06 02:03:50 +0000204 GTEST_SUCCEED() << "getPerFrameMetadataKeys is not supported";
205 return;
ramindani592b6512021-10-08 21:15:19 +0000206 }
ramindani431aad42022-02-01 21:44:29 +0000207
208 ASSERT_TRUE(status.isOk());
209 EXPECT_TRUE(keys.size() >= 0);
ramindani592b6512021-10-08 21:15:19 +0000210}
211
212TEST_P(GraphicsComposerAidlTest, GetReadbackBufferAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000213 const auto& [status, _] = mComposerClient->getReadbackBufferAttributes(getPrimaryDisplayId());
214 if (!status.isOk() && status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
215 GTEST_SUCCEED() << "getReadbackBufferAttributes is not supported";
216 return;
ramindani592b6512021-10-08 21:15:19 +0000217 }
ramindani431aad42022-02-01 21:44:29 +0000218
219 ASSERT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000220}
221
222TEST_P(GraphicsComposerAidlTest, GetRenderIntents) {
ramindani431aad42022-02-01 21:44:29 +0000223 const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
224 EXPECT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000225
ramindani431aad42022-02-01 21:44:29 +0000226 for (auto mode : modes) {
227 const auto& [intentStatus, intents] =
228 mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
229 EXPECT_TRUE(intentStatus.isOk());
ramindani592b6512021-10-08 21:15:19 +0000230 bool isHdr;
231 switch (mode) {
232 case ColorMode::BT2100_PQ:
233 case ColorMode::BT2100_HLG:
234 isHdr = true;
235 break;
236 default:
237 isHdr = false;
238 break;
239 }
240 RenderIntent requiredIntent =
241 isHdr ? RenderIntent::TONE_MAP_COLORIMETRIC : RenderIntent::COLORIMETRIC;
242
ramindani431aad42022-02-01 21:44:29 +0000243 const auto iter = std::find(intents.cbegin(), intents.cend(), requiredIntent);
ramindani592b6512021-10-08 21:15:19 +0000244 EXPECT_NE(intents.cend(), iter);
245 }
246}
247
ramindani431aad42022-02-01 21:44:29 +0000248TEST_P(GraphicsComposerAidlTest, GetRenderIntents_BadDisplay) {
249 const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
250 ASSERT_TRUE(status.isOk());
251
ramindani592b6512021-10-08 21:15:19 +0000252 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000253 const auto& [intentStatus, _] =
254 mComposerClient->getRenderIntents(getInvalidDisplayId(), mode);
255
256 EXPECT_FALSE(intentStatus.isOk());
257 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, intentStatus.getServiceSpecificError());
ramindani592b6512021-10-08 21:15:19 +0000258 }
259}
260
ramindani431aad42022-02-01 21:44:29 +0000261TEST_P(GraphicsComposerAidlTest, GetRenderIntents_BadParameter) {
262 const auto& [status, _] =
263 mComposerClient->getRenderIntents(getPrimaryDisplayId(), static_cast<ColorMode>(-1));
264
265 EXPECT_FALSE(status.isOk());
266 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, status.getServiceSpecificError());
ramindani592b6512021-10-08 21:15:19 +0000267}
268
269TEST_P(GraphicsComposerAidlTest, GetColorModes) {
ramindani431aad42022-02-01 21:44:29 +0000270 const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
271 ASSERT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000272
ramindani431aad42022-02-01 21:44:29 +0000273 const auto native = std::find(colorModes.cbegin(), colorModes.cend(), ColorMode::NATIVE);
274 EXPECT_NE(colorModes.cend(), native);
ramindani592b6512021-10-08 21:15:19 +0000275}
276
ramindani431aad42022-02-01 21:44:29 +0000277TEST_P(GraphicsComposerAidlTest, GetColorMode_BadDisplay) {
278 const auto& [status, _] = mComposerClient->getColorModes(getInvalidDisplayId());
ramindani592b6512021-10-08 21:15:19 +0000279
ramindani431aad42022-02-01 21:44:29 +0000280 EXPECT_FALSE(status.isOk());
281 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
ramindani592b6512021-10-08 21:15:19 +0000282}
283
284TEST_P(GraphicsComposerAidlTest, SetColorMode) {
ramindani431aad42022-02-01 21:44:29 +0000285 const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
286 EXPECT_TRUE(status.isOk());
287
ramindani592b6512021-10-08 21:15:19 +0000288 for (auto mode : colorModes) {
ramindani431aad42022-02-01 21:44:29 +0000289 const auto& [intentStatus, intents] =
290 mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
291 EXPECT_TRUE(intentStatus.isOk()) << "failed to get render intents";
292
ramindani592b6512021-10-08 21:15:19 +0000293 for (auto intent : intents) {
ramindani431aad42022-02-01 21:44:29 +0000294 const auto modeStatus =
295 mComposerClient->setColorMode(getPrimaryDisplayId(), mode, intent);
296 EXPECT_TRUE(modeStatus.isOk() ||
297 IComposerClient::EX_UNSUPPORTED == modeStatus.getServiceSpecificError())
ramindani592b6512021-10-08 21:15:19 +0000298 << "failed to set color mode";
299 }
300 }
301
ramindani431aad42022-02-01 21:44:29 +0000302 const auto modeStatus = mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE,
303 RenderIntent::COLORIMETRIC);
304 EXPECT_TRUE(modeStatus.isOk() ||
305 IComposerClient::EX_UNSUPPORTED == modeStatus.getServiceSpecificError())
ramindani592b6512021-10-08 21:15:19 +0000306 << "failed to set color mode";
307}
308
ramindani431aad42022-02-01 21:44:29 +0000309TEST_P(GraphicsComposerAidlTest, SetColorMode_BadDisplay) {
310 const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
311 ASSERT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000312
ramindani431aad42022-02-01 21:44:29 +0000313 for (auto mode : colorModes) {
314 const auto& [intentStatus, intents] =
315 mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
316 ASSERT_TRUE(intentStatus.isOk()) << "failed to get render intents";
317
318 for (auto intent : intents) {
319 auto const modeStatus =
320 mComposerClient->setColorMode(getInvalidDisplayId(), mode, intent);
321
322 EXPECT_FALSE(modeStatus.isOk());
323 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, modeStatus.getServiceSpecificError());
ramindani770d7082021-11-30 00:36:42 +0000324 }
325 }
ramindani592b6512021-10-08 21:15:19 +0000326}
327
ramindani431aad42022-02-01 21:44:29 +0000328TEST_P(GraphicsComposerAidlTest, SetColorMode_BadParameter) {
329 auto status = mComposerClient->setColorMode(getPrimaryDisplayId(), static_cast<ColorMode>(-1),
330 RenderIntent::COLORIMETRIC);
ramindani592b6512021-10-08 21:15:19 +0000331
ramindani431aad42022-02-01 21:44:29 +0000332 EXPECT_FALSE(status.isOk());
333 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, status.getServiceSpecificError());
ramindani592b6512021-10-08 21:15:19 +0000334
ramindani431aad42022-02-01 21:44:29 +0000335 status = mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE,
336 static_cast<RenderIntent>(-1));
ramindani592b6512021-10-08 21:15:19 +0000337
ramindani431aad42022-02-01 21:44:29 +0000338 EXPECT_FALSE(status.isOk());
339 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, status.getServiceSpecificError());
ramindani592b6512021-10-08 21:15:19 +0000340}
341
342TEST_P(GraphicsComposerAidlTest, GetDisplayedContentSamplingAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000343 int constexpr kInvalid = -1;
344 const auto& [status, format] =
345 mComposerClient->getDisplayedContentSamplingAttributes(getPrimaryDisplayId());
ramindani592b6512021-10-08 21:15:19 +0000346
ramindani431aad42022-02-01 21:44:29 +0000347 if (!status.isOk() && status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani592b6512021-10-08 21:15:19 +0000348 SUCCEED() << "Device does not support optional extension. Test skipped";
349 return;
350 }
351
ramindani431aad42022-02-01 21:44:29 +0000352 ASSERT_TRUE(status.isOk());
353 EXPECT_NE(kInvalid, static_cast<int>(format.format));
354 EXPECT_NE(kInvalid, static_cast<int>(format.dataspace));
355 EXPECT_NE(kInvalid, static_cast<int>(format.componentMask));
ramindani592b6512021-10-08 21:15:19 +0000356};
357
358TEST_P(GraphicsComposerAidlTest, SetDisplayedContentSamplingEnabled) {
ramindani431aad42022-02-01 21:44:29 +0000359 int constexpr kMaxFrames = 10;
ramindani592b6512021-10-08 21:15:19 +0000360 FormatColorComponent enableAllComponents = FormatColorComponent::FORMAT_COMPONENT_0;
ramindani431aad42022-02-01 21:44:29 +0000361 auto status = mComposerClient->setDisplayedContentSamplingEnabled(
362 getPrimaryDisplayId(), /*isEnabled*/ true, enableAllComponents, kMaxFrames);
363 if (!status.isOk() && status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani592b6512021-10-08 21:15:19 +0000364 SUCCEED() << "Device does not support optional extension. Test skipped";
365 return;
366 }
ramindani431aad42022-02-01 21:44:29 +0000367 EXPECT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000368
ramindani431aad42022-02-01 21:44:29 +0000369 status = mComposerClient->setDisplayedContentSamplingEnabled(
370 getPrimaryDisplayId(), /*isEnabled*/ false, enableAllComponents, kMaxFrames);
371 EXPECT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000372}
373
374TEST_P(GraphicsComposerAidlTest, GetDisplayedContentSample) {
ramindani431aad42022-02-01 21:44:29 +0000375 const auto& [status, displayContentSamplingAttributes] =
376 mComposerClient->getDisplayedContentSamplingAttributes(getPrimaryDisplayId());
377 if (!status.isOk() && status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindanideb059e2021-11-18 01:57:25 +0000378 SUCCEED() << "Sampling attributes aren't supported on this device, test skipped";
379 return;
380 }
ramindani592b6512021-10-08 21:15:19 +0000381
ramindani431aad42022-02-01 21:44:29 +0000382 int64_t constexpr kMaxFrames = 10;
383 int64_t constexpr kTimestamp = 0;
384 const auto& [sampleStatus, displayContentSample] = mComposerClient->getDisplayedContentSample(
385 getPrimaryDisplayId(), kMaxFrames, kTimestamp);
386 if (!sampleStatus.isOk() &&
387 sampleStatus.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani592b6512021-10-08 21:15:19 +0000388 SUCCEED() << "Device does not support optional extension. Test skipped";
389 return;
390 }
391
ramindani431aad42022-02-01 21:44:29 +0000392 EXPECT_TRUE(sampleStatus.isOk());
393 const std::vector<std::vector<int64_t>> histogram = {
ramindani592b6512021-10-08 21:15:19 +0000394 displayContentSample.sampleComponent0, displayContentSample.sampleComponent1,
395 displayContentSample.sampleComponent2, displayContentSample.sampleComponent3};
396
ramindani3335f7a2021-10-25 17:22:35 +0000397 for (size_t i = 0; i < histogram.size(); i++) {
398 const bool shouldHaveHistogram =
399 static_cast<int>(displayContentSamplingAttributes.componentMask) & (1 << i);
400 EXPECT_EQ(shouldHaveHistogram, !histogram[i].empty());
ramindani592b6512021-10-08 21:15:19 +0000401 }
402}
403
ramindani431aad42022-02-01 21:44:29 +0000404TEST_P(GraphicsComposerAidlTest, GetDisplayConnectionType) {
405 const auto& [status, type] = mComposerClient->getDisplayConnectionType(getInvalidDisplayId());
406
407 EXPECT_FALSE(status.isOk());
408 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
409
ramindani0291f112021-11-04 03:45:46 +0000410 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000411 const auto& [connectionTypeStatus, _] =
412 mComposerClient->getDisplayConnectionType(display.getDisplayId());
413 EXPECT_TRUE(connectionTypeStatus.isOk());
ramindani0291f112021-11-04 03:45:46 +0000414 }
415}
416
ramindani431aad42022-02-01 21:44:29 +0000417TEST_P(GraphicsComposerAidlTest, GetDisplayAttribute) {
ramindani0291f112021-11-04 03:45:46 +0000418 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000419 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
420 EXPECT_TRUE(status.isOk());
421
ramindani0291f112021-11-04 03:45:46 +0000422 for (const auto& config : configs) {
423 const std::array<DisplayAttribute, 4> requiredAttributes = {{
424 DisplayAttribute::WIDTH,
425 DisplayAttribute::HEIGHT,
426 DisplayAttribute::VSYNC_PERIOD,
427 DisplayAttribute::CONFIG_GROUP,
428 }};
ramindani0291f112021-11-04 03:45:46 +0000429 for (const auto& attribute : requiredAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000430 const auto& [attribStatus, value] = mComposerClient->getDisplayAttribute(
431 display.getDisplayId(), config, attribute);
432 EXPECT_TRUE(attribStatus.isOk());
ramindani0291f112021-11-04 03:45:46 +0000433 EXPECT_NE(-1, value);
434 }
435
436 const std::array<DisplayAttribute, 2> optionalAttributes = {{
437 DisplayAttribute::DPI_X,
438 DisplayAttribute::DPI_Y,
439 }};
440 for (const auto& attribute : optionalAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000441 const auto& [attribStatus, value] = mComposerClient->getDisplayAttribute(
442 display.getDisplayId(), config, attribute);
443 EXPECT_TRUE(attribStatus.isOk() || IComposerClient::EX_UNSUPPORTED ==
444 attribStatus.getServiceSpecificError());
ramindani0291f112021-11-04 03:45:46 +0000445 }
446 }
447 }
448}
449
ramindani431aad42022-02-01 21:44:29 +0000450TEST_P(GraphicsComposerAidlTest, CheckConfigsAreValid) {
ramindani0291f112021-11-04 03:45:46 +0000451 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000452 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
453 EXPECT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000454
455 EXPECT_FALSE(std::any_of(configs.begin(), configs.end(), [](auto config) {
456 return config == IComposerClient::INVALID_CONFIGURATION;
457 }));
458 }
459}
460
ramindani431aad42022-02-01 21:44:29 +0000461TEST_P(GraphicsComposerAidlTest, GetDisplayVsyncPeriod_BadDisplay) {
462 const auto& [status, vsyncPeriodNanos] =
463 mComposerClient->getDisplayVsyncPeriod(getInvalidDisplayId());
464
465 EXPECT_FALSE(status.isOk());
466 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
ramindani0291f112021-11-04 03:45:46 +0000467}
468
ramindani431aad42022-02-01 21:44:29 +0000469TEST_P(GraphicsComposerAidlTest, SetActiveConfigWithConstraints_BadDisplay) {
ramindani0291f112021-11-04 03:45:46 +0000470 VsyncPeriodChangeConstraints constraints;
ramindani0291f112021-11-04 03:45:46 +0000471 constraints.seamlessRequired = false;
472 constraints.desiredTimeNanos = systemTime();
ramindani431aad42022-02-01 21:44:29 +0000473 auto invalidDisplay = VtsDisplay(getInvalidDisplayId());
ramindani0291f112021-11-04 03:45:46 +0000474
ramindani431aad42022-02-01 21:44:29 +0000475 const auto& [status, timeline] = mComposerClient->setActiveConfigWithConstraints(
476 &invalidDisplay, /*config*/ 0, constraints);
477
478 EXPECT_FALSE(status.isOk());
479 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
ramindani0291f112021-11-04 03:45:46 +0000480}
481
ramindani431aad42022-02-01 21:44:29 +0000482TEST_P(GraphicsComposerAidlTest, SetActiveConfigWithConstraints_BadConfig) {
ramindani0291f112021-11-04 03:45:46 +0000483 VsyncPeriodChangeConstraints constraints;
ramindani0291f112021-11-04 03:45:46 +0000484 constraints.seamlessRequired = false;
485 constraints.desiredTimeNanos = systemTime();
486
487 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000488 int32_t constexpr kInvalidConfigId = IComposerClient::INVALID_CONFIGURATION;
489 const auto& [status, _] = mComposerClient->setActiveConfigWithConstraints(
490 &display, kInvalidConfigId, constraints);
491
492 EXPECT_FALSE(status.isOk());
493 EXPECT_EQ(IComposerClient::EX_BAD_CONFIG, status.getServiceSpecificError());
ramindani0291f112021-11-04 03:45:46 +0000494 }
495}
496
ramindani431aad42022-02-01 21:44:29 +0000497TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig_BadDisplay) {
ramindani476314c2022-03-16 00:17:08 +0000498 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
499 GTEST_SUCCEED() << "Boot Display Config not supported";
500 return;
501 }
ramindani431aad42022-02-01 21:44:29 +0000502 const auto& status = mComposerClient->setBootDisplayConfig(getInvalidDisplayId(), /*config*/ 0);
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100503
ramindani431aad42022-02-01 21:44:29 +0000504 EXPECT_FALSE(status.isOk());
505 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100506}
507
ramindani431aad42022-02-01 21:44:29 +0000508TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig_BadConfig) {
ramindani476314c2022-03-16 00:17:08 +0000509 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
510 GTEST_SUCCEED() << "Boot Display Config not supported";
511 return;
512 }
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100513 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000514 int32_t constexpr kInvalidConfigId = IComposerClient::INVALID_CONFIGURATION;
515 const auto& status =
516 mComposerClient->setBootDisplayConfig(display.getDisplayId(), kInvalidConfigId);
517
518 EXPECT_FALSE(status.isOk());
519 EXPECT_EQ(IComposerClient::EX_BAD_CONFIG, status.getServiceSpecificError());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100520 }
521}
522
ramindani431aad42022-02-01 21:44:29 +0000523TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig) {
ramindani476314c2022-03-16 00:17:08 +0000524 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
525 GTEST_SUCCEED() << "Boot Display Config not supported";
526 return;
527 }
ramindani431aad42022-02-01 21:44:29 +0000528 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
529 EXPECT_TRUE(status.isOk());
530 for (const auto& config : configs) {
531 EXPECT_TRUE(mComposerClient->setBootDisplayConfig(getPrimaryDisplayId(), config).isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100532 }
533}
534
ramindani431aad42022-02-01 21:44:29 +0000535TEST_P(GraphicsComposerAidlTest, ClearBootDisplayConfig_BadDisplay) {
ramindani476314c2022-03-16 00:17:08 +0000536 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
537 GTEST_SUCCEED() << "Boot Display Config not supported";
538 return;
539 }
ramindani431aad42022-02-01 21:44:29 +0000540 const auto& status = mComposerClient->clearBootDisplayConfig(getInvalidDisplayId());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100541
ramindani431aad42022-02-01 21:44:29 +0000542 EXPECT_FALSE(status.isOk());
543 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100544}
545
ramindani431aad42022-02-01 21:44:29 +0000546TEST_P(GraphicsComposerAidlTest, ClearBootDisplayConfig) {
ramindani476314c2022-03-16 00:17:08 +0000547 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
548 GTEST_SUCCEED() << "Boot Display Config not supported";
549 return;
550 }
ramindani431aad42022-02-01 21:44:29 +0000551 EXPECT_TRUE(mComposerClient->clearBootDisplayConfig(getPrimaryDisplayId()).isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100552}
553
ramindani431aad42022-02-01 21:44:29 +0000554TEST_P(GraphicsComposerAidlTest, GetPreferredBootDisplayConfig_BadDisplay) {
ramindani476314c2022-03-16 00:17:08 +0000555 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
556 GTEST_SUCCEED() << "Boot Display Config not supported";
557 return;
558 }
ramindani431aad42022-02-01 21:44:29 +0000559 const auto& [status, _] = mComposerClient->getPreferredBootDisplayConfig(getInvalidDisplayId());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100560
ramindani431aad42022-02-01 21:44:29 +0000561 EXPECT_FALSE(status.isOk());
562 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100563}
564
ramindani431aad42022-02-01 21:44:29 +0000565TEST_P(GraphicsComposerAidlTest, GetPreferredBootDisplayConfig) {
ramindani476314c2022-03-16 00:17:08 +0000566 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
567 GTEST_SUCCEED() << "Boot Display Config not supported";
568 return;
569 }
ramindani431aad42022-02-01 21:44:29 +0000570 const auto& [status, preferredDisplayConfig] =
571 mComposerClient->getPreferredBootDisplayConfig(getPrimaryDisplayId());
572 EXPECT_TRUE(status.isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100573
ramindani431aad42022-02-01 21:44:29 +0000574 const auto& [configStatus, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
575
576 EXPECT_TRUE(configStatus.isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100577 EXPECT_NE(configs.end(), std::find(configs.begin(), configs.end(), preferredDisplayConfig));
578}
579
ramindani476314c2022-03-16 00:17:08 +0000580TEST_P(GraphicsComposerAidlTest, BootDisplayConfig_Unsupported) {
581 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
582 const auto& [configStatus, config] =
583 mComposerClient->getActiveConfig(getPrimaryDisplayId());
584 EXPECT_TRUE(configStatus.isOk());
585
586 auto status = mComposerClient->setBootDisplayConfig(getPrimaryDisplayId(), config);
587 EXPECT_FALSE(status.isOk());
588 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, status.getServiceSpecificError());
589
590 status = mComposerClient->getPreferredBootDisplayConfig(getPrimaryDisplayId()).first;
591 EXPECT_FALSE(status.isOk());
592 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, status.getServiceSpecificError());
593
594 status = mComposerClient->clearBootDisplayConfig(getPrimaryDisplayId());
595 EXPECT_FALSE(status.isOk());
596 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, status.getServiceSpecificError());
597 }
598}
599
ramindani431aad42022-02-01 21:44:29 +0000600TEST_P(GraphicsComposerAidlTest, SetAutoLowLatencyMode_BadDisplay) {
601 auto status = mComposerClient->setAutoLowLatencyMode(getInvalidDisplayId(), /*isEnabled*/ true);
602 EXPECT_FALSE(status.isOk());
603 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
604
605 status = mComposerClient->setAutoLowLatencyMode(getInvalidDisplayId(), /*isEnabled*/ false);
606 EXPECT_FALSE(status.isOk());
607 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
ramindani0291f112021-11-04 03:45:46 +0000608}
609
ramindani431aad42022-02-01 21:44:29 +0000610TEST_P(GraphicsComposerAidlTest, SetAutoLowLatencyMode) {
ramindani0291f112021-11-04 03:45:46 +0000611 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000612 const auto& [status, capabilities] =
613 mComposerClient->getDisplayCapabilities(display.getDisplayId());
614 ASSERT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000615
616 const bool allmSupport =
617 std::find(capabilities.begin(), capabilities.end(),
618 DisplayCapability::AUTO_LOW_LATENCY_MODE) != capabilities.end();
619
620 if (!allmSupport) {
ramindani431aad42022-02-01 21:44:29 +0000621 const auto& statusIsOn = mComposerClient->setAutoLowLatencyMode(display.getDisplayId(),
622 /*isEnabled*/ true);
623 EXPECT_FALSE(statusIsOn.isOk());
624 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, statusIsOn.getServiceSpecificError());
625 const auto& statusIsOff = mComposerClient->setAutoLowLatencyMode(display.getDisplayId(),
626 /*isEnabled*/ false);
627 EXPECT_FALSE(statusIsOff.isOk());
628 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, statusIsOff.getServiceSpecificError());
ramindani0291f112021-11-04 03:45:46 +0000629 GTEST_SUCCEED() << "Auto Low Latency Mode is not supported on display "
ramindani431aad42022-02-01 21:44:29 +0000630 << std::to_string(display.getDisplayId()) << ", skipping test";
ramindani0291f112021-11-04 03:45:46 +0000631 return;
632 }
633
ramindani431aad42022-02-01 21:44:29 +0000634 EXPECT_TRUE(mComposerClient->setAutoLowLatencyMode(display.getDisplayId(), true).isOk());
635 EXPECT_TRUE(mComposerClient->setAutoLowLatencyMode(display.getDisplayId(), false).isOk());
ramindani0291f112021-11-04 03:45:46 +0000636 }
637}
638
ramindani431aad42022-02-01 21:44:29 +0000639TEST_P(GraphicsComposerAidlTest, GetSupportedContentTypes_BadDisplay) {
640 const auto& [status, _] = mComposerClient->getSupportedContentTypes(getInvalidDisplayId());
641
642 EXPECT_FALSE(status.isOk());
643 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
ramindani0291f112021-11-04 03:45:46 +0000644}
645
ramindani431aad42022-02-01 21:44:29 +0000646TEST_P(GraphicsComposerAidlTest, GetSupportedContentTypes) {
ramindani0291f112021-11-04 03:45:46 +0000647 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000648 const auto& [status, supportedContentTypes] =
649 mComposerClient->getSupportedContentTypes(display.getDisplayId());
650 ASSERT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000651
652 const bool noneSupported =
653 std::find(supportedContentTypes.begin(), supportedContentTypes.end(),
654 ContentType::NONE) != supportedContentTypes.end();
ramindani431aad42022-02-01 21:44:29 +0000655
ramindani0291f112021-11-04 03:45:46 +0000656 EXPECT_FALSE(noneSupported);
657 }
658}
659
ramindani431aad42022-02-01 21:44:29 +0000660TEST_P(GraphicsComposerAidlTest, SetContentTypeNoneAlwaysAccepted) {
ramindani0291f112021-11-04 03:45:46 +0000661 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000662 EXPECT_TRUE(
663 mComposerClient->setContentType(display.getDisplayId(), ContentType::NONE).isOk());
ramindani0291f112021-11-04 03:45:46 +0000664 }
665}
666
ramindani431aad42022-02-01 21:44:29 +0000667TEST_P(GraphicsComposerAidlTest, SetContentType_BadDisplay) {
ramindani0291f112021-11-04 03:45:46 +0000668 constexpr ContentType types[] = {ContentType::NONE, ContentType::GRAPHICS, ContentType::PHOTO,
669 ContentType::CINEMA, ContentType::GAME};
670 for (const auto& type : types) {
ramindani431aad42022-02-01 21:44:29 +0000671 const auto& status = mComposerClient->setContentType(getInvalidDisplayId(), type);
ramindani0291f112021-11-04 03:45:46 +0000672
ramindani431aad42022-02-01 21:44:29 +0000673 EXPECT_FALSE(status.isOk());
674 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
ramindani0291f112021-11-04 03:45:46 +0000675 }
676}
677
ramindani431aad42022-02-01 21:44:29 +0000678TEST_P(GraphicsComposerAidlTest, SetGraphicsContentType) {
ramindani0291f112021-11-04 03:45:46 +0000679 Test_setContentType(ContentType::GRAPHICS, "GRAPHICS");
680}
681
ramindani431aad42022-02-01 21:44:29 +0000682TEST_P(GraphicsComposerAidlTest, SetPhotoContentType) {
ramindani0291f112021-11-04 03:45:46 +0000683 Test_setContentType(ContentType::PHOTO, "PHOTO");
684}
685
ramindani431aad42022-02-01 21:44:29 +0000686TEST_P(GraphicsComposerAidlTest, SetCinemaContentType) {
ramindani0291f112021-11-04 03:45:46 +0000687 Test_setContentType(ContentType::CINEMA, "CINEMA");
688}
689
ramindani431aad42022-02-01 21:44:29 +0000690TEST_P(GraphicsComposerAidlTest, SetGameContentType) {
ramindani0291f112021-11-04 03:45:46 +0000691 Test_setContentType(ContentType::GAME, "GAME");
692}
693
ramindanic2b8d082021-11-06 02:03:50 +0000694TEST_P(GraphicsComposerAidlTest, CreateVirtualDisplay) {
ramindani431aad42022-02-01 21:44:29 +0000695 const auto& [status, maxVirtualDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
696 EXPECT_TRUE(status.isOk());
697
ramindanic2b8d082021-11-06 02:03:50 +0000698 if (maxVirtualDisplayCount == 0) {
699 GTEST_SUCCEED() << "no virtual display support";
700 return;
701 }
702
ramindani431aad42022-02-01 21:44:29 +0000703 const auto& [virtualDisplayStatus, virtualDisplay] = mComposerClient->createVirtualDisplay(
704 /*width*/ 64, /*height*/ 64, common::PixelFormat::IMPLEMENTATION_DEFINED,
705 kBufferSlotCount);
ramindanic2b8d082021-11-06 02:03:50 +0000706
ramindani431aad42022-02-01 21:44:29 +0000707 ASSERT_TRUE(virtualDisplayStatus.isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000708 EXPECT_TRUE(mComposerClient->destroyVirtualDisplay(virtualDisplay.display).isOk());
709}
710
ramindani431aad42022-02-01 21:44:29 +0000711TEST_P(GraphicsComposerAidlTest, DestroyVirtualDisplay_BadDisplay) {
712 const auto& [status, maxDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
713 EXPECT_TRUE(status.isOk());
714
ramindani2740bac2021-11-24 22:58:32 +0000715 if (maxDisplayCount == 0) {
716 GTEST_SUCCEED() << "no virtual display support";
717 return;
718 }
ramindani2740bac2021-11-24 22:58:32 +0000719
ramindani431aad42022-02-01 21:44:29 +0000720 const auto& destroyStatus = mComposerClient->destroyVirtualDisplay(getInvalidDisplayId());
721
722 EXPECT_FALSE(destroyStatus.isOk());
723 ASSERT_EQ(IComposerClient::EX_BAD_DISPLAY, destroyStatus.getServiceSpecificError());
ramindani2740bac2021-11-24 22:58:32 +0000724}
725
726TEST_P(GraphicsComposerAidlTest, CreateLayer) {
ramindani431aad42022-02-01 21:44:29 +0000727 const auto& [status, layer] =
728 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
ramindani2740bac2021-11-24 22:58:32 +0000729
ramindani431aad42022-02-01 21:44:29 +0000730 EXPECT_TRUE(status.isOk());
731 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000732}
733
ramindani431aad42022-02-01 21:44:29 +0000734TEST_P(GraphicsComposerAidlTest, CreateLayer_BadDisplay) {
735 const auto& [status, _] = mComposerClient->createLayer(getInvalidDisplayId(), kBufferSlotCount);
ramindani2740bac2021-11-24 22:58:32 +0000736
ramindani431aad42022-02-01 21:44:29 +0000737 EXPECT_FALSE(status.isOk());
738 ASSERT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
ramindani2740bac2021-11-24 22:58:32 +0000739}
740
ramindani431aad42022-02-01 21:44:29 +0000741TEST_P(GraphicsComposerAidlTest, DestroyLayer_BadDisplay) {
742 const auto& [status, layer] =
743 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
744 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000745
ramindani431aad42022-02-01 21:44:29 +0000746 const auto& destroyStatus = mComposerClient->destroyLayer(getInvalidDisplayId(), layer);
ramindani2740bac2021-11-24 22:58:32 +0000747
ramindani431aad42022-02-01 21:44:29 +0000748 EXPECT_FALSE(destroyStatus.isOk());
749 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, destroyStatus.getServiceSpecificError());
750 ASSERT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000751}
752
ramindani431aad42022-02-01 21:44:29 +0000753TEST_P(GraphicsComposerAidlTest, DestroyLayer_BadLayerError) {
ramindani2740bac2021-11-24 22:58:32 +0000754 // We haven't created any layers yet, so any id should be invalid
ramindani431aad42022-02-01 21:44:29 +0000755 const auto& status = mComposerClient->destroyLayer(getPrimaryDisplayId(), /*layer*/ 1);
ramindani2740bac2021-11-24 22:58:32 +0000756
ramindani431aad42022-02-01 21:44:29 +0000757 EXPECT_FALSE(status.isOk());
758 EXPECT_EQ(IComposerClient::EX_BAD_LAYER, status.getServiceSpecificError());
ramindani2740bac2021-11-24 22:58:32 +0000759}
760
ramindani431aad42022-02-01 21:44:29 +0000761TEST_P(GraphicsComposerAidlTest, GetActiveConfig_BadDisplay) {
762 const auto& [status, _] = mComposerClient->getActiveConfig(getInvalidDisplayId());
ramindani2740bac2021-11-24 22:58:32 +0000763
ramindani431aad42022-02-01 21:44:29 +0000764 EXPECT_FALSE(status.isOk());
765 ASSERT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
ramindani2740bac2021-11-24 22:58:32 +0000766}
767
768TEST_P(GraphicsComposerAidlTest, GetDisplayConfig) {
ramindani431aad42022-02-01 21:44:29 +0000769 const auto& [status, _] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
770 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000771}
772
ramindani431aad42022-02-01 21:44:29 +0000773TEST_P(GraphicsComposerAidlTest, GetDisplayConfig_BadDisplay) {
774 const auto& [status, _] = mComposerClient->getDisplayConfigs(getInvalidDisplayId());
ramindani2740bac2021-11-24 22:58:32 +0000775
ramindani431aad42022-02-01 21:44:29 +0000776 EXPECT_FALSE(status.isOk());
777 ASSERT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
ramindani2740bac2021-11-24 22:58:32 +0000778}
779
780TEST_P(GraphicsComposerAidlTest, GetDisplayName) {
ramindani431aad42022-02-01 21:44:29 +0000781 const auto& [status, _] = mComposerClient->getDisplayName(getPrimaryDisplayId());
782 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000783}
784
ramindani431aad42022-02-01 21:44:29 +0000785TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation_BadDisplay) {
786 const auto& [status, _] = mComposerClient->getDisplayPhysicalOrientation(getInvalidDisplayId());
Ady Abrahamae12e382022-01-13 18:06:21 -0800787
ramindani431aad42022-02-01 21:44:29 +0000788 EXPECT_FALSE(status.isOk());
789 ASSERT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
Ady Abrahamae12e382022-01-13 18:06:21 -0800790}
791
792TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation) {
793 const auto allowedDisplayOrientations = std::array<Transform, 4>{
794 Transform::NONE,
795 Transform::ROT_90,
796 Transform::ROT_180,
797 Transform::ROT_270,
798 };
799
ramindani431aad42022-02-01 21:44:29 +0000800 const auto& [status, displayOrientation] =
801 mComposerClient->getDisplayPhysicalOrientation(getPrimaryDisplayId());
Ady Abrahamae12e382022-01-13 18:06:21 -0800802
ramindani431aad42022-02-01 21:44:29 +0000803 EXPECT_TRUE(status.isOk());
Ady Abrahamae12e382022-01-13 18:06:21 -0800804 EXPECT_NE(std::find(allowedDisplayOrientations.begin(), allowedDisplayOrientations.end(),
805 displayOrientation),
806 allowedDisplayOrientations.end());
807}
808
ramindani2740bac2021-11-24 22:58:32 +0000809TEST_P(GraphicsComposerAidlTest, SetClientTargetSlotCount) {
ramindani431aad42022-02-01 21:44:29 +0000810 EXPECT_TRUE(mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kBufferSlotCount)
811 .isOk());
ramindani2740bac2021-11-24 22:58:32 +0000812}
813
814TEST_P(GraphicsComposerAidlTest, SetActiveConfig) {
ramindani431aad42022-02-01 21:44:29 +0000815 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
816 EXPECT_TRUE(status.isOk());
817
818 for (const auto& config : configs) {
819 auto display = getEditablePrimaryDisplay();
820 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
821 const auto& [configStatus, config1] =
822 mComposerClient->getActiveConfig(getPrimaryDisplayId());
823 EXPECT_TRUE(configStatus.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000824 EXPECT_EQ(config, config1);
825 }
826}
827
828TEST_P(GraphicsComposerAidlTest, SetActiveConfigPowerCycle) {
ramindani431aad42022-02-01 21:44:29 +0000829 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
830 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000831
ramindani431aad42022-02-01 21:44:29 +0000832 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
833 EXPECT_TRUE(status.isOk());
834
835 for (const auto& config : configs) {
836 auto display = getEditablePrimaryDisplay();
837 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
838 const auto& [config1Status, config1] =
839 mComposerClient->getActiveConfig(getPrimaryDisplayId());
840 EXPECT_TRUE(config1Status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000841 EXPECT_EQ(config, config1);
842
ramindani431aad42022-02-01 21:44:29 +0000843 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
844 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
845 const auto& [config2Status, config2] =
846 mComposerClient->getActiveConfig(getPrimaryDisplayId());
847 EXPECT_TRUE(config2Status.isOk());
848 EXPECT_EQ(config, config2);
ramindani2740bac2021-11-24 22:58:32 +0000849 }
850}
851
ramindani2740bac2021-11-24 22:58:32 +0000852TEST_P(GraphicsComposerAidlTest, SetPowerModeUnsupported) {
ramindani431aad42022-02-01 21:44:29 +0000853 const auto& [status, capabilities] =
854 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
855 ASSERT_TRUE(status.isOk());
856
Ady Abraham6679baf2021-12-08 18:28:27 -0800857 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
858 DisplayCapability::DOZE) != capabilities.end();
859 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
860 DisplayCapability::SUSPEND) != capabilities.end();
ramindani2740bac2021-11-24 22:58:32 +0000861
ramindani431aad42022-02-01 21:44:29 +0000862 if (!isDozeSupported) {
863 const auto& powerModeDozeStatus =
864 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE);
865 EXPECT_FALSE(powerModeDozeStatus.isOk());
866 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, powerModeDozeStatus.getServiceSpecificError());
867
868 const auto& powerModeDozeSuspendStatus =
869 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
870 EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
871 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED,
872 powerModeDozeSuspendStatus.getServiceSpecificError());
ramindani2740bac2021-11-24 22:58:32 +0000873 }
Ady Abraham6679baf2021-12-08 18:28:27 -0800874
875 if (!isSuspendSupported) {
ramindani431aad42022-02-01 21:44:29 +0000876 const auto& powerModeSuspendStatus =
877 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON_SUSPEND);
878 EXPECT_FALSE(powerModeSuspendStatus.isOk());
879 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED,
880 powerModeSuspendStatus.getServiceSpecificError());
Ady Abraham6679baf2021-12-08 18:28:27 -0800881
ramindani431aad42022-02-01 21:44:29 +0000882 const auto& powerModeDozeSuspendStatus =
883 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
884 EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
885 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED,
886 powerModeDozeSuspendStatus.getServiceSpecificError());
Ady Abraham6679baf2021-12-08 18:28:27 -0800887 }
ramindani2740bac2021-11-24 22:58:32 +0000888}
889
890TEST_P(GraphicsComposerAidlTest, SetVsyncEnabled) {
ramindani431aad42022-02-01 21:44:29 +0000891 mComposerClient->setVsyncAllowed(true);
ramindani2740bac2021-11-24 22:58:32 +0000892
ramindani431aad42022-02-01 21:44:29 +0000893 EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), true).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000894 usleep(60 * 1000);
ramindani431aad42022-02-01 21:44:29 +0000895 EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), false).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000896
ramindani431aad42022-02-01 21:44:29 +0000897 mComposerClient->setVsyncAllowed(false);
ramindani2740bac2021-11-24 22:58:32 +0000898}
899
ramindanic2b8d082021-11-06 02:03:50 +0000900TEST_P(GraphicsComposerAidlTest, SetPowerMode) {
ramindani431aad42022-02-01 21:44:29 +0000901 const auto& [status, capabilities] =
902 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
903 ASSERT_TRUE(status.isOk());
904
Ady Abraham6679baf2021-12-08 18:28:27 -0800905 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
906 DisplayCapability::DOZE) != capabilities.end();
907 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
908 DisplayCapability::SUSPEND) != capabilities.end();
909
ramindanic2b8d082021-11-06 02:03:50 +0000910 std::vector<PowerMode> modes;
911 modes.push_back(PowerMode::OFF);
ramindanic2b8d082021-11-06 02:03:50 +0000912 modes.push_back(PowerMode::ON);
913
Ady Abraham6679baf2021-12-08 18:28:27 -0800914 if (isSuspendSupported) {
915 modes.push_back(PowerMode::ON_SUSPEND);
916 }
917
ramindani770d7082021-11-30 00:36:42 +0000918 if (isDozeSupported) {
919 modes.push_back(PowerMode::DOZE);
Ady Abraham6679baf2021-12-08 18:28:27 -0800920 }
921
922 if (isSuspendSupported && isDozeSupported) {
ramindani770d7082021-11-30 00:36:42 +0000923 modes.push_back(PowerMode::DOZE_SUSPEND);
924 }
925
ramindanic2b8d082021-11-06 02:03:50 +0000926 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000927 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000928 }
929}
930
931TEST_P(GraphicsComposerAidlTest, SetPowerModeVariations) {
ramindani431aad42022-02-01 21:44:29 +0000932 const auto& [status, capabilities] =
933 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
934 ASSERT_TRUE(status.isOk());
935
Ady Abraham6679baf2021-12-08 18:28:27 -0800936 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
937 DisplayCapability::DOZE) != capabilities.end();
938 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
939 DisplayCapability::SUSPEND) != capabilities.end();
940
ramindanic2b8d082021-11-06 02:03:50 +0000941 std::vector<PowerMode> modes;
942
943 modes.push_back(PowerMode::OFF);
ramindani770d7082021-11-30 00:36:42 +0000944 modes.push_back(PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +0000945 modes.push_back(PowerMode::OFF);
ramindanic2b8d082021-11-06 02:03:50 +0000946 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000947 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000948 }
ramindani770d7082021-11-30 00:36:42 +0000949 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +0000950
ramindani770d7082021-11-30 00:36:42 +0000951 modes.push_back(PowerMode::OFF);
952 modes.push_back(PowerMode::OFF);
953 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000954 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindani770d7082021-11-30 00:36:42 +0000955 }
ramindanic2b8d082021-11-06 02:03:50 +0000956 modes.clear();
957
958 modes.push_back(PowerMode::ON);
959 modes.push_back(PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +0000960 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000961 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000962 }
ramindanic2b8d082021-11-06 02:03:50 +0000963 modes.clear();
964
Ady Abraham6679baf2021-12-08 18:28:27 -0800965 if (isSuspendSupported) {
966 modes.push_back(PowerMode::ON_SUSPEND);
967 modes.push_back(PowerMode::ON_SUSPEND);
968 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000969 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
Ady Abraham6679baf2021-12-08 18:28:27 -0800970 }
971 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +0000972 }
973
ramindanic2b8d082021-11-06 02:03:50 +0000974 if (isDozeSupported) {
ramindanic2b8d082021-11-06 02:03:50 +0000975 modes.push_back(PowerMode::DOZE);
976 modes.push_back(PowerMode::DOZE);
ramindanic2b8d082021-11-06 02:03:50 +0000977 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000978 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000979 }
ramindanic2b8d082021-11-06 02:03:50 +0000980 modes.clear();
Ady Abraham6679baf2021-12-08 18:28:27 -0800981 }
ramindanic2b8d082021-11-06 02:03:50 +0000982
Ady Abraham6679baf2021-12-08 18:28:27 -0800983 if (isSuspendSupported && isDozeSupported) {
ramindanic2b8d082021-11-06 02:03:50 +0000984 modes.push_back(PowerMode::DOZE_SUSPEND);
985 modes.push_back(PowerMode::DOZE_SUSPEND);
ramindanic2b8d082021-11-06 02:03:50 +0000986 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000987 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000988 }
Ady Abraham6679baf2021-12-08 18:28:27 -0800989 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +0000990 }
991}
992
ramindani431aad42022-02-01 21:44:29 +0000993TEST_P(GraphicsComposerAidlTest, SetPowerMode_BadDisplay) {
994 const auto& status = mComposerClient->setPowerMode(getInvalidDisplayId(), PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +0000995
ramindani431aad42022-02-01 21:44:29 +0000996 EXPECT_FALSE(status.isOk());
997 ASSERT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
ramindanic2b8d082021-11-06 02:03:50 +0000998}
999
ramindani431aad42022-02-01 21:44:29 +00001000TEST_P(GraphicsComposerAidlTest, SetPowerMode_BadParameter) {
1001 const auto& status =
1002 mComposerClient->setPowerMode(getPrimaryDisplayId(), static_cast<PowerMode>(-1));
ramindanic2b8d082021-11-06 02:03:50 +00001003
ramindani431aad42022-02-01 21:44:29 +00001004 EXPECT_FALSE(status.isOk());
1005 ASSERT_EQ(IComposerClient::EX_BAD_PARAMETER, status.getServiceSpecificError());
ramindanic2b8d082021-11-06 02:03:50 +00001006}
1007
ramindanic2b8d082021-11-06 02:03:50 +00001008TEST_P(GraphicsComposerAidlTest, GetDataspaceSaturationMatrix) {
ramindani431aad42022-02-01 21:44:29 +00001009 const auto& [status, matrix] =
1010 mComposerClient->getDataspaceSaturationMatrix(common::Dataspace::SRGB_LINEAR);
1011 ASSERT_TRUE(status.isOk());
1012 ASSERT_EQ(16, matrix.size()); // matrix should not be empty if call succeeded.
ramindanideb059e2021-11-18 01:57:25 +00001013
ramindanic2b8d082021-11-06 02:03:50 +00001014 // the last row is known
ramindani431aad42022-02-01 21:44:29 +00001015 EXPECT_EQ(0.0f, matrix[12]);
1016 EXPECT_EQ(0.0f, matrix[13]);
1017 EXPECT_EQ(0.0f, matrix[14]);
1018 EXPECT_EQ(1.0f, matrix[15]);
ramindanic2b8d082021-11-06 02:03:50 +00001019}
1020
ramindani431aad42022-02-01 21:44:29 +00001021TEST_P(GraphicsComposerAidlTest, GetDataspaceSaturationMatrix_BadParameter) {
1022 const auto& [status, matrix] =
1023 mComposerClient->getDataspaceSaturationMatrix(common::Dataspace::UNKNOWN);
ramindanic2b8d082021-11-06 02:03:50 +00001024
ramindani431aad42022-02-01 21:44:29 +00001025 EXPECT_FALSE(status.isOk());
1026 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, status.getServiceSpecificError());
ramindanic2b8d082021-11-06 02:03:50 +00001027}
1028
ramindanidcfe3a82021-11-29 17:00:31 +00001029// Tests for Command.
1030class GraphicsComposerAidlCommandTest : public GraphicsComposerAidlTest {
1031 protected:
ramindanidcfe3a82021-11-29 17:00:31 +00001032 void TearDown() override {
Ady Abraham3192f3d2021-12-03 16:08:56 -08001033 const auto errors = mReader.takeErrors();
1034 ASSERT_TRUE(mReader.takeErrors().empty());
ramindani431aad42022-02-01 21:44:29 +00001035 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001036
ramindanidcfe3a82021-11-29 17:00:31 +00001037 ASSERT_NO_FATAL_FAILURE(GraphicsComposerAidlTest::TearDown());
1038 }
1039
1040 void execute() {
Ady Abraham3192f3d2021-12-03 16:08:56 -08001041 const auto& commands = mWriter.getPendingCommands();
1042 if (commands.empty()) {
1043 mWriter.reset();
1044 return;
ramindanidcfe3a82021-11-29 17:00:31 +00001045 }
1046
ramindani431aad42022-02-01 21:44:29 +00001047 auto [status, results] = mComposerClient->executeCommands(commands);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001048 ASSERT_TRUE(status.isOk()) << "executeCommands failed " << status.getDescription();
ramindanidcfe3a82021-11-29 17:00:31 +00001049
Ady Abraham46219f52021-12-20 09:44:31 -08001050 mReader.parse(std::move(results));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001051 mWriter.reset();
ramindanidcfe3a82021-11-29 17:00:31 +00001052 }
1053
1054 static inline auto toTimePoint(nsecs_t time) {
1055 return std::chrono::time_point<std::chrono::steady_clock>(std::chrono::nanoseconds(time));
1056 }
1057
ramindanidcfe3a82021-11-29 17:00:31 +00001058 void forEachTwoConfigs(int64_t display, std::function<void(int32_t, int32_t)> func) {
ramindani431aad42022-02-01 21:44:29 +00001059 const auto& [status, displayConfigs] = mComposerClient->getDisplayConfigs(display);
1060 ASSERT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001061 for (const int32_t config1 : displayConfigs) {
1062 for (const int32_t config2 : displayConfigs) {
1063 if (config1 != config2) {
1064 func(config1, config2);
1065 }
1066 }
1067 }
1068 }
1069
1070 void waitForVsyncPeriodChange(int64_t display, const VsyncPeriodChangeTimeline& timeline,
1071 int64_t desiredTimeNanos, int64_t oldPeriodNanos,
1072 int64_t newPeriodNanos) {
1073 const auto kChangeDeadline = toTimePoint(timeline.newVsyncAppliedTimeNanos) + 100ms;
1074 while (std::chrono::steady_clock::now() <= kChangeDeadline) {
ramindani431aad42022-02-01 21:44:29 +00001075 const auto& [status, vsyncPeriodNanos] =
1076 mComposerClient->getDisplayVsyncPeriod(display);
1077 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001078 if (systemTime() <= desiredTimeNanos) {
1079 EXPECT_EQ(vsyncPeriodNanos, oldPeriodNanos);
1080 } else if (vsyncPeriodNanos == newPeriodNanos) {
1081 break;
1082 }
1083 std::this_thread::sleep_for(std::chrono::nanoseconds(oldPeriodNanos));
1084 }
1085 }
1086
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001087 sp<GraphicBuffer> allocate(::android::PixelFormat pixelFormat) {
ramindanidcfe3a82021-11-29 17:00:31 +00001088 return sp<GraphicBuffer>::make(
ramindani431aad42022-02-01 21:44:29 +00001089 static_cast<uint32_t>(getPrimaryDisplay().getDisplayWidth()),
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001090 static_cast<uint32_t>(getPrimaryDisplay().getDisplayHeight()), pixelFormat,
ramindani431aad42022-02-01 21:44:29 +00001091 /*layerCount*/ 1U,
ramindanidcfe3a82021-11-29 17:00:31 +00001092 (static_cast<uint64_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
1093 static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
1094 static_cast<uint64_t>(common::BufferUsage::COMPOSER_OVERLAY)),
1095 "VtsHalGraphicsComposer3_TargetTest");
1096 }
1097
1098 void sendRefreshFrame(const VtsDisplay& display, const VsyncPeriodChangeTimeline* timeline) {
1099 if (timeline != nullptr) {
1100 // Refresh time should be before newVsyncAppliedTimeNanos
1101 EXPECT_LT(timeline->refreshTimeNanos, timeline->newVsyncAppliedTimeNanos);
1102
1103 std::this_thread::sleep_until(toTimePoint(timeline->refreshTimeNanos));
1104 }
1105
ramindani431aad42022-02-01 21:44:29 +00001106 EXPECT_TRUE(mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::ON).isOk());
1107 EXPECT_TRUE(mComposerClient
1108 ->setColorMode(display.getDisplayId(), ColorMode::NATIVE,
1109 RenderIntent::COLORIMETRIC)
1110 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001111
ramindani431aad42022-02-01 21:44:29 +00001112 const auto& [status, layer] =
1113 mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount);
1114 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001115 {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001116 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindanidcfe3a82021-11-29 17:00:31 +00001117 ASSERT_NE(nullptr, buffer);
1118 ASSERT_EQ(::android::OK, buffer->initCheck());
1119 ASSERT_NE(nullptr, buffer->handle);
1120
ramindani431aad42022-02-01 21:44:29 +00001121 configureLayer(display, layer, Composition::DEVICE, display.getFrameRect(),
1122 display.getCrop());
1123 mWriter.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer->handle,
1124 /*acquireFence*/ -1);
1125 mWriter.setLayerDataspace(display.getDisplayId(), layer, common::Dataspace::UNKNOWN);
ramindanidcfe3a82021-11-29 17:00:31 +00001126
ramindani431aad42022-02-01 21:44:29 +00001127 mWriter.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001128 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001129 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001130
ramindani431aad42022-02-01 21:44:29 +00001131 mWriter.presentDisplay(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001132 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001133 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001134 }
1135
1136 {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001137 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindanidcfe3a82021-11-29 17:00:31 +00001138 ASSERT_NE(nullptr, buffer->handle);
1139
ramindani431aad42022-02-01 21:44:29 +00001140 mWriter.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer->handle,
1141 /*acquireFence*/ -1);
1142 mWriter.setLayerSurfaceDamage(display.getDisplayId(), layer,
Ady Abraham3192f3d2021-12-03 16:08:56 -08001143 std::vector<Rect>(1, {0, 0, 10, 10}));
ramindani431aad42022-02-01 21:44:29 +00001144 mWriter.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001145 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001146 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001147
ramindani431aad42022-02-01 21:44:29 +00001148 mWriter.presentDisplay(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001149 execute();
1150 }
1151
ramindani431aad42022-02-01 21:44:29 +00001152 EXPECT_TRUE(mComposerClient->destroyLayer(display.getDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001153 }
1154
Ady Abraham72c5b502021-12-10 17:23:39 -08001155 sp<::android::Fence> presentAndGetFence(
1156 std::optional<ClockMonotonicTimestamp> expectedPresentTime) {
ramindani431aad42022-02-01 21:44:29 +00001157 mWriter.validateDisplay(getPrimaryDisplayId(), expectedPresentTime);
Ady Abraham72c5b502021-12-10 17:23:39 -08001158 execute();
1159 EXPECT_TRUE(mReader.takeErrors().empty());
1160
ramindani431aad42022-02-01 21:44:29 +00001161 mWriter.presentDisplay(getPrimaryDisplayId());
Ady Abraham72c5b502021-12-10 17:23:39 -08001162 execute();
1163 EXPECT_TRUE(mReader.takeErrors().empty());
1164
ramindani431aad42022-02-01 21:44:29 +00001165 auto presentFence = mReader.takePresentFence(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -08001166 // take ownership
1167 const int fenceOwner = presentFence.get();
1168 *presentFence.getR() = -1;
1169 EXPECT_NE(-1, fenceOwner);
1170 return sp<::android::Fence>::make(fenceOwner);
Ady Abraham72c5b502021-12-10 17:23:39 -08001171 }
1172
1173 int32_t getVsyncPeriod() {
ramindani431aad42022-02-01 21:44:29 +00001174 const auto& [status, activeConfig] =
1175 mComposerClient->getActiveConfig(getPrimaryDisplayId());
1176 EXPECT_TRUE(status.isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001177
ramindani431aad42022-02-01 21:44:29 +00001178 const auto& [vsyncPeriodStatus, vsyncPeriod] = mComposerClient->getDisplayAttribute(
1179 getPrimaryDisplayId(), activeConfig, DisplayAttribute::VSYNC_PERIOD);
1180 EXPECT_TRUE(vsyncPeriodStatus.isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001181 return vsyncPeriod;
1182 }
1183
1184 int64_t createOnScreenLayer() {
ramindani431aad42022-02-01 21:44:29 +00001185 const auto& [status, layer] =
1186 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1187 EXPECT_TRUE(status.isOk());
1188 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1189 getPrimaryDisplay().getDisplayHeight()};
1190 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1191 (float)getPrimaryDisplay().getDisplayHeight()};
1192 configureLayer(getPrimaryDisplay(), layer, Composition::DEVICE, displayFrame, cropRect);
1193 mWriter.setLayerDataspace(getPrimaryDisplayId(), layer, common::Dataspace::UNKNOWN);
Ady Abraham72c5b502021-12-10 17:23:39 -08001194 return layer;
1195 }
1196
Midas Chiena0b56bd2022-01-13 23:27:33 +08001197 bool hasDisplayCapability(int64_t display, DisplayCapability cap) {
ramindani431aad42022-02-01 21:44:29 +00001198 const auto& [status, capabilities] = mComposerClient->getDisplayCapabilities(display);
1199 EXPECT_TRUE(status.isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08001200
1201 return std::find(capabilities.begin(), capabilities.end(), cap) != capabilities.end();
1202 }
1203
ramindanidcfe3a82021-11-29 17:00:31 +00001204 void Test_setActiveConfigWithConstraints(const TestParameters& params) {
1205 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00001206 forEachTwoConfigs(display.getDisplayId(), [&](int32_t config1, int32_t config2) {
1207 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001208 sendRefreshFrame(display, nullptr);
1209
ramindani431aad42022-02-01 21:44:29 +00001210 const auto displayConfigGroup1 = display.getDisplayConfig(config1);
1211 int32_t vsyncPeriod1 = displayConfigGroup1.vsyncPeriod;
1212 int32_t configGroup1 = displayConfigGroup1.configGroup;
1213
1214 const auto displayConfigGroup2 = display.getDisplayConfig(config2);
1215 int32_t vsyncPeriod2 = displayConfigGroup2.vsyncPeriod;
1216 int32_t configGroup2 = displayConfigGroup2.configGroup;
ramindanidcfe3a82021-11-29 17:00:31 +00001217
1218 if (vsyncPeriod1 == vsyncPeriod2) {
1219 return; // continue
1220 }
1221
1222 // We don't allow delayed change when changing config groups
1223 if (params.delayForChange > 0 && configGroup1 != configGroup2) {
1224 return; // continue
1225 }
1226
ramindanidcfe3a82021-11-29 17:00:31 +00001227 VsyncPeriodChangeConstraints constraints = {
1228 .desiredTimeNanos = systemTime() + params.delayForChange,
1229 .seamlessRequired = false};
ramindani431aad42022-02-01 21:44:29 +00001230 const auto& [status, timeline] = mComposerClient->setActiveConfigWithConstraints(
1231 &display, config2, constraints);
1232 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001233
1234 EXPECT_TRUE(timeline.newVsyncAppliedTimeNanos >= constraints.desiredTimeNanos);
1235 // Refresh rate should change within a reasonable time
1236 constexpr std::chrono::nanoseconds kReasonableTimeForChange = 1s; // 1 second
1237 EXPECT_TRUE(timeline.newVsyncAppliedTimeNanos - constraints.desiredTimeNanos <=
1238 kReasonableTimeForChange.count());
1239
1240 if (timeline.refreshRequired) {
1241 if (params.refreshMiss) {
1242 // Miss the refresh frame on purpose to make sure the implementation sends a
1243 // callback
1244 std::this_thread::sleep_until(toTimePoint(timeline.refreshTimeNanos) +
1245 100ms);
1246 }
1247 sendRefreshFrame(display, &timeline);
1248 }
ramindani431aad42022-02-01 21:44:29 +00001249 waitForVsyncPeriodChange(display.getDisplayId(), timeline,
1250 constraints.desiredTimeNanos, vsyncPeriod1, vsyncPeriod2);
ramindanidcfe3a82021-11-29 17:00:31 +00001251
1252 // At this point the refresh rate should have changed already, however in rare
1253 // cases the implementation might have missed the deadline. In this case a new
1254 // timeline should have been provided.
ramindani431aad42022-02-01 21:44:29 +00001255 auto newTimeline = mComposerClient->takeLastVsyncPeriodChangeTimeline();
ramindanidcfe3a82021-11-29 17:00:31 +00001256 if (timeline.refreshRequired && params.refreshMiss) {
1257 EXPECT_TRUE(newTimeline.has_value());
1258 }
1259
1260 if (newTimeline.has_value()) {
1261 if (newTimeline->refreshRequired) {
1262 sendRefreshFrame(display, &newTimeline.value());
1263 }
ramindani431aad42022-02-01 21:44:29 +00001264 waitForVsyncPeriodChange(display.getDisplayId(), newTimeline.value(),
ramindanidcfe3a82021-11-29 17:00:31 +00001265 constraints.desiredTimeNanos, vsyncPeriod1,
1266 vsyncPeriod2);
1267 }
1268
ramindani431aad42022-02-01 21:44:29 +00001269 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanos] =
1270 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
1271 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001272 EXPECT_EQ(vsyncPeriodNanos, vsyncPeriod2);
1273 });
1274 }
1275 }
1276
Ady Abraham72c5b502021-12-10 17:23:39 -08001277 void Test_expectedPresentTime(std::optional<int> framesDelay) {
Jason Macnak325e8232022-01-24 14:48:55 -08001278 if (hasCapability(Capability::PRESENT_FENCE_IS_NOT_RELIABLE)) {
1279 GTEST_SUCCEED() << "Device has unreliable present fences capability, skipping";
1280 return;
1281 }
1282
ramindani431aad42022-02-01 21:44:29 +00001283 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001284
1285 const auto vsyncPeriod = getVsyncPeriod();
1286
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001287 const auto buffer1 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1288 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
Ady Abraham72c5b502021-12-10 17:23:39 -08001289 ASSERT_NE(nullptr, buffer1);
1290 ASSERT_NE(nullptr, buffer2);
1291
1292 const auto layer = createOnScreenLayer();
ramindani431aad42022-02-01 21:44:29 +00001293 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer1->handle,
1294 /*acquireFence*/ -1);
Ady Abraham72c5b502021-12-10 17:23:39 -08001295 const sp<::android::Fence> presentFence1 =
1296 presentAndGetFence(ComposerClientWriter::kNoTimestamp);
1297 presentFence1->waitForever(LOG_TAG);
1298
1299 auto expectedPresentTime = presentFence1->getSignalTime() + vsyncPeriod;
1300 if (framesDelay.has_value()) {
1301 expectedPresentTime += *framesDelay * vsyncPeriod;
1302 }
1303
ramindani431aad42022-02-01 21:44:29 +00001304 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer2->handle,
1305 /*acquireFence*/ -1);
Ady Abraham72c5b502021-12-10 17:23:39 -08001306 const auto setExpectedPresentTime = [&]() -> std::optional<ClockMonotonicTimestamp> {
1307 if (!framesDelay.has_value()) {
1308 return ComposerClientWriter::kNoTimestamp;
1309 } else if (*framesDelay == 0) {
1310 return ClockMonotonicTimestamp{0};
1311 }
1312 return ClockMonotonicTimestamp{expectedPresentTime};
1313 }();
1314
1315 const sp<::android::Fence> presentFence2 = presentAndGetFence(setExpectedPresentTime);
1316 presentFence2->waitForever(LOG_TAG);
1317
1318 const auto actualPresentTime = presentFence2->getSignalTime();
Ady Abrahamdf084f32022-01-10 14:10:23 -08001319 EXPECT_GE(actualPresentTime, expectedPresentTime - vsyncPeriod / 2);
Ady Abraham72c5b502021-12-10 17:23:39 -08001320
ramindani431aad42022-02-01 21:44:29 +00001321 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001322 }
1323
ramindani431aad42022-02-01 21:44:29 +00001324 void configureLayer(const VtsDisplay& display, int64_t layer, Composition composition,
1325 const Rect& displayFrame, const FRect& cropRect) {
1326 mWriter.setLayerCompositionType(display.getDisplayId(), layer, composition);
1327 mWriter.setLayerDisplayFrame(display.getDisplayId(), layer, displayFrame);
1328 mWriter.setLayerPlaneAlpha(display.getDisplayId(), layer, /*alpha*/ 1);
1329 mWriter.setLayerSourceCrop(display.getDisplayId(), layer, cropRect);
1330 mWriter.setLayerTransform(display.getDisplayId(), layer, static_cast<Transform>(0));
1331 mWriter.setLayerVisibleRegion(display.getDisplayId(), layer,
1332 std::vector<Rect>(1, displayFrame));
1333 mWriter.setLayerZOrder(display.getDisplayId(), layer, /*z*/ 10);
1334 mWriter.setLayerBlendMode(display.getDisplayId(), layer, BlendMode::NONE);
1335 mWriter.setLayerSurfaceDamage(display.getDisplayId(), layer,
1336 std::vector<Rect>(1, displayFrame));
1337 }
ramindanidcfe3a82021-11-29 17:00:31 +00001338 // clang-format off
1339 const std::array<float, 16> kIdentity = {{
1340 1.0f, 0.0f, 0.0f, 0.0f,
1341 0.0f, 1.0f, 0.0f, 0.0f,
1342 0.0f, 0.0f, 1.0f, 0.0f,
1343 0.0f, 0.0f, 0.0f, 1.0f,
1344 }};
1345 // clang-format on
1346
Ady Abraham91c9d1a2021-12-15 18:14:45 -08001347 ComposerClientWriter mWriter;
1348 ComposerClientReader mReader;
ramindanidcfe3a82021-11-29 17:00:31 +00001349};
1350
ramindani431aad42022-02-01 21:44:29 +00001351TEST_P(GraphicsComposerAidlCommandTest, SetColorTransform) {
1352 mWriter.setColorTransform(getPrimaryDisplayId(), kIdentity.data());
ramindanidcfe3a82021-11-29 17:00:31 +00001353 execute();
1354}
1355
1356TEST_P(GraphicsComposerAidlCommandTest, SetLayerColorTransform) {
ramindani431aad42022-02-01 21:44:29 +00001357 const auto& [status, layer] =
1358 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1359 EXPECT_TRUE(status.isOk());
1360 mWriter.setLayerColorTransform(getPrimaryDisplayId(), layer, kIdentity.data());
ramindanidcfe3a82021-11-29 17:00:31 +00001361 execute();
1362
Ady Abraham3192f3d2021-12-03 16:08:56 -08001363 const auto errors = mReader.takeErrors();
Jason Macnak062bc9a2022-01-20 15:00:09 -08001364 if (errors.size() == 1 && errors[0].errorCode == IComposerClient::EX_UNSUPPORTED) {
ramindanidcfe3a82021-11-29 17:00:31 +00001365 GTEST_SUCCEED() << "setLayerColorTransform is not supported";
1366 return;
1367 }
1368}
1369
Alec Mouri60564e12021-12-09 18:48:20 -08001370TEST_P(GraphicsComposerAidlCommandTest, SetDisplayBrightness) {
ramindani431aad42022-02-01 21:44:29 +00001371 const auto& [status, capabilities] =
1372 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
1373 ASSERT_TRUE(status.isOk());
Alec Mouri60564e12021-12-09 18:48:20 -08001374 bool brightnessSupport = std::find(capabilities.begin(), capabilities.end(),
1375 DisplayCapability::BRIGHTNESS) != capabilities.end();
1376 if (!brightnessSupport) {
ramindani431aad42022-02-01 21:44:29 +00001377 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.5f);
Alec Mouri60564e12021-12-09 18:48:20 -08001378 execute();
1379 const auto errors = mReader.takeErrors();
1380 EXPECT_EQ(1, errors.size());
Jason Macnak062bc9a2022-01-20 15:00:09 -08001381 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, errors[0].errorCode);
Alec Mouri60564e12021-12-09 18:48:20 -08001382 GTEST_SUCCEED() << "SetDisplayBrightness is not supported";
1383 return;
1384 }
1385
ramindani431aad42022-02-01 21:44:29 +00001386 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.0f);
Alec Mouri60564e12021-12-09 18:48:20 -08001387 execute();
1388 EXPECT_TRUE(mReader.takeErrors().empty());
1389
ramindani431aad42022-02-01 21:44:29 +00001390 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.5f);
Alec Mouri60564e12021-12-09 18:48:20 -08001391 execute();
1392 EXPECT_TRUE(mReader.takeErrors().empty());
1393
ramindani431aad42022-02-01 21:44:29 +00001394 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 1.0f);
Alec Mouri60564e12021-12-09 18:48:20 -08001395 execute();
1396 EXPECT_TRUE(mReader.takeErrors().empty());
1397
ramindani431aad42022-02-01 21:44:29 +00001398 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ -1.0f);
Alec Mouri60564e12021-12-09 18:48:20 -08001399 execute();
1400 EXPECT_TRUE(mReader.takeErrors().empty());
1401
ramindani431aad42022-02-01 21:44:29 +00001402 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 2.0f);
Alec Mouri60564e12021-12-09 18:48:20 -08001403 execute();
1404 {
1405 const auto errors = mReader.takeErrors();
ramindanib3bdf052022-01-12 18:27:05 +00001406 ASSERT_EQ(1, errors.size());
Alec Mouri60564e12021-12-09 18:48:20 -08001407 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1408 }
1409
ramindani431aad42022-02-01 21:44:29 +00001410 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ -2.0f);
Alec Mouri60564e12021-12-09 18:48:20 -08001411 execute();
1412 {
1413 const auto errors = mReader.takeErrors();
ramindanib3bdf052022-01-12 18:27:05 +00001414 ASSERT_EQ(1, errors.size());
Alec Mouri60564e12021-12-09 18:48:20 -08001415 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1416 }
1417}
1418
ramindani431aad42022-02-01 21:44:29 +00001419TEST_P(GraphicsComposerAidlCommandTest, SetClientTarget) {
1420 EXPECT_TRUE(mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kBufferSlotCount)
1421 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001422
ramindani431aad42022-02-01 21:44:29 +00001423 mWriter.setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, nullptr, /*acquireFence*/ -1,
1424 Dataspace::UNKNOWN, std::vector<Rect>());
ramindanidcfe3a82021-11-29 17:00:31 +00001425
1426 execute();
1427}
1428
ramindani431aad42022-02-01 21:44:29 +00001429TEST_P(GraphicsComposerAidlCommandTest, SetOutputBuffer) {
1430 const auto& [status, virtualDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
1431 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001432 if (virtualDisplayCount == 0) {
1433 GTEST_SUCCEED() << "no virtual display support";
1434 return;
1435 }
1436
ramindani431aad42022-02-01 21:44:29 +00001437 const auto& [displayStatus, display] = mComposerClient->createVirtualDisplay(
1438 /*width*/ 64, /*height*/ 64, common::PixelFormat::IMPLEMENTATION_DEFINED,
1439 kBufferSlotCount);
1440 EXPECT_TRUE(displayStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001441
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001442 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001443 const auto handle = buffer->handle;
ramindani431aad42022-02-01 21:44:29 +00001444 mWriter.setOutputBuffer(display.display, /*slot*/ 0, handle, /*releaseFence*/ -1);
ramindanidcfe3a82021-11-29 17:00:31 +00001445 execute();
1446}
1447
ramindani431aad42022-02-01 21:44:29 +00001448TEST_P(GraphicsComposerAidlCommandTest, ValidDisplay) {
1449 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001450 execute();
1451}
1452
ramindani431aad42022-02-01 21:44:29 +00001453TEST_P(GraphicsComposerAidlCommandTest, AcceptDisplayChanges) {
1454 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1455 mWriter.acceptDisplayChanges(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001456 execute();
1457}
1458
ramindani431aad42022-02-01 21:44:29 +00001459TEST_P(GraphicsComposerAidlCommandTest, PresentDisplay) {
1460 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1461 mWriter.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001462 execute();
1463}
1464
1465/**
1466 * Test IComposerClient::Command::PRESENT_DISPLAY
1467 *
1468 * Test that IComposerClient::Command::PRESENT_DISPLAY works without
1469 * additional call to validateDisplay when only the layer buffer handle and
1470 * surface damage have been set
1471 */
ramindani431aad42022-02-01 21:44:29 +00001472TEST_P(GraphicsComposerAidlCommandTest, PresentDisplayNoLayerStateChanges) {
Jason Macnak325e8232022-01-24 14:48:55 -08001473 if (!hasCapability(Capability::SKIP_VALIDATE)) {
ramindanidcfe3a82021-11-29 17:00:31 +00001474 GTEST_SUCCEED() << "Device does not have skip validate capability, skipping";
1475 return;
1476 }
ramindani431aad42022-02-01 21:44:29 +00001477 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001478
ramindani431aad42022-02-01 21:44:29 +00001479 const auto& [renderIntentsStatus, renderIntents] =
1480 mComposerClient->getRenderIntents(getPrimaryDisplayId(), ColorMode::NATIVE);
1481 EXPECT_TRUE(renderIntentsStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001482 for (auto intent : renderIntents) {
ramindani431aad42022-02-01 21:44:29 +00001483 EXPECT_TRUE(mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE, intent)
1484 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001485
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001486 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001487 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001488 ASSERT_NE(nullptr, handle);
1489
ramindani431aad42022-02-01 21:44:29 +00001490 const auto& [layerStatus, layer] =
1491 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1492 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001493
ramindani431aad42022-02-01 21:44:29 +00001494 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1495 getPrimaryDisplay().getDisplayHeight()};
1496 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1497 (float)getPrimaryDisplay().getDisplayHeight()};
1498 configureLayer(getPrimaryDisplay(), layer, Composition::CURSOR, displayFrame, cropRect);
1499 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle,
1500 /*acquireFence*/ -1);
1501 mWriter.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1502 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001503 execute();
ramindani431aad42022-02-01 21:44:29 +00001504 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanidcfe3a82021-11-29 17:00:31 +00001505 GTEST_SUCCEED() << "Composition change requested, skipping test";
1506 return;
1507 }
1508
Ady Abraham3192f3d2021-12-03 16:08:56 -08001509 ASSERT_TRUE(mReader.takeErrors().empty());
ramindani431aad42022-02-01 21:44:29 +00001510 mWriter.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001511 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001512 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001513
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001514 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001515 const auto handle2 = buffer2->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001516 ASSERT_NE(nullptr, handle2);
ramindani431aad42022-02-01 21:44:29 +00001517 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle2,
1518 /*acquireFence*/ -1);
1519 mWriter.setLayerSurfaceDamage(getPrimaryDisplayId(), layer,
1520 std::vector<Rect>(1, {0, 0, 10, 10}));
1521 mWriter.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001522 execute();
1523 }
1524}
1525
ramindani431aad42022-02-01 21:44:29 +00001526TEST_P(GraphicsComposerAidlCommandTest, SetLayerCursorPosition) {
1527 const auto& [layerStatus, layer] =
1528 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1529 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001530
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001531 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001532 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001533 ASSERT_NE(nullptr, handle);
ramindanidcfe3a82021-11-29 17:00:31 +00001534
ramindani431aad42022-02-01 21:44:29 +00001535 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
1536
1537 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1538 getPrimaryDisplay().getDisplayHeight()};
1539 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1540 (float)getPrimaryDisplay().getDisplayHeight()};
1541 configureLayer(getPrimaryDisplay(), layer, Composition::CURSOR, displayFrame, cropRect);
1542 mWriter.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1543 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001544
1545 execute();
Ady Abraham46219f52021-12-20 09:44:31 -08001546
ramindani431aad42022-02-01 21:44:29 +00001547 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanidcfe3a82021-11-29 17:00:31 +00001548 GTEST_SUCCEED() << "Composition change requested, skipping test";
1549 return;
1550 }
ramindani431aad42022-02-01 21:44:29 +00001551 mWriter.presentDisplay(getPrimaryDisplayId());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001552 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001553
ramindani431aad42022-02-01 21:44:29 +00001554 mWriter.setLayerCursorPosition(getPrimaryDisplayId(), layer, /*x*/ 1, /*y*/ 1);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001555 execute();
1556
ramindani431aad42022-02-01 21:44:29 +00001557 mWriter.setLayerCursorPosition(getPrimaryDisplayId(), layer, /*x*/ 0, /*y*/ 0);
1558 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1559 mWriter.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001560 execute();
1561}
1562
ramindani431aad42022-02-01 21:44:29 +00001563TEST_P(GraphicsComposerAidlCommandTest, SetLayerBuffer) {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001564 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001565 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001566 ASSERT_NE(nullptr, handle);
1567
ramindani431aad42022-02-01 21:44:29 +00001568 const auto& [layerStatus, layer] =
1569 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1570 EXPECT_TRUE(layerStatus.isOk());
1571 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
ramindanidcfe3a82021-11-29 17:00:31 +00001572 execute();
1573}
1574
ramindani431aad42022-02-01 21:44:29 +00001575TEST_P(GraphicsComposerAidlCommandTest, SetLayerSurfaceDamage) {
1576 const auto& [layerStatus, layer] =
1577 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1578 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001579
1580 Rect empty{0, 0, 0, 0};
1581 Rect unit{0, 0, 1, 1};
1582
ramindani431aad42022-02-01 21:44:29 +00001583 mWriter.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
ramindanidcfe3a82021-11-29 17:00:31 +00001584 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001585 ASSERT_TRUE(mReader.takeErrors().empty());
1586
ramindani431aad42022-02-01 21:44:29 +00001587 mWriter.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001588 execute();
1589 ASSERT_TRUE(mReader.takeErrors().empty());
1590
ramindani431aad42022-02-01 21:44:29 +00001591 mWriter.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001592 execute();
1593 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001594}
1595
ramindani431aad42022-02-01 21:44:29 +00001596TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlockingRegion) {
1597 const auto& [layerStatus, layer] =
1598 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1599 EXPECT_TRUE(layerStatus.isOk());
Leon Scroggins III03318152022-01-13 12:24:19 -05001600
1601 Rect empty{0, 0, 0, 0};
1602 Rect unit{0, 0, 1, 1};
1603
ramindani431aad42022-02-01 21:44:29 +00001604 mWriter.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
Leon Scroggins III03318152022-01-13 12:24:19 -05001605 execute();
1606 ASSERT_TRUE(mReader.takeErrors().empty());
1607
ramindani431aad42022-02-01 21:44:29 +00001608 mWriter.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Leon Scroggins III03318152022-01-13 12:24:19 -05001609 execute();
1610 ASSERT_TRUE(mReader.takeErrors().empty());
1611
ramindani431aad42022-02-01 21:44:29 +00001612 mWriter.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
Leon Scroggins III03318152022-01-13 12:24:19 -05001613 execute();
1614 ASSERT_TRUE(mReader.takeErrors().empty());
1615}
1616
ramindani431aad42022-02-01 21:44:29 +00001617TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlendMode) {
1618 const auto& [layerStatus, layer] =
1619 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1620 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001621
ramindani431aad42022-02-01 21:44:29 +00001622 mWriter.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::NONE);
ramindanidcfe3a82021-11-29 17:00:31 +00001623 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001624 ASSERT_TRUE(mReader.takeErrors().empty());
1625
ramindani431aad42022-02-01 21:44:29 +00001626 mWriter.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::PREMULTIPLIED);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001627 execute();
1628 ASSERT_TRUE(mReader.takeErrors().empty());
1629
ramindani431aad42022-02-01 21:44:29 +00001630 mWriter.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::COVERAGE);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001631 execute();
1632 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001633}
1634
ramindani431aad42022-02-01 21:44:29 +00001635TEST_P(GraphicsComposerAidlCommandTest, SetLayerColor) {
1636 const auto& [layerStatus, layer] =
1637 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1638 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001639
ramindani431aad42022-02-01 21:44:29 +00001640 mWriter.setLayerColor(getPrimaryDisplayId(), layer, Color{1.0f, 1.0f, 1.0f, 1.0f});
ramindanidcfe3a82021-11-29 17:00:31 +00001641 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001642 ASSERT_TRUE(mReader.takeErrors().empty());
1643
ramindani431aad42022-02-01 21:44:29 +00001644 mWriter.setLayerColor(getPrimaryDisplayId(), layer, Color{0.0f, 0.0f, 0.0f, 0.0f});
Ady Abraham3192f3d2021-12-03 16:08:56 -08001645 execute();
1646 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001647}
1648
ramindani431aad42022-02-01 21:44:29 +00001649TEST_P(GraphicsComposerAidlCommandTest, SetLayerCompositionType) {
1650 const auto& [layerStatus, layer] =
1651 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1652 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001653
ramindani431aad42022-02-01 21:44:29 +00001654 mWriter.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CLIENT);
ramindanidcfe3a82021-11-29 17:00:31 +00001655 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001656 ASSERT_TRUE(mReader.takeErrors().empty());
1657
ramindani431aad42022-02-01 21:44:29 +00001658 mWriter.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::DEVICE);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001659 execute();
1660 ASSERT_TRUE(mReader.takeErrors().empty());
1661
ramindani431aad42022-02-01 21:44:29 +00001662 mWriter.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::SOLID_COLOR);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001663 execute();
1664 ASSERT_TRUE(mReader.takeErrors().empty());
1665
ramindani431aad42022-02-01 21:44:29 +00001666 mWriter.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CURSOR);
1667 execute();
1668}
1669
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001670TEST_P(GraphicsComposerAidlCommandTest, DisplayDecoration) {
1671 for (VtsDisplay& display : mDisplays) {
1672 const auto [layerStatus, layer] =
1673 mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount);
1674 EXPECT_TRUE(layerStatus.isOk());
1675
1676 const auto [error, support] =
1677 mComposerClient->getDisplayDecorationSupport(display.getDisplayId());
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001678
Leon Scroggins III91590872022-02-23 09:51:21 -05001679 const auto format = (error.isOk() && support) ? support->format
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001680 : aidl::android::hardware::graphics::common::PixelFormat::RGBA_8888;
1681 const auto decorBuffer = allocate(static_cast<::android::PixelFormat>(format));
1682 ASSERT_NE(nullptr, decorBuffer);
1683 if (::android::OK != decorBuffer->initCheck()) {
1684 if (support) {
1685 FAIL() << "Device advertised display decoration support with format "
1686 << aidl::android::hardware::graphics::common::toString(format)
1687 << " but failed to allocate it!";
1688 } else {
1689 FAIL() << "Device advertised NO display decoration support, but it should "
1690 << "still be able to allocate "
1691 << aidl::android::hardware::graphics::common::toString(format);
1692 }
1693 }
1694
1695 mWriter.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, decorBuffer->handle,
1696 /*acquireFence*/ -1);
1697 mWriter.setLayerCompositionType(display.getDisplayId(), layer,
1698 Composition::DISPLAY_DECORATION);
1699 mWriter.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
1700 execute();
1701 if (support) {
1702 ASSERT_TRUE(mReader.takeErrors().empty());
1703 } else {
1704 const auto errors = mReader.takeErrors();
1705 ASSERT_EQ(1, errors.size());
Leon Scroggins III6455e792022-02-24 12:18:58 -05001706 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, errors[0].errorCode);
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001707 }
1708 }
1709}
1710
ramindani431aad42022-02-01 21:44:29 +00001711TEST_P(GraphicsComposerAidlCommandTest, SetLayerDataspace) {
1712 const auto& [layerStatus, layer] =
1713 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1714 EXPECT_TRUE(layerStatus.isOk());
1715
1716 mWriter.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1717 execute();
1718}
1719
1720TEST_P(GraphicsComposerAidlCommandTest, SetLayerDisplayFrame) {
1721 const auto& [layerStatus, layer] =
1722 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1723 EXPECT_TRUE(layerStatus.isOk());
1724
1725 mWriter.setLayerDisplayFrame(getPrimaryDisplayId(), layer, Rect{0, 0, 1, 1});
1726 execute();
1727}
1728
1729TEST_P(GraphicsComposerAidlCommandTest, SetLayerPlaneAlpha) {
1730 const auto& [layerStatus, layer] =
1731 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1732 EXPECT_TRUE(layerStatus.isOk());
1733
1734 mWriter.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 0.0f);
1735 execute();
1736 ASSERT_TRUE(mReader.takeErrors().empty());
1737
1738 mWriter.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 1.0f);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001739 execute();
1740 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001741}
1742
ramindani431aad42022-02-01 21:44:29 +00001743TEST_P(GraphicsComposerAidlCommandTest, SetLayerSidebandStream) {
Jason Macnak325e8232022-01-24 14:48:55 -08001744 if (!hasCapability(Capability::SIDEBAND_STREAM)) {
ramindanidcfe3a82021-11-29 17:00:31 +00001745 GTEST_SUCCEED() << "no sideband stream support";
1746 return;
1747 }
1748
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001749 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001750 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001751 ASSERT_NE(nullptr, handle);
1752
ramindani431aad42022-02-01 21:44:29 +00001753 const auto& [layerStatus, layer] =
1754 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1755 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001756
ramindani431aad42022-02-01 21:44:29 +00001757 mWriter.setLayerSidebandStream(getPrimaryDisplayId(), layer, handle);
ramindanidcfe3a82021-11-29 17:00:31 +00001758 execute();
1759}
1760
ramindani431aad42022-02-01 21:44:29 +00001761TEST_P(GraphicsComposerAidlCommandTest, SetLayerSourceCrop) {
1762 const auto& [layerStatus, layer] =
1763 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1764 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001765
ramindani431aad42022-02-01 21:44:29 +00001766 mWriter.setLayerSourceCrop(getPrimaryDisplayId(), layer, FRect{0.0f, 0.0f, 1.0f, 1.0f});
ramindanidcfe3a82021-11-29 17:00:31 +00001767 execute();
1768}
1769
ramindani431aad42022-02-01 21:44:29 +00001770TEST_P(GraphicsComposerAidlCommandTest, SetLayerTransform) {
1771 const auto& [layerStatus, layer] =
1772 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1773 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001774
ramindani431aad42022-02-01 21:44:29 +00001775 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, static_cast<Transform>(0));
ramindanidcfe3a82021-11-29 17:00:31 +00001776 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001777 ASSERT_TRUE(mReader.takeErrors().empty());
1778
ramindani431aad42022-02-01 21:44:29 +00001779 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_H);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001780 execute();
1781 ASSERT_TRUE(mReader.takeErrors().empty());
1782
ramindani431aad42022-02-01 21:44:29 +00001783 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_V);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001784 execute();
1785 ASSERT_TRUE(mReader.takeErrors().empty());
1786
ramindani431aad42022-02-01 21:44:29 +00001787 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_90);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001788 execute();
1789 ASSERT_TRUE(mReader.takeErrors().empty());
1790
ramindani431aad42022-02-01 21:44:29 +00001791 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_180);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001792 execute();
1793 ASSERT_TRUE(mReader.takeErrors().empty());
1794
ramindani431aad42022-02-01 21:44:29 +00001795 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_270);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001796 execute();
1797 ASSERT_TRUE(mReader.takeErrors().empty());
1798
ramindani431aad42022-02-01 21:44:29 +00001799 mWriter.setLayerTransform(getPrimaryDisplayId(), layer,
Ady Abraham3192f3d2021-12-03 16:08:56 -08001800 static_cast<Transform>(static_cast<int>(Transform::FLIP_H) |
1801 static_cast<int>(Transform::ROT_90)));
1802 execute();
1803 ASSERT_TRUE(mReader.takeErrors().empty());
1804
ramindani431aad42022-02-01 21:44:29 +00001805 mWriter.setLayerTransform(getPrimaryDisplayId(), layer,
Ady Abraham3192f3d2021-12-03 16:08:56 -08001806 static_cast<Transform>(static_cast<int>(Transform::FLIP_V) |
1807 static_cast<int>(Transform::ROT_90)));
1808 execute();
1809 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001810}
1811
ramindani431aad42022-02-01 21:44:29 +00001812TEST_P(GraphicsComposerAidlCommandTest, SetLayerVisibleRegion) {
1813 const auto& [layerStatus, layer] =
1814 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1815 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001816
1817 Rect empty{0, 0, 0, 0};
1818 Rect unit{0, 0, 1, 1};
1819
ramindani431aad42022-02-01 21:44:29 +00001820 mWriter.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
ramindanidcfe3a82021-11-29 17:00:31 +00001821 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001822 ASSERT_TRUE(mReader.takeErrors().empty());
1823
ramindani431aad42022-02-01 21:44:29 +00001824 mWriter.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001825 execute();
1826 ASSERT_TRUE(mReader.takeErrors().empty());
1827
ramindani431aad42022-02-01 21:44:29 +00001828 mWriter.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001829 execute();
1830 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001831}
1832
ramindani431aad42022-02-01 21:44:29 +00001833TEST_P(GraphicsComposerAidlCommandTest, SetLayerZOrder) {
1834 const auto& [layerStatus, layer] =
1835 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1836 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001837
ramindani431aad42022-02-01 21:44:29 +00001838 mWriter.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 10);
ramindanidcfe3a82021-11-29 17:00:31 +00001839 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001840 ASSERT_TRUE(mReader.takeErrors().empty());
1841
ramindani431aad42022-02-01 21:44:29 +00001842 mWriter.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 0);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001843 execute();
1844 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001845}
1846
ramindani431aad42022-02-01 21:44:29 +00001847TEST_P(GraphicsComposerAidlCommandTest, SetLayerPerFrameMetadata) {
1848 const auto& [layerStatus, layer] =
1849 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1850 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001851
ramindanidcfe3a82021-11-29 17:00:31 +00001852 /**
1853 * DISPLAY_P3 is a color space that uses the DCI_P3 primaries,
1854 * the D65 white point and the SRGB transfer functions.
1855 * Rendering Intent: Colorimetric
1856 * Primaries:
1857 * x y
1858 * green 0.265 0.690
1859 * blue 0.150 0.060
1860 * red 0.680 0.320
1861 * white (D65) 0.3127 0.3290
1862 */
1863
1864 std::vector<PerFrameMetadata> aidlMetadata;
1865 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X, 0.680f});
1866 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y, 0.320f});
1867 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_X, 0.265f});
1868 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_Y, 0.690f});
1869 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_X, 0.150f});
1870 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_Y, 0.060f});
1871 aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_X, 0.3127f});
1872 aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_Y, 0.3290f});
1873 aidlMetadata.push_back({PerFrameMetadataKey::MAX_LUMINANCE, 100.0f});
1874 aidlMetadata.push_back({PerFrameMetadataKey::MIN_LUMINANCE, 0.1f});
1875 aidlMetadata.push_back({PerFrameMetadataKey::MAX_CONTENT_LIGHT_LEVEL, 78.0});
1876 aidlMetadata.push_back({PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL, 62.0});
ramindani431aad42022-02-01 21:44:29 +00001877 mWriter.setLayerPerFrameMetadata(getPrimaryDisplayId(), layer, aidlMetadata);
ramindanidcfe3a82021-11-29 17:00:31 +00001878 execute();
1879
Ady Abraham3192f3d2021-12-03 16:08:56 -08001880 const auto errors = mReader.takeErrors();
1881 if (errors.size() == 1 && errors[0].errorCode == EX_UNSUPPORTED_OPERATION) {
ramindanidcfe3a82021-11-29 17:00:31 +00001882 GTEST_SUCCEED() << "SetLayerPerFrameMetadata is not supported";
ramindani431aad42022-02-01 21:44:29 +00001883 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001884 return;
1885 }
1886
ramindani431aad42022-02-01 21:44:29 +00001887 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001888}
1889
Alec Mourib1f16722022-02-07 13:03:44 -08001890TEST_P(GraphicsComposerAidlCommandTest, setLayerBrightness) {
ramindani431aad42022-02-01 21:44:29 +00001891 const auto& [layerStatus, layer] =
1892 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
Alec Mouri95e490b2022-01-06 13:46:58 -08001893
Alec Mourib1f16722022-02-07 13:03:44 -08001894 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, 0.2f);
Alec Mouri95e490b2022-01-06 13:46:58 -08001895 execute();
1896 ASSERT_TRUE(mReader.takeErrors().empty());
1897
Alec Mourib1f16722022-02-07 13:03:44 -08001898 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, 1.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08001899 execute();
1900 ASSERT_TRUE(mReader.takeErrors().empty());
1901
Alec Mourib1f16722022-02-07 13:03:44 -08001902 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, 0.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08001903 execute();
1904 ASSERT_TRUE(mReader.takeErrors().empty());
1905
Alec Mourib1f16722022-02-07 13:03:44 -08001906 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, -1.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08001907 execute();
Alec Mourib1f16722022-02-07 13:03:44 -08001908 {
1909 const auto errors = mReader.takeErrors();
1910 ASSERT_EQ(1, errors.size());
1911 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1912 }
1913
1914 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, std::nanf(""));
1915 execute();
1916 {
1917 const auto errors = mReader.takeErrors();
1918 ASSERT_EQ(1, errors.size());
1919 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1920 }
Alec Mouri95e490b2022-01-06 13:46:58 -08001921}
1922
ramindani431aad42022-02-01 21:44:29 +00001923TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints) {
ramindanidcfe3a82021-11-29 17:00:31 +00001924 Test_setActiveConfigWithConstraints({.delayForChange = 0, .refreshMiss = false});
1925}
1926
ramindani431aad42022-02-01 21:44:29 +00001927TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_Delayed) {
ramindanidcfe3a82021-11-29 17:00:31 +00001928 Test_setActiveConfigWithConstraints({.delayForChange = 300'000'000, // 300ms
1929 .refreshMiss = false});
1930}
1931
ramindani431aad42022-02-01 21:44:29 +00001932TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_MissRefresh) {
ramindanidcfe3a82021-11-29 17:00:31 +00001933 Test_setActiveConfigWithConstraints({.delayForChange = 0, .refreshMiss = true});
1934}
1935
ramindani431aad42022-02-01 21:44:29 +00001936TEST_P(GraphicsComposerAidlCommandTest, GetDisplayVsyncPeriod) {
ramindanidcfe3a82021-11-29 17:00:31 +00001937 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00001938 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
1939 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001940
ramindani431aad42022-02-01 21:44:29 +00001941 for (int32_t config : configs) {
1942 int32_t expectedVsyncPeriodNanos = display.getDisplayConfig(config).vsyncPeriod;
1943
ramindanidcfe3a82021-11-29 17:00:31 +00001944 VsyncPeriodChangeConstraints constraints;
1945
1946 constraints.desiredTimeNanos = systemTime();
1947 constraints.seamlessRequired = false;
ramindani431aad42022-02-01 21:44:29 +00001948
1949 const auto& [timelineStatus, timeline] =
1950 mComposerClient->setActiveConfigWithConstraints(&display, config, constraints);
1951 EXPECT_TRUE(timelineStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001952
1953 if (timeline.refreshRequired) {
1954 sendRefreshFrame(display, &timeline);
1955 }
ramindani431aad42022-02-01 21:44:29 +00001956 waitForVsyncPeriodChange(display.getDisplayId(), timeline, constraints.desiredTimeNanos,
1957 /*odPeriodNanos*/ 0, expectedVsyncPeriodNanos);
ramindanidcfe3a82021-11-29 17:00:31 +00001958
1959 int32_t vsyncPeriodNanos;
1960 int retryCount = 100;
1961 do {
1962 std::this_thread::sleep_for(10ms);
ramindani431aad42022-02-01 21:44:29 +00001963 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanosValue] =
1964 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
1965
1966 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
1967 vsyncPeriodNanos = vsyncPeriodNanosValue;
ramindanidcfe3a82021-11-29 17:00:31 +00001968 --retryCount;
1969 } while (vsyncPeriodNanos != expectedVsyncPeriodNanos && retryCount > 0);
1970
1971 EXPECT_EQ(vsyncPeriodNanos, expectedVsyncPeriodNanos);
1972
1973 // Make sure that the vsync period stays the same if the active config is not
1974 // changed.
1975 auto timeout = 1ms;
1976 for (int i = 0; i < 10; i++) {
1977 std::this_thread::sleep_for(timeout);
1978 timeout *= 2;
1979 vsyncPeriodNanos = 0;
ramindani431aad42022-02-01 21:44:29 +00001980 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanosValue] =
1981 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
1982
1983 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
1984 vsyncPeriodNanos = vsyncPeriodNanosValue;
ramindanidcfe3a82021-11-29 17:00:31 +00001985 EXPECT_EQ(vsyncPeriodNanos, expectedVsyncPeriodNanos);
1986 }
1987 }
1988 }
1989}
1990
ramindani431aad42022-02-01 21:44:29 +00001991TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_SeamlessNotAllowed) {
ramindanidcfe3a82021-11-29 17:00:31 +00001992 VsyncPeriodChangeConstraints constraints;
ramindanidcfe3a82021-11-29 17:00:31 +00001993 constraints.seamlessRequired = true;
1994 constraints.desiredTimeNanos = systemTime();
1995
1996 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00001997 forEachTwoConfigs(display.getDisplayId(), [&](int32_t config1, int32_t config2) {
1998 int32_t configGroup1 = display.getDisplayConfig(config1).configGroup;
1999 int32_t configGroup2 = display.getDisplayConfig(config2).configGroup;
ramindanidcfe3a82021-11-29 17:00:31 +00002000 if (configGroup1 != configGroup2) {
ramindani431aad42022-02-01 21:44:29 +00002001 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002002 sendRefreshFrame(display, nullptr);
ramindani431aad42022-02-01 21:44:29 +00002003 const auto& [status, _] = mComposerClient->setActiveConfigWithConstraints(
2004 &display, config2, constraints);
2005 EXPECT_FALSE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002006 EXPECT_EQ(IComposerClient::EX_SEAMLESS_NOT_ALLOWED,
ramindani431aad42022-02-01 21:44:29 +00002007 status.getServiceSpecificError());
ramindanidcfe3a82021-11-29 17:00:31 +00002008 }
2009 });
2010 }
2011}
2012
ramindani431aad42022-02-01 21:44:29 +00002013TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_NoTimestamp) {
2014 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ std::nullopt));
Ady Abraham72c5b502021-12-10 17:23:39 -08002015}
2016
ramindani431aad42022-02-01 21:44:29 +00002017TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_0) {
2018 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ 0));
Ady Abraham72c5b502021-12-10 17:23:39 -08002019}
2020
ramindani431aad42022-02-01 21:44:29 +00002021TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_5) {
2022 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ 5));
Ady Abraham72c5b502021-12-10 17:23:39 -08002023}
2024
ramindani431aad42022-02-01 21:44:29 +00002025TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Unsupported) {
2026 const bool hasDisplayIdleTimerSupport =
2027 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002028 if (!hasDisplayIdleTimerSupport) {
ramindani431aad42022-02-01 21:44:29 +00002029 const auto& status =
2030 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0);
2031 EXPECT_FALSE(status.isOk());
2032 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, status.getServiceSpecificError());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002033 }
2034}
2035
ramindani431aad42022-02-01 21:44:29 +00002036TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_BadParameter) {
2037 const bool hasDisplayIdleTimerSupport =
2038 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002039 if (!hasDisplayIdleTimerSupport) {
2040 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2041 return;
2042 }
2043
ramindani431aad42022-02-01 21:44:29 +00002044 const auto& status =
2045 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ -1);
2046 EXPECT_FALSE(status.isOk());
2047 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, status.getServiceSpecificError());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002048}
2049
ramindani431aad42022-02-01 21:44:29 +00002050TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Disable) {
2051 const bool hasDisplayIdleTimerSupport =
2052 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002053 if (!hasDisplayIdleTimerSupport) {
2054 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2055 return;
2056 }
2057
ramindani431aad42022-02-01 21:44:29 +00002058 EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002059 std::this_thread::sleep_for(1s);
ramindani431aad42022-02-01 21:44:29 +00002060 EXPECT_EQ(0, mComposerClient->getVsyncIdleCount());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002061}
2062
ramindani431aad42022-02-01 21:44:29 +00002063TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Timeout_2) {
2064 const bool hasDisplayIdleTimerSupport =
2065 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002066 if (!hasDisplayIdleTimerSupport) {
2067 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2068 return;
2069 }
2070
ramindani431aad42022-02-01 21:44:29 +00002071 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
2072 EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002073
Leon Scroggins IIIde057582022-01-13 12:26:00 -05002074 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002075 ASSERT_NE(nullptr, buffer->handle);
2076
2077 const auto layer = createOnScreenLayer();
ramindani431aad42022-02-01 21:44:29 +00002078 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer->handle,
2079 /*acquireFence*/ -1);
2080 int32_t vsyncIdleCount = mComposerClient->getVsyncIdleCount();
Midas Chiena0b56bd2022-01-13 23:27:33 +08002081 auto earlyVsyncIdleTime = systemTime() + std::chrono::nanoseconds(2s).count();
ramindani431aad42022-02-01 21:44:29 +00002082 EXPECT_TRUE(
2083 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 2000).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002084
2085 const sp<::android::Fence> presentFence =
ramindani431aad42022-02-01 21:44:29 +00002086 presentAndGetFence(ComposerClientWriter::kNoTimestamp);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002087 presentFence->waitForever(LOG_TAG);
2088
2089 std::this_thread::sleep_for(3s);
ramindani431aad42022-02-01 21:44:29 +00002090 if (vsyncIdleCount < mComposerClient->getVsyncIdleCount()) {
2091 EXPECT_GE(mComposerClient->getVsyncIdleTime(), earlyVsyncIdleTime);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002092 }
2093
ramindani431aad42022-02-01 21:44:29 +00002094 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002095}
2096
ramindanidcfe3a82021-11-29 17:00:31 +00002097GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlCommandTest);
2098INSTANTIATE_TEST_SUITE_P(
2099 PerInstance, GraphicsComposerAidlCommandTest,
2100 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
2101 ::android::PrintInstanceNameToString);
2102
ramindanid32ae8e2021-10-01 18:48:39 +00002103GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlTest);
2104INSTANTIATE_TEST_SUITE_P(
2105 PerInstance, GraphicsComposerAidlTest,
2106 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
2107 ::android::PrintInstanceNameToString);
2108} // namespace
2109} // namespace aidl::android::hardware::graphics::composer3::vts
2110
2111int main(int argc, char** argv) {
2112 ::testing::InitGoogleTest(&argc, argv);
2113
2114 using namespace std::chrono_literals;
2115 if (!android::base::WaitForProperty("init.svc.surfaceflinger", "stopped", 10s)) {
2116 ALOGE("Failed to stop init.svc.surfaceflinger");
2117 return -1;
2118 }
ramindanibeea10e2021-12-07 21:02:49 +00002119
2120 android::ProcessState::self()->setThreadPoolMaxThreadCount(4);
2121
2122 // The binder threadpool we start will inherit sched policy and priority
2123 // of (this) creating thread. We want the binder thread pool to have
2124 // SCHED_FIFO policy and priority 1 (lowest RT priority)
2125 // Once the pool is created we reset this thread's priority back to
2126 // original.
2127 // This thread policy is based on what we do in the SurfaceFlinger while starting
2128 // the thread pool and we need to replicate that for the VTS tests.
2129 int newPriority = 0;
2130 int origPolicy = sched_getscheduler(0);
2131 struct sched_param origSchedParam;
2132
2133 int errorInPriorityModification = sched_getparam(0, &origSchedParam);
2134 if (errorInPriorityModification == 0) {
2135 int policy = SCHED_FIFO;
2136 newPriority = sched_get_priority_min(policy);
2137
2138 struct sched_param param;
2139 param.sched_priority = newPriority;
2140
2141 errorInPriorityModification = sched_setscheduler(0, policy, &param);
2142 }
2143
2144 // start the thread pool
2145 android::ProcessState::self()->startThreadPool();
2146
2147 // Reset current thread's policy and priority
2148 if (errorInPriorityModification == 0) {
2149 errorInPriorityModification = sched_setscheduler(0, origPolicy, &origSchedParam);
2150 } else {
2151 ALOGE("Failed to set VtsHalGraphicsComposer3_TargetTest binder threadpool priority to "
2152 "SCHED_FIFO");
2153 }
2154
ramindanid32ae8e2021-10-01 18:48:39 +00002155 return RUN_ALL_TESTS();
ramindania9780262021-10-01 18:48:39 +00002156}