blob: 9c8ffe6b0d1858e197ed0f4078ce90dff302be5d [file] [log] [blame]
ramindani431aad42022-02-01 21:44:29 +00001/**
2 * Copyright (c) 2022, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Sally Qi2600d342022-08-16 12:46:17 -070016
ramindanid32ae8e2021-10-01 18:48:39 +000017#include <aidl/Gtest.h>
18#include <aidl/Vintf.h>
Ady Abraham3192f3d2021-12-03 16:08:56 -080019#include <aidl/android/hardware/graphics/common/BlendMode.h>
ramindani3335f7a2021-10-25 17:22:35 +000020#include <aidl/android/hardware/graphics/common/BufferUsage.h>
21#include <aidl/android/hardware/graphics/common/FRect.h>
Leon Scroggins IIIde057582022-01-13 12:26:00 -050022#include <aidl/android/hardware/graphics/common/PixelFormat.h>
ramindani3335f7a2021-10-25 17:22:35 +000023#include <aidl/android/hardware/graphics/common/Rect.h>
ramindani3335f7a2021-10-25 17:22:35 +000024#include <aidl/android/hardware/graphics/composer3/Composition.h>
ramindanid32ae8e2021-10-01 18:48:39 +000025#include <aidl/android/hardware/graphics/composer3/IComposer.h>
26#include <android-base/properties.h>
ramindania9780262021-10-01 18:48:39 +000027#include <android/binder_process.h>
Ady Abraham91c9d1a2021-12-15 18:14:45 -080028#include <android/hardware/graphics/composer3/ComposerClientReader.h>
29#include <android/hardware/graphics/composer3/ComposerClientWriter.h>
ramindanid32ae8e2021-10-01 18:48:39 +000030#include <binder/ProcessState.h>
31#include <gtest/gtest.h>
Ady Abraham72c5b502021-12-10 17:23:39 -080032#include <ui/Fence.h>
ramindani3335f7a2021-10-25 17:22:35 +000033#include <ui/GraphicBuffer.h>
34#include <ui/PixelFormat.h>
ramindani0291f112021-11-04 03:45:46 +000035#include <algorithm>
ramindani592b6512021-10-08 21:15:19 +000036#include <numeric>
ramindanid32ae8e2021-10-01 18:48:39 +000037#include <string>
ramindani1cb794e2021-10-13 20:45:23 +000038#include <thread>
ramindani458e53e2022-02-23 17:30:16 +000039#include "GraphicsComposerCallback.h"
40#include "VtsComposerClient.h"
ramindani3335f7a2021-10-25 17:22:35 +000041
ramindanid32ae8e2021-10-01 18:48:39 +000042#undef LOG_TAG
43#define LOG_TAG "VtsHalGraphicsComposer3_TargetTest"
44
45namespace aidl::android::hardware::graphics::composer3::vts {
46namespace {
47
ramindani1cb794e2021-10-13 20:45:23 +000048using namespace std::chrono_literals;
49
ramindanidcfe3a82021-11-29 17:00:31 +000050using ::android::GraphicBuffer;
51using ::android::sp;
52
ramindanid32ae8e2021-10-01 18:48:39 +000053class GraphicsComposerAidlTest : public ::testing::TestWithParam<std::string> {
ramindania9780262021-10-01 18:48:39 +000054 protected:
55 void SetUp() override {
ramindani431aad42022-02-01 21:44:29 +000056 mComposerClient = std::make_unique<VtsComposerClient>(GetParam());
57 ASSERT_TRUE(mComposerClient->createClient().isOk());
Jason Macnake531a092022-01-20 08:49:09 -080058
ramindani431aad42022-02-01 21:44:29 +000059 const auto& [status, displays] = mComposerClient->getDisplays();
Jason Macnake531a092022-01-20 08:49:09 -080060 ASSERT_TRUE(status.isOk());
ramindani431aad42022-02-01 21:44:29 +000061 mDisplays = displays;
ramindanidcfe3a82021-11-29 17:00:31 +000062
ramindani3335f7a2021-10-25 17:22:35 +000063 // explicitly disable vsync
64 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +000065 EXPECT_TRUE(mComposerClient->setVsync(display.getDisplayId(), false).isOk());
ramindani3335f7a2021-10-25 17:22:35 +000066 }
ramindani431aad42022-02-01 21:44:29 +000067 mComposerClient->setVsyncAllowed(false);
ramindania9780262021-10-01 18:48:39 +000068 }
69
ramindani3335f7a2021-10-25 17:22:35 +000070 void TearDown() override {
ramindani431aad42022-02-01 21:44:29 +000071 ASSERT_TRUE(mComposerClient->tearDown());
72 mComposerClient.reset();
ramindani3335f7a2021-10-25 17:22:35 +000073 }
ramindanic2b8d082021-11-06 02:03:50 +000074
ramindanid5751092022-04-22 22:30:20 +000075 void assertServiceSpecificError(const ScopedAStatus& status, int32_t serviceSpecificError) {
76 ASSERT_EQ(status.getExceptionCode(), EX_SERVICE_SPECIFIC);
77 ASSERT_EQ(status.getServiceSpecificError(), serviceSpecificError);
78 }
79
ramindani431aad42022-02-01 21:44:29 +000080 void Test_setContentTypeForDisplay(int64_t display,
81 const std::vector<ContentType>& supportedContentTypes,
82 ContentType contentType, const char* contentTypeStr) {
83 const bool contentTypeSupport =
84 std::find(supportedContentTypes.begin(), supportedContentTypes.end(),
85 contentType) != supportedContentTypes.end();
ramindanidcfe3a82021-11-29 17:00:31 +000086
87 if (!contentTypeSupport) {
ramindani431aad42022-02-01 21:44:29 +000088 const auto& status = mComposerClient->setContentType(display, contentType);
89 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +000090 EXPECT_NO_FATAL_FAILURE(
91 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindanidcfe3a82021-11-29 17:00:31 +000092 GTEST_SUCCEED() << contentTypeStr << " content type is not supported on display "
93 << std::to_string(display) << ", skipping test";
94 return;
95 }
96
97 EXPECT_TRUE(mComposerClient->setContentType(display, contentType).isOk());
98 EXPECT_TRUE(mComposerClient->setContentType(display, ContentType::NONE).isOk());
99 }
100
ramindani431aad42022-02-01 21:44:29 +0000101 void Test_setContentType(ContentType contentType, const char* contentTypeStr) {
ramindanidcfe3a82021-11-29 17:00:31 +0000102 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000103 const auto& [status, supportedContentTypes] =
104 mComposerClient->getSupportedContentTypes(display.getDisplayId());
105 EXPECT_TRUE(status.isOk());
106 Test_setContentTypeForDisplay(display.getDisplayId(), supportedContentTypes,
107 contentType, contentTypeStr);
ramindanidcfe3a82021-11-29 17:00:31 +0000108 }
109 }
110
Jason Macnak325e8232022-01-24 14:48:55 -0800111 bool hasCapability(Capability capability) {
ramindani431aad42022-02-01 21:44:29 +0000112 const auto& [status, capabilities] = mComposerClient->getCapabilities();
113 EXPECT_TRUE(status.isOk());
Jason Macnak325e8232022-01-24 14:48:55 -0800114 return std::any_of(
115 capabilities.begin(), capabilities.end(),
116 [&](const Capability& activeCapability) { return activeCapability == capability; });
117 }
118
ramindani431aad42022-02-01 21:44:29 +0000119 const VtsDisplay& getPrimaryDisplay() const { return mDisplays[0]; }
ramindania9780262021-10-01 18:48:39 +0000120
ramindani431aad42022-02-01 21:44:29 +0000121 int64_t getPrimaryDisplayId() const { return getPrimaryDisplay().getDisplayId(); }
ramindania9780262021-10-01 18:48:39 +0000122
ramindani431aad42022-02-01 21:44:29 +0000123 int64_t getInvalidDisplayId() const { return mComposerClient->getInvalidDisplayId(); }
ramindani1cb794e2021-10-13 20:45:23 +0000124
ramindani431aad42022-02-01 21:44:29 +0000125 VtsDisplay& getEditablePrimaryDisplay() { return mDisplays[0]; }
ramindani0291f112021-11-04 03:45:46 +0000126
ramindani3335f7a2021-10-25 17:22:35 +0000127 struct TestParameters {
128 nsecs_t delayForChange;
129 bool refreshMiss;
130 };
131
ramindani431aad42022-02-01 21:44:29 +0000132 std::unique_ptr<VtsComposerClient> mComposerClient;
ramindani1cb794e2021-10-13 20:45:23 +0000133 std::vector<VtsDisplay> mDisplays;
ramindani3335f7a2021-10-25 17:22:35 +0000134 // use the slot count usually set by SF
135 static constexpr uint32_t kBufferSlotCount = 64;
ramindanid32ae8e2021-10-01 18:48:39 +0000136};
137
ramindani431aad42022-02-01 21:44:29 +0000138TEST_P(GraphicsComposerAidlTest, GetDisplayCapabilities_BadDisplay) {
139 const auto& [status, _] = mComposerClient->getDisplayCapabilities(getInvalidDisplayId());
ramindani5f696942021-10-14 16:24:18 +0000140
ramindani431aad42022-02-01 21:44:29 +0000141 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000142 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindania9780262021-10-01 18:48:39 +0000143}
144
ramindani431aad42022-02-01 21:44:29 +0000145TEST_P(GraphicsComposerAidlTest, GetDisplayCapabilities) {
ramindania9780262021-10-01 18:48:39 +0000146 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000147 const auto& [status, capabilities] =
148 mComposerClient->getDisplayCapabilities(display.getDisplayId());
ramindania9780262021-10-01 18:48:39 +0000149
ramindani431aad42022-02-01 21:44:29 +0000150 EXPECT_TRUE(status.isOk());
ramindania9780262021-10-01 18:48:39 +0000151 }
ramindanid32ae8e2021-10-01 18:48:39 +0000152}
153
ramindani2740bac2021-11-24 22:58:32 +0000154TEST_P(GraphicsComposerAidlTest, DumpDebugInfo) {
ramindani431aad42022-02-01 21:44:29 +0000155 ASSERT_TRUE(mComposerClient->dumpDebugInfo().isOk());
ramindani2740bac2021-11-24 22:58:32 +0000156}
157
158TEST_P(GraphicsComposerAidlTest, CreateClientSingleton) {
159 std::shared_ptr<IComposerClient> composerClient;
ramindani431aad42022-02-01 21:44:29 +0000160 const auto& status = mComposerClient->createClient();
ramindani2740bac2021-11-24 22:58:32 +0000161
ramindani431aad42022-02-01 21:44:29 +0000162 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000163 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_NO_RESOURCES));
ramindani2740bac2021-11-24 22:58:32 +0000164}
165
ramindani592b6512021-10-08 21:15:19 +0000166TEST_P(GraphicsComposerAidlTest, GetDisplayIdentificationData) {
ramindani431aad42022-02-01 21:44:29 +0000167 const auto& [status0, displayIdentification0] =
168 mComposerClient->getDisplayIdentificationData(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000169 if (!status0.isOk() && status0.getExceptionCode() == EX_SERVICE_SPECIFIC &&
170 status0.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani431aad42022-02-01 21:44:29 +0000171 GTEST_SUCCEED() << "Display identification data not supported, skipping test";
ramindani592b6512021-10-08 21:15:19 +0000172 return;
173 }
ramindani431aad42022-02-01 21:44:29 +0000174 ASSERT_TRUE(status0.isOk()) << "failed to get display identification data";
ramindani592b6512021-10-08 21:15:19 +0000175 ASSERT_FALSE(displayIdentification0.data.empty());
176
177 constexpr size_t kEdidBlockSize = 128;
178 ASSERT_TRUE(displayIdentification0.data.size() % kEdidBlockSize == 0)
179 << "EDID blob length is not a multiple of " << kEdidBlockSize;
180
181 const uint8_t kEdidHeader[] = {0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00};
182 ASSERT_TRUE(std::equal(std::begin(kEdidHeader), std::end(kEdidHeader),
183 displayIdentification0.data.begin()))
184 << "EDID blob doesn't start with the fixed EDID header";
185 ASSERT_EQ(0, std::accumulate(displayIdentification0.data.begin(),
186 displayIdentification0.data.begin() + kEdidBlockSize,
187 static_cast<uint8_t>(0)))
188 << "EDID base block doesn't checksum";
189
ramindani431aad42022-02-01 21:44:29 +0000190 const auto& [status1, displayIdentification1] =
191 mComposerClient->getDisplayIdentificationData(getPrimaryDisplayId());
192 ASSERT_TRUE(status1.isOk());
ramindani592b6512021-10-08 21:15:19 +0000193
194 ASSERT_EQ(displayIdentification0.port, displayIdentification1.port) << "ports are not stable";
195 ASSERT_TRUE(displayIdentification0.data.size() == displayIdentification1.data.size() &&
196 std::equal(displayIdentification0.data.begin(), displayIdentification0.data.end(),
197 displayIdentification1.data.begin()))
198 << "data is not stable";
199}
200
201TEST_P(GraphicsComposerAidlTest, GetHdrCapabilities) {
ramindani431aad42022-02-01 21:44:29 +0000202 const auto& [status, hdrCapabilities] =
203 mComposerClient->getHdrCapabilities(getPrimaryDisplayId());
ramindani592b6512021-10-08 21:15:19 +0000204
ramindani431aad42022-02-01 21:44:29 +0000205 ASSERT_TRUE(status.isOk());
206 EXPECT_TRUE(hdrCapabilities.maxLuminance >= hdrCapabilities.minLuminance);
ramindani592b6512021-10-08 21:15:19 +0000207}
208
209TEST_P(GraphicsComposerAidlTest, GetPerFrameMetadataKeys) {
ramindani431aad42022-02-01 21:44:29 +0000210 const auto& [status, keys] = mComposerClient->getPerFrameMetadataKeys(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000211 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
212 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindanic2b8d082021-11-06 02:03:50 +0000213 GTEST_SUCCEED() << "getPerFrameMetadataKeys is not supported";
214 return;
ramindani592b6512021-10-08 21:15:19 +0000215 }
ramindani431aad42022-02-01 21:44:29 +0000216
217 ASSERT_TRUE(status.isOk());
218 EXPECT_TRUE(keys.size() >= 0);
ramindani592b6512021-10-08 21:15:19 +0000219}
220
221TEST_P(GraphicsComposerAidlTest, GetReadbackBufferAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000222 const auto& [status, _] = mComposerClient->getReadbackBufferAttributes(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000223 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
224 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani431aad42022-02-01 21:44:29 +0000225 GTEST_SUCCEED() << "getReadbackBufferAttributes is not supported";
226 return;
ramindani592b6512021-10-08 21:15:19 +0000227 }
ramindani431aad42022-02-01 21:44:29 +0000228
229 ASSERT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000230}
231
232TEST_P(GraphicsComposerAidlTest, GetRenderIntents) {
ramindani431aad42022-02-01 21:44:29 +0000233 const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
234 EXPECT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000235
ramindani431aad42022-02-01 21:44:29 +0000236 for (auto mode : modes) {
237 const auto& [intentStatus, intents] =
238 mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
239 EXPECT_TRUE(intentStatus.isOk());
ramindani592b6512021-10-08 21:15:19 +0000240 bool isHdr;
241 switch (mode) {
242 case ColorMode::BT2100_PQ:
243 case ColorMode::BT2100_HLG:
244 isHdr = true;
245 break;
246 default:
247 isHdr = false;
248 break;
249 }
250 RenderIntent requiredIntent =
251 isHdr ? RenderIntent::TONE_MAP_COLORIMETRIC : RenderIntent::COLORIMETRIC;
252
ramindani431aad42022-02-01 21:44:29 +0000253 const auto iter = std::find(intents.cbegin(), intents.cend(), requiredIntent);
ramindani592b6512021-10-08 21:15:19 +0000254 EXPECT_NE(intents.cend(), iter);
255 }
256}
257
ramindani431aad42022-02-01 21:44:29 +0000258TEST_P(GraphicsComposerAidlTest, GetRenderIntents_BadDisplay) {
259 const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
260 ASSERT_TRUE(status.isOk());
261
ramindani592b6512021-10-08 21:15:19 +0000262 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000263 const auto& [intentStatus, _] =
264 mComposerClient->getRenderIntents(getInvalidDisplayId(), mode);
265
266 EXPECT_FALSE(intentStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000267 EXPECT_NO_FATAL_FAILURE(
268 assertServiceSpecificError(intentStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani592b6512021-10-08 21:15:19 +0000269 }
270}
271
ramindani431aad42022-02-01 21:44:29 +0000272TEST_P(GraphicsComposerAidlTest, GetRenderIntents_BadParameter) {
273 const auto& [status, _] =
274 mComposerClient->getRenderIntents(getPrimaryDisplayId(), static_cast<ColorMode>(-1));
275
276 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000277 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindani592b6512021-10-08 21:15:19 +0000278}
279
280TEST_P(GraphicsComposerAidlTest, GetColorModes) {
ramindani431aad42022-02-01 21:44:29 +0000281 const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
282 ASSERT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000283
ramindani431aad42022-02-01 21:44:29 +0000284 const auto native = std::find(colorModes.cbegin(), colorModes.cend(), ColorMode::NATIVE);
285 EXPECT_NE(colorModes.cend(), native);
ramindani592b6512021-10-08 21:15:19 +0000286}
287
ramindani431aad42022-02-01 21:44:29 +0000288TEST_P(GraphicsComposerAidlTest, GetColorMode_BadDisplay) {
289 const auto& [status, _] = mComposerClient->getColorModes(getInvalidDisplayId());
ramindani592b6512021-10-08 21:15:19 +0000290
ramindani431aad42022-02-01 21:44:29 +0000291 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000292 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani592b6512021-10-08 21:15:19 +0000293}
294
295TEST_P(GraphicsComposerAidlTest, SetColorMode) {
ramindani431aad42022-02-01 21:44:29 +0000296 const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
297 EXPECT_TRUE(status.isOk());
298
ramindani592b6512021-10-08 21:15:19 +0000299 for (auto mode : colorModes) {
ramindani431aad42022-02-01 21:44:29 +0000300 const auto& [intentStatus, intents] =
301 mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
302 EXPECT_TRUE(intentStatus.isOk()) << "failed to get render intents";
303
ramindani592b6512021-10-08 21:15:19 +0000304 for (auto intent : intents) {
ramindani431aad42022-02-01 21:44:29 +0000305 const auto modeStatus =
306 mComposerClient->setColorMode(getPrimaryDisplayId(), mode, intent);
307 EXPECT_TRUE(modeStatus.isOk() ||
ramindanid5751092022-04-22 22:30:20 +0000308 (modeStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
309 IComposerClient::EX_UNSUPPORTED == modeStatus.getServiceSpecificError()))
ramindani592b6512021-10-08 21:15:19 +0000310 << "failed to set color mode";
311 }
312 }
313
ramindani431aad42022-02-01 21:44:29 +0000314 const auto modeStatus = mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE,
315 RenderIntent::COLORIMETRIC);
316 EXPECT_TRUE(modeStatus.isOk() ||
ramindanid5751092022-04-22 22:30:20 +0000317 (modeStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
318 IComposerClient::EX_UNSUPPORTED == modeStatus.getServiceSpecificError()))
ramindani592b6512021-10-08 21:15:19 +0000319 << "failed to set color mode";
320}
321
ramindani431aad42022-02-01 21:44:29 +0000322TEST_P(GraphicsComposerAidlTest, SetColorMode_BadDisplay) {
323 const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
324 ASSERT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000325
ramindani431aad42022-02-01 21:44:29 +0000326 for (auto mode : colorModes) {
327 const auto& [intentStatus, intents] =
328 mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
329 ASSERT_TRUE(intentStatus.isOk()) << "failed to get render intents";
330
331 for (auto intent : intents) {
332 auto const modeStatus =
333 mComposerClient->setColorMode(getInvalidDisplayId(), mode, intent);
334
335 EXPECT_FALSE(modeStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000336 EXPECT_NO_FATAL_FAILURE(
337 assertServiceSpecificError(modeStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani770d7082021-11-30 00:36:42 +0000338 }
339 }
ramindani592b6512021-10-08 21:15:19 +0000340}
341
ramindani431aad42022-02-01 21:44:29 +0000342TEST_P(GraphicsComposerAidlTest, SetColorMode_BadParameter) {
343 auto status = mComposerClient->setColorMode(getPrimaryDisplayId(), static_cast<ColorMode>(-1),
344 RenderIntent::COLORIMETRIC);
ramindani592b6512021-10-08 21:15:19 +0000345
ramindani431aad42022-02-01 21:44:29 +0000346 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000347 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindani592b6512021-10-08 21:15:19 +0000348
ramindani431aad42022-02-01 21:44:29 +0000349 status = mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE,
350 static_cast<RenderIntent>(-1));
ramindani592b6512021-10-08 21:15:19 +0000351
ramindani431aad42022-02-01 21:44:29 +0000352 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000353 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindani592b6512021-10-08 21:15:19 +0000354}
355
356TEST_P(GraphicsComposerAidlTest, GetDisplayedContentSamplingAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000357 int constexpr kInvalid = -1;
358 const auto& [status, format] =
359 mComposerClient->getDisplayedContentSamplingAttributes(getPrimaryDisplayId());
ramindani592b6512021-10-08 21:15:19 +0000360
ramindanid5751092022-04-22 22:30:20 +0000361 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
362 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani592b6512021-10-08 21:15:19 +0000363 SUCCEED() << "Device does not support optional extension. Test skipped";
364 return;
365 }
366
ramindani431aad42022-02-01 21:44:29 +0000367 ASSERT_TRUE(status.isOk());
368 EXPECT_NE(kInvalid, static_cast<int>(format.format));
369 EXPECT_NE(kInvalid, static_cast<int>(format.dataspace));
370 EXPECT_NE(kInvalid, static_cast<int>(format.componentMask));
ramindani592b6512021-10-08 21:15:19 +0000371};
372
373TEST_P(GraphicsComposerAidlTest, SetDisplayedContentSamplingEnabled) {
ramindani431aad42022-02-01 21:44:29 +0000374 int constexpr kMaxFrames = 10;
ramindani592b6512021-10-08 21:15:19 +0000375 FormatColorComponent enableAllComponents = FormatColorComponent::FORMAT_COMPONENT_0;
ramindani431aad42022-02-01 21:44:29 +0000376 auto status = mComposerClient->setDisplayedContentSamplingEnabled(
377 getPrimaryDisplayId(), /*isEnabled*/ true, enableAllComponents, kMaxFrames);
ramindanid5751092022-04-22 22:30:20 +0000378 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
379 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani592b6512021-10-08 21:15:19 +0000380 SUCCEED() << "Device does not support optional extension. Test skipped";
381 return;
382 }
ramindani431aad42022-02-01 21:44:29 +0000383 EXPECT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000384
ramindani431aad42022-02-01 21:44:29 +0000385 status = mComposerClient->setDisplayedContentSamplingEnabled(
386 getPrimaryDisplayId(), /*isEnabled*/ false, enableAllComponents, kMaxFrames);
387 EXPECT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000388}
389
390TEST_P(GraphicsComposerAidlTest, GetDisplayedContentSample) {
ramindani431aad42022-02-01 21:44:29 +0000391 const auto& [status, displayContentSamplingAttributes] =
392 mComposerClient->getDisplayedContentSamplingAttributes(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000393 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
394 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindanideb059e2021-11-18 01:57:25 +0000395 SUCCEED() << "Sampling attributes aren't supported on this device, test skipped";
396 return;
397 }
ramindani592b6512021-10-08 21:15:19 +0000398
ramindani431aad42022-02-01 21:44:29 +0000399 int64_t constexpr kMaxFrames = 10;
400 int64_t constexpr kTimestamp = 0;
401 const auto& [sampleStatus, displayContentSample] = mComposerClient->getDisplayedContentSample(
402 getPrimaryDisplayId(), kMaxFrames, kTimestamp);
ramindanid5751092022-04-22 22:30:20 +0000403 if (!sampleStatus.isOk() && sampleStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
ramindani431aad42022-02-01 21:44:29 +0000404 sampleStatus.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani592b6512021-10-08 21:15:19 +0000405 SUCCEED() << "Device does not support optional extension. Test skipped";
406 return;
407 }
408
ramindani431aad42022-02-01 21:44:29 +0000409 EXPECT_TRUE(sampleStatus.isOk());
410 const std::vector<std::vector<int64_t>> histogram = {
ramindani592b6512021-10-08 21:15:19 +0000411 displayContentSample.sampleComponent0, displayContentSample.sampleComponent1,
412 displayContentSample.sampleComponent2, displayContentSample.sampleComponent3};
413
ramindani3335f7a2021-10-25 17:22:35 +0000414 for (size_t i = 0; i < histogram.size(); i++) {
415 const bool shouldHaveHistogram =
416 static_cast<int>(displayContentSamplingAttributes.componentMask) & (1 << i);
417 EXPECT_EQ(shouldHaveHistogram, !histogram[i].empty());
ramindani592b6512021-10-08 21:15:19 +0000418 }
419}
420
ramindani431aad42022-02-01 21:44:29 +0000421TEST_P(GraphicsComposerAidlTest, GetDisplayConnectionType) {
422 const auto& [status, type] = mComposerClient->getDisplayConnectionType(getInvalidDisplayId());
423
424 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000425 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani431aad42022-02-01 21:44:29 +0000426
ramindani0291f112021-11-04 03:45:46 +0000427 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000428 const auto& [connectionTypeStatus, _] =
429 mComposerClient->getDisplayConnectionType(display.getDisplayId());
430 EXPECT_TRUE(connectionTypeStatus.isOk());
ramindani0291f112021-11-04 03:45:46 +0000431 }
432}
433
ramindani431aad42022-02-01 21:44:29 +0000434TEST_P(GraphicsComposerAidlTest, GetDisplayAttribute) {
ramindani0291f112021-11-04 03:45:46 +0000435 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000436 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
437 EXPECT_TRUE(status.isOk());
438
ramindani0291f112021-11-04 03:45:46 +0000439 for (const auto& config : configs) {
440 const std::array<DisplayAttribute, 4> requiredAttributes = {{
441 DisplayAttribute::WIDTH,
442 DisplayAttribute::HEIGHT,
443 DisplayAttribute::VSYNC_PERIOD,
444 DisplayAttribute::CONFIG_GROUP,
445 }};
ramindani0291f112021-11-04 03:45:46 +0000446 for (const auto& attribute : requiredAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000447 const auto& [attribStatus, value] = mComposerClient->getDisplayAttribute(
448 display.getDisplayId(), config, attribute);
449 EXPECT_TRUE(attribStatus.isOk());
ramindani0291f112021-11-04 03:45:46 +0000450 EXPECT_NE(-1, value);
451 }
452
453 const std::array<DisplayAttribute, 2> optionalAttributes = {{
454 DisplayAttribute::DPI_X,
455 DisplayAttribute::DPI_Y,
456 }};
457 for (const auto& attribute : optionalAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000458 const auto& [attribStatus, value] = mComposerClient->getDisplayAttribute(
459 display.getDisplayId(), config, attribute);
ramindanid5751092022-04-22 22:30:20 +0000460 EXPECT_TRUE(attribStatus.isOk() ||
461 (attribStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
462 IComposerClient::EX_UNSUPPORTED ==
463 attribStatus.getServiceSpecificError()));
ramindani0291f112021-11-04 03:45:46 +0000464 }
465 }
466 }
467}
468
ramindani431aad42022-02-01 21:44:29 +0000469TEST_P(GraphicsComposerAidlTest, CheckConfigsAreValid) {
ramindani0291f112021-11-04 03:45:46 +0000470 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000471 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
472 EXPECT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000473
474 EXPECT_FALSE(std::any_of(configs.begin(), configs.end(), [](auto config) {
475 return config == IComposerClient::INVALID_CONFIGURATION;
476 }));
477 }
478}
479
ramindani431aad42022-02-01 21:44:29 +0000480TEST_P(GraphicsComposerAidlTest, GetDisplayVsyncPeriod_BadDisplay) {
481 const auto& [status, vsyncPeriodNanos] =
482 mComposerClient->getDisplayVsyncPeriod(getInvalidDisplayId());
483
484 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000485 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000486}
487
ramindani431aad42022-02-01 21:44:29 +0000488TEST_P(GraphicsComposerAidlTest, SetActiveConfigWithConstraints_BadDisplay) {
ramindani0291f112021-11-04 03:45:46 +0000489 VsyncPeriodChangeConstraints constraints;
ramindani0291f112021-11-04 03:45:46 +0000490 constraints.seamlessRequired = false;
491 constraints.desiredTimeNanos = systemTime();
ramindani431aad42022-02-01 21:44:29 +0000492 auto invalidDisplay = VtsDisplay(getInvalidDisplayId());
ramindani0291f112021-11-04 03:45:46 +0000493
ramindani431aad42022-02-01 21:44:29 +0000494 const auto& [status, timeline] = mComposerClient->setActiveConfigWithConstraints(
495 &invalidDisplay, /*config*/ 0, constraints);
496
497 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000498 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000499}
500
ramindani431aad42022-02-01 21:44:29 +0000501TEST_P(GraphicsComposerAidlTest, SetActiveConfigWithConstraints_BadConfig) {
ramindani0291f112021-11-04 03:45:46 +0000502 VsyncPeriodChangeConstraints constraints;
ramindani0291f112021-11-04 03:45:46 +0000503 constraints.seamlessRequired = false;
504 constraints.desiredTimeNanos = systemTime();
505
506 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000507 int32_t constexpr kInvalidConfigId = IComposerClient::INVALID_CONFIGURATION;
508 const auto& [status, _] = mComposerClient->setActiveConfigWithConstraints(
509 &display, kInvalidConfigId, constraints);
510
511 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000512 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_CONFIG));
ramindani0291f112021-11-04 03:45:46 +0000513 }
514}
515
ramindani431aad42022-02-01 21:44:29 +0000516TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig_BadDisplay) {
ramindani476314c2022-03-16 00:17:08 +0000517 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
518 GTEST_SUCCEED() << "Boot Display Config not supported";
519 return;
520 }
ramindani431aad42022-02-01 21:44:29 +0000521 const auto& status = mComposerClient->setBootDisplayConfig(getInvalidDisplayId(), /*config*/ 0);
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100522
ramindani431aad42022-02-01 21:44:29 +0000523 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000524 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100525}
526
ramindani431aad42022-02-01 21:44:29 +0000527TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig_BadConfig) {
ramindani476314c2022-03-16 00:17:08 +0000528 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
529 GTEST_SUCCEED() << "Boot Display Config not supported";
530 return;
531 }
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100532 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000533 int32_t constexpr kInvalidConfigId = IComposerClient::INVALID_CONFIGURATION;
534 const auto& status =
535 mComposerClient->setBootDisplayConfig(display.getDisplayId(), kInvalidConfigId);
536
537 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000538 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_CONFIG));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100539 }
540}
541
ramindani431aad42022-02-01 21:44:29 +0000542TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig) {
ramindani476314c2022-03-16 00:17:08 +0000543 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
544 GTEST_SUCCEED() << "Boot Display Config not supported";
545 return;
546 }
ramindani431aad42022-02-01 21:44:29 +0000547 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
548 EXPECT_TRUE(status.isOk());
549 for (const auto& config : configs) {
550 EXPECT_TRUE(mComposerClient->setBootDisplayConfig(getPrimaryDisplayId(), config).isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100551 }
552}
553
ramindani431aad42022-02-01 21:44:29 +0000554TEST_P(GraphicsComposerAidlTest, ClearBootDisplayConfig_BadDisplay) {
ramindani476314c2022-03-16 00:17:08 +0000555 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
556 GTEST_SUCCEED() << "Boot Display Config not supported";
557 return;
558 }
ramindani431aad42022-02-01 21:44:29 +0000559 const auto& status = mComposerClient->clearBootDisplayConfig(getInvalidDisplayId());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100560
ramindani431aad42022-02-01 21:44:29 +0000561 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000562 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100563}
564
ramindani431aad42022-02-01 21:44:29 +0000565TEST_P(GraphicsComposerAidlTest, ClearBootDisplayConfig) {
ramindani476314c2022-03-16 00:17:08 +0000566 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
567 GTEST_SUCCEED() << "Boot Display Config not supported";
568 return;
569 }
ramindani431aad42022-02-01 21:44:29 +0000570 EXPECT_TRUE(mComposerClient->clearBootDisplayConfig(getPrimaryDisplayId()).isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100571}
572
ramindani431aad42022-02-01 21:44:29 +0000573TEST_P(GraphicsComposerAidlTest, GetPreferredBootDisplayConfig_BadDisplay) {
ramindani476314c2022-03-16 00:17:08 +0000574 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
575 GTEST_SUCCEED() << "Boot Display Config not supported";
576 return;
577 }
ramindani431aad42022-02-01 21:44:29 +0000578 const auto& [status, _] = mComposerClient->getPreferredBootDisplayConfig(getInvalidDisplayId());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100579
ramindani431aad42022-02-01 21:44:29 +0000580 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000581 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100582}
583
ramindani431aad42022-02-01 21:44:29 +0000584TEST_P(GraphicsComposerAidlTest, GetPreferredBootDisplayConfig) {
ramindani476314c2022-03-16 00:17:08 +0000585 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
586 GTEST_SUCCEED() << "Boot Display Config not supported";
587 return;
588 }
ramindani431aad42022-02-01 21:44:29 +0000589 const auto& [status, preferredDisplayConfig] =
590 mComposerClient->getPreferredBootDisplayConfig(getPrimaryDisplayId());
591 EXPECT_TRUE(status.isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100592
ramindani431aad42022-02-01 21:44:29 +0000593 const auto& [configStatus, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
594
595 EXPECT_TRUE(configStatus.isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100596 EXPECT_NE(configs.end(), std::find(configs.begin(), configs.end(), preferredDisplayConfig));
597}
598
ramindani476314c2022-03-16 00:17:08 +0000599TEST_P(GraphicsComposerAidlTest, BootDisplayConfig_Unsupported) {
600 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
601 const auto& [configStatus, config] =
602 mComposerClient->getActiveConfig(getPrimaryDisplayId());
603 EXPECT_TRUE(configStatus.isOk());
604
605 auto status = mComposerClient->setBootDisplayConfig(getPrimaryDisplayId(), config);
606 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000607 EXPECT_NO_FATAL_FAILURE(
608 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani476314c2022-03-16 00:17:08 +0000609
610 status = mComposerClient->getPreferredBootDisplayConfig(getPrimaryDisplayId()).first;
611 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000612 EXPECT_NO_FATAL_FAILURE(
613 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani476314c2022-03-16 00:17:08 +0000614
615 status = mComposerClient->clearBootDisplayConfig(getPrimaryDisplayId());
616 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000617 EXPECT_NO_FATAL_FAILURE(
618 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani476314c2022-03-16 00:17:08 +0000619 }
620}
621
ramindani431aad42022-02-01 21:44:29 +0000622TEST_P(GraphicsComposerAidlTest, SetAutoLowLatencyMode_BadDisplay) {
623 auto status = mComposerClient->setAutoLowLatencyMode(getInvalidDisplayId(), /*isEnabled*/ true);
624 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000625 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani431aad42022-02-01 21:44:29 +0000626
627 status = mComposerClient->setAutoLowLatencyMode(getInvalidDisplayId(), /*isEnabled*/ false);
628 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000629 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000630}
631
ramindani431aad42022-02-01 21:44:29 +0000632TEST_P(GraphicsComposerAidlTest, SetAutoLowLatencyMode) {
ramindani0291f112021-11-04 03:45:46 +0000633 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000634 const auto& [status, capabilities] =
635 mComposerClient->getDisplayCapabilities(display.getDisplayId());
636 ASSERT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000637
638 const bool allmSupport =
639 std::find(capabilities.begin(), capabilities.end(),
640 DisplayCapability::AUTO_LOW_LATENCY_MODE) != capabilities.end();
641
642 if (!allmSupport) {
ramindani431aad42022-02-01 21:44:29 +0000643 const auto& statusIsOn = mComposerClient->setAutoLowLatencyMode(display.getDisplayId(),
644 /*isEnabled*/ true);
645 EXPECT_FALSE(statusIsOn.isOk());
ramindanid5751092022-04-22 22:30:20 +0000646 EXPECT_NO_FATAL_FAILURE(
647 assertServiceSpecificError(statusIsOn, IComposerClient::EX_UNSUPPORTED));
ramindani431aad42022-02-01 21:44:29 +0000648 const auto& statusIsOff = mComposerClient->setAutoLowLatencyMode(display.getDisplayId(),
649 /*isEnabled*/ false);
650 EXPECT_FALSE(statusIsOff.isOk());
ramindanid5751092022-04-22 22:30:20 +0000651 EXPECT_NO_FATAL_FAILURE(
652 assertServiceSpecificError(statusIsOff, IComposerClient::EX_UNSUPPORTED));
ramindani0291f112021-11-04 03:45:46 +0000653 GTEST_SUCCEED() << "Auto Low Latency Mode is not supported on display "
ramindani431aad42022-02-01 21:44:29 +0000654 << std::to_string(display.getDisplayId()) << ", skipping test";
ramindani0291f112021-11-04 03:45:46 +0000655 return;
656 }
657
ramindani431aad42022-02-01 21:44:29 +0000658 EXPECT_TRUE(mComposerClient->setAutoLowLatencyMode(display.getDisplayId(), true).isOk());
659 EXPECT_TRUE(mComposerClient->setAutoLowLatencyMode(display.getDisplayId(), false).isOk());
ramindani0291f112021-11-04 03:45:46 +0000660 }
661}
662
ramindani431aad42022-02-01 21:44:29 +0000663TEST_P(GraphicsComposerAidlTest, GetSupportedContentTypes_BadDisplay) {
664 const auto& [status, _] = mComposerClient->getSupportedContentTypes(getInvalidDisplayId());
665
666 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000667 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000668}
669
ramindani431aad42022-02-01 21:44:29 +0000670TEST_P(GraphicsComposerAidlTest, GetSupportedContentTypes) {
ramindani0291f112021-11-04 03:45:46 +0000671 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000672 const auto& [status, supportedContentTypes] =
673 mComposerClient->getSupportedContentTypes(display.getDisplayId());
674 ASSERT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000675
676 const bool noneSupported =
677 std::find(supportedContentTypes.begin(), supportedContentTypes.end(),
678 ContentType::NONE) != supportedContentTypes.end();
ramindani431aad42022-02-01 21:44:29 +0000679
ramindani0291f112021-11-04 03:45:46 +0000680 EXPECT_FALSE(noneSupported);
681 }
682}
683
ramindani431aad42022-02-01 21:44:29 +0000684TEST_P(GraphicsComposerAidlTest, SetContentTypeNoneAlwaysAccepted) {
ramindani0291f112021-11-04 03:45:46 +0000685 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000686 EXPECT_TRUE(
687 mComposerClient->setContentType(display.getDisplayId(), ContentType::NONE).isOk());
ramindani0291f112021-11-04 03:45:46 +0000688 }
689}
690
ramindani431aad42022-02-01 21:44:29 +0000691TEST_P(GraphicsComposerAidlTest, SetContentType_BadDisplay) {
ramindani0291f112021-11-04 03:45:46 +0000692 constexpr ContentType types[] = {ContentType::NONE, ContentType::GRAPHICS, ContentType::PHOTO,
693 ContentType::CINEMA, ContentType::GAME};
694 for (const auto& type : types) {
ramindani431aad42022-02-01 21:44:29 +0000695 const auto& status = mComposerClient->setContentType(getInvalidDisplayId(), type);
ramindani0291f112021-11-04 03:45:46 +0000696
ramindani431aad42022-02-01 21:44:29 +0000697 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000698 EXPECT_NO_FATAL_FAILURE(
699 assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000700 }
701}
702
ramindani431aad42022-02-01 21:44:29 +0000703TEST_P(GraphicsComposerAidlTest, SetGraphicsContentType) {
ramindani0291f112021-11-04 03:45:46 +0000704 Test_setContentType(ContentType::GRAPHICS, "GRAPHICS");
705}
706
ramindani431aad42022-02-01 21:44:29 +0000707TEST_P(GraphicsComposerAidlTest, SetPhotoContentType) {
ramindani0291f112021-11-04 03:45:46 +0000708 Test_setContentType(ContentType::PHOTO, "PHOTO");
709}
710
ramindani431aad42022-02-01 21:44:29 +0000711TEST_P(GraphicsComposerAidlTest, SetCinemaContentType) {
ramindani0291f112021-11-04 03:45:46 +0000712 Test_setContentType(ContentType::CINEMA, "CINEMA");
713}
714
ramindani431aad42022-02-01 21:44:29 +0000715TEST_P(GraphicsComposerAidlTest, SetGameContentType) {
ramindani0291f112021-11-04 03:45:46 +0000716 Test_setContentType(ContentType::GAME, "GAME");
717}
718
ramindanic2b8d082021-11-06 02:03:50 +0000719TEST_P(GraphicsComposerAidlTest, CreateVirtualDisplay) {
ramindani431aad42022-02-01 21:44:29 +0000720 const auto& [status, maxVirtualDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
721 EXPECT_TRUE(status.isOk());
722
ramindanic2b8d082021-11-06 02:03:50 +0000723 if (maxVirtualDisplayCount == 0) {
724 GTEST_SUCCEED() << "no virtual display support";
725 return;
726 }
727
ramindani431aad42022-02-01 21:44:29 +0000728 const auto& [virtualDisplayStatus, virtualDisplay] = mComposerClient->createVirtualDisplay(
729 /*width*/ 64, /*height*/ 64, common::PixelFormat::IMPLEMENTATION_DEFINED,
730 kBufferSlotCount);
ramindanic2b8d082021-11-06 02:03:50 +0000731
ramindani431aad42022-02-01 21:44:29 +0000732 ASSERT_TRUE(virtualDisplayStatus.isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000733 EXPECT_TRUE(mComposerClient->destroyVirtualDisplay(virtualDisplay.display).isOk());
734}
735
ramindani431aad42022-02-01 21:44:29 +0000736TEST_P(GraphicsComposerAidlTest, DestroyVirtualDisplay_BadDisplay) {
737 const auto& [status, maxDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
738 EXPECT_TRUE(status.isOk());
739
ramindani2740bac2021-11-24 22:58:32 +0000740 if (maxDisplayCount == 0) {
741 GTEST_SUCCEED() << "no virtual display support";
742 return;
743 }
ramindani2740bac2021-11-24 22:58:32 +0000744
ramindani431aad42022-02-01 21:44:29 +0000745 const auto& destroyStatus = mComposerClient->destroyVirtualDisplay(getInvalidDisplayId());
746
747 EXPECT_FALSE(destroyStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000748 EXPECT_NO_FATAL_FAILURE(
749 assertServiceSpecificError(destroyStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000750}
751
752TEST_P(GraphicsComposerAidlTest, CreateLayer) {
ramindani431aad42022-02-01 21:44:29 +0000753 const auto& [status, layer] =
754 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
ramindani2740bac2021-11-24 22:58:32 +0000755
ramindani431aad42022-02-01 21:44:29 +0000756 EXPECT_TRUE(status.isOk());
757 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000758}
759
ramindani431aad42022-02-01 21:44:29 +0000760TEST_P(GraphicsComposerAidlTest, CreateLayer_BadDisplay) {
761 const auto& [status, _] = mComposerClient->createLayer(getInvalidDisplayId(), kBufferSlotCount);
ramindani2740bac2021-11-24 22:58:32 +0000762
ramindani431aad42022-02-01 21:44:29 +0000763 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000764 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000765}
766
ramindani431aad42022-02-01 21:44:29 +0000767TEST_P(GraphicsComposerAidlTest, DestroyLayer_BadDisplay) {
768 const auto& [status, layer] =
769 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
770 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000771
ramindani431aad42022-02-01 21:44:29 +0000772 const auto& destroyStatus = mComposerClient->destroyLayer(getInvalidDisplayId(), layer);
ramindani2740bac2021-11-24 22:58:32 +0000773
ramindani431aad42022-02-01 21:44:29 +0000774 EXPECT_FALSE(destroyStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000775 EXPECT_NO_FATAL_FAILURE(
776 assertServiceSpecificError(destroyStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani431aad42022-02-01 21:44:29 +0000777 ASSERT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000778}
779
ramindani431aad42022-02-01 21:44:29 +0000780TEST_P(GraphicsComposerAidlTest, DestroyLayer_BadLayerError) {
ramindani2740bac2021-11-24 22:58:32 +0000781 // We haven't created any layers yet, so any id should be invalid
ramindani431aad42022-02-01 21:44:29 +0000782 const auto& status = mComposerClient->destroyLayer(getPrimaryDisplayId(), /*layer*/ 1);
ramindani2740bac2021-11-24 22:58:32 +0000783
ramindani431aad42022-02-01 21:44:29 +0000784 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000785 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_LAYER));
ramindani2740bac2021-11-24 22:58:32 +0000786}
787
ramindani431aad42022-02-01 21:44:29 +0000788TEST_P(GraphicsComposerAidlTest, GetActiveConfig_BadDisplay) {
789 const auto& [status, _] = mComposerClient->getActiveConfig(getInvalidDisplayId());
ramindani2740bac2021-11-24 22:58:32 +0000790
ramindani431aad42022-02-01 21:44:29 +0000791 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000792 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000793}
794
795TEST_P(GraphicsComposerAidlTest, GetDisplayConfig) {
ramindani431aad42022-02-01 21:44:29 +0000796 const auto& [status, _] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
797 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000798}
799
ramindani431aad42022-02-01 21:44:29 +0000800TEST_P(GraphicsComposerAidlTest, GetDisplayConfig_BadDisplay) {
801 const auto& [status, _] = mComposerClient->getDisplayConfigs(getInvalidDisplayId());
ramindani2740bac2021-11-24 22:58:32 +0000802
ramindani431aad42022-02-01 21:44:29 +0000803 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000804 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000805}
806
807TEST_P(GraphicsComposerAidlTest, GetDisplayName) {
ramindani431aad42022-02-01 21:44:29 +0000808 const auto& [status, _] = mComposerClient->getDisplayName(getPrimaryDisplayId());
809 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000810}
811
Sally Qi8ec063f2022-11-12 11:18:56 -0800812TEST_P(GraphicsComposerAidlTest, GetOverlaySupport) {
Sally Qi2600d342022-08-16 12:46:17 -0700813 const auto& [status, _] = mComposerClient->getOverlaySupport();
814 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
815 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
816 GTEST_SUCCEED() << "getOverlaySupport is not supported";
817 return;
818 }
819
820 ASSERT_TRUE(status.isOk());
821}
822
ramindani431aad42022-02-01 21:44:29 +0000823TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation_BadDisplay) {
824 const auto& [status, _] = mComposerClient->getDisplayPhysicalOrientation(getInvalidDisplayId());
Ady Abrahamae12e382022-01-13 18:06:21 -0800825
ramindani431aad42022-02-01 21:44:29 +0000826 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000827 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Ady Abrahamae12e382022-01-13 18:06:21 -0800828}
829
830TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation) {
831 const auto allowedDisplayOrientations = std::array<Transform, 4>{
832 Transform::NONE,
833 Transform::ROT_90,
834 Transform::ROT_180,
835 Transform::ROT_270,
836 };
837
ramindani431aad42022-02-01 21:44:29 +0000838 const auto& [status, displayOrientation] =
839 mComposerClient->getDisplayPhysicalOrientation(getPrimaryDisplayId());
Ady Abrahamae12e382022-01-13 18:06:21 -0800840
ramindani431aad42022-02-01 21:44:29 +0000841 EXPECT_TRUE(status.isOk());
Ady Abrahamae12e382022-01-13 18:06:21 -0800842 EXPECT_NE(std::find(allowedDisplayOrientations.begin(), allowedDisplayOrientations.end(),
843 displayOrientation),
844 allowedDisplayOrientations.end());
845}
846
ramindani2740bac2021-11-24 22:58:32 +0000847TEST_P(GraphicsComposerAidlTest, SetClientTargetSlotCount) {
ramindani431aad42022-02-01 21:44:29 +0000848 EXPECT_TRUE(mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kBufferSlotCount)
849 .isOk());
ramindani2740bac2021-11-24 22:58:32 +0000850}
851
852TEST_P(GraphicsComposerAidlTest, SetActiveConfig) {
ramindani431aad42022-02-01 21:44:29 +0000853 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
854 EXPECT_TRUE(status.isOk());
855
856 for (const auto& config : configs) {
857 auto display = getEditablePrimaryDisplay();
858 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
859 const auto& [configStatus, config1] =
860 mComposerClient->getActiveConfig(getPrimaryDisplayId());
861 EXPECT_TRUE(configStatus.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000862 EXPECT_EQ(config, config1);
863 }
864}
865
866TEST_P(GraphicsComposerAidlTest, SetActiveConfigPowerCycle) {
ramindani431aad42022-02-01 21:44:29 +0000867 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
868 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000869
ramindani431aad42022-02-01 21:44:29 +0000870 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
871 EXPECT_TRUE(status.isOk());
872
873 for (const auto& config : configs) {
874 auto display = getEditablePrimaryDisplay();
875 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
876 const auto& [config1Status, config1] =
877 mComposerClient->getActiveConfig(getPrimaryDisplayId());
878 EXPECT_TRUE(config1Status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000879 EXPECT_EQ(config, config1);
880
ramindani431aad42022-02-01 21:44:29 +0000881 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
882 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
883 const auto& [config2Status, config2] =
884 mComposerClient->getActiveConfig(getPrimaryDisplayId());
885 EXPECT_TRUE(config2Status.isOk());
886 EXPECT_EQ(config, config2);
ramindani2740bac2021-11-24 22:58:32 +0000887 }
888}
889
ramindani2740bac2021-11-24 22:58:32 +0000890TEST_P(GraphicsComposerAidlTest, SetPowerModeUnsupported) {
ramindani431aad42022-02-01 21:44:29 +0000891 const auto& [status, capabilities] =
892 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
893 ASSERT_TRUE(status.isOk());
894
Ady Abraham6679baf2021-12-08 18:28:27 -0800895 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
896 DisplayCapability::DOZE) != capabilities.end();
897 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
898 DisplayCapability::SUSPEND) != capabilities.end();
ramindani2740bac2021-11-24 22:58:32 +0000899
ramindani431aad42022-02-01 21:44:29 +0000900 if (!isDozeSupported) {
901 const auto& powerModeDozeStatus =
902 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE);
903 EXPECT_FALSE(powerModeDozeStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000904 EXPECT_NO_FATAL_FAILURE(
905 assertServiceSpecificError(powerModeDozeStatus, IComposerClient::EX_UNSUPPORTED));
ramindani431aad42022-02-01 21:44:29 +0000906
907 const auto& powerModeDozeSuspendStatus =
908 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
909 EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000910 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeDozeSuspendStatus,
911 IComposerClient::EX_UNSUPPORTED));
ramindani2740bac2021-11-24 22:58:32 +0000912 }
Ady Abraham6679baf2021-12-08 18:28:27 -0800913
914 if (!isSuspendSupported) {
ramindani431aad42022-02-01 21:44:29 +0000915 const auto& powerModeSuspendStatus =
916 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON_SUSPEND);
917 EXPECT_FALSE(powerModeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000918 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeSuspendStatus,
919 IComposerClient::EX_UNSUPPORTED));
Ady Abraham6679baf2021-12-08 18:28:27 -0800920
ramindani431aad42022-02-01 21:44:29 +0000921 const auto& powerModeDozeSuspendStatus =
922 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
923 EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000924 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeDozeSuspendStatus,
925 IComposerClient::EX_UNSUPPORTED));
Ady Abraham6679baf2021-12-08 18:28:27 -0800926 }
ramindani2740bac2021-11-24 22:58:32 +0000927}
928
929TEST_P(GraphicsComposerAidlTest, SetVsyncEnabled) {
ramindani431aad42022-02-01 21:44:29 +0000930 mComposerClient->setVsyncAllowed(true);
ramindani2740bac2021-11-24 22:58:32 +0000931
ramindani431aad42022-02-01 21:44:29 +0000932 EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), true).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000933 usleep(60 * 1000);
ramindani431aad42022-02-01 21:44:29 +0000934 EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), false).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000935
ramindani431aad42022-02-01 21:44:29 +0000936 mComposerClient->setVsyncAllowed(false);
ramindani2740bac2021-11-24 22:58:32 +0000937}
938
ramindanic2b8d082021-11-06 02:03:50 +0000939TEST_P(GraphicsComposerAidlTest, SetPowerMode) {
ramindani431aad42022-02-01 21:44:29 +0000940 const auto& [status, capabilities] =
941 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
942 ASSERT_TRUE(status.isOk());
943
Ady Abraham6679baf2021-12-08 18:28:27 -0800944 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
945 DisplayCapability::DOZE) != capabilities.end();
946 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
947 DisplayCapability::SUSPEND) != capabilities.end();
948
ramindanic2b8d082021-11-06 02:03:50 +0000949 std::vector<PowerMode> modes;
950 modes.push_back(PowerMode::OFF);
ramindanic2b8d082021-11-06 02:03:50 +0000951 modes.push_back(PowerMode::ON);
952
Ady Abraham6679baf2021-12-08 18:28:27 -0800953 if (isSuspendSupported) {
954 modes.push_back(PowerMode::ON_SUSPEND);
955 }
956
ramindani770d7082021-11-30 00:36:42 +0000957 if (isDozeSupported) {
958 modes.push_back(PowerMode::DOZE);
Ady Abraham6679baf2021-12-08 18:28:27 -0800959 }
960
961 if (isSuspendSupported && isDozeSupported) {
ramindani770d7082021-11-30 00:36:42 +0000962 modes.push_back(PowerMode::DOZE_SUSPEND);
963 }
964
ramindanic2b8d082021-11-06 02:03:50 +0000965 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000966 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000967 }
968}
969
970TEST_P(GraphicsComposerAidlTest, SetPowerModeVariations) {
ramindani431aad42022-02-01 21:44:29 +0000971 const auto& [status, capabilities] =
972 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
973 ASSERT_TRUE(status.isOk());
974
Ady Abraham6679baf2021-12-08 18:28:27 -0800975 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
976 DisplayCapability::DOZE) != capabilities.end();
977 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
978 DisplayCapability::SUSPEND) != capabilities.end();
979
ramindanic2b8d082021-11-06 02:03:50 +0000980 std::vector<PowerMode> modes;
981
982 modes.push_back(PowerMode::OFF);
ramindani770d7082021-11-30 00:36:42 +0000983 modes.push_back(PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +0000984 modes.push_back(PowerMode::OFF);
ramindanic2b8d082021-11-06 02:03:50 +0000985 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000986 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000987 }
ramindani770d7082021-11-30 00:36:42 +0000988 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +0000989
ramindani770d7082021-11-30 00:36:42 +0000990 modes.push_back(PowerMode::OFF);
991 modes.push_back(PowerMode::OFF);
992 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000993 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindani770d7082021-11-30 00:36:42 +0000994 }
ramindanic2b8d082021-11-06 02:03:50 +0000995 modes.clear();
996
997 modes.push_back(PowerMode::ON);
998 modes.push_back(PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +0000999 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001000 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001001 }
ramindanic2b8d082021-11-06 02:03:50 +00001002 modes.clear();
1003
Ady Abraham6679baf2021-12-08 18:28:27 -08001004 if (isSuspendSupported) {
1005 modes.push_back(PowerMode::ON_SUSPEND);
1006 modes.push_back(PowerMode::ON_SUSPEND);
1007 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001008 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
Ady Abraham6679baf2021-12-08 18:28:27 -08001009 }
1010 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +00001011 }
1012
ramindanic2b8d082021-11-06 02:03:50 +00001013 if (isDozeSupported) {
ramindanic2b8d082021-11-06 02:03:50 +00001014 modes.push_back(PowerMode::DOZE);
1015 modes.push_back(PowerMode::DOZE);
ramindanic2b8d082021-11-06 02:03:50 +00001016 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001017 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001018 }
ramindanic2b8d082021-11-06 02:03:50 +00001019 modes.clear();
Ady Abraham6679baf2021-12-08 18:28:27 -08001020 }
ramindanic2b8d082021-11-06 02:03:50 +00001021
Ady Abraham6679baf2021-12-08 18:28:27 -08001022 if (isSuspendSupported && isDozeSupported) {
ramindanic2b8d082021-11-06 02:03:50 +00001023 modes.push_back(PowerMode::DOZE_SUSPEND);
1024 modes.push_back(PowerMode::DOZE_SUSPEND);
ramindanic2b8d082021-11-06 02:03:50 +00001025 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001026 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001027 }
Ady Abraham6679baf2021-12-08 18:28:27 -08001028 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +00001029 }
1030}
1031
ramindani431aad42022-02-01 21:44:29 +00001032TEST_P(GraphicsComposerAidlTest, SetPowerMode_BadDisplay) {
1033 const auto& status = mComposerClient->setPowerMode(getInvalidDisplayId(), PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +00001034
ramindani431aad42022-02-01 21:44:29 +00001035 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001036 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindanic2b8d082021-11-06 02:03:50 +00001037}
1038
ramindani431aad42022-02-01 21:44:29 +00001039TEST_P(GraphicsComposerAidlTest, SetPowerMode_BadParameter) {
1040 const auto& status =
1041 mComposerClient->setPowerMode(getPrimaryDisplayId(), static_cast<PowerMode>(-1));
ramindanic2b8d082021-11-06 02:03:50 +00001042
ramindani431aad42022-02-01 21:44:29 +00001043 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001044 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanic2b8d082021-11-06 02:03:50 +00001045}
1046
ramindanic2b8d082021-11-06 02:03:50 +00001047TEST_P(GraphicsComposerAidlTest, GetDataspaceSaturationMatrix) {
ramindani431aad42022-02-01 21:44:29 +00001048 const auto& [status, matrix] =
1049 mComposerClient->getDataspaceSaturationMatrix(common::Dataspace::SRGB_LINEAR);
1050 ASSERT_TRUE(status.isOk());
1051 ASSERT_EQ(16, matrix.size()); // matrix should not be empty if call succeeded.
ramindanideb059e2021-11-18 01:57:25 +00001052
ramindanic2b8d082021-11-06 02:03:50 +00001053 // the last row is known
ramindani431aad42022-02-01 21:44:29 +00001054 EXPECT_EQ(0.0f, matrix[12]);
1055 EXPECT_EQ(0.0f, matrix[13]);
1056 EXPECT_EQ(0.0f, matrix[14]);
1057 EXPECT_EQ(1.0f, matrix[15]);
ramindanic2b8d082021-11-06 02:03:50 +00001058}
1059
ramindani431aad42022-02-01 21:44:29 +00001060TEST_P(GraphicsComposerAidlTest, GetDataspaceSaturationMatrix_BadParameter) {
1061 const auto& [status, matrix] =
1062 mComposerClient->getDataspaceSaturationMatrix(common::Dataspace::UNKNOWN);
ramindanic2b8d082021-11-06 02:03:50 +00001063
ramindani431aad42022-02-01 21:44:29 +00001064 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001065 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanic2b8d082021-11-06 02:03:50 +00001066}
1067
ramindanidcfe3a82021-11-29 17:00:31 +00001068// Tests for Command.
1069class GraphicsComposerAidlCommandTest : public GraphicsComposerAidlTest {
1070 protected:
ramindanidcfe3a82021-11-29 17:00:31 +00001071 void TearDown() override {
Ady Abraham3192f3d2021-12-03 16:08:56 -08001072 const auto errors = mReader.takeErrors();
1073 ASSERT_TRUE(mReader.takeErrors().empty());
ramindani431aad42022-02-01 21:44:29 +00001074 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001075
ramindanidcfe3a82021-11-29 17:00:31 +00001076 ASSERT_NO_FATAL_FAILURE(GraphicsComposerAidlTest::TearDown());
1077 }
1078
1079 void execute() {
Ady Abraham3192f3d2021-12-03 16:08:56 -08001080 const auto& commands = mWriter.getPendingCommands();
1081 if (commands.empty()) {
1082 mWriter.reset();
1083 return;
ramindanidcfe3a82021-11-29 17:00:31 +00001084 }
1085
ramindani431aad42022-02-01 21:44:29 +00001086 auto [status, results] = mComposerClient->executeCommands(commands);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001087 ASSERT_TRUE(status.isOk()) << "executeCommands failed " << status.getDescription();
ramindanidcfe3a82021-11-29 17:00:31 +00001088
Ady Abraham46219f52021-12-20 09:44:31 -08001089 mReader.parse(std::move(results));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001090 mWriter.reset();
ramindanidcfe3a82021-11-29 17:00:31 +00001091 }
1092
1093 static inline auto toTimePoint(nsecs_t time) {
1094 return std::chrono::time_point<std::chrono::steady_clock>(std::chrono::nanoseconds(time));
1095 }
1096
ramindanidcfe3a82021-11-29 17:00:31 +00001097 void forEachTwoConfigs(int64_t display, std::function<void(int32_t, int32_t)> func) {
ramindani431aad42022-02-01 21:44:29 +00001098 const auto& [status, displayConfigs] = mComposerClient->getDisplayConfigs(display);
1099 ASSERT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001100 for (const int32_t config1 : displayConfigs) {
1101 for (const int32_t config2 : displayConfigs) {
1102 if (config1 != config2) {
1103 func(config1, config2);
1104 }
1105 }
1106 }
1107 }
1108
1109 void waitForVsyncPeriodChange(int64_t display, const VsyncPeriodChangeTimeline& timeline,
1110 int64_t desiredTimeNanos, int64_t oldPeriodNanos,
1111 int64_t newPeriodNanos) {
1112 const auto kChangeDeadline = toTimePoint(timeline.newVsyncAppliedTimeNanos) + 100ms;
1113 while (std::chrono::steady_clock::now() <= kChangeDeadline) {
ramindani431aad42022-02-01 21:44:29 +00001114 const auto& [status, vsyncPeriodNanos] =
1115 mComposerClient->getDisplayVsyncPeriod(display);
1116 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001117 if (systemTime() <= desiredTimeNanos) {
1118 EXPECT_EQ(vsyncPeriodNanos, oldPeriodNanos);
1119 } else if (vsyncPeriodNanos == newPeriodNanos) {
1120 break;
1121 }
1122 std::this_thread::sleep_for(std::chrono::nanoseconds(oldPeriodNanos));
1123 }
1124 }
1125
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001126 sp<GraphicBuffer> allocate(::android::PixelFormat pixelFormat) {
ramindanidcfe3a82021-11-29 17:00:31 +00001127 return sp<GraphicBuffer>::make(
ramindani431aad42022-02-01 21:44:29 +00001128 static_cast<uint32_t>(getPrimaryDisplay().getDisplayWidth()),
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001129 static_cast<uint32_t>(getPrimaryDisplay().getDisplayHeight()), pixelFormat,
ramindani431aad42022-02-01 21:44:29 +00001130 /*layerCount*/ 1U,
ramindanidcfe3a82021-11-29 17:00:31 +00001131 (static_cast<uint64_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
1132 static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
1133 static_cast<uint64_t>(common::BufferUsage::COMPOSER_OVERLAY)),
1134 "VtsHalGraphicsComposer3_TargetTest");
1135 }
1136
1137 void sendRefreshFrame(const VtsDisplay& display, const VsyncPeriodChangeTimeline* timeline) {
1138 if (timeline != nullptr) {
1139 // Refresh time should be before newVsyncAppliedTimeNanos
1140 EXPECT_LT(timeline->refreshTimeNanos, timeline->newVsyncAppliedTimeNanos);
1141
1142 std::this_thread::sleep_until(toTimePoint(timeline->refreshTimeNanos));
1143 }
1144
ramindani431aad42022-02-01 21:44:29 +00001145 EXPECT_TRUE(mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::ON).isOk());
1146 EXPECT_TRUE(mComposerClient
1147 ->setColorMode(display.getDisplayId(), ColorMode::NATIVE,
1148 RenderIntent::COLORIMETRIC)
1149 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001150
ramindani431aad42022-02-01 21:44:29 +00001151 const auto& [status, layer] =
1152 mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount);
1153 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001154 {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001155 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindanidcfe3a82021-11-29 17:00:31 +00001156 ASSERT_NE(nullptr, buffer);
1157 ASSERT_EQ(::android::OK, buffer->initCheck());
1158 ASSERT_NE(nullptr, buffer->handle);
1159
ramindani431aad42022-02-01 21:44:29 +00001160 configureLayer(display, layer, Composition::DEVICE, display.getFrameRect(),
1161 display.getCrop());
1162 mWriter.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer->handle,
1163 /*acquireFence*/ -1);
1164 mWriter.setLayerDataspace(display.getDisplayId(), layer, common::Dataspace::UNKNOWN);
ramindanidcfe3a82021-11-29 17:00:31 +00001165
ramindani431aad42022-02-01 21:44:29 +00001166 mWriter.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001167 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001168 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001169
ramindani431aad42022-02-01 21:44:29 +00001170 mWriter.presentDisplay(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001171 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001172 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001173 }
1174
1175 {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001176 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindanidcfe3a82021-11-29 17:00:31 +00001177 ASSERT_NE(nullptr, buffer->handle);
1178
ramindani431aad42022-02-01 21:44:29 +00001179 mWriter.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer->handle,
1180 /*acquireFence*/ -1);
1181 mWriter.setLayerSurfaceDamage(display.getDisplayId(), layer,
Ady Abraham3192f3d2021-12-03 16:08:56 -08001182 std::vector<Rect>(1, {0, 0, 10, 10}));
ramindani431aad42022-02-01 21:44:29 +00001183 mWriter.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001184 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001185 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001186
ramindani431aad42022-02-01 21:44:29 +00001187 mWriter.presentDisplay(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001188 execute();
1189 }
1190
ramindani431aad42022-02-01 21:44:29 +00001191 EXPECT_TRUE(mComposerClient->destroyLayer(display.getDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001192 }
1193
Ady Abraham72c5b502021-12-10 17:23:39 -08001194 sp<::android::Fence> presentAndGetFence(
1195 std::optional<ClockMonotonicTimestamp> expectedPresentTime) {
ramindani431aad42022-02-01 21:44:29 +00001196 mWriter.validateDisplay(getPrimaryDisplayId(), expectedPresentTime);
Ady Abraham72c5b502021-12-10 17:23:39 -08001197 execute();
1198 EXPECT_TRUE(mReader.takeErrors().empty());
1199
ramindani431aad42022-02-01 21:44:29 +00001200 mWriter.presentDisplay(getPrimaryDisplayId());
Ady Abraham72c5b502021-12-10 17:23:39 -08001201 execute();
1202 EXPECT_TRUE(mReader.takeErrors().empty());
1203
ramindani431aad42022-02-01 21:44:29 +00001204 auto presentFence = mReader.takePresentFence(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -08001205 // take ownership
1206 const int fenceOwner = presentFence.get();
1207 *presentFence.getR() = -1;
1208 EXPECT_NE(-1, fenceOwner);
1209 return sp<::android::Fence>::make(fenceOwner);
Ady Abraham72c5b502021-12-10 17:23:39 -08001210 }
1211
1212 int32_t getVsyncPeriod() {
ramindani431aad42022-02-01 21:44:29 +00001213 const auto& [status, activeConfig] =
1214 mComposerClient->getActiveConfig(getPrimaryDisplayId());
1215 EXPECT_TRUE(status.isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001216
ramindani431aad42022-02-01 21:44:29 +00001217 const auto& [vsyncPeriodStatus, vsyncPeriod] = mComposerClient->getDisplayAttribute(
1218 getPrimaryDisplayId(), activeConfig, DisplayAttribute::VSYNC_PERIOD);
1219 EXPECT_TRUE(vsyncPeriodStatus.isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001220 return vsyncPeriod;
1221 }
1222
1223 int64_t createOnScreenLayer() {
ramindani431aad42022-02-01 21:44:29 +00001224 const auto& [status, layer] =
1225 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1226 EXPECT_TRUE(status.isOk());
1227 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1228 getPrimaryDisplay().getDisplayHeight()};
1229 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1230 (float)getPrimaryDisplay().getDisplayHeight()};
1231 configureLayer(getPrimaryDisplay(), layer, Composition::DEVICE, displayFrame, cropRect);
1232 mWriter.setLayerDataspace(getPrimaryDisplayId(), layer, common::Dataspace::UNKNOWN);
Ady Abraham72c5b502021-12-10 17:23:39 -08001233 return layer;
1234 }
1235
Midas Chiena0b56bd2022-01-13 23:27:33 +08001236 bool hasDisplayCapability(int64_t display, DisplayCapability cap) {
ramindani431aad42022-02-01 21:44:29 +00001237 const auto& [status, capabilities] = mComposerClient->getDisplayCapabilities(display);
1238 EXPECT_TRUE(status.isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08001239
1240 return std::find(capabilities.begin(), capabilities.end(), cap) != capabilities.end();
1241 }
1242
ramindanidcfe3a82021-11-29 17:00:31 +00001243 void Test_setActiveConfigWithConstraints(const TestParameters& params) {
1244 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00001245 forEachTwoConfigs(display.getDisplayId(), [&](int32_t config1, int32_t config2) {
1246 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001247 sendRefreshFrame(display, nullptr);
1248
ramindani431aad42022-02-01 21:44:29 +00001249 const auto displayConfigGroup1 = display.getDisplayConfig(config1);
1250 int32_t vsyncPeriod1 = displayConfigGroup1.vsyncPeriod;
1251 int32_t configGroup1 = displayConfigGroup1.configGroup;
1252
1253 const auto displayConfigGroup2 = display.getDisplayConfig(config2);
1254 int32_t vsyncPeriod2 = displayConfigGroup2.vsyncPeriod;
1255 int32_t configGroup2 = displayConfigGroup2.configGroup;
ramindanidcfe3a82021-11-29 17:00:31 +00001256
1257 if (vsyncPeriod1 == vsyncPeriod2) {
1258 return; // continue
1259 }
1260
1261 // We don't allow delayed change when changing config groups
1262 if (params.delayForChange > 0 && configGroup1 != configGroup2) {
1263 return; // continue
1264 }
1265
ramindanidcfe3a82021-11-29 17:00:31 +00001266 VsyncPeriodChangeConstraints constraints = {
1267 .desiredTimeNanos = systemTime() + params.delayForChange,
1268 .seamlessRequired = false};
ramindani431aad42022-02-01 21:44:29 +00001269 const auto& [status, timeline] = mComposerClient->setActiveConfigWithConstraints(
1270 &display, config2, constraints);
1271 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001272
1273 EXPECT_TRUE(timeline.newVsyncAppliedTimeNanos >= constraints.desiredTimeNanos);
1274 // Refresh rate should change within a reasonable time
1275 constexpr std::chrono::nanoseconds kReasonableTimeForChange = 1s; // 1 second
1276 EXPECT_TRUE(timeline.newVsyncAppliedTimeNanos - constraints.desiredTimeNanos <=
1277 kReasonableTimeForChange.count());
1278
1279 if (timeline.refreshRequired) {
1280 if (params.refreshMiss) {
1281 // Miss the refresh frame on purpose to make sure the implementation sends a
1282 // callback
1283 std::this_thread::sleep_until(toTimePoint(timeline.refreshTimeNanos) +
1284 100ms);
1285 }
1286 sendRefreshFrame(display, &timeline);
1287 }
ramindani431aad42022-02-01 21:44:29 +00001288 waitForVsyncPeriodChange(display.getDisplayId(), timeline,
1289 constraints.desiredTimeNanos, vsyncPeriod1, vsyncPeriod2);
ramindanidcfe3a82021-11-29 17:00:31 +00001290
1291 // At this point the refresh rate should have changed already, however in rare
1292 // cases the implementation might have missed the deadline. In this case a new
1293 // timeline should have been provided.
ramindani431aad42022-02-01 21:44:29 +00001294 auto newTimeline = mComposerClient->takeLastVsyncPeriodChangeTimeline();
ramindanidcfe3a82021-11-29 17:00:31 +00001295 if (timeline.refreshRequired && params.refreshMiss) {
1296 EXPECT_TRUE(newTimeline.has_value());
1297 }
1298
1299 if (newTimeline.has_value()) {
1300 if (newTimeline->refreshRequired) {
1301 sendRefreshFrame(display, &newTimeline.value());
1302 }
ramindani431aad42022-02-01 21:44:29 +00001303 waitForVsyncPeriodChange(display.getDisplayId(), newTimeline.value(),
ramindanidcfe3a82021-11-29 17:00:31 +00001304 constraints.desiredTimeNanos, vsyncPeriod1,
1305 vsyncPeriod2);
1306 }
1307
ramindani431aad42022-02-01 21:44:29 +00001308 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanos] =
1309 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
1310 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001311 EXPECT_EQ(vsyncPeriodNanos, vsyncPeriod2);
1312 });
1313 }
1314 }
1315
Ady Abraham72c5b502021-12-10 17:23:39 -08001316 void Test_expectedPresentTime(std::optional<int> framesDelay) {
Jason Macnak325e8232022-01-24 14:48:55 -08001317 if (hasCapability(Capability::PRESENT_FENCE_IS_NOT_RELIABLE)) {
1318 GTEST_SUCCEED() << "Device has unreliable present fences capability, skipping";
1319 return;
1320 }
1321
ramindani431aad42022-02-01 21:44:29 +00001322 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001323
1324 const auto vsyncPeriod = getVsyncPeriod();
1325
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001326 const auto buffer1 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1327 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
Ady Abraham72c5b502021-12-10 17:23:39 -08001328 ASSERT_NE(nullptr, buffer1);
1329 ASSERT_NE(nullptr, buffer2);
1330
1331 const auto layer = createOnScreenLayer();
ramindani431aad42022-02-01 21:44:29 +00001332 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer1->handle,
1333 /*acquireFence*/ -1);
Ady Abraham72c5b502021-12-10 17:23:39 -08001334 const sp<::android::Fence> presentFence1 =
1335 presentAndGetFence(ComposerClientWriter::kNoTimestamp);
1336 presentFence1->waitForever(LOG_TAG);
1337
1338 auto expectedPresentTime = presentFence1->getSignalTime() + vsyncPeriod;
1339 if (framesDelay.has_value()) {
1340 expectedPresentTime += *framesDelay * vsyncPeriod;
1341 }
1342
ramindani431aad42022-02-01 21:44:29 +00001343 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer2->handle,
1344 /*acquireFence*/ -1);
Ady Abraham72c5b502021-12-10 17:23:39 -08001345 const auto setExpectedPresentTime = [&]() -> std::optional<ClockMonotonicTimestamp> {
1346 if (!framesDelay.has_value()) {
1347 return ComposerClientWriter::kNoTimestamp;
1348 } else if (*framesDelay == 0) {
1349 return ClockMonotonicTimestamp{0};
1350 }
1351 return ClockMonotonicTimestamp{expectedPresentTime};
1352 }();
1353
1354 const sp<::android::Fence> presentFence2 = presentAndGetFence(setExpectedPresentTime);
1355 presentFence2->waitForever(LOG_TAG);
1356
1357 const auto actualPresentTime = presentFence2->getSignalTime();
Ady Abrahamdf084f32022-01-10 14:10:23 -08001358 EXPECT_GE(actualPresentTime, expectedPresentTime - vsyncPeriod / 2);
Ady Abraham72c5b502021-12-10 17:23:39 -08001359
ramindani431aad42022-02-01 21:44:29 +00001360 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001361 }
1362
ramindani431aad42022-02-01 21:44:29 +00001363 void configureLayer(const VtsDisplay& display, int64_t layer, Composition composition,
1364 const Rect& displayFrame, const FRect& cropRect) {
1365 mWriter.setLayerCompositionType(display.getDisplayId(), layer, composition);
1366 mWriter.setLayerDisplayFrame(display.getDisplayId(), layer, displayFrame);
1367 mWriter.setLayerPlaneAlpha(display.getDisplayId(), layer, /*alpha*/ 1);
1368 mWriter.setLayerSourceCrop(display.getDisplayId(), layer, cropRect);
1369 mWriter.setLayerTransform(display.getDisplayId(), layer, static_cast<Transform>(0));
1370 mWriter.setLayerVisibleRegion(display.getDisplayId(), layer,
1371 std::vector<Rect>(1, displayFrame));
1372 mWriter.setLayerZOrder(display.getDisplayId(), layer, /*z*/ 10);
1373 mWriter.setLayerBlendMode(display.getDisplayId(), layer, BlendMode::NONE);
1374 mWriter.setLayerSurfaceDamage(display.getDisplayId(), layer,
1375 std::vector<Rect>(1, displayFrame));
1376 }
ramindanidcfe3a82021-11-29 17:00:31 +00001377 // clang-format off
1378 const std::array<float, 16> kIdentity = {{
1379 1.0f, 0.0f, 0.0f, 0.0f,
1380 0.0f, 1.0f, 0.0f, 0.0f,
1381 0.0f, 0.0f, 1.0f, 0.0f,
1382 0.0f, 0.0f, 0.0f, 1.0f,
1383 }};
1384 // clang-format on
1385
Ady Abraham91c9d1a2021-12-15 18:14:45 -08001386 ComposerClientWriter mWriter;
1387 ComposerClientReader mReader;
ramindanidcfe3a82021-11-29 17:00:31 +00001388};
1389
ramindani431aad42022-02-01 21:44:29 +00001390TEST_P(GraphicsComposerAidlCommandTest, SetColorTransform) {
1391 mWriter.setColorTransform(getPrimaryDisplayId(), kIdentity.data());
ramindanidcfe3a82021-11-29 17:00:31 +00001392 execute();
1393}
1394
1395TEST_P(GraphicsComposerAidlCommandTest, SetLayerColorTransform) {
ramindani431aad42022-02-01 21:44:29 +00001396 const auto& [status, layer] =
1397 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1398 EXPECT_TRUE(status.isOk());
1399 mWriter.setLayerColorTransform(getPrimaryDisplayId(), layer, kIdentity.data());
ramindanidcfe3a82021-11-29 17:00:31 +00001400 execute();
1401
Ady Abraham3192f3d2021-12-03 16:08:56 -08001402 const auto errors = mReader.takeErrors();
Jason Macnak062bc9a2022-01-20 15:00:09 -08001403 if (errors.size() == 1 && errors[0].errorCode == IComposerClient::EX_UNSUPPORTED) {
ramindanidcfe3a82021-11-29 17:00:31 +00001404 GTEST_SUCCEED() << "setLayerColorTransform is not supported";
1405 return;
1406 }
1407}
1408
Alec Mouri60564e12021-12-09 18:48:20 -08001409TEST_P(GraphicsComposerAidlCommandTest, SetDisplayBrightness) {
ramindani431aad42022-02-01 21:44:29 +00001410 const auto& [status, capabilities] =
1411 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
1412 ASSERT_TRUE(status.isOk());
Alec Mouri60564e12021-12-09 18:48:20 -08001413 bool brightnessSupport = std::find(capabilities.begin(), capabilities.end(),
1414 DisplayCapability::BRIGHTNESS) != capabilities.end();
1415 if (!brightnessSupport) {
Alec Mouri03b6daa2022-03-23 18:45:02 +00001416 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.5f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001417 execute();
1418 const auto errors = mReader.takeErrors();
1419 EXPECT_EQ(1, errors.size());
Jason Macnak062bc9a2022-01-20 15:00:09 -08001420 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, errors[0].errorCode);
Alec Mouri60564e12021-12-09 18:48:20 -08001421 GTEST_SUCCEED() << "SetDisplayBrightness is not supported";
1422 return;
1423 }
1424
Alec Mouri03b6daa2022-03-23 18:45:02 +00001425 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001426 execute();
1427 EXPECT_TRUE(mReader.takeErrors().empty());
1428
Alec Mouri03b6daa2022-03-23 18:45:02 +00001429 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.5f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001430 execute();
1431 EXPECT_TRUE(mReader.takeErrors().empty());
1432
Alec Mouri03b6daa2022-03-23 18:45:02 +00001433 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 1.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001434 execute();
1435 EXPECT_TRUE(mReader.takeErrors().empty());
1436
Alec Mouri03b6daa2022-03-23 18:45:02 +00001437 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ -1.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001438 execute();
1439 EXPECT_TRUE(mReader.takeErrors().empty());
1440
Alec Mouri03b6daa2022-03-23 18:45:02 +00001441 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 2.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001442 execute();
1443 {
1444 const auto errors = mReader.takeErrors();
ramindanib3bdf052022-01-12 18:27:05 +00001445 ASSERT_EQ(1, errors.size());
Alec Mouri60564e12021-12-09 18:48:20 -08001446 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1447 }
1448
Alec Mouri03b6daa2022-03-23 18:45:02 +00001449 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ -2.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001450 execute();
1451 {
1452 const auto errors = mReader.takeErrors();
ramindanib3bdf052022-01-12 18:27:05 +00001453 ASSERT_EQ(1, errors.size());
Alec Mouri60564e12021-12-09 18:48:20 -08001454 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1455 }
1456}
1457
ramindani431aad42022-02-01 21:44:29 +00001458TEST_P(GraphicsComposerAidlCommandTest, SetClientTarget) {
1459 EXPECT_TRUE(mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kBufferSlotCount)
1460 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001461
ramindani431aad42022-02-01 21:44:29 +00001462 mWriter.setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, nullptr, /*acquireFence*/ -1,
1463 Dataspace::UNKNOWN, std::vector<Rect>());
ramindanidcfe3a82021-11-29 17:00:31 +00001464
1465 execute();
1466}
1467
ramindani431aad42022-02-01 21:44:29 +00001468TEST_P(GraphicsComposerAidlCommandTest, SetOutputBuffer) {
1469 const auto& [status, virtualDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
1470 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001471 if (virtualDisplayCount == 0) {
1472 GTEST_SUCCEED() << "no virtual display support";
1473 return;
1474 }
1475
ramindani431aad42022-02-01 21:44:29 +00001476 const auto& [displayStatus, display] = mComposerClient->createVirtualDisplay(
1477 /*width*/ 64, /*height*/ 64, common::PixelFormat::IMPLEMENTATION_DEFINED,
1478 kBufferSlotCount);
1479 EXPECT_TRUE(displayStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001480
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001481 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001482 const auto handle = buffer->handle;
ramindani431aad42022-02-01 21:44:29 +00001483 mWriter.setOutputBuffer(display.display, /*slot*/ 0, handle, /*releaseFence*/ -1);
ramindanidcfe3a82021-11-29 17:00:31 +00001484 execute();
1485}
1486
ramindani431aad42022-02-01 21:44:29 +00001487TEST_P(GraphicsComposerAidlCommandTest, ValidDisplay) {
1488 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001489 execute();
1490}
1491
ramindani431aad42022-02-01 21:44:29 +00001492TEST_P(GraphicsComposerAidlCommandTest, AcceptDisplayChanges) {
1493 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1494 mWriter.acceptDisplayChanges(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001495 execute();
1496}
1497
ramindani431aad42022-02-01 21:44:29 +00001498TEST_P(GraphicsComposerAidlCommandTest, PresentDisplay) {
1499 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1500 mWriter.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001501 execute();
1502}
1503
1504/**
1505 * Test IComposerClient::Command::PRESENT_DISPLAY
1506 *
1507 * Test that IComposerClient::Command::PRESENT_DISPLAY works without
1508 * additional call to validateDisplay when only the layer buffer handle and
1509 * surface damage have been set
1510 */
ramindani431aad42022-02-01 21:44:29 +00001511TEST_P(GraphicsComposerAidlCommandTest, PresentDisplayNoLayerStateChanges) {
Jason Macnak325e8232022-01-24 14:48:55 -08001512 if (!hasCapability(Capability::SKIP_VALIDATE)) {
ramindanidcfe3a82021-11-29 17:00:31 +00001513 GTEST_SUCCEED() << "Device does not have skip validate capability, skipping";
1514 return;
1515 }
ramindani431aad42022-02-01 21:44:29 +00001516 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001517
ramindani431aad42022-02-01 21:44:29 +00001518 const auto& [renderIntentsStatus, renderIntents] =
1519 mComposerClient->getRenderIntents(getPrimaryDisplayId(), ColorMode::NATIVE);
1520 EXPECT_TRUE(renderIntentsStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001521 for (auto intent : renderIntents) {
ramindani431aad42022-02-01 21:44:29 +00001522 EXPECT_TRUE(mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE, intent)
1523 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001524
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001525 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001526 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001527 ASSERT_NE(nullptr, handle);
1528
ramindani431aad42022-02-01 21:44:29 +00001529 const auto& [layerStatus, layer] =
1530 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1531 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001532
ramindani431aad42022-02-01 21:44:29 +00001533 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1534 getPrimaryDisplay().getDisplayHeight()};
1535 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1536 (float)getPrimaryDisplay().getDisplayHeight()};
1537 configureLayer(getPrimaryDisplay(), layer, Composition::CURSOR, displayFrame, cropRect);
1538 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle,
1539 /*acquireFence*/ -1);
1540 mWriter.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1541 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001542 execute();
ramindani431aad42022-02-01 21:44:29 +00001543 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanidcfe3a82021-11-29 17:00:31 +00001544 GTEST_SUCCEED() << "Composition change requested, skipping test";
1545 return;
1546 }
1547
Ady Abraham3192f3d2021-12-03 16:08:56 -08001548 ASSERT_TRUE(mReader.takeErrors().empty());
ramindani431aad42022-02-01 21:44:29 +00001549 mWriter.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001550 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001551 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001552
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001553 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001554 const auto handle2 = buffer2->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001555 ASSERT_NE(nullptr, handle2);
ramindani431aad42022-02-01 21:44:29 +00001556 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle2,
1557 /*acquireFence*/ -1);
1558 mWriter.setLayerSurfaceDamage(getPrimaryDisplayId(), layer,
1559 std::vector<Rect>(1, {0, 0, 10, 10}));
1560 mWriter.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001561 execute();
1562 }
1563}
1564
ramindani431aad42022-02-01 21:44:29 +00001565TEST_P(GraphicsComposerAidlCommandTest, SetLayerCursorPosition) {
1566 const auto& [layerStatus, layer] =
1567 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1568 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001569
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001570 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001571 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001572 ASSERT_NE(nullptr, handle);
ramindanidcfe3a82021-11-29 17:00:31 +00001573
ramindani431aad42022-02-01 21:44:29 +00001574 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
1575
1576 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1577 getPrimaryDisplay().getDisplayHeight()};
1578 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1579 (float)getPrimaryDisplay().getDisplayHeight()};
1580 configureLayer(getPrimaryDisplay(), layer, Composition::CURSOR, displayFrame, cropRect);
1581 mWriter.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1582 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001583
1584 execute();
Ady Abraham46219f52021-12-20 09:44:31 -08001585
ramindani431aad42022-02-01 21:44:29 +00001586 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanidcfe3a82021-11-29 17:00:31 +00001587 GTEST_SUCCEED() << "Composition change requested, skipping test";
1588 return;
1589 }
ramindani431aad42022-02-01 21:44:29 +00001590 mWriter.presentDisplay(getPrimaryDisplayId());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001591 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001592
ramindani431aad42022-02-01 21:44:29 +00001593 mWriter.setLayerCursorPosition(getPrimaryDisplayId(), layer, /*x*/ 1, /*y*/ 1);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001594 execute();
1595
ramindani431aad42022-02-01 21:44:29 +00001596 mWriter.setLayerCursorPosition(getPrimaryDisplayId(), layer, /*x*/ 0, /*y*/ 0);
1597 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1598 mWriter.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001599 execute();
1600}
1601
ramindani431aad42022-02-01 21:44:29 +00001602TEST_P(GraphicsComposerAidlCommandTest, SetLayerBuffer) {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001603 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001604 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001605 ASSERT_NE(nullptr, handle);
1606
ramindani431aad42022-02-01 21:44:29 +00001607 const auto& [layerStatus, layer] =
1608 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1609 EXPECT_TRUE(layerStatus.isOk());
1610 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
ramindanidcfe3a82021-11-29 17:00:31 +00001611 execute();
1612}
1613
ramindani431aad42022-02-01 21:44:29 +00001614TEST_P(GraphicsComposerAidlCommandTest, SetLayerSurfaceDamage) {
1615 const auto& [layerStatus, layer] =
1616 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1617 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001618
1619 Rect empty{0, 0, 0, 0};
1620 Rect unit{0, 0, 1, 1};
1621
ramindani431aad42022-02-01 21:44:29 +00001622 mWriter.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
ramindanidcfe3a82021-11-29 17:00:31 +00001623 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001624 ASSERT_TRUE(mReader.takeErrors().empty());
1625
ramindani431aad42022-02-01 21:44:29 +00001626 mWriter.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001627 execute();
1628 ASSERT_TRUE(mReader.takeErrors().empty());
1629
ramindani431aad42022-02-01 21:44:29 +00001630 mWriter.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001631 execute();
1632 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001633}
1634
ramindani431aad42022-02-01 21:44:29 +00001635TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlockingRegion) {
1636 const auto& [layerStatus, layer] =
1637 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1638 EXPECT_TRUE(layerStatus.isOk());
Leon Scroggins III03318152022-01-13 12:24:19 -05001639
1640 Rect empty{0, 0, 0, 0};
1641 Rect unit{0, 0, 1, 1};
1642
ramindani431aad42022-02-01 21:44:29 +00001643 mWriter.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
Leon Scroggins III03318152022-01-13 12:24:19 -05001644 execute();
1645 ASSERT_TRUE(mReader.takeErrors().empty());
1646
ramindani431aad42022-02-01 21:44:29 +00001647 mWriter.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Leon Scroggins III03318152022-01-13 12:24:19 -05001648 execute();
1649 ASSERT_TRUE(mReader.takeErrors().empty());
1650
ramindani431aad42022-02-01 21:44:29 +00001651 mWriter.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
Leon Scroggins III03318152022-01-13 12:24:19 -05001652 execute();
1653 ASSERT_TRUE(mReader.takeErrors().empty());
1654}
1655
ramindani431aad42022-02-01 21:44:29 +00001656TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlendMode) {
1657 const auto& [layerStatus, layer] =
1658 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1659 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001660
ramindani431aad42022-02-01 21:44:29 +00001661 mWriter.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::NONE);
ramindanidcfe3a82021-11-29 17:00:31 +00001662 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001663 ASSERT_TRUE(mReader.takeErrors().empty());
1664
ramindani431aad42022-02-01 21:44:29 +00001665 mWriter.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::PREMULTIPLIED);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001666 execute();
1667 ASSERT_TRUE(mReader.takeErrors().empty());
1668
ramindani431aad42022-02-01 21:44:29 +00001669 mWriter.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::COVERAGE);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001670 execute();
1671 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001672}
1673
ramindani431aad42022-02-01 21:44:29 +00001674TEST_P(GraphicsComposerAidlCommandTest, SetLayerColor) {
1675 const auto& [layerStatus, layer] =
1676 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1677 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001678
ramindani431aad42022-02-01 21:44:29 +00001679 mWriter.setLayerColor(getPrimaryDisplayId(), layer, Color{1.0f, 1.0f, 1.0f, 1.0f});
ramindanidcfe3a82021-11-29 17:00:31 +00001680 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001681 ASSERT_TRUE(mReader.takeErrors().empty());
1682
ramindani431aad42022-02-01 21:44:29 +00001683 mWriter.setLayerColor(getPrimaryDisplayId(), layer, Color{0.0f, 0.0f, 0.0f, 0.0f});
Ady Abraham3192f3d2021-12-03 16:08:56 -08001684 execute();
1685 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001686}
1687
ramindani431aad42022-02-01 21:44:29 +00001688TEST_P(GraphicsComposerAidlCommandTest, SetLayerCompositionType) {
1689 const auto& [layerStatus, layer] =
1690 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1691 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001692
ramindani431aad42022-02-01 21:44:29 +00001693 mWriter.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CLIENT);
ramindanidcfe3a82021-11-29 17:00:31 +00001694 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001695 ASSERT_TRUE(mReader.takeErrors().empty());
1696
ramindani431aad42022-02-01 21:44:29 +00001697 mWriter.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::DEVICE);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001698 execute();
1699 ASSERT_TRUE(mReader.takeErrors().empty());
1700
ramindani431aad42022-02-01 21:44:29 +00001701 mWriter.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::SOLID_COLOR);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001702 execute();
1703 ASSERT_TRUE(mReader.takeErrors().empty());
1704
ramindani431aad42022-02-01 21:44:29 +00001705 mWriter.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CURSOR);
1706 execute();
1707}
1708
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001709TEST_P(GraphicsComposerAidlCommandTest, DisplayDecoration) {
1710 for (VtsDisplay& display : mDisplays) {
1711 const auto [layerStatus, layer] =
1712 mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount);
1713 EXPECT_TRUE(layerStatus.isOk());
1714
1715 const auto [error, support] =
1716 mComposerClient->getDisplayDecorationSupport(display.getDisplayId());
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001717
Leon Scroggins III91590872022-02-23 09:51:21 -05001718 const auto format = (error.isOk() && support) ? support->format
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001719 : aidl::android::hardware::graphics::common::PixelFormat::RGBA_8888;
1720 const auto decorBuffer = allocate(static_cast<::android::PixelFormat>(format));
1721 ASSERT_NE(nullptr, decorBuffer);
1722 if (::android::OK != decorBuffer->initCheck()) {
1723 if (support) {
1724 FAIL() << "Device advertised display decoration support with format "
1725 << aidl::android::hardware::graphics::common::toString(format)
1726 << " but failed to allocate it!";
1727 } else {
1728 FAIL() << "Device advertised NO display decoration support, but it should "
1729 << "still be able to allocate "
1730 << aidl::android::hardware::graphics::common::toString(format);
1731 }
1732 }
1733
Midas Chien7d55d422022-06-07 02:32:28 +08001734 configureLayer(display, layer, Composition::DISPLAY_DECORATION, display.getFrameRect(),
1735 display.getCrop());
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001736 mWriter.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, decorBuffer->handle,
1737 /*acquireFence*/ -1);
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001738 mWriter.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
1739 execute();
1740 if (support) {
1741 ASSERT_TRUE(mReader.takeErrors().empty());
1742 } else {
1743 const auto errors = mReader.takeErrors();
1744 ASSERT_EQ(1, errors.size());
Leon Scroggins III6455e792022-02-24 12:18:58 -05001745 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, errors[0].errorCode);
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001746 }
1747 }
1748}
1749
ramindani431aad42022-02-01 21:44:29 +00001750TEST_P(GraphicsComposerAidlCommandTest, SetLayerDataspace) {
1751 const auto& [layerStatus, layer] =
1752 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1753 EXPECT_TRUE(layerStatus.isOk());
1754
1755 mWriter.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1756 execute();
1757}
1758
1759TEST_P(GraphicsComposerAidlCommandTest, SetLayerDisplayFrame) {
1760 const auto& [layerStatus, layer] =
1761 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1762 EXPECT_TRUE(layerStatus.isOk());
1763
1764 mWriter.setLayerDisplayFrame(getPrimaryDisplayId(), layer, Rect{0, 0, 1, 1});
1765 execute();
1766}
1767
1768TEST_P(GraphicsComposerAidlCommandTest, SetLayerPlaneAlpha) {
1769 const auto& [layerStatus, layer] =
1770 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1771 EXPECT_TRUE(layerStatus.isOk());
1772
1773 mWriter.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 0.0f);
1774 execute();
1775 ASSERT_TRUE(mReader.takeErrors().empty());
1776
1777 mWriter.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 1.0f);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001778 execute();
1779 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001780}
1781
ramindani431aad42022-02-01 21:44:29 +00001782TEST_P(GraphicsComposerAidlCommandTest, SetLayerSidebandStream) {
Jason Macnak325e8232022-01-24 14:48:55 -08001783 if (!hasCapability(Capability::SIDEBAND_STREAM)) {
ramindanidcfe3a82021-11-29 17:00:31 +00001784 GTEST_SUCCEED() << "no sideband stream support";
1785 return;
1786 }
1787
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001788 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001789 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001790 ASSERT_NE(nullptr, handle);
1791
ramindani431aad42022-02-01 21:44:29 +00001792 const auto& [layerStatus, layer] =
1793 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1794 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001795
ramindani431aad42022-02-01 21:44:29 +00001796 mWriter.setLayerSidebandStream(getPrimaryDisplayId(), layer, handle);
ramindanidcfe3a82021-11-29 17:00:31 +00001797 execute();
1798}
1799
ramindani431aad42022-02-01 21:44:29 +00001800TEST_P(GraphicsComposerAidlCommandTest, SetLayerSourceCrop) {
1801 const auto& [layerStatus, layer] =
1802 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1803 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001804
ramindani431aad42022-02-01 21:44:29 +00001805 mWriter.setLayerSourceCrop(getPrimaryDisplayId(), layer, FRect{0.0f, 0.0f, 1.0f, 1.0f});
ramindanidcfe3a82021-11-29 17:00:31 +00001806 execute();
1807}
1808
ramindani431aad42022-02-01 21:44:29 +00001809TEST_P(GraphicsComposerAidlCommandTest, SetLayerTransform) {
1810 const auto& [layerStatus, layer] =
1811 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1812 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001813
ramindani431aad42022-02-01 21:44:29 +00001814 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, static_cast<Transform>(0));
ramindanidcfe3a82021-11-29 17:00:31 +00001815 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001816 ASSERT_TRUE(mReader.takeErrors().empty());
1817
ramindani431aad42022-02-01 21:44:29 +00001818 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_H);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001819 execute();
1820 ASSERT_TRUE(mReader.takeErrors().empty());
1821
ramindani431aad42022-02-01 21:44:29 +00001822 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_V);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001823 execute();
1824 ASSERT_TRUE(mReader.takeErrors().empty());
1825
ramindani431aad42022-02-01 21:44:29 +00001826 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_90);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001827 execute();
1828 ASSERT_TRUE(mReader.takeErrors().empty());
1829
ramindani431aad42022-02-01 21:44:29 +00001830 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_180);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001831 execute();
1832 ASSERT_TRUE(mReader.takeErrors().empty());
1833
ramindani431aad42022-02-01 21:44:29 +00001834 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_270);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001835 execute();
1836 ASSERT_TRUE(mReader.takeErrors().empty());
1837
ramindani431aad42022-02-01 21:44:29 +00001838 mWriter.setLayerTransform(getPrimaryDisplayId(), layer,
Ady Abraham3192f3d2021-12-03 16:08:56 -08001839 static_cast<Transform>(static_cast<int>(Transform::FLIP_H) |
1840 static_cast<int>(Transform::ROT_90)));
1841 execute();
1842 ASSERT_TRUE(mReader.takeErrors().empty());
1843
ramindani431aad42022-02-01 21:44:29 +00001844 mWriter.setLayerTransform(getPrimaryDisplayId(), layer,
Ady Abraham3192f3d2021-12-03 16:08:56 -08001845 static_cast<Transform>(static_cast<int>(Transform::FLIP_V) |
1846 static_cast<int>(Transform::ROT_90)));
1847 execute();
1848 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001849}
1850
ramindani431aad42022-02-01 21:44:29 +00001851TEST_P(GraphicsComposerAidlCommandTest, SetLayerVisibleRegion) {
1852 const auto& [layerStatus, layer] =
1853 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1854 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001855
1856 Rect empty{0, 0, 0, 0};
1857 Rect unit{0, 0, 1, 1};
1858
ramindani431aad42022-02-01 21:44:29 +00001859 mWriter.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
ramindanidcfe3a82021-11-29 17:00:31 +00001860 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001861 ASSERT_TRUE(mReader.takeErrors().empty());
1862
ramindani431aad42022-02-01 21:44:29 +00001863 mWriter.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001864 execute();
1865 ASSERT_TRUE(mReader.takeErrors().empty());
1866
ramindani431aad42022-02-01 21:44:29 +00001867 mWriter.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001868 execute();
1869 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001870}
1871
ramindani431aad42022-02-01 21:44:29 +00001872TEST_P(GraphicsComposerAidlCommandTest, SetLayerZOrder) {
1873 const auto& [layerStatus, layer] =
1874 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1875 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001876
ramindani431aad42022-02-01 21:44:29 +00001877 mWriter.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 10);
ramindanidcfe3a82021-11-29 17:00:31 +00001878 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001879 ASSERT_TRUE(mReader.takeErrors().empty());
1880
ramindani431aad42022-02-01 21:44:29 +00001881 mWriter.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 0);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001882 execute();
1883 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001884}
1885
ramindani431aad42022-02-01 21:44:29 +00001886TEST_P(GraphicsComposerAidlCommandTest, SetLayerPerFrameMetadata) {
1887 const auto& [layerStatus, layer] =
1888 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1889 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001890
ramindanidcfe3a82021-11-29 17:00:31 +00001891 /**
1892 * DISPLAY_P3 is a color space that uses the DCI_P3 primaries,
1893 * the D65 white point and the SRGB transfer functions.
1894 * Rendering Intent: Colorimetric
1895 * Primaries:
1896 * x y
1897 * green 0.265 0.690
1898 * blue 0.150 0.060
1899 * red 0.680 0.320
1900 * white (D65) 0.3127 0.3290
1901 */
1902
1903 std::vector<PerFrameMetadata> aidlMetadata;
1904 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X, 0.680f});
1905 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y, 0.320f});
1906 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_X, 0.265f});
1907 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_Y, 0.690f});
1908 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_X, 0.150f});
1909 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_Y, 0.060f});
1910 aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_X, 0.3127f});
1911 aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_Y, 0.3290f});
1912 aidlMetadata.push_back({PerFrameMetadataKey::MAX_LUMINANCE, 100.0f});
1913 aidlMetadata.push_back({PerFrameMetadataKey::MIN_LUMINANCE, 0.1f});
1914 aidlMetadata.push_back({PerFrameMetadataKey::MAX_CONTENT_LIGHT_LEVEL, 78.0});
1915 aidlMetadata.push_back({PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL, 62.0});
ramindani431aad42022-02-01 21:44:29 +00001916 mWriter.setLayerPerFrameMetadata(getPrimaryDisplayId(), layer, aidlMetadata);
ramindanidcfe3a82021-11-29 17:00:31 +00001917 execute();
1918
Ady Abraham3192f3d2021-12-03 16:08:56 -08001919 const auto errors = mReader.takeErrors();
1920 if (errors.size() == 1 && errors[0].errorCode == EX_UNSUPPORTED_OPERATION) {
ramindanidcfe3a82021-11-29 17:00:31 +00001921 GTEST_SUCCEED() << "SetLayerPerFrameMetadata is not supported";
ramindani431aad42022-02-01 21:44:29 +00001922 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001923 return;
1924 }
1925
ramindani431aad42022-02-01 21:44:29 +00001926 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001927}
1928
Alec Mourib1f16722022-02-07 13:03:44 -08001929TEST_P(GraphicsComposerAidlCommandTest, setLayerBrightness) {
ramindani431aad42022-02-01 21:44:29 +00001930 const auto& [layerStatus, layer] =
1931 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
Alec Mouri95e490b2022-01-06 13:46:58 -08001932
Alec Mourib1f16722022-02-07 13:03:44 -08001933 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, 0.2f);
Alec Mouri95e490b2022-01-06 13:46:58 -08001934 execute();
1935 ASSERT_TRUE(mReader.takeErrors().empty());
1936
Alec Mourib1f16722022-02-07 13:03:44 -08001937 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, 1.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08001938 execute();
1939 ASSERT_TRUE(mReader.takeErrors().empty());
1940
Alec Mourib1f16722022-02-07 13:03:44 -08001941 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, 0.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08001942 execute();
1943 ASSERT_TRUE(mReader.takeErrors().empty());
1944
Alec Mourib1f16722022-02-07 13:03:44 -08001945 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, -1.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08001946 execute();
Alec Mourib1f16722022-02-07 13:03:44 -08001947 {
1948 const auto errors = mReader.takeErrors();
1949 ASSERT_EQ(1, errors.size());
1950 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1951 }
1952
1953 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, std::nanf(""));
1954 execute();
1955 {
1956 const auto errors = mReader.takeErrors();
1957 ASSERT_EQ(1, errors.size());
1958 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1959 }
Alec Mouri95e490b2022-01-06 13:46:58 -08001960}
1961
ramindani431aad42022-02-01 21:44:29 +00001962TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints) {
ramindanidcfe3a82021-11-29 17:00:31 +00001963 Test_setActiveConfigWithConstraints({.delayForChange = 0, .refreshMiss = false});
1964}
1965
ramindani431aad42022-02-01 21:44:29 +00001966TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_Delayed) {
ramindanidcfe3a82021-11-29 17:00:31 +00001967 Test_setActiveConfigWithConstraints({.delayForChange = 300'000'000, // 300ms
1968 .refreshMiss = false});
1969}
1970
ramindani431aad42022-02-01 21:44:29 +00001971TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_MissRefresh) {
ramindanidcfe3a82021-11-29 17:00:31 +00001972 Test_setActiveConfigWithConstraints({.delayForChange = 0, .refreshMiss = true});
1973}
1974
ramindani431aad42022-02-01 21:44:29 +00001975TEST_P(GraphicsComposerAidlCommandTest, GetDisplayVsyncPeriod) {
ramindanidcfe3a82021-11-29 17:00:31 +00001976 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00001977 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
1978 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001979
ramindani431aad42022-02-01 21:44:29 +00001980 for (int32_t config : configs) {
1981 int32_t expectedVsyncPeriodNanos = display.getDisplayConfig(config).vsyncPeriod;
1982
ramindanidcfe3a82021-11-29 17:00:31 +00001983 VsyncPeriodChangeConstraints constraints;
1984
1985 constraints.desiredTimeNanos = systemTime();
1986 constraints.seamlessRequired = false;
ramindani431aad42022-02-01 21:44:29 +00001987
1988 const auto& [timelineStatus, timeline] =
1989 mComposerClient->setActiveConfigWithConstraints(&display, config, constraints);
1990 EXPECT_TRUE(timelineStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001991
1992 if (timeline.refreshRequired) {
1993 sendRefreshFrame(display, &timeline);
1994 }
ramindani431aad42022-02-01 21:44:29 +00001995 waitForVsyncPeriodChange(display.getDisplayId(), timeline, constraints.desiredTimeNanos,
1996 /*odPeriodNanos*/ 0, expectedVsyncPeriodNanos);
ramindanidcfe3a82021-11-29 17:00:31 +00001997
1998 int32_t vsyncPeriodNanos;
1999 int retryCount = 100;
2000 do {
2001 std::this_thread::sleep_for(10ms);
ramindani431aad42022-02-01 21:44:29 +00002002 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanosValue] =
2003 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
2004
2005 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
2006 vsyncPeriodNanos = vsyncPeriodNanosValue;
ramindanidcfe3a82021-11-29 17:00:31 +00002007 --retryCount;
2008 } while (vsyncPeriodNanos != expectedVsyncPeriodNanos && retryCount > 0);
2009
2010 EXPECT_EQ(vsyncPeriodNanos, expectedVsyncPeriodNanos);
2011
2012 // Make sure that the vsync period stays the same if the active config is not
2013 // changed.
2014 auto timeout = 1ms;
2015 for (int i = 0; i < 10; i++) {
2016 std::this_thread::sleep_for(timeout);
2017 timeout *= 2;
2018 vsyncPeriodNanos = 0;
ramindani431aad42022-02-01 21:44:29 +00002019 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanosValue] =
2020 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
2021
2022 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
2023 vsyncPeriodNanos = vsyncPeriodNanosValue;
ramindanidcfe3a82021-11-29 17:00:31 +00002024 EXPECT_EQ(vsyncPeriodNanos, expectedVsyncPeriodNanos);
2025 }
2026 }
2027 }
2028}
2029
ramindani431aad42022-02-01 21:44:29 +00002030TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_SeamlessNotAllowed) {
ramindanidcfe3a82021-11-29 17:00:31 +00002031 VsyncPeriodChangeConstraints constraints;
ramindanidcfe3a82021-11-29 17:00:31 +00002032 constraints.seamlessRequired = true;
2033 constraints.desiredTimeNanos = systemTime();
2034
2035 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00002036 forEachTwoConfigs(display.getDisplayId(), [&](int32_t config1, int32_t config2) {
2037 int32_t configGroup1 = display.getDisplayConfig(config1).configGroup;
2038 int32_t configGroup2 = display.getDisplayConfig(config2).configGroup;
ramindanidcfe3a82021-11-29 17:00:31 +00002039 if (configGroup1 != configGroup2) {
ramindani431aad42022-02-01 21:44:29 +00002040 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002041 sendRefreshFrame(display, nullptr);
ramindani431aad42022-02-01 21:44:29 +00002042 const auto& [status, _] = mComposerClient->setActiveConfigWithConstraints(
2043 &display, config2, constraints);
2044 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002045 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(
2046 status, IComposerClient::EX_SEAMLESS_NOT_ALLOWED));
ramindanidcfe3a82021-11-29 17:00:31 +00002047 }
2048 });
2049 }
2050}
2051
ramindani431aad42022-02-01 21:44:29 +00002052TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_NoTimestamp) {
2053 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ std::nullopt));
Ady Abraham72c5b502021-12-10 17:23:39 -08002054}
2055
ramindani431aad42022-02-01 21:44:29 +00002056TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_0) {
2057 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ 0));
Ady Abraham72c5b502021-12-10 17:23:39 -08002058}
2059
ramindani431aad42022-02-01 21:44:29 +00002060TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_5) {
2061 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ 5));
Ady Abraham72c5b502021-12-10 17:23:39 -08002062}
2063
ramindani431aad42022-02-01 21:44:29 +00002064TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Unsupported) {
2065 const bool hasDisplayIdleTimerSupport =
2066 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002067 if (!hasDisplayIdleTimerSupport) {
ramindani431aad42022-02-01 21:44:29 +00002068 const auto& status =
2069 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0);
2070 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002071 EXPECT_NO_FATAL_FAILURE(
2072 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
Midas Chiena0b56bd2022-01-13 23:27:33 +08002073 }
2074}
2075
ramindani431aad42022-02-01 21:44:29 +00002076TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_BadParameter) {
2077 const bool hasDisplayIdleTimerSupport =
2078 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002079 if (!hasDisplayIdleTimerSupport) {
2080 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2081 return;
2082 }
2083
ramindani431aad42022-02-01 21:44:29 +00002084 const auto& status =
2085 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ -1);
2086 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002087 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
Midas Chiena0b56bd2022-01-13 23:27:33 +08002088}
2089
ramindani431aad42022-02-01 21:44:29 +00002090TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Disable) {
2091 const bool hasDisplayIdleTimerSupport =
2092 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002093 if (!hasDisplayIdleTimerSupport) {
2094 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2095 return;
2096 }
2097
ramindani431aad42022-02-01 21:44:29 +00002098 EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002099 std::this_thread::sleep_for(1s);
ramindani431aad42022-02-01 21:44:29 +00002100 EXPECT_EQ(0, mComposerClient->getVsyncIdleCount());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002101}
2102
ramindani431aad42022-02-01 21:44:29 +00002103TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Timeout_2) {
2104 const bool hasDisplayIdleTimerSupport =
2105 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002106 if (!hasDisplayIdleTimerSupport) {
2107 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2108 return;
2109 }
2110
ramindani431aad42022-02-01 21:44:29 +00002111 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
2112 EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002113
Leon Scroggins IIIde057582022-01-13 12:26:00 -05002114 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002115 ASSERT_NE(nullptr, buffer->handle);
2116
2117 const auto layer = createOnScreenLayer();
ramindani431aad42022-02-01 21:44:29 +00002118 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer->handle,
2119 /*acquireFence*/ -1);
2120 int32_t vsyncIdleCount = mComposerClient->getVsyncIdleCount();
Midas Chiena0b56bd2022-01-13 23:27:33 +08002121 auto earlyVsyncIdleTime = systemTime() + std::chrono::nanoseconds(2s).count();
ramindani431aad42022-02-01 21:44:29 +00002122 EXPECT_TRUE(
2123 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 2000).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002124
2125 const sp<::android::Fence> presentFence =
ramindani431aad42022-02-01 21:44:29 +00002126 presentAndGetFence(ComposerClientWriter::kNoTimestamp);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002127 presentFence->waitForever(LOG_TAG);
2128
2129 std::this_thread::sleep_for(3s);
ramindani431aad42022-02-01 21:44:29 +00002130 if (vsyncIdleCount < mComposerClient->getVsyncIdleCount()) {
2131 EXPECT_GE(mComposerClient->getVsyncIdleTime(), earlyVsyncIdleTime);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002132 }
2133
ramindani431aad42022-02-01 21:44:29 +00002134 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002135}
2136
Kriti Dang4efe8602022-05-03 16:55:59 +02002137/*
2138 * Test that no two display configs are exactly the same.
2139 */
2140TEST_P(GraphicsComposerAidlTest, GetDisplayConfigNoRepetitions) {
2141 for (const auto& display : mDisplays) {
2142 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
2143 for (std::vector<int>::size_type i = 0; i < configs.size(); i++) {
2144 for (std::vector<int>::size_type j = i + 1; j < configs.size(); j++) {
2145 const auto& [widthStatus1, width1] = mComposerClient->getDisplayAttribute(
2146 display.getDisplayId(), configs[i], DisplayAttribute::WIDTH);
2147 const auto& [heightStatus1, height1] = mComposerClient->getDisplayAttribute(
2148 display.getDisplayId(), configs[i], DisplayAttribute::HEIGHT);
2149 const auto& [vsyncPeriodStatus1, vsyncPeriod1] =
2150 mComposerClient->getDisplayAttribute(display.getDisplayId(), configs[i],
2151 DisplayAttribute::VSYNC_PERIOD);
2152 const auto& [groupStatus1, group1] = mComposerClient->getDisplayAttribute(
2153 display.getDisplayId(), configs[i], DisplayAttribute::CONFIG_GROUP);
2154
2155 const auto& [widthStatus2, width2] = mComposerClient->getDisplayAttribute(
2156 display.getDisplayId(), configs[j], DisplayAttribute::WIDTH);
2157 const auto& [heightStatus2, height2] = mComposerClient->getDisplayAttribute(
2158 display.getDisplayId(), configs[j], DisplayAttribute::HEIGHT);
2159 const auto& [vsyncPeriodStatus2, vsyncPeriod2] =
2160 mComposerClient->getDisplayAttribute(display.getDisplayId(), configs[j],
2161 DisplayAttribute::VSYNC_PERIOD);
2162 const auto& [groupStatus2, group2] = mComposerClient->getDisplayAttribute(
2163 display.getDisplayId(), configs[j], DisplayAttribute::CONFIG_GROUP);
2164
2165 ASSERT_FALSE(width1 == width2 && height1 == height2 &&
2166 vsyncPeriod1 == vsyncPeriod2 && group1 == group2);
2167 }
2168 }
2169 }
2170}
2171
Leon Scroggins IIIb3e336e2022-10-06 12:32:16 -04002172TEST_P(GraphicsComposerAidlCommandTest, MultiThreadedPresent) {
2173 std::vector<VtsDisplay*> displays;
2174 for (auto& display : mDisplays) {
2175 if (hasDisplayCapability(display.getDisplayId(),
2176 DisplayCapability::MULTI_THREADED_PRESENT)) {
2177 displays.push_back(&display);
2178 }
2179 }
2180 if (displays.size() <= 1u) {
2181 return;
2182 }
2183 // TODO(b/251842321): Try to present on multiple threads.
2184}
2185
ramindanidcfe3a82021-11-29 17:00:31 +00002186GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlCommandTest);
2187INSTANTIATE_TEST_SUITE_P(
2188 PerInstance, GraphicsComposerAidlCommandTest,
2189 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
2190 ::android::PrintInstanceNameToString);
2191
ramindanid32ae8e2021-10-01 18:48:39 +00002192GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlTest);
2193INSTANTIATE_TEST_SUITE_P(
2194 PerInstance, GraphicsComposerAidlTest,
2195 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
2196 ::android::PrintInstanceNameToString);
2197} // namespace
2198} // namespace aidl::android::hardware::graphics::composer3::vts
2199
2200int main(int argc, char** argv) {
2201 ::testing::InitGoogleTest(&argc, argv);
2202
2203 using namespace std::chrono_literals;
2204 if (!android::base::WaitForProperty("init.svc.surfaceflinger", "stopped", 10s)) {
2205 ALOGE("Failed to stop init.svc.surfaceflinger");
2206 return -1;
2207 }
ramindanibeea10e2021-12-07 21:02:49 +00002208
2209 android::ProcessState::self()->setThreadPoolMaxThreadCount(4);
2210
2211 // The binder threadpool we start will inherit sched policy and priority
2212 // of (this) creating thread. We want the binder thread pool to have
2213 // SCHED_FIFO policy and priority 1 (lowest RT priority)
2214 // Once the pool is created we reset this thread's priority back to
2215 // original.
2216 // This thread policy is based on what we do in the SurfaceFlinger while starting
2217 // the thread pool and we need to replicate that for the VTS tests.
2218 int newPriority = 0;
2219 int origPolicy = sched_getscheduler(0);
2220 struct sched_param origSchedParam;
2221
2222 int errorInPriorityModification = sched_getparam(0, &origSchedParam);
2223 if (errorInPriorityModification == 0) {
2224 int policy = SCHED_FIFO;
2225 newPriority = sched_get_priority_min(policy);
2226
2227 struct sched_param param;
2228 param.sched_priority = newPriority;
2229
2230 errorInPriorityModification = sched_setscheduler(0, policy, &param);
2231 }
2232
2233 // start the thread pool
2234 android::ProcessState::self()->startThreadPool();
2235
2236 // Reset current thread's policy and priority
2237 if (errorInPriorityModification == 0) {
2238 errorInPriorityModification = sched_setscheduler(0, origPolicy, &origSchedParam);
2239 } else {
2240 ALOGE("Failed to set VtsHalGraphicsComposer3_TargetTest binder threadpool priority to "
2241 "SCHED_FIFO");
2242 }
2243
ramindanid32ae8e2021-10-01 18:48:39 +00002244 return RUN_ALL_TESTS();
ramindania9780262021-10-01 18:48:39 +00002245}