blob: 74a8a57e224d28fbe881a41dc917f1fe16eeadf8 [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) {
498 const auto& status = mComposerClient->setBootDisplayConfig(getInvalidDisplayId(), /*config*/ 0);
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100499
ramindani431aad42022-02-01 21:44:29 +0000500 EXPECT_FALSE(status.isOk());
501 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100502}
503
ramindani431aad42022-02-01 21:44:29 +0000504TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig_BadConfig) {
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100505 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000506 int32_t constexpr kInvalidConfigId = IComposerClient::INVALID_CONFIGURATION;
507 const auto& status =
508 mComposerClient->setBootDisplayConfig(display.getDisplayId(), kInvalidConfigId);
509
510 EXPECT_FALSE(status.isOk());
511 EXPECT_EQ(IComposerClient::EX_BAD_CONFIG, status.getServiceSpecificError());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100512 }
513}
514
ramindani431aad42022-02-01 21:44:29 +0000515TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig) {
516 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
517 EXPECT_TRUE(status.isOk());
518 for (const auto& config : configs) {
519 EXPECT_TRUE(mComposerClient->setBootDisplayConfig(getPrimaryDisplayId(), config).isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100520 }
521}
522
ramindani431aad42022-02-01 21:44:29 +0000523TEST_P(GraphicsComposerAidlTest, ClearBootDisplayConfig_BadDisplay) {
524 const auto& status = mComposerClient->clearBootDisplayConfig(getInvalidDisplayId());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100525
ramindani431aad42022-02-01 21:44:29 +0000526 EXPECT_FALSE(status.isOk());
527 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100528}
529
ramindani431aad42022-02-01 21:44:29 +0000530TEST_P(GraphicsComposerAidlTest, ClearBootDisplayConfig) {
531 EXPECT_TRUE(mComposerClient->clearBootDisplayConfig(getPrimaryDisplayId()).isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100532}
533
ramindani431aad42022-02-01 21:44:29 +0000534TEST_P(GraphicsComposerAidlTest, GetPreferredBootDisplayConfig_BadDisplay) {
535 const auto& [status, _] = mComposerClient->getPreferredBootDisplayConfig(getInvalidDisplayId());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100536
ramindani431aad42022-02-01 21:44:29 +0000537 EXPECT_FALSE(status.isOk());
538 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100539}
540
ramindani431aad42022-02-01 21:44:29 +0000541TEST_P(GraphicsComposerAidlTest, GetPreferredBootDisplayConfig) {
542 const auto& [status, preferredDisplayConfig] =
543 mComposerClient->getPreferredBootDisplayConfig(getPrimaryDisplayId());
544 EXPECT_TRUE(status.isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100545
ramindani431aad42022-02-01 21:44:29 +0000546 const auto& [configStatus, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
547
548 EXPECT_TRUE(configStatus.isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100549 EXPECT_NE(configs.end(), std::find(configs.begin(), configs.end(), preferredDisplayConfig));
550}
551
ramindani431aad42022-02-01 21:44:29 +0000552TEST_P(GraphicsComposerAidlTest, SetAutoLowLatencyMode_BadDisplay) {
553 auto status = mComposerClient->setAutoLowLatencyMode(getInvalidDisplayId(), /*isEnabled*/ true);
554 EXPECT_FALSE(status.isOk());
555 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
556
557 status = mComposerClient->setAutoLowLatencyMode(getInvalidDisplayId(), /*isEnabled*/ false);
558 EXPECT_FALSE(status.isOk());
559 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
ramindani0291f112021-11-04 03:45:46 +0000560}
561
ramindani431aad42022-02-01 21:44:29 +0000562TEST_P(GraphicsComposerAidlTest, SetAutoLowLatencyMode) {
ramindani0291f112021-11-04 03:45:46 +0000563 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000564 const auto& [status, capabilities] =
565 mComposerClient->getDisplayCapabilities(display.getDisplayId());
566 ASSERT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000567
568 const bool allmSupport =
569 std::find(capabilities.begin(), capabilities.end(),
570 DisplayCapability::AUTO_LOW_LATENCY_MODE) != capabilities.end();
571
572 if (!allmSupport) {
ramindani431aad42022-02-01 21:44:29 +0000573 const auto& statusIsOn = mComposerClient->setAutoLowLatencyMode(display.getDisplayId(),
574 /*isEnabled*/ true);
575 EXPECT_FALSE(statusIsOn.isOk());
576 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, statusIsOn.getServiceSpecificError());
577 const auto& statusIsOff = mComposerClient->setAutoLowLatencyMode(display.getDisplayId(),
578 /*isEnabled*/ false);
579 EXPECT_FALSE(statusIsOff.isOk());
580 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, statusIsOff.getServiceSpecificError());
ramindani0291f112021-11-04 03:45:46 +0000581 GTEST_SUCCEED() << "Auto Low Latency Mode is not supported on display "
ramindani431aad42022-02-01 21:44:29 +0000582 << std::to_string(display.getDisplayId()) << ", skipping test";
ramindani0291f112021-11-04 03:45:46 +0000583 return;
584 }
585
ramindani431aad42022-02-01 21:44:29 +0000586 EXPECT_TRUE(mComposerClient->setAutoLowLatencyMode(display.getDisplayId(), true).isOk());
587 EXPECT_TRUE(mComposerClient->setAutoLowLatencyMode(display.getDisplayId(), false).isOk());
ramindani0291f112021-11-04 03:45:46 +0000588 }
589}
590
ramindani431aad42022-02-01 21:44:29 +0000591TEST_P(GraphicsComposerAidlTest, GetSupportedContentTypes_BadDisplay) {
592 const auto& [status, _] = mComposerClient->getSupportedContentTypes(getInvalidDisplayId());
593
594 EXPECT_FALSE(status.isOk());
595 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
ramindani0291f112021-11-04 03:45:46 +0000596}
597
ramindani431aad42022-02-01 21:44:29 +0000598TEST_P(GraphicsComposerAidlTest, GetSupportedContentTypes) {
ramindani0291f112021-11-04 03:45:46 +0000599 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000600 const auto& [status, supportedContentTypes] =
601 mComposerClient->getSupportedContentTypes(display.getDisplayId());
602 ASSERT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000603
604 const bool noneSupported =
605 std::find(supportedContentTypes.begin(), supportedContentTypes.end(),
606 ContentType::NONE) != supportedContentTypes.end();
ramindani431aad42022-02-01 21:44:29 +0000607
ramindani0291f112021-11-04 03:45:46 +0000608 EXPECT_FALSE(noneSupported);
609 }
610}
611
ramindani431aad42022-02-01 21:44:29 +0000612TEST_P(GraphicsComposerAidlTest, SetContentTypeNoneAlwaysAccepted) {
ramindani0291f112021-11-04 03:45:46 +0000613 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000614 EXPECT_TRUE(
615 mComposerClient->setContentType(display.getDisplayId(), ContentType::NONE).isOk());
ramindani0291f112021-11-04 03:45:46 +0000616 }
617}
618
ramindani431aad42022-02-01 21:44:29 +0000619TEST_P(GraphicsComposerAidlTest, SetContentType_BadDisplay) {
ramindani0291f112021-11-04 03:45:46 +0000620 constexpr ContentType types[] = {ContentType::NONE, ContentType::GRAPHICS, ContentType::PHOTO,
621 ContentType::CINEMA, ContentType::GAME};
622 for (const auto& type : types) {
ramindani431aad42022-02-01 21:44:29 +0000623 const auto& status = mComposerClient->setContentType(getInvalidDisplayId(), type);
ramindani0291f112021-11-04 03:45:46 +0000624
ramindani431aad42022-02-01 21:44:29 +0000625 EXPECT_FALSE(status.isOk());
626 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
ramindani0291f112021-11-04 03:45:46 +0000627 }
628}
629
ramindani431aad42022-02-01 21:44:29 +0000630TEST_P(GraphicsComposerAidlTest, SetGraphicsContentType) {
ramindani0291f112021-11-04 03:45:46 +0000631 Test_setContentType(ContentType::GRAPHICS, "GRAPHICS");
632}
633
ramindani431aad42022-02-01 21:44:29 +0000634TEST_P(GraphicsComposerAidlTest, SetPhotoContentType) {
ramindani0291f112021-11-04 03:45:46 +0000635 Test_setContentType(ContentType::PHOTO, "PHOTO");
636}
637
ramindani431aad42022-02-01 21:44:29 +0000638TEST_P(GraphicsComposerAidlTest, SetCinemaContentType) {
ramindani0291f112021-11-04 03:45:46 +0000639 Test_setContentType(ContentType::CINEMA, "CINEMA");
640}
641
ramindani431aad42022-02-01 21:44:29 +0000642TEST_P(GraphicsComposerAidlTest, SetGameContentType) {
ramindani0291f112021-11-04 03:45:46 +0000643 Test_setContentType(ContentType::GAME, "GAME");
644}
645
ramindanic2b8d082021-11-06 02:03:50 +0000646TEST_P(GraphicsComposerAidlTest, CreateVirtualDisplay) {
ramindani431aad42022-02-01 21:44:29 +0000647 const auto& [status, maxVirtualDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
648 EXPECT_TRUE(status.isOk());
649
ramindanic2b8d082021-11-06 02:03:50 +0000650 if (maxVirtualDisplayCount == 0) {
651 GTEST_SUCCEED() << "no virtual display support";
652 return;
653 }
654
ramindani431aad42022-02-01 21:44:29 +0000655 const auto& [virtualDisplayStatus, virtualDisplay] = mComposerClient->createVirtualDisplay(
656 /*width*/ 64, /*height*/ 64, common::PixelFormat::IMPLEMENTATION_DEFINED,
657 kBufferSlotCount);
ramindanic2b8d082021-11-06 02:03:50 +0000658
ramindani431aad42022-02-01 21:44:29 +0000659 ASSERT_TRUE(virtualDisplayStatus.isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000660 EXPECT_TRUE(mComposerClient->destroyVirtualDisplay(virtualDisplay.display).isOk());
661}
662
ramindani431aad42022-02-01 21:44:29 +0000663TEST_P(GraphicsComposerAidlTest, DestroyVirtualDisplay_BadDisplay) {
664 const auto& [status, maxDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
665 EXPECT_TRUE(status.isOk());
666
ramindani2740bac2021-11-24 22:58:32 +0000667 if (maxDisplayCount == 0) {
668 GTEST_SUCCEED() << "no virtual display support";
669 return;
670 }
ramindani2740bac2021-11-24 22:58:32 +0000671
ramindani431aad42022-02-01 21:44:29 +0000672 const auto& destroyStatus = mComposerClient->destroyVirtualDisplay(getInvalidDisplayId());
673
674 EXPECT_FALSE(destroyStatus.isOk());
675 ASSERT_EQ(IComposerClient::EX_BAD_DISPLAY, destroyStatus.getServiceSpecificError());
ramindani2740bac2021-11-24 22:58:32 +0000676}
677
678TEST_P(GraphicsComposerAidlTest, CreateLayer) {
ramindani431aad42022-02-01 21:44:29 +0000679 const auto& [status, layer] =
680 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
ramindani2740bac2021-11-24 22:58:32 +0000681
ramindani431aad42022-02-01 21:44:29 +0000682 EXPECT_TRUE(status.isOk());
683 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000684}
685
ramindani431aad42022-02-01 21:44:29 +0000686TEST_P(GraphicsComposerAidlTest, CreateLayer_BadDisplay) {
687 const auto& [status, _] = mComposerClient->createLayer(getInvalidDisplayId(), kBufferSlotCount);
ramindani2740bac2021-11-24 22:58:32 +0000688
ramindani431aad42022-02-01 21:44:29 +0000689 EXPECT_FALSE(status.isOk());
690 ASSERT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
ramindani2740bac2021-11-24 22:58:32 +0000691}
692
ramindani431aad42022-02-01 21:44:29 +0000693TEST_P(GraphicsComposerAidlTest, DestroyLayer_BadDisplay) {
694 const auto& [status, layer] =
695 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
696 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000697
ramindani431aad42022-02-01 21:44:29 +0000698 const auto& destroyStatus = mComposerClient->destroyLayer(getInvalidDisplayId(), layer);
ramindani2740bac2021-11-24 22:58:32 +0000699
ramindani431aad42022-02-01 21:44:29 +0000700 EXPECT_FALSE(destroyStatus.isOk());
701 EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, destroyStatus.getServiceSpecificError());
702 ASSERT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000703}
704
ramindani431aad42022-02-01 21:44:29 +0000705TEST_P(GraphicsComposerAidlTest, DestroyLayer_BadLayerError) {
ramindani2740bac2021-11-24 22:58:32 +0000706 // We haven't created any layers yet, so any id should be invalid
ramindani431aad42022-02-01 21:44:29 +0000707 const auto& status = mComposerClient->destroyLayer(getPrimaryDisplayId(), /*layer*/ 1);
ramindani2740bac2021-11-24 22:58:32 +0000708
ramindani431aad42022-02-01 21:44:29 +0000709 EXPECT_FALSE(status.isOk());
710 EXPECT_EQ(IComposerClient::EX_BAD_LAYER, status.getServiceSpecificError());
ramindani2740bac2021-11-24 22:58:32 +0000711}
712
ramindani431aad42022-02-01 21:44:29 +0000713TEST_P(GraphicsComposerAidlTest, GetActiveConfig_BadDisplay) {
714 const auto& [status, _] = mComposerClient->getActiveConfig(getInvalidDisplayId());
ramindani2740bac2021-11-24 22:58:32 +0000715
ramindani431aad42022-02-01 21:44:29 +0000716 EXPECT_FALSE(status.isOk());
717 ASSERT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
ramindani2740bac2021-11-24 22:58:32 +0000718}
719
720TEST_P(GraphicsComposerAidlTest, GetDisplayConfig) {
ramindani431aad42022-02-01 21:44:29 +0000721 const auto& [status, _] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
722 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000723}
724
ramindani431aad42022-02-01 21:44:29 +0000725TEST_P(GraphicsComposerAidlTest, GetDisplayConfig_BadDisplay) {
726 const auto& [status, _] = mComposerClient->getDisplayConfigs(getInvalidDisplayId());
ramindani2740bac2021-11-24 22:58:32 +0000727
ramindani431aad42022-02-01 21:44:29 +0000728 EXPECT_FALSE(status.isOk());
729 ASSERT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
ramindani2740bac2021-11-24 22:58:32 +0000730}
731
732TEST_P(GraphicsComposerAidlTest, GetDisplayName) {
ramindani431aad42022-02-01 21:44:29 +0000733 const auto& [status, _] = mComposerClient->getDisplayName(getPrimaryDisplayId());
734 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000735}
736
ramindani431aad42022-02-01 21:44:29 +0000737TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation_BadDisplay) {
738 const auto& [status, _] = mComposerClient->getDisplayPhysicalOrientation(getInvalidDisplayId());
Ady Abrahamae12e382022-01-13 18:06:21 -0800739
ramindani431aad42022-02-01 21:44:29 +0000740 EXPECT_FALSE(status.isOk());
741 ASSERT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
Ady Abrahamae12e382022-01-13 18:06:21 -0800742}
743
744TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation) {
745 const auto allowedDisplayOrientations = std::array<Transform, 4>{
746 Transform::NONE,
747 Transform::ROT_90,
748 Transform::ROT_180,
749 Transform::ROT_270,
750 };
751
ramindani431aad42022-02-01 21:44:29 +0000752 const auto& [status, displayOrientation] =
753 mComposerClient->getDisplayPhysicalOrientation(getPrimaryDisplayId());
Ady Abrahamae12e382022-01-13 18:06:21 -0800754
ramindani431aad42022-02-01 21:44:29 +0000755 EXPECT_TRUE(status.isOk());
Ady Abrahamae12e382022-01-13 18:06:21 -0800756 EXPECT_NE(std::find(allowedDisplayOrientations.begin(), allowedDisplayOrientations.end(),
757 displayOrientation),
758 allowedDisplayOrientations.end());
759}
760
ramindani2740bac2021-11-24 22:58:32 +0000761TEST_P(GraphicsComposerAidlTest, SetClientTargetSlotCount) {
ramindani431aad42022-02-01 21:44:29 +0000762 EXPECT_TRUE(mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kBufferSlotCount)
763 .isOk());
ramindani2740bac2021-11-24 22:58:32 +0000764}
765
766TEST_P(GraphicsComposerAidlTest, SetActiveConfig) {
ramindani431aad42022-02-01 21:44:29 +0000767 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
768 EXPECT_TRUE(status.isOk());
769
770 for (const auto& config : configs) {
771 auto display = getEditablePrimaryDisplay();
772 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
773 const auto& [configStatus, config1] =
774 mComposerClient->getActiveConfig(getPrimaryDisplayId());
775 EXPECT_TRUE(configStatus.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000776 EXPECT_EQ(config, config1);
777 }
778}
779
780TEST_P(GraphicsComposerAidlTest, SetActiveConfigPowerCycle) {
ramindani431aad42022-02-01 21:44:29 +0000781 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
782 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000783
ramindani431aad42022-02-01 21:44:29 +0000784 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
785 EXPECT_TRUE(status.isOk());
786
787 for (const auto& config : configs) {
788 auto display = getEditablePrimaryDisplay();
789 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
790 const auto& [config1Status, config1] =
791 mComposerClient->getActiveConfig(getPrimaryDisplayId());
792 EXPECT_TRUE(config1Status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000793 EXPECT_EQ(config, config1);
794
ramindani431aad42022-02-01 21:44:29 +0000795 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
796 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
797 const auto& [config2Status, config2] =
798 mComposerClient->getActiveConfig(getPrimaryDisplayId());
799 EXPECT_TRUE(config2Status.isOk());
800 EXPECT_EQ(config, config2);
ramindani2740bac2021-11-24 22:58:32 +0000801 }
802}
803
ramindani2740bac2021-11-24 22:58:32 +0000804TEST_P(GraphicsComposerAidlTest, SetPowerModeUnsupported) {
ramindani431aad42022-02-01 21:44:29 +0000805 const auto& [status, capabilities] =
806 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
807 ASSERT_TRUE(status.isOk());
808
Ady Abraham6679baf2021-12-08 18:28:27 -0800809 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
810 DisplayCapability::DOZE) != capabilities.end();
811 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
812 DisplayCapability::SUSPEND) != capabilities.end();
ramindani2740bac2021-11-24 22:58:32 +0000813
ramindani431aad42022-02-01 21:44:29 +0000814 if (!isDozeSupported) {
815 const auto& powerModeDozeStatus =
816 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE);
817 EXPECT_FALSE(powerModeDozeStatus.isOk());
818 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, powerModeDozeStatus.getServiceSpecificError());
819
820 const auto& powerModeDozeSuspendStatus =
821 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
822 EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
823 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED,
824 powerModeDozeSuspendStatus.getServiceSpecificError());
ramindani2740bac2021-11-24 22:58:32 +0000825 }
Ady Abraham6679baf2021-12-08 18:28:27 -0800826
827 if (!isSuspendSupported) {
ramindani431aad42022-02-01 21:44:29 +0000828 const auto& powerModeSuspendStatus =
829 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON_SUSPEND);
830 EXPECT_FALSE(powerModeSuspendStatus.isOk());
831 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED,
832 powerModeSuspendStatus.getServiceSpecificError());
Ady Abraham6679baf2021-12-08 18:28:27 -0800833
ramindani431aad42022-02-01 21:44:29 +0000834 const auto& powerModeDozeSuspendStatus =
835 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
836 EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
837 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED,
838 powerModeDozeSuspendStatus.getServiceSpecificError());
Ady Abraham6679baf2021-12-08 18:28:27 -0800839 }
ramindani2740bac2021-11-24 22:58:32 +0000840}
841
842TEST_P(GraphicsComposerAidlTest, SetVsyncEnabled) {
ramindani431aad42022-02-01 21:44:29 +0000843 mComposerClient->setVsyncAllowed(true);
ramindani2740bac2021-11-24 22:58:32 +0000844
ramindani431aad42022-02-01 21:44:29 +0000845 EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), true).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000846 usleep(60 * 1000);
ramindani431aad42022-02-01 21:44:29 +0000847 EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), false).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000848
ramindani431aad42022-02-01 21:44:29 +0000849 mComposerClient->setVsyncAllowed(false);
ramindani2740bac2021-11-24 22:58:32 +0000850}
851
ramindanic2b8d082021-11-06 02:03:50 +0000852TEST_P(GraphicsComposerAidlTest, SetPowerMode) {
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();
861
ramindanic2b8d082021-11-06 02:03:50 +0000862 std::vector<PowerMode> modes;
863 modes.push_back(PowerMode::OFF);
ramindanic2b8d082021-11-06 02:03:50 +0000864 modes.push_back(PowerMode::ON);
865
Ady Abraham6679baf2021-12-08 18:28:27 -0800866 if (isSuspendSupported) {
867 modes.push_back(PowerMode::ON_SUSPEND);
868 }
869
ramindani770d7082021-11-30 00:36:42 +0000870 if (isDozeSupported) {
871 modes.push_back(PowerMode::DOZE);
Ady Abraham6679baf2021-12-08 18:28:27 -0800872 }
873
874 if (isSuspendSupported && isDozeSupported) {
ramindani770d7082021-11-30 00:36:42 +0000875 modes.push_back(PowerMode::DOZE_SUSPEND);
876 }
877
ramindanic2b8d082021-11-06 02:03:50 +0000878 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000879 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000880 }
881}
882
883TEST_P(GraphicsComposerAidlTest, SetPowerModeVariations) {
ramindani431aad42022-02-01 21:44:29 +0000884 const auto& [status, capabilities] =
885 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
886 ASSERT_TRUE(status.isOk());
887
Ady Abraham6679baf2021-12-08 18:28:27 -0800888 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
889 DisplayCapability::DOZE) != capabilities.end();
890 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
891 DisplayCapability::SUSPEND) != capabilities.end();
892
ramindanic2b8d082021-11-06 02:03:50 +0000893 std::vector<PowerMode> modes;
894
895 modes.push_back(PowerMode::OFF);
ramindani770d7082021-11-30 00:36:42 +0000896 modes.push_back(PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +0000897 modes.push_back(PowerMode::OFF);
ramindanic2b8d082021-11-06 02:03:50 +0000898 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000899 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000900 }
ramindani770d7082021-11-30 00:36:42 +0000901 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +0000902
ramindani770d7082021-11-30 00:36:42 +0000903 modes.push_back(PowerMode::OFF);
904 modes.push_back(PowerMode::OFF);
905 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000906 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindani770d7082021-11-30 00:36:42 +0000907 }
ramindanic2b8d082021-11-06 02:03:50 +0000908 modes.clear();
909
910 modes.push_back(PowerMode::ON);
911 modes.push_back(PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +0000912 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000913 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000914 }
ramindanic2b8d082021-11-06 02:03:50 +0000915 modes.clear();
916
Ady Abraham6679baf2021-12-08 18:28:27 -0800917 if (isSuspendSupported) {
918 modes.push_back(PowerMode::ON_SUSPEND);
919 modes.push_back(PowerMode::ON_SUSPEND);
920 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000921 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
Ady Abraham6679baf2021-12-08 18:28:27 -0800922 }
923 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +0000924 }
925
ramindanic2b8d082021-11-06 02:03:50 +0000926 if (isDozeSupported) {
ramindanic2b8d082021-11-06 02:03:50 +0000927 modes.push_back(PowerMode::DOZE);
928 modes.push_back(PowerMode::DOZE);
ramindanic2b8d082021-11-06 02:03:50 +0000929 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000930 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000931 }
ramindanic2b8d082021-11-06 02:03:50 +0000932 modes.clear();
Ady Abraham6679baf2021-12-08 18:28:27 -0800933 }
ramindanic2b8d082021-11-06 02:03:50 +0000934
Ady Abraham6679baf2021-12-08 18:28:27 -0800935 if (isSuspendSupported && isDozeSupported) {
ramindanic2b8d082021-11-06 02:03:50 +0000936 modes.push_back(PowerMode::DOZE_SUSPEND);
937 modes.push_back(PowerMode::DOZE_SUSPEND);
ramindanic2b8d082021-11-06 02:03:50 +0000938 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000939 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000940 }
Ady Abraham6679baf2021-12-08 18:28:27 -0800941 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +0000942 }
943}
944
ramindani431aad42022-02-01 21:44:29 +0000945TEST_P(GraphicsComposerAidlTest, SetPowerMode_BadDisplay) {
946 const auto& status = mComposerClient->setPowerMode(getInvalidDisplayId(), PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +0000947
ramindani431aad42022-02-01 21:44:29 +0000948 EXPECT_FALSE(status.isOk());
949 ASSERT_EQ(IComposerClient::EX_BAD_DISPLAY, status.getServiceSpecificError());
ramindanic2b8d082021-11-06 02:03:50 +0000950}
951
ramindani431aad42022-02-01 21:44:29 +0000952TEST_P(GraphicsComposerAidlTest, SetPowerMode_BadParameter) {
953 const auto& status =
954 mComposerClient->setPowerMode(getPrimaryDisplayId(), static_cast<PowerMode>(-1));
ramindanic2b8d082021-11-06 02:03:50 +0000955
ramindani431aad42022-02-01 21:44:29 +0000956 EXPECT_FALSE(status.isOk());
957 ASSERT_EQ(IComposerClient::EX_BAD_PARAMETER, status.getServiceSpecificError());
ramindanic2b8d082021-11-06 02:03:50 +0000958}
959
ramindanic2b8d082021-11-06 02:03:50 +0000960TEST_P(GraphicsComposerAidlTest, GetDataspaceSaturationMatrix) {
ramindani431aad42022-02-01 21:44:29 +0000961 const auto& [status, matrix] =
962 mComposerClient->getDataspaceSaturationMatrix(common::Dataspace::SRGB_LINEAR);
963 ASSERT_TRUE(status.isOk());
964 ASSERT_EQ(16, matrix.size()); // matrix should not be empty if call succeeded.
ramindanideb059e2021-11-18 01:57:25 +0000965
ramindanic2b8d082021-11-06 02:03:50 +0000966 // the last row is known
ramindani431aad42022-02-01 21:44:29 +0000967 EXPECT_EQ(0.0f, matrix[12]);
968 EXPECT_EQ(0.0f, matrix[13]);
969 EXPECT_EQ(0.0f, matrix[14]);
970 EXPECT_EQ(1.0f, matrix[15]);
ramindanic2b8d082021-11-06 02:03:50 +0000971}
972
ramindani431aad42022-02-01 21:44:29 +0000973TEST_P(GraphicsComposerAidlTest, GetDataspaceSaturationMatrix_BadParameter) {
974 const auto& [status, matrix] =
975 mComposerClient->getDataspaceSaturationMatrix(common::Dataspace::UNKNOWN);
ramindanic2b8d082021-11-06 02:03:50 +0000976
ramindani431aad42022-02-01 21:44:29 +0000977 EXPECT_FALSE(status.isOk());
978 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, status.getServiceSpecificError());
ramindanic2b8d082021-11-06 02:03:50 +0000979}
980
ramindanidcfe3a82021-11-29 17:00:31 +0000981// Tests for Command.
982class GraphicsComposerAidlCommandTest : public GraphicsComposerAidlTest {
983 protected:
ramindanidcfe3a82021-11-29 17:00:31 +0000984 void TearDown() override {
Ady Abraham3192f3d2021-12-03 16:08:56 -0800985 const auto errors = mReader.takeErrors();
986 ASSERT_TRUE(mReader.takeErrors().empty());
ramindani431aad42022-02-01 21:44:29 +0000987 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -0800988
ramindanidcfe3a82021-11-29 17:00:31 +0000989 ASSERT_NO_FATAL_FAILURE(GraphicsComposerAidlTest::TearDown());
990 }
991
992 void execute() {
Ady Abraham3192f3d2021-12-03 16:08:56 -0800993 const auto& commands = mWriter.getPendingCommands();
994 if (commands.empty()) {
995 mWriter.reset();
996 return;
ramindanidcfe3a82021-11-29 17:00:31 +0000997 }
998
ramindani431aad42022-02-01 21:44:29 +0000999 auto [status, results] = mComposerClient->executeCommands(commands);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001000 ASSERT_TRUE(status.isOk()) << "executeCommands failed " << status.getDescription();
ramindanidcfe3a82021-11-29 17:00:31 +00001001
Ady Abraham46219f52021-12-20 09:44:31 -08001002 mReader.parse(std::move(results));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001003 mWriter.reset();
ramindanidcfe3a82021-11-29 17:00:31 +00001004 }
1005
1006 static inline auto toTimePoint(nsecs_t time) {
1007 return std::chrono::time_point<std::chrono::steady_clock>(std::chrono::nanoseconds(time));
1008 }
1009
ramindanidcfe3a82021-11-29 17:00:31 +00001010 void forEachTwoConfigs(int64_t display, std::function<void(int32_t, int32_t)> func) {
ramindani431aad42022-02-01 21:44:29 +00001011 const auto& [status, displayConfigs] = mComposerClient->getDisplayConfigs(display);
1012 ASSERT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001013 for (const int32_t config1 : displayConfigs) {
1014 for (const int32_t config2 : displayConfigs) {
1015 if (config1 != config2) {
1016 func(config1, config2);
1017 }
1018 }
1019 }
1020 }
1021
1022 void waitForVsyncPeriodChange(int64_t display, const VsyncPeriodChangeTimeline& timeline,
1023 int64_t desiredTimeNanos, int64_t oldPeriodNanos,
1024 int64_t newPeriodNanos) {
1025 const auto kChangeDeadline = toTimePoint(timeline.newVsyncAppliedTimeNanos) + 100ms;
1026 while (std::chrono::steady_clock::now() <= kChangeDeadline) {
ramindani431aad42022-02-01 21:44:29 +00001027 const auto& [status, vsyncPeriodNanos] =
1028 mComposerClient->getDisplayVsyncPeriod(display);
1029 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001030 if (systemTime() <= desiredTimeNanos) {
1031 EXPECT_EQ(vsyncPeriodNanos, oldPeriodNanos);
1032 } else if (vsyncPeriodNanos == newPeriodNanos) {
1033 break;
1034 }
1035 std::this_thread::sleep_for(std::chrono::nanoseconds(oldPeriodNanos));
1036 }
1037 }
1038
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001039 sp<GraphicBuffer> allocate(::android::PixelFormat pixelFormat) {
ramindanidcfe3a82021-11-29 17:00:31 +00001040 return sp<GraphicBuffer>::make(
ramindani431aad42022-02-01 21:44:29 +00001041 static_cast<uint32_t>(getPrimaryDisplay().getDisplayWidth()),
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001042 static_cast<uint32_t>(getPrimaryDisplay().getDisplayHeight()), pixelFormat,
ramindani431aad42022-02-01 21:44:29 +00001043 /*layerCount*/ 1U,
ramindanidcfe3a82021-11-29 17:00:31 +00001044 (static_cast<uint64_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
1045 static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
1046 static_cast<uint64_t>(common::BufferUsage::COMPOSER_OVERLAY)),
1047 "VtsHalGraphicsComposer3_TargetTest");
1048 }
1049
1050 void sendRefreshFrame(const VtsDisplay& display, const VsyncPeriodChangeTimeline* timeline) {
1051 if (timeline != nullptr) {
1052 // Refresh time should be before newVsyncAppliedTimeNanos
1053 EXPECT_LT(timeline->refreshTimeNanos, timeline->newVsyncAppliedTimeNanos);
1054
1055 std::this_thread::sleep_until(toTimePoint(timeline->refreshTimeNanos));
1056 }
1057
ramindani431aad42022-02-01 21:44:29 +00001058 EXPECT_TRUE(mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::ON).isOk());
1059 EXPECT_TRUE(mComposerClient
1060 ->setColorMode(display.getDisplayId(), ColorMode::NATIVE,
1061 RenderIntent::COLORIMETRIC)
1062 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001063
ramindani431aad42022-02-01 21:44:29 +00001064 const auto& [status, layer] =
1065 mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount);
1066 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001067 {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001068 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindanidcfe3a82021-11-29 17:00:31 +00001069 ASSERT_NE(nullptr, buffer);
1070 ASSERT_EQ(::android::OK, buffer->initCheck());
1071 ASSERT_NE(nullptr, buffer->handle);
1072
ramindani431aad42022-02-01 21:44:29 +00001073 configureLayer(display, layer, Composition::DEVICE, display.getFrameRect(),
1074 display.getCrop());
1075 mWriter.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer->handle,
1076 /*acquireFence*/ -1);
1077 mWriter.setLayerDataspace(display.getDisplayId(), layer, common::Dataspace::UNKNOWN);
ramindanidcfe3a82021-11-29 17:00:31 +00001078
ramindani431aad42022-02-01 21:44:29 +00001079 mWriter.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001080 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001081 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001082
ramindani431aad42022-02-01 21:44:29 +00001083 mWriter.presentDisplay(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001084 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001085 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001086 }
1087
1088 {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001089 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindanidcfe3a82021-11-29 17:00:31 +00001090 ASSERT_NE(nullptr, buffer->handle);
1091
ramindani431aad42022-02-01 21:44:29 +00001092 mWriter.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer->handle,
1093 /*acquireFence*/ -1);
1094 mWriter.setLayerSurfaceDamage(display.getDisplayId(), layer,
Ady Abraham3192f3d2021-12-03 16:08:56 -08001095 std::vector<Rect>(1, {0, 0, 10, 10}));
ramindani431aad42022-02-01 21:44:29 +00001096 mWriter.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001097 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001098 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001099
ramindani431aad42022-02-01 21:44:29 +00001100 mWriter.presentDisplay(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001101 execute();
1102 }
1103
ramindani431aad42022-02-01 21:44:29 +00001104 EXPECT_TRUE(mComposerClient->destroyLayer(display.getDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001105 }
1106
Ady Abraham72c5b502021-12-10 17:23:39 -08001107 sp<::android::Fence> presentAndGetFence(
1108 std::optional<ClockMonotonicTimestamp> expectedPresentTime) {
ramindani431aad42022-02-01 21:44:29 +00001109 mWriter.validateDisplay(getPrimaryDisplayId(), expectedPresentTime);
Ady Abraham72c5b502021-12-10 17:23:39 -08001110 execute();
1111 EXPECT_TRUE(mReader.takeErrors().empty());
1112
ramindani431aad42022-02-01 21:44:29 +00001113 mWriter.presentDisplay(getPrimaryDisplayId());
Ady Abraham72c5b502021-12-10 17:23:39 -08001114 execute();
1115 EXPECT_TRUE(mReader.takeErrors().empty());
1116
ramindani431aad42022-02-01 21:44:29 +00001117 auto presentFence = mReader.takePresentFence(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -08001118 // take ownership
1119 const int fenceOwner = presentFence.get();
1120 *presentFence.getR() = -1;
1121 EXPECT_NE(-1, fenceOwner);
1122 return sp<::android::Fence>::make(fenceOwner);
Ady Abraham72c5b502021-12-10 17:23:39 -08001123 }
1124
1125 int32_t getVsyncPeriod() {
ramindani431aad42022-02-01 21:44:29 +00001126 const auto& [status, activeConfig] =
1127 mComposerClient->getActiveConfig(getPrimaryDisplayId());
1128 EXPECT_TRUE(status.isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001129
ramindani431aad42022-02-01 21:44:29 +00001130 const auto& [vsyncPeriodStatus, vsyncPeriod] = mComposerClient->getDisplayAttribute(
1131 getPrimaryDisplayId(), activeConfig, DisplayAttribute::VSYNC_PERIOD);
1132 EXPECT_TRUE(vsyncPeriodStatus.isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001133 return vsyncPeriod;
1134 }
1135
1136 int64_t createOnScreenLayer() {
ramindani431aad42022-02-01 21:44:29 +00001137 const auto& [status, layer] =
1138 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1139 EXPECT_TRUE(status.isOk());
1140 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1141 getPrimaryDisplay().getDisplayHeight()};
1142 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1143 (float)getPrimaryDisplay().getDisplayHeight()};
1144 configureLayer(getPrimaryDisplay(), layer, Composition::DEVICE, displayFrame, cropRect);
1145 mWriter.setLayerDataspace(getPrimaryDisplayId(), layer, common::Dataspace::UNKNOWN);
Ady Abraham72c5b502021-12-10 17:23:39 -08001146 return layer;
1147 }
1148
Midas Chiena0b56bd2022-01-13 23:27:33 +08001149 bool hasDisplayCapability(int64_t display, DisplayCapability cap) {
ramindani431aad42022-02-01 21:44:29 +00001150 const auto& [status, capabilities] = mComposerClient->getDisplayCapabilities(display);
1151 EXPECT_TRUE(status.isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08001152
1153 return std::find(capabilities.begin(), capabilities.end(), cap) != capabilities.end();
1154 }
1155
ramindanidcfe3a82021-11-29 17:00:31 +00001156 void Test_setActiveConfigWithConstraints(const TestParameters& params) {
1157 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00001158 forEachTwoConfigs(display.getDisplayId(), [&](int32_t config1, int32_t config2) {
1159 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001160 sendRefreshFrame(display, nullptr);
1161
ramindani431aad42022-02-01 21:44:29 +00001162 const auto displayConfigGroup1 = display.getDisplayConfig(config1);
1163 int32_t vsyncPeriod1 = displayConfigGroup1.vsyncPeriod;
1164 int32_t configGroup1 = displayConfigGroup1.configGroup;
1165
1166 const auto displayConfigGroup2 = display.getDisplayConfig(config2);
1167 int32_t vsyncPeriod2 = displayConfigGroup2.vsyncPeriod;
1168 int32_t configGroup2 = displayConfigGroup2.configGroup;
ramindanidcfe3a82021-11-29 17:00:31 +00001169
1170 if (vsyncPeriod1 == vsyncPeriod2) {
1171 return; // continue
1172 }
1173
1174 // We don't allow delayed change when changing config groups
1175 if (params.delayForChange > 0 && configGroup1 != configGroup2) {
1176 return; // continue
1177 }
1178
ramindanidcfe3a82021-11-29 17:00:31 +00001179 VsyncPeriodChangeConstraints constraints = {
1180 .desiredTimeNanos = systemTime() + params.delayForChange,
1181 .seamlessRequired = false};
ramindani431aad42022-02-01 21:44:29 +00001182 const auto& [status, timeline] = mComposerClient->setActiveConfigWithConstraints(
1183 &display, config2, constraints);
1184 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001185
1186 EXPECT_TRUE(timeline.newVsyncAppliedTimeNanos >= constraints.desiredTimeNanos);
1187 // Refresh rate should change within a reasonable time
1188 constexpr std::chrono::nanoseconds kReasonableTimeForChange = 1s; // 1 second
1189 EXPECT_TRUE(timeline.newVsyncAppliedTimeNanos - constraints.desiredTimeNanos <=
1190 kReasonableTimeForChange.count());
1191
1192 if (timeline.refreshRequired) {
1193 if (params.refreshMiss) {
1194 // Miss the refresh frame on purpose to make sure the implementation sends a
1195 // callback
1196 std::this_thread::sleep_until(toTimePoint(timeline.refreshTimeNanos) +
1197 100ms);
1198 }
1199 sendRefreshFrame(display, &timeline);
1200 }
ramindani431aad42022-02-01 21:44:29 +00001201 waitForVsyncPeriodChange(display.getDisplayId(), timeline,
1202 constraints.desiredTimeNanos, vsyncPeriod1, vsyncPeriod2);
ramindanidcfe3a82021-11-29 17:00:31 +00001203
1204 // At this point the refresh rate should have changed already, however in rare
1205 // cases the implementation might have missed the deadline. In this case a new
1206 // timeline should have been provided.
ramindani431aad42022-02-01 21:44:29 +00001207 auto newTimeline = mComposerClient->takeLastVsyncPeriodChangeTimeline();
ramindanidcfe3a82021-11-29 17:00:31 +00001208 if (timeline.refreshRequired && params.refreshMiss) {
1209 EXPECT_TRUE(newTimeline.has_value());
1210 }
1211
1212 if (newTimeline.has_value()) {
1213 if (newTimeline->refreshRequired) {
1214 sendRefreshFrame(display, &newTimeline.value());
1215 }
ramindani431aad42022-02-01 21:44:29 +00001216 waitForVsyncPeriodChange(display.getDisplayId(), newTimeline.value(),
ramindanidcfe3a82021-11-29 17:00:31 +00001217 constraints.desiredTimeNanos, vsyncPeriod1,
1218 vsyncPeriod2);
1219 }
1220
ramindani431aad42022-02-01 21:44:29 +00001221 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanos] =
1222 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
1223 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001224 EXPECT_EQ(vsyncPeriodNanos, vsyncPeriod2);
1225 });
1226 }
1227 }
1228
Ady Abraham72c5b502021-12-10 17:23:39 -08001229 void Test_expectedPresentTime(std::optional<int> framesDelay) {
Jason Macnak325e8232022-01-24 14:48:55 -08001230 if (hasCapability(Capability::PRESENT_FENCE_IS_NOT_RELIABLE)) {
1231 GTEST_SUCCEED() << "Device has unreliable present fences capability, skipping";
1232 return;
1233 }
1234
ramindani431aad42022-02-01 21:44:29 +00001235 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001236
1237 const auto vsyncPeriod = getVsyncPeriod();
1238
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001239 const auto buffer1 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1240 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
Ady Abraham72c5b502021-12-10 17:23:39 -08001241 ASSERT_NE(nullptr, buffer1);
1242 ASSERT_NE(nullptr, buffer2);
1243
1244 const auto layer = createOnScreenLayer();
ramindani431aad42022-02-01 21:44:29 +00001245 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer1->handle,
1246 /*acquireFence*/ -1);
Ady Abraham72c5b502021-12-10 17:23:39 -08001247 const sp<::android::Fence> presentFence1 =
1248 presentAndGetFence(ComposerClientWriter::kNoTimestamp);
1249 presentFence1->waitForever(LOG_TAG);
1250
1251 auto expectedPresentTime = presentFence1->getSignalTime() + vsyncPeriod;
1252 if (framesDelay.has_value()) {
1253 expectedPresentTime += *framesDelay * vsyncPeriod;
1254 }
1255
ramindani431aad42022-02-01 21:44:29 +00001256 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer2->handle,
1257 /*acquireFence*/ -1);
Ady Abraham72c5b502021-12-10 17:23:39 -08001258 const auto setExpectedPresentTime = [&]() -> std::optional<ClockMonotonicTimestamp> {
1259 if (!framesDelay.has_value()) {
1260 return ComposerClientWriter::kNoTimestamp;
1261 } else if (*framesDelay == 0) {
1262 return ClockMonotonicTimestamp{0};
1263 }
1264 return ClockMonotonicTimestamp{expectedPresentTime};
1265 }();
1266
1267 const sp<::android::Fence> presentFence2 = presentAndGetFence(setExpectedPresentTime);
1268 presentFence2->waitForever(LOG_TAG);
1269
1270 const auto actualPresentTime = presentFence2->getSignalTime();
Ady Abrahamdf084f32022-01-10 14:10:23 -08001271 EXPECT_GE(actualPresentTime, expectedPresentTime - vsyncPeriod / 2);
Ady Abraham72c5b502021-12-10 17:23:39 -08001272
ramindani431aad42022-02-01 21:44:29 +00001273 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001274 }
1275
ramindani431aad42022-02-01 21:44:29 +00001276 void configureLayer(const VtsDisplay& display, int64_t layer, Composition composition,
1277 const Rect& displayFrame, const FRect& cropRect) {
1278 mWriter.setLayerCompositionType(display.getDisplayId(), layer, composition);
1279 mWriter.setLayerDisplayFrame(display.getDisplayId(), layer, displayFrame);
1280 mWriter.setLayerPlaneAlpha(display.getDisplayId(), layer, /*alpha*/ 1);
1281 mWriter.setLayerSourceCrop(display.getDisplayId(), layer, cropRect);
1282 mWriter.setLayerTransform(display.getDisplayId(), layer, static_cast<Transform>(0));
1283 mWriter.setLayerVisibleRegion(display.getDisplayId(), layer,
1284 std::vector<Rect>(1, displayFrame));
1285 mWriter.setLayerZOrder(display.getDisplayId(), layer, /*z*/ 10);
1286 mWriter.setLayerBlendMode(display.getDisplayId(), layer, BlendMode::NONE);
1287 mWriter.setLayerSurfaceDamage(display.getDisplayId(), layer,
1288 std::vector<Rect>(1, displayFrame));
1289 }
ramindanidcfe3a82021-11-29 17:00:31 +00001290 // clang-format off
1291 const std::array<float, 16> kIdentity = {{
1292 1.0f, 0.0f, 0.0f, 0.0f,
1293 0.0f, 1.0f, 0.0f, 0.0f,
1294 0.0f, 0.0f, 1.0f, 0.0f,
1295 0.0f, 0.0f, 0.0f, 1.0f,
1296 }};
1297 // clang-format on
1298
Ady Abraham91c9d1a2021-12-15 18:14:45 -08001299 ComposerClientWriter mWriter;
1300 ComposerClientReader mReader;
ramindanidcfe3a82021-11-29 17:00:31 +00001301};
1302
ramindani431aad42022-02-01 21:44:29 +00001303TEST_P(GraphicsComposerAidlCommandTest, SetColorTransform) {
1304 mWriter.setColorTransform(getPrimaryDisplayId(), kIdentity.data());
ramindanidcfe3a82021-11-29 17:00:31 +00001305 execute();
1306}
1307
1308TEST_P(GraphicsComposerAidlCommandTest, SetLayerColorTransform) {
ramindani431aad42022-02-01 21:44:29 +00001309 const auto& [status, layer] =
1310 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1311 EXPECT_TRUE(status.isOk());
1312 mWriter.setLayerColorTransform(getPrimaryDisplayId(), layer, kIdentity.data());
ramindanidcfe3a82021-11-29 17:00:31 +00001313 execute();
1314
Ady Abraham3192f3d2021-12-03 16:08:56 -08001315 const auto errors = mReader.takeErrors();
Jason Macnak062bc9a2022-01-20 15:00:09 -08001316 if (errors.size() == 1 && errors[0].errorCode == IComposerClient::EX_UNSUPPORTED) {
ramindanidcfe3a82021-11-29 17:00:31 +00001317 GTEST_SUCCEED() << "setLayerColorTransform is not supported";
1318 return;
1319 }
1320}
1321
Alec Mouri60564e12021-12-09 18:48:20 -08001322TEST_P(GraphicsComposerAidlCommandTest, SetDisplayBrightness) {
ramindani431aad42022-02-01 21:44:29 +00001323 const auto& [status, capabilities] =
1324 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
1325 ASSERT_TRUE(status.isOk());
Alec Mouri60564e12021-12-09 18:48:20 -08001326 bool brightnessSupport = std::find(capabilities.begin(), capabilities.end(),
1327 DisplayCapability::BRIGHTNESS) != capabilities.end();
1328 if (!brightnessSupport) {
ramindani431aad42022-02-01 21:44:29 +00001329 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.5f);
Alec Mouri60564e12021-12-09 18:48:20 -08001330 execute();
1331 const auto errors = mReader.takeErrors();
1332 EXPECT_EQ(1, errors.size());
Jason Macnak062bc9a2022-01-20 15:00:09 -08001333 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, errors[0].errorCode);
Alec Mouri60564e12021-12-09 18:48:20 -08001334 GTEST_SUCCEED() << "SetDisplayBrightness is not supported";
1335 return;
1336 }
1337
ramindani431aad42022-02-01 21:44:29 +00001338 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.0f);
Alec Mouri60564e12021-12-09 18:48:20 -08001339 execute();
1340 EXPECT_TRUE(mReader.takeErrors().empty());
1341
ramindani431aad42022-02-01 21:44:29 +00001342 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.5f);
Alec Mouri60564e12021-12-09 18:48:20 -08001343 execute();
1344 EXPECT_TRUE(mReader.takeErrors().empty());
1345
ramindani431aad42022-02-01 21:44:29 +00001346 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 1.0f);
Alec Mouri60564e12021-12-09 18:48:20 -08001347 execute();
1348 EXPECT_TRUE(mReader.takeErrors().empty());
1349
ramindani431aad42022-02-01 21:44:29 +00001350 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ -1.0f);
Alec Mouri60564e12021-12-09 18:48:20 -08001351 execute();
1352 EXPECT_TRUE(mReader.takeErrors().empty());
1353
ramindani431aad42022-02-01 21:44:29 +00001354 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 2.0f);
Alec Mouri60564e12021-12-09 18:48:20 -08001355 execute();
1356 {
1357 const auto errors = mReader.takeErrors();
ramindanib3bdf052022-01-12 18:27:05 +00001358 ASSERT_EQ(1, errors.size());
Alec Mouri60564e12021-12-09 18:48:20 -08001359 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1360 }
1361
ramindani431aad42022-02-01 21:44:29 +00001362 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ -2.0f);
Alec Mouri60564e12021-12-09 18:48:20 -08001363 execute();
1364 {
1365 const auto errors = mReader.takeErrors();
ramindanib3bdf052022-01-12 18:27:05 +00001366 ASSERT_EQ(1, errors.size());
Alec Mouri60564e12021-12-09 18:48:20 -08001367 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1368 }
1369}
1370
ramindani431aad42022-02-01 21:44:29 +00001371TEST_P(GraphicsComposerAidlCommandTest, SetClientTarget) {
1372 EXPECT_TRUE(mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kBufferSlotCount)
1373 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001374
ramindani431aad42022-02-01 21:44:29 +00001375 mWriter.setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, nullptr, /*acquireFence*/ -1,
1376 Dataspace::UNKNOWN, std::vector<Rect>());
ramindanidcfe3a82021-11-29 17:00:31 +00001377
1378 execute();
1379}
1380
ramindani431aad42022-02-01 21:44:29 +00001381TEST_P(GraphicsComposerAidlCommandTest, SetOutputBuffer) {
1382 const auto& [status, virtualDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
1383 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001384 if (virtualDisplayCount == 0) {
1385 GTEST_SUCCEED() << "no virtual display support";
1386 return;
1387 }
1388
ramindani431aad42022-02-01 21:44:29 +00001389 const auto& [displayStatus, display] = mComposerClient->createVirtualDisplay(
1390 /*width*/ 64, /*height*/ 64, common::PixelFormat::IMPLEMENTATION_DEFINED,
1391 kBufferSlotCount);
1392 EXPECT_TRUE(displayStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001393
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001394 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001395 const auto handle = buffer->handle;
ramindani431aad42022-02-01 21:44:29 +00001396 mWriter.setOutputBuffer(display.display, /*slot*/ 0, handle, /*releaseFence*/ -1);
ramindanidcfe3a82021-11-29 17:00:31 +00001397 execute();
1398}
1399
ramindani431aad42022-02-01 21:44:29 +00001400TEST_P(GraphicsComposerAidlCommandTest, ValidDisplay) {
1401 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001402 execute();
1403}
1404
ramindani431aad42022-02-01 21:44:29 +00001405TEST_P(GraphicsComposerAidlCommandTest, AcceptDisplayChanges) {
1406 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1407 mWriter.acceptDisplayChanges(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001408 execute();
1409}
1410
ramindani431aad42022-02-01 21:44:29 +00001411TEST_P(GraphicsComposerAidlCommandTest, PresentDisplay) {
1412 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1413 mWriter.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001414 execute();
1415}
1416
1417/**
1418 * Test IComposerClient::Command::PRESENT_DISPLAY
1419 *
1420 * Test that IComposerClient::Command::PRESENT_DISPLAY works without
1421 * additional call to validateDisplay when only the layer buffer handle and
1422 * surface damage have been set
1423 */
ramindani431aad42022-02-01 21:44:29 +00001424TEST_P(GraphicsComposerAidlCommandTest, PresentDisplayNoLayerStateChanges) {
Jason Macnak325e8232022-01-24 14:48:55 -08001425 if (!hasCapability(Capability::SKIP_VALIDATE)) {
ramindanidcfe3a82021-11-29 17:00:31 +00001426 GTEST_SUCCEED() << "Device does not have skip validate capability, skipping";
1427 return;
1428 }
ramindani431aad42022-02-01 21:44:29 +00001429 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001430
ramindani431aad42022-02-01 21:44:29 +00001431 const auto& [renderIntentsStatus, renderIntents] =
1432 mComposerClient->getRenderIntents(getPrimaryDisplayId(), ColorMode::NATIVE);
1433 EXPECT_TRUE(renderIntentsStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001434 for (auto intent : renderIntents) {
ramindani431aad42022-02-01 21:44:29 +00001435 EXPECT_TRUE(mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE, intent)
1436 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001437
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001438 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001439 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001440 ASSERT_NE(nullptr, handle);
1441
ramindani431aad42022-02-01 21:44:29 +00001442 const auto& [layerStatus, layer] =
1443 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1444 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001445
ramindani431aad42022-02-01 21:44:29 +00001446 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1447 getPrimaryDisplay().getDisplayHeight()};
1448 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1449 (float)getPrimaryDisplay().getDisplayHeight()};
1450 configureLayer(getPrimaryDisplay(), layer, Composition::CURSOR, displayFrame, cropRect);
1451 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle,
1452 /*acquireFence*/ -1);
1453 mWriter.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1454 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001455 execute();
ramindani431aad42022-02-01 21:44:29 +00001456 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanidcfe3a82021-11-29 17:00:31 +00001457 GTEST_SUCCEED() << "Composition change requested, skipping test";
1458 return;
1459 }
1460
Ady Abraham3192f3d2021-12-03 16:08:56 -08001461 ASSERT_TRUE(mReader.takeErrors().empty());
ramindani431aad42022-02-01 21:44:29 +00001462 mWriter.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001463 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001464 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001465
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001466 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001467 const auto handle2 = buffer2->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001468 ASSERT_NE(nullptr, handle2);
ramindani431aad42022-02-01 21:44:29 +00001469 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle2,
1470 /*acquireFence*/ -1);
1471 mWriter.setLayerSurfaceDamage(getPrimaryDisplayId(), layer,
1472 std::vector<Rect>(1, {0, 0, 10, 10}));
1473 mWriter.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001474 execute();
1475 }
1476}
1477
ramindani431aad42022-02-01 21:44:29 +00001478TEST_P(GraphicsComposerAidlCommandTest, SetLayerCursorPosition) {
1479 const auto& [layerStatus, layer] =
1480 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1481 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001482
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001483 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001484 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001485 ASSERT_NE(nullptr, handle);
ramindanidcfe3a82021-11-29 17:00:31 +00001486
ramindani431aad42022-02-01 21:44:29 +00001487 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
1488
1489 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1490 getPrimaryDisplay().getDisplayHeight()};
1491 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1492 (float)getPrimaryDisplay().getDisplayHeight()};
1493 configureLayer(getPrimaryDisplay(), layer, Composition::CURSOR, displayFrame, cropRect);
1494 mWriter.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1495 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001496
1497 execute();
Ady Abraham46219f52021-12-20 09:44:31 -08001498
ramindani431aad42022-02-01 21:44:29 +00001499 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanidcfe3a82021-11-29 17:00:31 +00001500 GTEST_SUCCEED() << "Composition change requested, skipping test";
1501 return;
1502 }
ramindani431aad42022-02-01 21:44:29 +00001503 mWriter.presentDisplay(getPrimaryDisplayId());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001504 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001505
ramindani431aad42022-02-01 21:44:29 +00001506 mWriter.setLayerCursorPosition(getPrimaryDisplayId(), layer, /*x*/ 1, /*y*/ 1);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001507 execute();
1508
ramindani431aad42022-02-01 21:44:29 +00001509 mWriter.setLayerCursorPosition(getPrimaryDisplayId(), layer, /*x*/ 0, /*y*/ 0);
1510 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1511 mWriter.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001512 execute();
1513}
1514
ramindani431aad42022-02-01 21:44:29 +00001515TEST_P(GraphicsComposerAidlCommandTest, SetLayerBuffer) {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001516 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001517 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001518 ASSERT_NE(nullptr, handle);
1519
ramindani431aad42022-02-01 21:44:29 +00001520 const auto& [layerStatus, layer] =
1521 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1522 EXPECT_TRUE(layerStatus.isOk());
1523 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
ramindanidcfe3a82021-11-29 17:00:31 +00001524 execute();
1525}
1526
ramindani431aad42022-02-01 21:44:29 +00001527TEST_P(GraphicsComposerAidlCommandTest, SetLayerSurfaceDamage) {
1528 const auto& [layerStatus, layer] =
1529 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1530 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001531
1532 Rect empty{0, 0, 0, 0};
1533 Rect unit{0, 0, 1, 1};
1534
ramindani431aad42022-02-01 21:44:29 +00001535 mWriter.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
ramindanidcfe3a82021-11-29 17:00:31 +00001536 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001537 ASSERT_TRUE(mReader.takeErrors().empty());
1538
ramindani431aad42022-02-01 21:44:29 +00001539 mWriter.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001540 execute();
1541 ASSERT_TRUE(mReader.takeErrors().empty());
1542
ramindani431aad42022-02-01 21:44:29 +00001543 mWriter.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001544 execute();
1545 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001546}
1547
ramindani431aad42022-02-01 21:44:29 +00001548TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlockingRegion) {
1549 const auto& [layerStatus, layer] =
1550 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1551 EXPECT_TRUE(layerStatus.isOk());
Leon Scroggins III03318152022-01-13 12:24:19 -05001552
1553 Rect empty{0, 0, 0, 0};
1554 Rect unit{0, 0, 1, 1};
1555
ramindani431aad42022-02-01 21:44:29 +00001556 mWriter.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
Leon Scroggins III03318152022-01-13 12:24:19 -05001557 execute();
1558 ASSERT_TRUE(mReader.takeErrors().empty());
1559
ramindani431aad42022-02-01 21:44:29 +00001560 mWriter.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Leon Scroggins III03318152022-01-13 12:24:19 -05001561 execute();
1562 ASSERT_TRUE(mReader.takeErrors().empty());
1563
ramindani431aad42022-02-01 21:44:29 +00001564 mWriter.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
Leon Scroggins III03318152022-01-13 12:24:19 -05001565 execute();
1566 ASSERT_TRUE(mReader.takeErrors().empty());
1567}
1568
ramindani431aad42022-02-01 21:44:29 +00001569TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlendMode) {
1570 const auto& [layerStatus, layer] =
1571 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1572 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001573
ramindani431aad42022-02-01 21:44:29 +00001574 mWriter.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::NONE);
ramindanidcfe3a82021-11-29 17:00:31 +00001575 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001576 ASSERT_TRUE(mReader.takeErrors().empty());
1577
ramindani431aad42022-02-01 21:44:29 +00001578 mWriter.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::PREMULTIPLIED);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001579 execute();
1580 ASSERT_TRUE(mReader.takeErrors().empty());
1581
ramindani431aad42022-02-01 21:44:29 +00001582 mWriter.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::COVERAGE);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001583 execute();
1584 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001585}
1586
ramindani431aad42022-02-01 21:44:29 +00001587TEST_P(GraphicsComposerAidlCommandTest, SetLayerColor) {
1588 const auto& [layerStatus, layer] =
1589 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1590 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001591
ramindani431aad42022-02-01 21:44:29 +00001592 mWriter.setLayerColor(getPrimaryDisplayId(), layer, Color{1.0f, 1.0f, 1.0f, 1.0f});
ramindanidcfe3a82021-11-29 17:00:31 +00001593 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001594 ASSERT_TRUE(mReader.takeErrors().empty());
1595
ramindani431aad42022-02-01 21:44:29 +00001596 mWriter.setLayerColor(getPrimaryDisplayId(), layer, Color{0.0f, 0.0f, 0.0f, 0.0f});
Ady Abraham3192f3d2021-12-03 16:08:56 -08001597 execute();
1598 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001599}
1600
ramindani431aad42022-02-01 21:44:29 +00001601TEST_P(GraphicsComposerAidlCommandTest, SetLayerCompositionType) {
1602 const auto& [layerStatus, layer] =
1603 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1604 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001605
ramindani431aad42022-02-01 21:44:29 +00001606 mWriter.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CLIENT);
ramindanidcfe3a82021-11-29 17:00:31 +00001607 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001608 ASSERT_TRUE(mReader.takeErrors().empty());
1609
ramindani431aad42022-02-01 21:44:29 +00001610 mWriter.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::DEVICE);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001611 execute();
1612 ASSERT_TRUE(mReader.takeErrors().empty());
1613
ramindani431aad42022-02-01 21:44:29 +00001614 mWriter.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::SOLID_COLOR);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001615 execute();
1616 ASSERT_TRUE(mReader.takeErrors().empty());
1617
ramindani431aad42022-02-01 21:44:29 +00001618 mWriter.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CURSOR);
1619 execute();
1620}
1621
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001622TEST_P(GraphicsComposerAidlCommandTest, DisplayDecoration) {
1623 for (VtsDisplay& display : mDisplays) {
1624 const auto [layerStatus, layer] =
1625 mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount);
1626 EXPECT_TRUE(layerStatus.isOk());
1627
1628 const auto [error, support] =
1629 mComposerClient->getDisplayDecorationSupport(display.getDisplayId());
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001630
Leon Scroggins III91590872022-02-23 09:51:21 -05001631 const auto format = (error.isOk() && support) ? support->format
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001632 : aidl::android::hardware::graphics::common::PixelFormat::RGBA_8888;
1633 const auto decorBuffer = allocate(static_cast<::android::PixelFormat>(format));
1634 ASSERT_NE(nullptr, decorBuffer);
1635 if (::android::OK != decorBuffer->initCheck()) {
1636 if (support) {
1637 FAIL() << "Device advertised display decoration support with format "
1638 << aidl::android::hardware::graphics::common::toString(format)
1639 << " but failed to allocate it!";
1640 } else {
1641 FAIL() << "Device advertised NO display decoration support, but it should "
1642 << "still be able to allocate "
1643 << aidl::android::hardware::graphics::common::toString(format);
1644 }
1645 }
1646
1647 mWriter.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, decorBuffer->handle,
1648 /*acquireFence*/ -1);
1649 mWriter.setLayerCompositionType(display.getDisplayId(), layer,
1650 Composition::DISPLAY_DECORATION);
1651 mWriter.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
1652 execute();
1653 if (support) {
1654 ASSERT_TRUE(mReader.takeErrors().empty());
1655 } else {
1656 const auto errors = mReader.takeErrors();
1657 ASSERT_EQ(1, errors.size());
1658 EXPECT_EQ(EX_UNSUPPORTED_OPERATION, errors[0].errorCode);
1659
1660 const auto changedTypes = mReader.takeChangedCompositionTypes(display.getDisplayId());
1661 ASSERT_EQ(1u, changedTypes.size());
1662 const auto changedType = changedTypes[0].composition;
1663 EXPECT_TRUE(changedType == Composition::DEVICE || changedType == Composition::CLIENT);
1664 }
1665 }
1666}
1667
ramindani431aad42022-02-01 21:44:29 +00001668TEST_P(GraphicsComposerAidlCommandTest, SetLayerDataspace) {
1669 const auto& [layerStatus, layer] =
1670 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1671 EXPECT_TRUE(layerStatus.isOk());
1672
1673 mWriter.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1674 execute();
1675}
1676
1677TEST_P(GraphicsComposerAidlCommandTest, SetLayerDisplayFrame) {
1678 const auto& [layerStatus, layer] =
1679 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1680 EXPECT_TRUE(layerStatus.isOk());
1681
1682 mWriter.setLayerDisplayFrame(getPrimaryDisplayId(), layer, Rect{0, 0, 1, 1});
1683 execute();
1684}
1685
1686TEST_P(GraphicsComposerAidlCommandTest, SetLayerPlaneAlpha) {
1687 const auto& [layerStatus, layer] =
1688 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1689 EXPECT_TRUE(layerStatus.isOk());
1690
1691 mWriter.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 0.0f);
1692 execute();
1693 ASSERT_TRUE(mReader.takeErrors().empty());
1694
1695 mWriter.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 1.0f);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001696 execute();
1697 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001698}
1699
ramindani431aad42022-02-01 21:44:29 +00001700TEST_P(GraphicsComposerAidlCommandTest, SetLayerSidebandStream) {
Jason Macnak325e8232022-01-24 14:48:55 -08001701 if (!hasCapability(Capability::SIDEBAND_STREAM)) {
ramindanidcfe3a82021-11-29 17:00:31 +00001702 GTEST_SUCCEED() << "no sideband stream support";
1703 return;
1704 }
1705
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001706 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001707 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001708 ASSERT_NE(nullptr, handle);
1709
ramindani431aad42022-02-01 21:44:29 +00001710 const auto& [layerStatus, layer] =
1711 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1712 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001713
ramindani431aad42022-02-01 21:44:29 +00001714 mWriter.setLayerSidebandStream(getPrimaryDisplayId(), layer, handle);
ramindanidcfe3a82021-11-29 17:00:31 +00001715 execute();
1716}
1717
ramindani431aad42022-02-01 21:44:29 +00001718TEST_P(GraphicsComposerAidlCommandTest, SetLayerSourceCrop) {
1719 const auto& [layerStatus, layer] =
1720 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1721 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001722
ramindani431aad42022-02-01 21:44:29 +00001723 mWriter.setLayerSourceCrop(getPrimaryDisplayId(), layer, FRect{0.0f, 0.0f, 1.0f, 1.0f});
ramindanidcfe3a82021-11-29 17:00:31 +00001724 execute();
1725}
1726
ramindani431aad42022-02-01 21:44:29 +00001727TEST_P(GraphicsComposerAidlCommandTest, SetLayerTransform) {
1728 const auto& [layerStatus, layer] =
1729 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1730 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001731
ramindani431aad42022-02-01 21:44:29 +00001732 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, static_cast<Transform>(0));
ramindanidcfe3a82021-11-29 17:00:31 +00001733 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001734 ASSERT_TRUE(mReader.takeErrors().empty());
1735
ramindani431aad42022-02-01 21:44:29 +00001736 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_H);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001737 execute();
1738 ASSERT_TRUE(mReader.takeErrors().empty());
1739
ramindani431aad42022-02-01 21:44:29 +00001740 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_V);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001741 execute();
1742 ASSERT_TRUE(mReader.takeErrors().empty());
1743
ramindani431aad42022-02-01 21:44:29 +00001744 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_90);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001745 execute();
1746 ASSERT_TRUE(mReader.takeErrors().empty());
1747
ramindani431aad42022-02-01 21:44:29 +00001748 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_180);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001749 execute();
1750 ASSERT_TRUE(mReader.takeErrors().empty());
1751
ramindani431aad42022-02-01 21:44:29 +00001752 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_270);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001753 execute();
1754 ASSERT_TRUE(mReader.takeErrors().empty());
1755
ramindani431aad42022-02-01 21:44:29 +00001756 mWriter.setLayerTransform(getPrimaryDisplayId(), layer,
Ady Abraham3192f3d2021-12-03 16:08:56 -08001757 static_cast<Transform>(static_cast<int>(Transform::FLIP_H) |
1758 static_cast<int>(Transform::ROT_90)));
1759 execute();
1760 ASSERT_TRUE(mReader.takeErrors().empty());
1761
ramindani431aad42022-02-01 21:44:29 +00001762 mWriter.setLayerTransform(getPrimaryDisplayId(), layer,
Ady Abraham3192f3d2021-12-03 16:08:56 -08001763 static_cast<Transform>(static_cast<int>(Transform::FLIP_V) |
1764 static_cast<int>(Transform::ROT_90)));
1765 execute();
1766 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001767}
1768
ramindani431aad42022-02-01 21:44:29 +00001769TEST_P(GraphicsComposerAidlCommandTest, SetLayerVisibleRegion) {
1770 const auto& [layerStatus, layer] =
1771 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1772 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001773
1774 Rect empty{0, 0, 0, 0};
1775 Rect unit{0, 0, 1, 1};
1776
ramindani431aad42022-02-01 21:44:29 +00001777 mWriter.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
ramindanidcfe3a82021-11-29 17:00:31 +00001778 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001779 ASSERT_TRUE(mReader.takeErrors().empty());
1780
ramindani431aad42022-02-01 21:44:29 +00001781 mWriter.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001782 execute();
1783 ASSERT_TRUE(mReader.takeErrors().empty());
1784
ramindani431aad42022-02-01 21:44:29 +00001785 mWriter.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001786 execute();
1787 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001788}
1789
ramindani431aad42022-02-01 21:44:29 +00001790TEST_P(GraphicsComposerAidlCommandTest, SetLayerZOrder) {
1791 const auto& [layerStatus, layer] =
1792 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1793 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001794
ramindani431aad42022-02-01 21:44:29 +00001795 mWriter.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 10);
ramindanidcfe3a82021-11-29 17:00:31 +00001796 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001797 ASSERT_TRUE(mReader.takeErrors().empty());
1798
ramindani431aad42022-02-01 21:44:29 +00001799 mWriter.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 0);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001800 execute();
1801 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001802}
1803
ramindani431aad42022-02-01 21:44:29 +00001804TEST_P(GraphicsComposerAidlCommandTest, SetLayerPerFrameMetadata) {
1805 const auto& [layerStatus, layer] =
1806 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1807 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001808
ramindanidcfe3a82021-11-29 17:00:31 +00001809 /**
1810 * DISPLAY_P3 is a color space that uses the DCI_P3 primaries,
1811 * the D65 white point and the SRGB transfer functions.
1812 * Rendering Intent: Colorimetric
1813 * Primaries:
1814 * x y
1815 * green 0.265 0.690
1816 * blue 0.150 0.060
1817 * red 0.680 0.320
1818 * white (D65) 0.3127 0.3290
1819 */
1820
1821 std::vector<PerFrameMetadata> aidlMetadata;
1822 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X, 0.680f});
1823 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y, 0.320f});
1824 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_X, 0.265f});
1825 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_Y, 0.690f});
1826 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_X, 0.150f});
1827 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_Y, 0.060f});
1828 aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_X, 0.3127f});
1829 aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_Y, 0.3290f});
1830 aidlMetadata.push_back({PerFrameMetadataKey::MAX_LUMINANCE, 100.0f});
1831 aidlMetadata.push_back({PerFrameMetadataKey::MIN_LUMINANCE, 0.1f});
1832 aidlMetadata.push_back({PerFrameMetadataKey::MAX_CONTENT_LIGHT_LEVEL, 78.0});
1833 aidlMetadata.push_back({PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL, 62.0});
ramindani431aad42022-02-01 21:44:29 +00001834 mWriter.setLayerPerFrameMetadata(getPrimaryDisplayId(), layer, aidlMetadata);
ramindanidcfe3a82021-11-29 17:00:31 +00001835 execute();
1836
Ady Abraham3192f3d2021-12-03 16:08:56 -08001837 const auto errors = mReader.takeErrors();
1838 if (errors.size() == 1 && errors[0].errorCode == EX_UNSUPPORTED_OPERATION) {
ramindanidcfe3a82021-11-29 17:00:31 +00001839 GTEST_SUCCEED() << "SetLayerPerFrameMetadata is not supported";
ramindani431aad42022-02-01 21:44:29 +00001840 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001841 return;
1842 }
1843
ramindani431aad42022-02-01 21:44:29 +00001844 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001845}
1846
Alec Mourib1f16722022-02-07 13:03:44 -08001847TEST_P(GraphicsComposerAidlCommandTest, setLayerBrightness) {
ramindani431aad42022-02-01 21:44:29 +00001848 const auto& [layerStatus, layer] =
1849 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
Alec Mouri95e490b2022-01-06 13:46:58 -08001850
Alec Mourib1f16722022-02-07 13:03:44 -08001851 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, 0.2f);
Alec Mouri95e490b2022-01-06 13:46:58 -08001852 execute();
1853 ASSERT_TRUE(mReader.takeErrors().empty());
1854
Alec Mourib1f16722022-02-07 13:03:44 -08001855 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, 1.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08001856 execute();
1857 ASSERT_TRUE(mReader.takeErrors().empty());
1858
Alec Mourib1f16722022-02-07 13:03:44 -08001859 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, 0.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08001860 execute();
1861 ASSERT_TRUE(mReader.takeErrors().empty());
1862
Alec Mourib1f16722022-02-07 13:03:44 -08001863 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, -1.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08001864 execute();
Alec Mourib1f16722022-02-07 13:03:44 -08001865 {
1866 const auto errors = mReader.takeErrors();
1867 ASSERT_EQ(1, errors.size());
1868 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1869 }
1870
1871 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, std::nanf(""));
1872 execute();
1873 {
1874 const auto errors = mReader.takeErrors();
1875 ASSERT_EQ(1, errors.size());
1876 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1877 }
Alec Mouri95e490b2022-01-06 13:46:58 -08001878}
1879
ramindani431aad42022-02-01 21:44:29 +00001880TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints) {
ramindanidcfe3a82021-11-29 17:00:31 +00001881 Test_setActiveConfigWithConstraints({.delayForChange = 0, .refreshMiss = false});
1882}
1883
ramindani431aad42022-02-01 21:44:29 +00001884TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_Delayed) {
ramindanidcfe3a82021-11-29 17:00:31 +00001885 Test_setActiveConfigWithConstraints({.delayForChange = 300'000'000, // 300ms
1886 .refreshMiss = false});
1887}
1888
ramindani431aad42022-02-01 21:44:29 +00001889TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_MissRefresh) {
ramindanidcfe3a82021-11-29 17:00:31 +00001890 Test_setActiveConfigWithConstraints({.delayForChange = 0, .refreshMiss = true});
1891}
1892
ramindani431aad42022-02-01 21:44:29 +00001893TEST_P(GraphicsComposerAidlCommandTest, GetDisplayVsyncPeriod) {
ramindanidcfe3a82021-11-29 17:00:31 +00001894 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00001895 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
1896 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001897
ramindani431aad42022-02-01 21:44:29 +00001898 for (int32_t config : configs) {
1899 int32_t expectedVsyncPeriodNanos = display.getDisplayConfig(config).vsyncPeriod;
1900
ramindanidcfe3a82021-11-29 17:00:31 +00001901 VsyncPeriodChangeConstraints constraints;
1902
1903 constraints.desiredTimeNanos = systemTime();
1904 constraints.seamlessRequired = false;
ramindani431aad42022-02-01 21:44:29 +00001905
1906 const auto& [timelineStatus, timeline] =
1907 mComposerClient->setActiveConfigWithConstraints(&display, config, constraints);
1908 EXPECT_TRUE(timelineStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001909
1910 if (timeline.refreshRequired) {
1911 sendRefreshFrame(display, &timeline);
1912 }
ramindani431aad42022-02-01 21:44:29 +00001913 waitForVsyncPeriodChange(display.getDisplayId(), timeline, constraints.desiredTimeNanos,
1914 /*odPeriodNanos*/ 0, expectedVsyncPeriodNanos);
ramindanidcfe3a82021-11-29 17:00:31 +00001915
1916 int32_t vsyncPeriodNanos;
1917 int retryCount = 100;
1918 do {
1919 std::this_thread::sleep_for(10ms);
ramindani431aad42022-02-01 21:44:29 +00001920 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanosValue] =
1921 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
1922
1923 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
1924 vsyncPeriodNanos = vsyncPeriodNanosValue;
ramindanidcfe3a82021-11-29 17:00:31 +00001925 --retryCount;
1926 } while (vsyncPeriodNanos != expectedVsyncPeriodNanos && retryCount > 0);
1927
1928 EXPECT_EQ(vsyncPeriodNanos, expectedVsyncPeriodNanos);
1929
1930 // Make sure that the vsync period stays the same if the active config is not
1931 // changed.
1932 auto timeout = 1ms;
1933 for (int i = 0; i < 10; i++) {
1934 std::this_thread::sleep_for(timeout);
1935 timeout *= 2;
1936 vsyncPeriodNanos = 0;
ramindani431aad42022-02-01 21:44:29 +00001937 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanosValue] =
1938 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
1939
1940 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
1941 vsyncPeriodNanos = vsyncPeriodNanosValue;
ramindanidcfe3a82021-11-29 17:00:31 +00001942 EXPECT_EQ(vsyncPeriodNanos, expectedVsyncPeriodNanos);
1943 }
1944 }
1945 }
1946}
1947
ramindani431aad42022-02-01 21:44:29 +00001948TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_SeamlessNotAllowed) {
ramindanidcfe3a82021-11-29 17:00:31 +00001949 VsyncPeriodChangeConstraints constraints;
ramindanidcfe3a82021-11-29 17:00:31 +00001950 constraints.seamlessRequired = true;
1951 constraints.desiredTimeNanos = systemTime();
1952
1953 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00001954 forEachTwoConfigs(display.getDisplayId(), [&](int32_t config1, int32_t config2) {
1955 int32_t configGroup1 = display.getDisplayConfig(config1).configGroup;
1956 int32_t configGroup2 = display.getDisplayConfig(config2).configGroup;
ramindanidcfe3a82021-11-29 17:00:31 +00001957 if (configGroup1 != configGroup2) {
ramindani431aad42022-02-01 21:44:29 +00001958 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001959 sendRefreshFrame(display, nullptr);
ramindani431aad42022-02-01 21:44:29 +00001960 const auto& [status, _] = mComposerClient->setActiveConfigWithConstraints(
1961 &display, config2, constraints);
1962 EXPECT_FALSE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001963 EXPECT_EQ(IComposerClient::EX_SEAMLESS_NOT_ALLOWED,
ramindani431aad42022-02-01 21:44:29 +00001964 status.getServiceSpecificError());
ramindanidcfe3a82021-11-29 17:00:31 +00001965 }
1966 });
1967 }
1968}
1969
ramindani431aad42022-02-01 21:44:29 +00001970TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_NoTimestamp) {
1971 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ std::nullopt));
Ady Abraham72c5b502021-12-10 17:23:39 -08001972}
1973
ramindani431aad42022-02-01 21:44:29 +00001974TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_0) {
1975 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ 0));
Ady Abraham72c5b502021-12-10 17:23:39 -08001976}
1977
ramindani431aad42022-02-01 21:44:29 +00001978TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_5) {
1979 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ 5));
Ady Abraham72c5b502021-12-10 17:23:39 -08001980}
1981
ramindani431aad42022-02-01 21:44:29 +00001982TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Unsupported) {
1983 const bool hasDisplayIdleTimerSupport =
1984 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08001985 if (!hasDisplayIdleTimerSupport) {
ramindani431aad42022-02-01 21:44:29 +00001986 const auto& status =
1987 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0);
1988 EXPECT_FALSE(status.isOk());
1989 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, status.getServiceSpecificError());
Midas Chiena0b56bd2022-01-13 23:27:33 +08001990 }
1991}
1992
ramindani431aad42022-02-01 21:44:29 +00001993TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_BadParameter) {
1994 const bool hasDisplayIdleTimerSupport =
1995 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08001996 if (!hasDisplayIdleTimerSupport) {
1997 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
1998 return;
1999 }
2000
ramindani431aad42022-02-01 21:44:29 +00002001 const auto& status =
2002 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ -1);
2003 EXPECT_FALSE(status.isOk());
2004 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, status.getServiceSpecificError());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002005}
2006
ramindani431aad42022-02-01 21:44:29 +00002007TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Disable) {
2008 const bool hasDisplayIdleTimerSupport =
2009 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002010 if (!hasDisplayIdleTimerSupport) {
2011 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2012 return;
2013 }
2014
ramindani431aad42022-02-01 21:44:29 +00002015 EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002016 std::this_thread::sleep_for(1s);
ramindani431aad42022-02-01 21:44:29 +00002017 EXPECT_EQ(0, mComposerClient->getVsyncIdleCount());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002018}
2019
ramindani431aad42022-02-01 21:44:29 +00002020TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Timeout_2) {
2021 const bool hasDisplayIdleTimerSupport =
2022 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002023 if (!hasDisplayIdleTimerSupport) {
2024 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2025 return;
2026 }
2027
ramindani431aad42022-02-01 21:44:29 +00002028 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
2029 EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002030
Leon Scroggins IIIde057582022-01-13 12:26:00 -05002031 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002032 ASSERT_NE(nullptr, buffer->handle);
2033
2034 const auto layer = createOnScreenLayer();
ramindani431aad42022-02-01 21:44:29 +00002035 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer->handle,
2036 /*acquireFence*/ -1);
2037 int32_t vsyncIdleCount = mComposerClient->getVsyncIdleCount();
Midas Chiena0b56bd2022-01-13 23:27:33 +08002038 auto earlyVsyncIdleTime = systemTime() + std::chrono::nanoseconds(2s).count();
ramindani431aad42022-02-01 21:44:29 +00002039 EXPECT_TRUE(
2040 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 2000).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002041
2042 const sp<::android::Fence> presentFence =
ramindani431aad42022-02-01 21:44:29 +00002043 presentAndGetFence(ComposerClientWriter::kNoTimestamp);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002044 presentFence->waitForever(LOG_TAG);
2045
2046 std::this_thread::sleep_for(3s);
ramindani431aad42022-02-01 21:44:29 +00002047 if (vsyncIdleCount < mComposerClient->getVsyncIdleCount()) {
2048 EXPECT_GE(mComposerClient->getVsyncIdleTime(), earlyVsyncIdleTime);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002049 }
2050
ramindani431aad42022-02-01 21:44:29 +00002051 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002052}
2053
ramindanidcfe3a82021-11-29 17:00:31 +00002054GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlCommandTest);
2055INSTANTIATE_TEST_SUITE_P(
2056 PerInstance, GraphicsComposerAidlCommandTest,
2057 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
2058 ::android::PrintInstanceNameToString);
2059
ramindanid32ae8e2021-10-01 18:48:39 +00002060GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlTest);
2061INSTANTIATE_TEST_SUITE_P(
2062 PerInstance, GraphicsComposerAidlTest,
2063 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
2064 ::android::PrintInstanceNameToString);
2065} // namespace
2066} // namespace aidl::android::hardware::graphics::composer3::vts
2067
2068int main(int argc, char** argv) {
2069 ::testing::InitGoogleTest(&argc, argv);
2070
2071 using namespace std::chrono_literals;
2072 if (!android::base::WaitForProperty("init.svc.surfaceflinger", "stopped", 10s)) {
2073 ALOGE("Failed to stop init.svc.surfaceflinger");
2074 return -1;
2075 }
ramindanibeea10e2021-12-07 21:02:49 +00002076
2077 android::ProcessState::self()->setThreadPoolMaxThreadCount(4);
2078
2079 // The binder threadpool we start will inherit sched policy and priority
2080 // of (this) creating thread. We want the binder thread pool to have
2081 // SCHED_FIFO policy and priority 1 (lowest RT priority)
2082 // Once the pool is created we reset this thread's priority back to
2083 // original.
2084 // This thread policy is based on what we do in the SurfaceFlinger while starting
2085 // the thread pool and we need to replicate that for the VTS tests.
2086 int newPriority = 0;
2087 int origPolicy = sched_getscheduler(0);
2088 struct sched_param origSchedParam;
2089
2090 int errorInPriorityModification = sched_getparam(0, &origSchedParam);
2091 if (errorInPriorityModification == 0) {
2092 int policy = SCHED_FIFO;
2093 newPriority = sched_get_priority_min(policy);
2094
2095 struct sched_param param;
2096 param.sched_priority = newPriority;
2097
2098 errorInPriorityModification = sched_setscheduler(0, policy, &param);
2099 }
2100
2101 // start the thread pool
2102 android::ProcessState::self()->startThreadPool();
2103
2104 // Reset current thread's policy and priority
2105 if (errorInPriorityModification == 0) {
2106 errorInPriorityModification = sched_setscheduler(0, origPolicy, &origSchedParam);
2107 } else {
2108 ALOGE("Failed to set VtsHalGraphicsComposer3_TargetTest binder threadpool priority to "
2109 "SCHED_FIFO");
2110 }
2111
ramindanid32ae8e2021-10-01 18:48:39 +00002112 return RUN_ALL_TESTS();
ramindania9780262021-10-01 18:48:39 +00002113}