blob: 78dce63dc25c27226c5d5e49add9997844fbce0b [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 Qi2600d342022-08-16 12:46:17 -0700812// TODO(b/250036572): disable this due to no implementation and revup on cuttlefish
813TEST_P(GraphicsComposerAidlTest, DISABLED_GetOverlaySupport) {
814 const auto& [status, _] = mComposerClient->getOverlaySupport();
815 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
816 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
817 GTEST_SUCCEED() << "getOverlaySupport is not supported";
818 return;
819 }
820
821 ASSERT_TRUE(status.isOk());
822}
823
ramindani431aad42022-02-01 21:44:29 +0000824TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation_BadDisplay) {
825 const auto& [status, _] = mComposerClient->getDisplayPhysicalOrientation(getInvalidDisplayId());
Ady Abrahamae12e382022-01-13 18:06:21 -0800826
ramindani431aad42022-02-01 21:44:29 +0000827 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000828 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Ady Abrahamae12e382022-01-13 18:06:21 -0800829}
830
831TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation) {
832 const auto allowedDisplayOrientations = std::array<Transform, 4>{
833 Transform::NONE,
834 Transform::ROT_90,
835 Transform::ROT_180,
836 Transform::ROT_270,
837 };
838
ramindani431aad42022-02-01 21:44:29 +0000839 const auto& [status, displayOrientation] =
840 mComposerClient->getDisplayPhysicalOrientation(getPrimaryDisplayId());
Ady Abrahamae12e382022-01-13 18:06:21 -0800841
ramindani431aad42022-02-01 21:44:29 +0000842 EXPECT_TRUE(status.isOk());
Ady Abrahamae12e382022-01-13 18:06:21 -0800843 EXPECT_NE(std::find(allowedDisplayOrientations.begin(), allowedDisplayOrientations.end(),
844 displayOrientation),
845 allowedDisplayOrientations.end());
846}
847
ramindani2740bac2021-11-24 22:58:32 +0000848TEST_P(GraphicsComposerAidlTest, SetClientTargetSlotCount) {
ramindani431aad42022-02-01 21:44:29 +0000849 EXPECT_TRUE(mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kBufferSlotCount)
850 .isOk());
ramindani2740bac2021-11-24 22:58:32 +0000851}
852
853TEST_P(GraphicsComposerAidlTest, SetActiveConfig) {
ramindani431aad42022-02-01 21:44:29 +0000854 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
855 EXPECT_TRUE(status.isOk());
856
857 for (const auto& config : configs) {
858 auto display = getEditablePrimaryDisplay();
859 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
860 const auto& [configStatus, config1] =
861 mComposerClient->getActiveConfig(getPrimaryDisplayId());
862 EXPECT_TRUE(configStatus.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000863 EXPECT_EQ(config, config1);
864 }
865}
866
867TEST_P(GraphicsComposerAidlTest, SetActiveConfigPowerCycle) {
ramindani431aad42022-02-01 21:44:29 +0000868 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
869 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000870
ramindani431aad42022-02-01 21:44:29 +0000871 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
872 EXPECT_TRUE(status.isOk());
873
874 for (const auto& config : configs) {
875 auto display = getEditablePrimaryDisplay();
876 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
877 const auto& [config1Status, config1] =
878 mComposerClient->getActiveConfig(getPrimaryDisplayId());
879 EXPECT_TRUE(config1Status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000880 EXPECT_EQ(config, config1);
881
ramindani431aad42022-02-01 21:44:29 +0000882 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
883 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
884 const auto& [config2Status, config2] =
885 mComposerClient->getActiveConfig(getPrimaryDisplayId());
886 EXPECT_TRUE(config2Status.isOk());
887 EXPECT_EQ(config, config2);
ramindani2740bac2021-11-24 22:58:32 +0000888 }
889}
890
ramindani2740bac2021-11-24 22:58:32 +0000891TEST_P(GraphicsComposerAidlTest, SetPowerModeUnsupported) {
ramindani431aad42022-02-01 21:44:29 +0000892 const auto& [status, capabilities] =
893 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
894 ASSERT_TRUE(status.isOk());
895
Ady Abraham6679baf2021-12-08 18:28:27 -0800896 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
897 DisplayCapability::DOZE) != capabilities.end();
898 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
899 DisplayCapability::SUSPEND) != capabilities.end();
ramindani2740bac2021-11-24 22:58:32 +0000900
ramindani431aad42022-02-01 21:44:29 +0000901 if (!isDozeSupported) {
902 const auto& powerModeDozeStatus =
903 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE);
904 EXPECT_FALSE(powerModeDozeStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000905 EXPECT_NO_FATAL_FAILURE(
906 assertServiceSpecificError(powerModeDozeStatus, IComposerClient::EX_UNSUPPORTED));
ramindani431aad42022-02-01 21:44:29 +0000907
908 const auto& powerModeDozeSuspendStatus =
909 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
910 EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000911 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeDozeSuspendStatus,
912 IComposerClient::EX_UNSUPPORTED));
ramindani2740bac2021-11-24 22:58:32 +0000913 }
Ady Abraham6679baf2021-12-08 18:28:27 -0800914
915 if (!isSuspendSupported) {
ramindani431aad42022-02-01 21:44:29 +0000916 const auto& powerModeSuspendStatus =
917 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON_SUSPEND);
918 EXPECT_FALSE(powerModeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000919 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeSuspendStatus,
920 IComposerClient::EX_UNSUPPORTED));
Ady Abraham6679baf2021-12-08 18:28:27 -0800921
ramindani431aad42022-02-01 21:44:29 +0000922 const auto& powerModeDozeSuspendStatus =
923 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
924 EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000925 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeDozeSuspendStatus,
926 IComposerClient::EX_UNSUPPORTED));
Ady Abraham6679baf2021-12-08 18:28:27 -0800927 }
ramindani2740bac2021-11-24 22:58:32 +0000928}
929
930TEST_P(GraphicsComposerAidlTest, SetVsyncEnabled) {
ramindani431aad42022-02-01 21:44:29 +0000931 mComposerClient->setVsyncAllowed(true);
ramindani2740bac2021-11-24 22:58:32 +0000932
ramindani431aad42022-02-01 21:44:29 +0000933 EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), true).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000934 usleep(60 * 1000);
ramindani431aad42022-02-01 21:44:29 +0000935 EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), false).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000936
ramindani431aad42022-02-01 21:44:29 +0000937 mComposerClient->setVsyncAllowed(false);
ramindani2740bac2021-11-24 22:58:32 +0000938}
939
ramindanic2b8d082021-11-06 02:03:50 +0000940TEST_P(GraphicsComposerAidlTest, SetPowerMode) {
ramindani431aad42022-02-01 21:44:29 +0000941 const auto& [status, capabilities] =
942 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
943 ASSERT_TRUE(status.isOk());
944
Ady Abraham6679baf2021-12-08 18:28:27 -0800945 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
946 DisplayCapability::DOZE) != capabilities.end();
947 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
948 DisplayCapability::SUSPEND) != capabilities.end();
949
ramindanic2b8d082021-11-06 02:03:50 +0000950 std::vector<PowerMode> modes;
951 modes.push_back(PowerMode::OFF);
ramindanic2b8d082021-11-06 02:03:50 +0000952 modes.push_back(PowerMode::ON);
953
Ady Abraham6679baf2021-12-08 18:28:27 -0800954 if (isSuspendSupported) {
955 modes.push_back(PowerMode::ON_SUSPEND);
956 }
957
ramindani770d7082021-11-30 00:36:42 +0000958 if (isDozeSupported) {
959 modes.push_back(PowerMode::DOZE);
Ady Abraham6679baf2021-12-08 18:28:27 -0800960 }
961
962 if (isSuspendSupported && isDozeSupported) {
ramindani770d7082021-11-30 00:36:42 +0000963 modes.push_back(PowerMode::DOZE_SUSPEND);
964 }
965
ramindanic2b8d082021-11-06 02:03:50 +0000966 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000967 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000968 }
969}
970
971TEST_P(GraphicsComposerAidlTest, SetPowerModeVariations) {
ramindani431aad42022-02-01 21:44:29 +0000972 const auto& [status, capabilities] =
973 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
974 ASSERT_TRUE(status.isOk());
975
Ady Abraham6679baf2021-12-08 18:28:27 -0800976 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
977 DisplayCapability::DOZE) != capabilities.end();
978 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
979 DisplayCapability::SUSPEND) != capabilities.end();
980
ramindanic2b8d082021-11-06 02:03:50 +0000981 std::vector<PowerMode> modes;
982
983 modes.push_back(PowerMode::OFF);
ramindani770d7082021-11-30 00:36:42 +0000984 modes.push_back(PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +0000985 modes.push_back(PowerMode::OFF);
ramindanic2b8d082021-11-06 02:03:50 +0000986 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000987 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000988 }
ramindani770d7082021-11-30 00:36:42 +0000989 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +0000990
ramindani770d7082021-11-30 00:36:42 +0000991 modes.push_back(PowerMode::OFF);
992 modes.push_back(PowerMode::OFF);
993 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000994 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindani770d7082021-11-30 00:36:42 +0000995 }
ramindanic2b8d082021-11-06 02:03:50 +0000996 modes.clear();
997
998 modes.push_back(PowerMode::ON);
999 modes.push_back(PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +00001000 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001001 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001002 }
ramindanic2b8d082021-11-06 02:03:50 +00001003 modes.clear();
1004
Ady Abraham6679baf2021-12-08 18:28:27 -08001005 if (isSuspendSupported) {
1006 modes.push_back(PowerMode::ON_SUSPEND);
1007 modes.push_back(PowerMode::ON_SUSPEND);
1008 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001009 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
Ady Abraham6679baf2021-12-08 18:28:27 -08001010 }
1011 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +00001012 }
1013
ramindanic2b8d082021-11-06 02:03:50 +00001014 if (isDozeSupported) {
ramindanic2b8d082021-11-06 02:03:50 +00001015 modes.push_back(PowerMode::DOZE);
1016 modes.push_back(PowerMode::DOZE);
ramindanic2b8d082021-11-06 02:03:50 +00001017 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001018 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001019 }
ramindanic2b8d082021-11-06 02:03:50 +00001020 modes.clear();
Ady Abraham6679baf2021-12-08 18:28:27 -08001021 }
ramindanic2b8d082021-11-06 02:03:50 +00001022
Ady Abraham6679baf2021-12-08 18:28:27 -08001023 if (isSuspendSupported && isDozeSupported) {
ramindanic2b8d082021-11-06 02:03:50 +00001024 modes.push_back(PowerMode::DOZE_SUSPEND);
1025 modes.push_back(PowerMode::DOZE_SUSPEND);
ramindanic2b8d082021-11-06 02:03:50 +00001026 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001027 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001028 }
Ady Abraham6679baf2021-12-08 18:28:27 -08001029 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +00001030 }
1031}
1032
ramindani431aad42022-02-01 21:44:29 +00001033TEST_P(GraphicsComposerAidlTest, SetPowerMode_BadDisplay) {
1034 const auto& status = mComposerClient->setPowerMode(getInvalidDisplayId(), PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +00001035
ramindani431aad42022-02-01 21:44:29 +00001036 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001037 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindanic2b8d082021-11-06 02:03:50 +00001038}
1039
ramindani431aad42022-02-01 21:44:29 +00001040TEST_P(GraphicsComposerAidlTest, SetPowerMode_BadParameter) {
1041 const auto& status =
1042 mComposerClient->setPowerMode(getPrimaryDisplayId(), static_cast<PowerMode>(-1));
ramindanic2b8d082021-11-06 02:03:50 +00001043
ramindani431aad42022-02-01 21:44:29 +00001044 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001045 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanic2b8d082021-11-06 02:03:50 +00001046}
1047
ramindanic2b8d082021-11-06 02:03:50 +00001048TEST_P(GraphicsComposerAidlTest, GetDataspaceSaturationMatrix) {
ramindani431aad42022-02-01 21:44:29 +00001049 const auto& [status, matrix] =
1050 mComposerClient->getDataspaceSaturationMatrix(common::Dataspace::SRGB_LINEAR);
1051 ASSERT_TRUE(status.isOk());
1052 ASSERT_EQ(16, matrix.size()); // matrix should not be empty if call succeeded.
ramindanideb059e2021-11-18 01:57:25 +00001053
ramindanic2b8d082021-11-06 02:03:50 +00001054 // the last row is known
ramindani431aad42022-02-01 21:44:29 +00001055 EXPECT_EQ(0.0f, matrix[12]);
1056 EXPECT_EQ(0.0f, matrix[13]);
1057 EXPECT_EQ(0.0f, matrix[14]);
1058 EXPECT_EQ(1.0f, matrix[15]);
ramindanic2b8d082021-11-06 02:03:50 +00001059}
1060
ramindani431aad42022-02-01 21:44:29 +00001061TEST_P(GraphicsComposerAidlTest, GetDataspaceSaturationMatrix_BadParameter) {
1062 const auto& [status, matrix] =
1063 mComposerClient->getDataspaceSaturationMatrix(common::Dataspace::UNKNOWN);
ramindanic2b8d082021-11-06 02:03:50 +00001064
ramindani431aad42022-02-01 21:44:29 +00001065 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001066 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanic2b8d082021-11-06 02:03:50 +00001067}
1068
ramindanidcfe3a82021-11-29 17:00:31 +00001069// Tests for Command.
1070class GraphicsComposerAidlCommandTest : public GraphicsComposerAidlTest {
1071 protected:
ramindanidcfe3a82021-11-29 17:00:31 +00001072 void TearDown() override {
Ady Abraham3192f3d2021-12-03 16:08:56 -08001073 const auto errors = mReader.takeErrors();
1074 ASSERT_TRUE(mReader.takeErrors().empty());
ramindani431aad42022-02-01 21:44:29 +00001075 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001076
ramindanidcfe3a82021-11-29 17:00:31 +00001077 ASSERT_NO_FATAL_FAILURE(GraphicsComposerAidlTest::TearDown());
1078 }
1079
1080 void execute() {
Ady Abraham3192f3d2021-12-03 16:08:56 -08001081 const auto& commands = mWriter.getPendingCommands();
1082 if (commands.empty()) {
1083 mWriter.reset();
1084 return;
ramindanidcfe3a82021-11-29 17:00:31 +00001085 }
1086
ramindani431aad42022-02-01 21:44:29 +00001087 auto [status, results] = mComposerClient->executeCommands(commands);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001088 ASSERT_TRUE(status.isOk()) << "executeCommands failed " << status.getDescription();
ramindanidcfe3a82021-11-29 17:00:31 +00001089
Ady Abraham46219f52021-12-20 09:44:31 -08001090 mReader.parse(std::move(results));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001091 mWriter.reset();
ramindanidcfe3a82021-11-29 17:00:31 +00001092 }
1093
1094 static inline auto toTimePoint(nsecs_t time) {
1095 return std::chrono::time_point<std::chrono::steady_clock>(std::chrono::nanoseconds(time));
1096 }
1097
ramindanidcfe3a82021-11-29 17:00:31 +00001098 void forEachTwoConfigs(int64_t display, std::function<void(int32_t, int32_t)> func) {
ramindani431aad42022-02-01 21:44:29 +00001099 const auto& [status, displayConfigs] = mComposerClient->getDisplayConfigs(display);
1100 ASSERT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001101 for (const int32_t config1 : displayConfigs) {
1102 for (const int32_t config2 : displayConfigs) {
1103 if (config1 != config2) {
1104 func(config1, config2);
1105 }
1106 }
1107 }
1108 }
1109
1110 void waitForVsyncPeriodChange(int64_t display, const VsyncPeriodChangeTimeline& timeline,
1111 int64_t desiredTimeNanos, int64_t oldPeriodNanos,
1112 int64_t newPeriodNanos) {
1113 const auto kChangeDeadline = toTimePoint(timeline.newVsyncAppliedTimeNanos) + 100ms;
1114 while (std::chrono::steady_clock::now() <= kChangeDeadline) {
ramindani431aad42022-02-01 21:44:29 +00001115 const auto& [status, vsyncPeriodNanos] =
1116 mComposerClient->getDisplayVsyncPeriod(display);
1117 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001118 if (systemTime() <= desiredTimeNanos) {
1119 EXPECT_EQ(vsyncPeriodNanos, oldPeriodNanos);
1120 } else if (vsyncPeriodNanos == newPeriodNanos) {
1121 break;
1122 }
1123 std::this_thread::sleep_for(std::chrono::nanoseconds(oldPeriodNanos));
1124 }
1125 }
1126
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001127 sp<GraphicBuffer> allocate(::android::PixelFormat pixelFormat) {
ramindanidcfe3a82021-11-29 17:00:31 +00001128 return sp<GraphicBuffer>::make(
ramindani431aad42022-02-01 21:44:29 +00001129 static_cast<uint32_t>(getPrimaryDisplay().getDisplayWidth()),
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001130 static_cast<uint32_t>(getPrimaryDisplay().getDisplayHeight()), pixelFormat,
ramindani431aad42022-02-01 21:44:29 +00001131 /*layerCount*/ 1U,
ramindanidcfe3a82021-11-29 17:00:31 +00001132 (static_cast<uint64_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
1133 static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
1134 static_cast<uint64_t>(common::BufferUsage::COMPOSER_OVERLAY)),
1135 "VtsHalGraphicsComposer3_TargetTest");
1136 }
1137
1138 void sendRefreshFrame(const VtsDisplay& display, const VsyncPeriodChangeTimeline* timeline) {
1139 if (timeline != nullptr) {
1140 // Refresh time should be before newVsyncAppliedTimeNanos
1141 EXPECT_LT(timeline->refreshTimeNanos, timeline->newVsyncAppliedTimeNanos);
1142
1143 std::this_thread::sleep_until(toTimePoint(timeline->refreshTimeNanos));
1144 }
1145
ramindani431aad42022-02-01 21:44:29 +00001146 EXPECT_TRUE(mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::ON).isOk());
1147 EXPECT_TRUE(mComposerClient
1148 ->setColorMode(display.getDisplayId(), ColorMode::NATIVE,
1149 RenderIntent::COLORIMETRIC)
1150 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001151
ramindani431aad42022-02-01 21:44:29 +00001152 const auto& [status, layer] =
1153 mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount);
1154 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001155 {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001156 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindanidcfe3a82021-11-29 17:00:31 +00001157 ASSERT_NE(nullptr, buffer);
1158 ASSERT_EQ(::android::OK, buffer->initCheck());
1159 ASSERT_NE(nullptr, buffer->handle);
1160
ramindani431aad42022-02-01 21:44:29 +00001161 configureLayer(display, layer, Composition::DEVICE, display.getFrameRect(),
1162 display.getCrop());
1163 mWriter.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer->handle,
1164 /*acquireFence*/ -1);
1165 mWriter.setLayerDataspace(display.getDisplayId(), layer, common::Dataspace::UNKNOWN);
ramindanidcfe3a82021-11-29 17:00:31 +00001166
ramindani431aad42022-02-01 21:44:29 +00001167 mWriter.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001168 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001169 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001170
ramindani431aad42022-02-01 21:44:29 +00001171 mWriter.presentDisplay(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001172 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001173 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001174 }
1175
1176 {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001177 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindanidcfe3a82021-11-29 17:00:31 +00001178 ASSERT_NE(nullptr, buffer->handle);
1179
ramindani431aad42022-02-01 21:44:29 +00001180 mWriter.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer->handle,
1181 /*acquireFence*/ -1);
1182 mWriter.setLayerSurfaceDamage(display.getDisplayId(), layer,
Ady Abraham3192f3d2021-12-03 16:08:56 -08001183 std::vector<Rect>(1, {0, 0, 10, 10}));
ramindani431aad42022-02-01 21:44:29 +00001184 mWriter.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001185 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001186 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001187
ramindani431aad42022-02-01 21:44:29 +00001188 mWriter.presentDisplay(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001189 execute();
1190 }
1191
ramindani431aad42022-02-01 21:44:29 +00001192 EXPECT_TRUE(mComposerClient->destroyLayer(display.getDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001193 }
1194
Ady Abraham72c5b502021-12-10 17:23:39 -08001195 sp<::android::Fence> presentAndGetFence(
1196 std::optional<ClockMonotonicTimestamp> expectedPresentTime) {
ramindani431aad42022-02-01 21:44:29 +00001197 mWriter.validateDisplay(getPrimaryDisplayId(), expectedPresentTime);
Ady Abraham72c5b502021-12-10 17:23:39 -08001198 execute();
1199 EXPECT_TRUE(mReader.takeErrors().empty());
1200
ramindani431aad42022-02-01 21:44:29 +00001201 mWriter.presentDisplay(getPrimaryDisplayId());
Ady Abraham72c5b502021-12-10 17:23:39 -08001202 execute();
1203 EXPECT_TRUE(mReader.takeErrors().empty());
1204
ramindani431aad42022-02-01 21:44:29 +00001205 auto presentFence = mReader.takePresentFence(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -08001206 // take ownership
1207 const int fenceOwner = presentFence.get();
1208 *presentFence.getR() = -1;
1209 EXPECT_NE(-1, fenceOwner);
1210 return sp<::android::Fence>::make(fenceOwner);
Ady Abraham72c5b502021-12-10 17:23:39 -08001211 }
1212
1213 int32_t getVsyncPeriod() {
ramindani431aad42022-02-01 21:44:29 +00001214 const auto& [status, activeConfig] =
1215 mComposerClient->getActiveConfig(getPrimaryDisplayId());
1216 EXPECT_TRUE(status.isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001217
ramindani431aad42022-02-01 21:44:29 +00001218 const auto& [vsyncPeriodStatus, vsyncPeriod] = mComposerClient->getDisplayAttribute(
1219 getPrimaryDisplayId(), activeConfig, DisplayAttribute::VSYNC_PERIOD);
1220 EXPECT_TRUE(vsyncPeriodStatus.isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001221 return vsyncPeriod;
1222 }
1223
1224 int64_t createOnScreenLayer() {
ramindani431aad42022-02-01 21:44:29 +00001225 const auto& [status, layer] =
1226 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1227 EXPECT_TRUE(status.isOk());
1228 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1229 getPrimaryDisplay().getDisplayHeight()};
1230 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1231 (float)getPrimaryDisplay().getDisplayHeight()};
1232 configureLayer(getPrimaryDisplay(), layer, Composition::DEVICE, displayFrame, cropRect);
1233 mWriter.setLayerDataspace(getPrimaryDisplayId(), layer, common::Dataspace::UNKNOWN);
Ady Abraham72c5b502021-12-10 17:23:39 -08001234 return layer;
1235 }
1236
Midas Chiena0b56bd2022-01-13 23:27:33 +08001237 bool hasDisplayCapability(int64_t display, DisplayCapability cap) {
ramindani431aad42022-02-01 21:44:29 +00001238 const auto& [status, capabilities] = mComposerClient->getDisplayCapabilities(display);
1239 EXPECT_TRUE(status.isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08001240
1241 return std::find(capabilities.begin(), capabilities.end(), cap) != capabilities.end();
1242 }
1243
ramindanidcfe3a82021-11-29 17:00:31 +00001244 void Test_setActiveConfigWithConstraints(const TestParameters& params) {
1245 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00001246 forEachTwoConfigs(display.getDisplayId(), [&](int32_t config1, int32_t config2) {
1247 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001248 sendRefreshFrame(display, nullptr);
1249
ramindani431aad42022-02-01 21:44:29 +00001250 const auto displayConfigGroup1 = display.getDisplayConfig(config1);
1251 int32_t vsyncPeriod1 = displayConfigGroup1.vsyncPeriod;
1252 int32_t configGroup1 = displayConfigGroup1.configGroup;
1253
1254 const auto displayConfigGroup2 = display.getDisplayConfig(config2);
1255 int32_t vsyncPeriod2 = displayConfigGroup2.vsyncPeriod;
1256 int32_t configGroup2 = displayConfigGroup2.configGroup;
ramindanidcfe3a82021-11-29 17:00:31 +00001257
1258 if (vsyncPeriod1 == vsyncPeriod2) {
1259 return; // continue
1260 }
1261
1262 // We don't allow delayed change when changing config groups
1263 if (params.delayForChange > 0 && configGroup1 != configGroup2) {
1264 return; // continue
1265 }
1266
ramindanidcfe3a82021-11-29 17:00:31 +00001267 VsyncPeriodChangeConstraints constraints = {
1268 .desiredTimeNanos = systemTime() + params.delayForChange,
1269 .seamlessRequired = false};
ramindani431aad42022-02-01 21:44:29 +00001270 const auto& [status, timeline] = mComposerClient->setActiveConfigWithConstraints(
1271 &display, config2, constraints);
1272 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001273
1274 EXPECT_TRUE(timeline.newVsyncAppliedTimeNanos >= constraints.desiredTimeNanos);
1275 // Refresh rate should change within a reasonable time
1276 constexpr std::chrono::nanoseconds kReasonableTimeForChange = 1s; // 1 second
1277 EXPECT_TRUE(timeline.newVsyncAppliedTimeNanos - constraints.desiredTimeNanos <=
1278 kReasonableTimeForChange.count());
1279
1280 if (timeline.refreshRequired) {
1281 if (params.refreshMiss) {
1282 // Miss the refresh frame on purpose to make sure the implementation sends a
1283 // callback
1284 std::this_thread::sleep_until(toTimePoint(timeline.refreshTimeNanos) +
1285 100ms);
1286 }
1287 sendRefreshFrame(display, &timeline);
1288 }
ramindani431aad42022-02-01 21:44:29 +00001289 waitForVsyncPeriodChange(display.getDisplayId(), timeline,
1290 constraints.desiredTimeNanos, vsyncPeriod1, vsyncPeriod2);
ramindanidcfe3a82021-11-29 17:00:31 +00001291
1292 // At this point the refresh rate should have changed already, however in rare
1293 // cases the implementation might have missed the deadline. In this case a new
1294 // timeline should have been provided.
ramindani431aad42022-02-01 21:44:29 +00001295 auto newTimeline = mComposerClient->takeLastVsyncPeriodChangeTimeline();
ramindanidcfe3a82021-11-29 17:00:31 +00001296 if (timeline.refreshRequired && params.refreshMiss) {
1297 EXPECT_TRUE(newTimeline.has_value());
1298 }
1299
1300 if (newTimeline.has_value()) {
1301 if (newTimeline->refreshRequired) {
1302 sendRefreshFrame(display, &newTimeline.value());
1303 }
ramindani431aad42022-02-01 21:44:29 +00001304 waitForVsyncPeriodChange(display.getDisplayId(), newTimeline.value(),
ramindanidcfe3a82021-11-29 17:00:31 +00001305 constraints.desiredTimeNanos, vsyncPeriod1,
1306 vsyncPeriod2);
1307 }
1308
ramindani431aad42022-02-01 21:44:29 +00001309 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanos] =
1310 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
1311 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001312 EXPECT_EQ(vsyncPeriodNanos, vsyncPeriod2);
1313 });
1314 }
1315 }
1316
Ady Abraham72c5b502021-12-10 17:23:39 -08001317 void Test_expectedPresentTime(std::optional<int> framesDelay) {
Jason Macnak325e8232022-01-24 14:48:55 -08001318 if (hasCapability(Capability::PRESENT_FENCE_IS_NOT_RELIABLE)) {
1319 GTEST_SUCCEED() << "Device has unreliable present fences capability, skipping";
1320 return;
1321 }
1322
ramindani431aad42022-02-01 21:44:29 +00001323 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001324
1325 const auto vsyncPeriod = getVsyncPeriod();
1326
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001327 const auto buffer1 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1328 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
Ady Abraham72c5b502021-12-10 17:23:39 -08001329 ASSERT_NE(nullptr, buffer1);
1330 ASSERT_NE(nullptr, buffer2);
1331
1332 const auto layer = createOnScreenLayer();
ramindani431aad42022-02-01 21:44:29 +00001333 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer1->handle,
1334 /*acquireFence*/ -1);
Ady Abraham72c5b502021-12-10 17:23:39 -08001335 const sp<::android::Fence> presentFence1 =
1336 presentAndGetFence(ComposerClientWriter::kNoTimestamp);
1337 presentFence1->waitForever(LOG_TAG);
1338
1339 auto expectedPresentTime = presentFence1->getSignalTime() + vsyncPeriod;
1340 if (framesDelay.has_value()) {
1341 expectedPresentTime += *framesDelay * vsyncPeriod;
1342 }
1343
ramindani431aad42022-02-01 21:44:29 +00001344 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer2->handle,
1345 /*acquireFence*/ -1);
Ady Abraham72c5b502021-12-10 17:23:39 -08001346 const auto setExpectedPresentTime = [&]() -> std::optional<ClockMonotonicTimestamp> {
1347 if (!framesDelay.has_value()) {
1348 return ComposerClientWriter::kNoTimestamp;
1349 } else if (*framesDelay == 0) {
1350 return ClockMonotonicTimestamp{0};
1351 }
1352 return ClockMonotonicTimestamp{expectedPresentTime};
1353 }();
1354
1355 const sp<::android::Fence> presentFence2 = presentAndGetFence(setExpectedPresentTime);
1356 presentFence2->waitForever(LOG_TAG);
1357
1358 const auto actualPresentTime = presentFence2->getSignalTime();
Ady Abrahamdf084f32022-01-10 14:10:23 -08001359 EXPECT_GE(actualPresentTime, expectedPresentTime - vsyncPeriod / 2);
Ady Abraham72c5b502021-12-10 17:23:39 -08001360
ramindani431aad42022-02-01 21:44:29 +00001361 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001362 }
1363
ramindani431aad42022-02-01 21:44:29 +00001364 void configureLayer(const VtsDisplay& display, int64_t layer, Composition composition,
1365 const Rect& displayFrame, const FRect& cropRect) {
1366 mWriter.setLayerCompositionType(display.getDisplayId(), layer, composition);
1367 mWriter.setLayerDisplayFrame(display.getDisplayId(), layer, displayFrame);
1368 mWriter.setLayerPlaneAlpha(display.getDisplayId(), layer, /*alpha*/ 1);
1369 mWriter.setLayerSourceCrop(display.getDisplayId(), layer, cropRect);
1370 mWriter.setLayerTransform(display.getDisplayId(), layer, static_cast<Transform>(0));
1371 mWriter.setLayerVisibleRegion(display.getDisplayId(), layer,
1372 std::vector<Rect>(1, displayFrame));
1373 mWriter.setLayerZOrder(display.getDisplayId(), layer, /*z*/ 10);
1374 mWriter.setLayerBlendMode(display.getDisplayId(), layer, BlendMode::NONE);
1375 mWriter.setLayerSurfaceDamage(display.getDisplayId(), layer,
1376 std::vector<Rect>(1, displayFrame));
1377 }
ramindanidcfe3a82021-11-29 17:00:31 +00001378 // clang-format off
1379 const std::array<float, 16> kIdentity = {{
1380 1.0f, 0.0f, 0.0f, 0.0f,
1381 0.0f, 1.0f, 0.0f, 0.0f,
1382 0.0f, 0.0f, 1.0f, 0.0f,
1383 0.0f, 0.0f, 0.0f, 1.0f,
1384 }};
1385 // clang-format on
1386
Ady Abraham91c9d1a2021-12-15 18:14:45 -08001387 ComposerClientWriter mWriter;
1388 ComposerClientReader mReader;
ramindanidcfe3a82021-11-29 17:00:31 +00001389};
1390
ramindani431aad42022-02-01 21:44:29 +00001391TEST_P(GraphicsComposerAidlCommandTest, SetColorTransform) {
1392 mWriter.setColorTransform(getPrimaryDisplayId(), kIdentity.data());
ramindanidcfe3a82021-11-29 17:00:31 +00001393 execute();
1394}
1395
1396TEST_P(GraphicsComposerAidlCommandTest, SetLayerColorTransform) {
ramindani431aad42022-02-01 21:44:29 +00001397 const auto& [status, layer] =
1398 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1399 EXPECT_TRUE(status.isOk());
1400 mWriter.setLayerColorTransform(getPrimaryDisplayId(), layer, kIdentity.data());
ramindanidcfe3a82021-11-29 17:00:31 +00001401 execute();
1402
Ady Abraham3192f3d2021-12-03 16:08:56 -08001403 const auto errors = mReader.takeErrors();
Jason Macnak062bc9a2022-01-20 15:00:09 -08001404 if (errors.size() == 1 && errors[0].errorCode == IComposerClient::EX_UNSUPPORTED) {
ramindanidcfe3a82021-11-29 17:00:31 +00001405 GTEST_SUCCEED() << "setLayerColorTransform is not supported";
1406 return;
1407 }
1408}
1409
Alec Mouri60564e12021-12-09 18:48:20 -08001410TEST_P(GraphicsComposerAidlCommandTest, SetDisplayBrightness) {
ramindani431aad42022-02-01 21:44:29 +00001411 const auto& [status, capabilities] =
1412 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
1413 ASSERT_TRUE(status.isOk());
Alec Mouri60564e12021-12-09 18:48:20 -08001414 bool brightnessSupport = std::find(capabilities.begin(), capabilities.end(),
1415 DisplayCapability::BRIGHTNESS) != capabilities.end();
1416 if (!brightnessSupport) {
Alec Mouri03b6daa2022-03-23 18:45:02 +00001417 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.5f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001418 execute();
1419 const auto errors = mReader.takeErrors();
1420 EXPECT_EQ(1, errors.size());
Jason Macnak062bc9a2022-01-20 15:00:09 -08001421 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, errors[0].errorCode);
Alec Mouri60564e12021-12-09 18:48:20 -08001422 GTEST_SUCCEED() << "SetDisplayBrightness is not supported";
1423 return;
1424 }
1425
Alec Mouri03b6daa2022-03-23 18:45:02 +00001426 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001427 execute();
1428 EXPECT_TRUE(mReader.takeErrors().empty());
1429
Alec Mouri03b6daa2022-03-23 18:45:02 +00001430 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.5f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001431 execute();
1432 EXPECT_TRUE(mReader.takeErrors().empty());
1433
Alec Mouri03b6daa2022-03-23 18:45:02 +00001434 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 1.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001435 execute();
1436 EXPECT_TRUE(mReader.takeErrors().empty());
1437
Alec Mouri03b6daa2022-03-23 18:45:02 +00001438 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ -1.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001439 execute();
1440 EXPECT_TRUE(mReader.takeErrors().empty());
1441
Alec Mouri03b6daa2022-03-23 18:45:02 +00001442 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 2.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001443 execute();
1444 {
1445 const auto errors = mReader.takeErrors();
ramindanib3bdf052022-01-12 18:27:05 +00001446 ASSERT_EQ(1, errors.size());
Alec Mouri60564e12021-12-09 18:48:20 -08001447 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1448 }
1449
Alec Mouri03b6daa2022-03-23 18:45:02 +00001450 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ -2.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001451 execute();
1452 {
1453 const auto errors = mReader.takeErrors();
ramindanib3bdf052022-01-12 18:27:05 +00001454 ASSERT_EQ(1, errors.size());
Alec Mouri60564e12021-12-09 18:48:20 -08001455 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1456 }
1457}
1458
ramindani431aad42022-02-01 21:44:29 +00001459TEST_P(GraphicsComposerAidlCommandTest, SetClientTarget) {
1460 EXPECT_TRUE(mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kBufferSlotCount)
1461 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001462
ramindani431aad42022-02-01 21:44:29 +00001463 mWriter.setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, nullptr, /*acquireFence*/ -1,
1464 Dataspace::UNKNOWN, std::vector<Rect>());
ramindanidcfe3a82021-11-29 17:00:31 +00001465
1466 execute();
1467}
1468
ramindani431aad42022-02-01 21:44:29 +00001469TEST_P(GraphicsComposerAidlCommandTest, SetOutputBuffer) {
1470 const auto& [status, virtualDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
1471 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001472 if (virtualDisplayCount == 0) {
1473 GTEST_SUCCEED() << "no virtual display support";
1474 return;
1475 }
1476
ramindani431aad42022-02-01 21:44:29 +00001477 const auto& [displayStatus, display] = mComposerClient->createVirtualDisplay(
1478 /*width*/ 64, /*height*/ 64, common::PixelFormat::IMPLEMENTATION_DEFINED,
1479 kBufferSlotCount);
1480 EXPECT_TRUE(displayStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001481
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001482 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001483 const auto handle = buffer->handle;
ramindani431aad42022-02-01 21:44:29 +00001484 mWriter.setOutputBuffer(display.display, /*slot*/ 0, handle, /*releaseFence*/ -1);
ramindanidcfe3a82021-11-29 17:00:31 +00001485 execute();
1486}
1487
ramindani431aad42022-02-01 21:44:29 +00001488TEST_P(GraphicsComposerAidlCommandTest, ValidDisplay) {
1489 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001490 execute();
1491}
1492
ramindani431aad42022-02-01 21:44:29 +00001493TEST_P(GraphicsComposerAidlCommandTest, AcceptDisplayChanges) {
1494 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1495 mWriter.acceptDisplayChanges(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001496 execute();
1497}
1498
ramindani431aad42022-02-01 21:44:29 +00001499TEST_P(GraphicsComposerAidlCommandTest, PresentDisplay) {
1500 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1501 mWriter.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001502 execute();
1503}
1504
1505/**
1506 * Test IComposerClient::Command::PRESENT_DISPLAY
1507 *
1508 * Test that IComposerClient::Command::PRESENT_DISPLAY works without
1509 * additional call to validateDisplay when only the layer buffer handle and
1510 * surface damage have been set
1511 */
ramindani431aad42022-02-01 21:44:29 +00001512TEST_P(GraphicsComposerAidlCommandTest, PresentDisplayNoLayerStateChanges) {
Jason Macnak325e8232022-01-24 14:48:55 -08001513 if (!hasCapability(Capability::SKIP_VALIDATE)) {
ramindanidcfe3a82021-11-29 17:00:31 +00001514 GTEST_SUCCEED() << "Device does not have skip validate capability, skipping";
1515 return;
1516 }
ramindani431aad42022-02-01 21:44:29 +00001517 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001518
ramindani431aad42022-02-01 21:44:29 +00001519 const auto& [renderIntentsStatus, renderIntents] =
1520 mComposerClient->getRenderIntents(getPrimaryDisplayId(), ColorMode::NATIVE);
1521 EXPECT_TRUE(renderIntentsStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001522 for (auto intent : renderIntents) {
ramindani431aad42022-02-01 21:44:29 +00001523 EXPECT_TRUE(mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE, intent)
1524 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001525
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001526 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001527 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001528 ASSERT_NE(nullptr, handle);
1529
ramindani431aad42022-02-01 21:44:29 +00001530 const auto& [layerStatus, layer] =
1531 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1532 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001533
ramindani431aad42022-02-01 21:44:29 +00001534 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1535 getPrimaryDisplay().getDisplayHeight()};
1536 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1537 (float)getPrimaryDisplay().getDisplayHeight()};
1538 configureLayer(getPrimaryDisplay(), layer, Composition::CURSOR, displayFrame, cropRect);
1539 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle,
1540 /*acquireFence*/ -1);
1541 mWriter.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1542 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001543 execute();
ramindani431aad42022-02-01 21:44:29 +00001544 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanidcfe3a82021-11-29 17:00:31 +00001545 GTEST_SUCCEED() << "Composition change requested, skipping test";
1546 return;
1547 }
1548
Ady Abraham3192f3d2021-12-03 16:08:56 -08001549 ASSERT_TRUE(mReader.takeErrors().empty());
ramindani431aad42022-02-01 21:44:29 +00001550 mWriter.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001551 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001552 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001553
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001554 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001555 const auto handle2 = buffer2->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001556 ASSERT_NE(nullptr, handle2);
ramindani431aad42022-02-01 21:44:29 +00001557 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle2,
1558 /*acquireFence*/ -1);
1559 mWriter.setLayerSurfaceDamage(getPrimaryDisplayId(), layer,
1560 std::vector<Rect>(1, {0, 0, 10, 10}));
1561 mWriter.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001562 execute();
1563 }
1564}
1565
ramindani431aad42022-02-01 21:44:29 +00001566TEST_P(GraphicsComposerAidlCommandTest, SetLayerCursorPosition) {
1567 const auto& [layerStatus, layer] =
1568 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1569 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001570
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001571 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001572 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001573 ASSERT_NE(nullptr, handle);
ramindanidcfe3a82021-11-29 17:00:31 +00001574
ramindani431aad42022-02-01 21:44:29 +00001575 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
1576
1577 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1578 getPrimaryDisplay().getDisplayHeight()};
1579 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1580 (float)getPrimaryDisplay().getDisplayHeight()};
1581 configureLayer(getPrimaryDisplay(), layer, Composition::CURSOR, displayFrame, cropRect);
1582 mWriter.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1583 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001584
1585 execute();
Ady Abraham46219f52021-12-20 09:44:31 -08001586
ramindani431aad42022-02-01 21:44:29 +00001587 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanidcfe3a82021-11-29 17:00:31 +00001588 GTEST_SUCCEED() << "Composition change requested, skipping test";
1589 return;
1590 }
ramindani431aad42022-02-01 21:44:29 +00001591 mWriter.presentDisplay(getPrimaryDisplayId());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001592 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001593
ramindani431aad42022-02-01 21:44:29 +00001594 mWriter.setLayerCursorPosition(getPrimaryDisplayId(), layer, /*x*/ 1, /*y*/ 1);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001595 execute();
1596
ramindani431aad42022-02-01 21:44:29 +00001597 mWriter.setLayerCursorPosition(getPrimaryDisplayId(), layer, /*x*/ 0, /*y*/ 0);
1598 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1599 mWriter.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001600 execute();
1601}
1602
ramindani431aad42022-02-01 21:44:29 +00001603TEST_P(GraphicsComposerAidlCommandTest, SetLayerBuffer) {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001604 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001605 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001606 ASSERT_NE(nullptr, handle);
1607
ramindani431aad42022-02-01 21:44:29 +00001608 const auto& [layerStatus, layer] =
1609 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1610 EXPECT_TRUE(layerStatus.isOk());
1611 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
ramindanidcfe3a82021-11-29 17:00:31 +00001612 execute();
1613}
1614
ramindani431aad42022-02-01 21:44:29 +00001615TEST_P(GraphicsComposerAidlCommandTest, SetLayerSurfaceDamage) {
1616 const auto& [layerStatus, layer] =
1617 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1618 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001619
1620 Rect empty{0, 0, 0, 0};
1621 Rect unit{0, 0, 1, 1};
1622
ramindani431aad42022-02-01 21:44:29 +00001623 mWriter.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
ramindanidcfe3a82021-11-29 17:00:31 +00001624 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001625 ASSERT_TRUE(mReader.takeErrors().empty());
1626
ramindani431aad42022-02-01 21:44:29 +00001627 mWriter.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001628 execute();
1629 ASSERT_TRUE(mReader.takeErrors().empty());
1630
ramindani431aad42022-02-01 21:44:29 +00001631 mWriter.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001632 execute();
1633 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001634}
1635
ramindani431aad42022-02-01 21:44:29 +00001636TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlockingRegion) {
1637 const auto& [layerStatus, layer] =
1638 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1639 EXPECT_TRUE(layerStatus.isOk());
Leon Scroggins III03318152022-01-13 12:24:19 -05001640
1641 Rect empty{0, 0, 0, 0};
1642 Rect unit{0, 0, 1, 1};
1643
ramindani431aad42022-02-01 21:44:29 +00001644 mWriter.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
Leon Scroggins III03318152022-01-13 12:24:19 -05001645 execute();
1646 ASSERT_TRUE(mReader.takeErrors().empty());
1647
ramindani431aad42022-02-01 21:44:29 +00001648 mWriter.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Leon Scroggins III03318152022-01-13 12:24:19 -05001649 execute();
1650 ASSERT_TRUE(mReader.takeErrors().empty());
1651
ramindani431aad42022-02-01 21:44:29 +00001652 mWriter.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
Leon Scroggins III03318152022-01-13 12:24:19 -05001653 execute();
1654 ASSERT_TRUE(mReader.takeErrors().empty());
1655}
1656
ramindani431aad42022-02-01 21:44:29 +00001657TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlendMode) {
1658 const auto& [layerStatus, layer] =
1659 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1660 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001661
ramindani431aad42022-02-01 21:44:29 +00001662 mWriter.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::NONE);
ramindanidcfe3a82021-11-29 17:00:31 +00001663 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001664 ASSERT_TRUE(mReader.takeErrors().empty());
1665
ramindani431aad42022-02-01 21:44:29 +00001666 mWriter.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::PREMULTIPLIED);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001667 execute();
1668 ASSERT_TRUE(mReader.takeErrors().empty());
1669
ramindani431aad42022-02-01 21:44:29 +00001670 mWriter.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::COVERAGE);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001671 execute();
1672 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001673}
1674
ramindani431aad42022-02-01 21:44:29 +00001675TEST_P(GraphicsComposerAidlCommandTest, SetLayerColor) {
1676 const auto& [layerStatus, layer] =
1677 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1678 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001679
ramindani431aad42022-02-01 21:44:29 +00001680 mWriter.setLayerColor(getPrimaryDisplayId(), layer, Color{1.0f, 1.0f, 1.0f, 1.0f});
ramindanidcfe3a82021-11-29 17:00:31 +00001681 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001682 ASSERT_TRUE(mReader.takeErrors().empty());
1683
ramindani431aad42022-02-01 21:44:29 +00001684 mWriter.setLayerColor(getPrimaryDisplayId(), layer, Color{0.0f, 0.0f, 0.0f, 0.0f});
Ady Abraham3192f3d2021-12-03 16:08:56 -08001685 execute();
1686 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001687}
1688
ramindani431aad42022-02-01 21:44:29 +00001689TEST_P(GraphicsComposerAidlCommandTest, SetLayerCompositionType) {
1690 const auto& [layerStatus, layer] =
1691 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1692 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001693
ramindani431aad42022-02-01 21:44:29 +00001694 mWriter.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CLIENT);
ramindanidcfe3a82021-11-29 17:00:31 +00001695 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001696 ASSERT_TRUE(mReader.takeErrors().empty());
1697
ramindani431aad42022-02-01 21:44:29 +00001698 mWriter.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::DEVICE);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001699 execute();
1700 ASSERT_TRUE(mReader.takeErrors().empty());
1701
ramindani431aad42022-02-01 21:44:29 +00001702 mWriter.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::SOLID_COLOR);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001703 execute();
1704 ASSERT_TRUE(mReader.takeErrors().empty());
1705
ramindani431aad42022-02-01 21:44:29 +00001706 mWriter.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CURSOR);
1707 execute();
1708}
1709
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001710TEST_P(GraphicsComposerAidlCommandTest, DisplayDecoration) {
1711 for (VtsDisplay& display : mDisplays) {
1712 const auto [layerStatus, layer] =
1713 mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount);
1714 EXPECT_TRUE(layerStatus.isOk());
1715
1716 const auto [error, support] =
1717 mComposerClient->getDisplayDecorationSupport(display.getDisplayId());
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001718
Leon Scroggins III91590872022-02-23 09:51:21 -05001719 const auto format = (error.isOk() && support) ? support->format
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001720 : aidl::android::hardware::graphics::common::PixelFormat::RGBA_8888;
1721 const auto decorBuffer = allocate(static_cast<::android::PixelFormat>(format));
1722 ASSERT_NE(nullptr, decorBuffer);
1723 if (::android::OK != decorBuffer->initCheck()) {
1724 if (support) {
1725 FAIL() << "Device advertised display decoration support with format "
1726 << aidl::android::hardware::graphics::common::toString(format)
1727 << " but failed to allocate it!";
1728 } else {
1729 FAIL() << "Device advertised NO display decoration support, but it should "
1730 << "still be able to allocate "
1731 << aidl::android::hardware::graphics::common::toString(format);
1732 }
1733 }
1734
Midas Chien7d55d422022-06-07 02:32:28 +08001735 configureLayer(display, layer, Composition::DISPLAY_DECORATION, display.getFrameRect(),
1736 display.getCrop());
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001737 mWriter.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, decorBuffer->handle,
1738 /*acquireFence*/ -1);
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001739 mWriter.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
1740 execute();
1741 if (support) {
1742 ASSERT_TRUE(mReader.takeErrors().empty());
1743 } else {
1744 const auto errors = mReader.takeErrors();
1745 ASSERT_EQ(1, errors.size());
Leon Scroggins III6455e792022-02-24 12:18:58 -05001746 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, errors[0].errorCode);
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001747 }
1748 }
1749}
1750
ramindani431aad42022-02-01 21:44:29 +00001751TEST_P(GraphicsComposerAidlCommandTest, SetLayerDataspace) {
1752 const auto& [layerStatus, layer] =
1753 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1754 EXPECT_TRUE(layerStatus.isOk());
1755
1756 mWriter.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1757 execute();
1758}
1759
1760TEST_P(GraphicsComposerAidlCommandTest, SetLayerDisplayFrame) {
1761 const auto& [layerStatus, layer] =
1762 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1763 EXPECT_TRUE(layerStatus.isOk());
1764
1765 mWriter.setLayerDisplayFrame(getPrimaryDisplayId(), layer, Rect{0, 0, 1, 1});
1766 execute();
1767}
1768
1769TEST_P(GraphicsComposerAidlCommandTest, SetLayerPlaneAlpha) {
1770 const auto& [layerStatus, layer] =
1771 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1772 EXPECT_TRUE(layerStatus.isOk());
1773
1774 mWriter.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 0.0f);
1775 execute();
1776 ASSERT_TRUE(mReader.takeErrors().empty());
1777
1778 mWriter.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 1.0f);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001779 execute();
1780 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001781}
1782
ramindani431aad42022-02-01 21:44:29 +00001783TEST_P(GraphicsComposerAidlCommandTest, SetLayerSidebandStream) {
Jason Macnak325e8232022-01-24 14:48:55 -08001784 if (!hasCapability(Capability::SIDEBAND_STREAM)) {
ramindanidcfe3a82021-11-29 17:00:31 +00001785 GTEST_SUCCEED() << "no sideband stream support";
1786 return;
1787 }
1788
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001789 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001790 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001791 ASSERT_NE(nullptr, handle);
1792
ramindani431aad42022-02-01 21:44:29 +00001793 const auto& [layerStatus, layer] =
1794 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1795 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001796
ramindani431aad42022-02-01 21:44:29 +00001797 mWriter.setLayerSidebandStream(getPrimaryDisplayId(), layer, handle);
ramindanidcfe3a82021-11-29 17:00:31 +00001798 execute();
1799}
1800
ramindani431aad42022-02-01 21:44:29 +00001801TEST_P(GraphicsComposerAidlCommandTest, SetLayerSourceCrop) {
1802 const auto& [layerStatus, layer] =
1803 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1804 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001805
ramindani431aad42022-02-01 21:44:29 +00001806 mWriter.setLayerSourceCrop(getPrimaryDisplayId(), layer, FRect{0.0f, 0.0f, 1.0f, 1.0f});
ramindanidcfe3a82021-11-29 17:00:31 +00001807 execute();
1808}
1809
ramindani431aad42022-02-01 21:44:29 +00001810TEST_P(GraphicsComposerAidlCommandTest, SetLayerTransform) {
1811 const auto& [layerStatus, layer] =
1812 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1813 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001814
ramindani431aad42022-02-01 21:44:29 +00001815 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, static_cast<Transform>(0));
ramindanidcfe3a82021-11-29 17:00:31 +00001816 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001817 ASSERT_TRUE(mReader.takeErrors().empty());
1818
ramindani431aad42022-02-01 21:44:29 +00001819 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_H);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001820 execute();
1821 ASSERT_TRUE(mReader.takeErrors().empty());
1822
ramindani431aad42022-02-01 21:44:29 +00001823 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_V);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001824 execute();
1825 ASSERT_TRUE(mReader.takeErrors().empty());
1826
ramindani431aad42022-02-01 21:44:29 +00001827 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_90);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001828 execute();
1829 ASSERT_TRUE(mReader.takeErrors().empty());
1830
ramindani431aad42022-02-01 21:44:29 +00001831 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_180);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001832 execute();
1833 ASSERT_TRUE(mReader.takeErrors().empty());
1834
ramindani431aad42022-02-01 21:44:29 +00001835 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_270);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001836 execute();
1837 ASSERT_TRUE(mReader.takeErrors().empty());
1838
ramindani431aad42022-02-01 21:44:29 +00001839 mWriter.setLayerTransform(getPrimaryDisplayId(), layer,
Ady Abraham3192f3d2021-12-03 16:08:56 -08001840 static_cast<Transform>(static_cast<int>(Transform::FLIP_H) |
1841 static_cast<int>(Transform::ROT_90)));
1842 execute();
1843 ASSERT_TRUE(mReader.takeErrors().empty());
1844
ramindani431aad42022-02-01 21:44:29 +00001845 mWriter.setLayerTransform(getPrimaryDisplayId(), layer,
Ady Abraham3192f3d2021-12-03 16:08:56 -08001846 static_cast<Transform>(static_cast<int>(Transform::FLIP_V) |
1847 static_cast<int>(Transform::ROT_90)));
1848 execute();
1849 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001850}
1851
ramindani431aad42022-02-01 21:44:29 +00001852TEST_P(GraphicsComposerAidlCommandTest, SetLayerVisibleRegion) {
1853 const auto& [layerStatus, layer] =
1854 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1855 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001856
1857 Rect empty{0, 0, 0, 0};
1858 Rect unit{0, 0, 1, 1};
1859
ramindani431aad42022-02-01 21:44:29 +00001860 mWriter.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
ramindanidcfe3a82021-11-29 17:00:31 +00001861 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001862 ASSERT_TRUE(mReader.takeErrors().empty());
1863
ramindani431aad42022-02-01 21:44:29 +00001864 mWriter.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001865 execute();
1866 ASSERT_TRUE(mReader.takeErrors().empty());
1867
ramindani431aad42022-02-01 21:44:29 +00001868 mWriter.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001869 execute();
1870 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001871}
1872
ramindani431aad42022-02-01 21:44:29 +00001873TEST_P(GraphicsComposerAidlCommandTest, SetLayerZOrder) {
1874 const auto& [layerStatus, layer] =
1875 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1876 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001877
ramindani431aad42022-02-01 21:44:29 +00001878 mWriter.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 10);
ramindanidcfe3a82021-11-29 17:00:31 +00001879 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001880 ASSERT_TRUE(mReader.takeErrors().empty());
1881
ramindani431aad42022-02-01 21:44:29 +00001882 mWriter.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 0);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001883 execute();
1884 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001885}
1886
ramindani431aad42022-02-01 21:44:29 +00001887TEST_P(GraphicsComposerAidlCommandTest, SetLayerPerFrameMetadata) {
1888 const auto& [layerStatus, layer] =
1889 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1890 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001891
ramindanidcfe3a82021-11-29 17:00:31 +00001892 /**
1893 * DISPLAY_P3 is a color space that uses the DCI_P3 primaries,
1894 * the D65 white point and the SRGB transfer functions.
1895 * Rendering Intent: Colorimetric
1896 * Primaries:
1897 * x y
1898 * green 0.265 0.690
1899 * blue 0.150 0.060
1900 * red 0.680 0.320
1901 * white (D65) 0.3127 0.3290
1902 */
1903
1904 std::vector<PerFrameMetadata> aidlMetadata;
1905 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X, 0.680f});
1906 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y, 0.320f});
1907 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_X, 0.265f});
1908 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_Y, 0.690f});
1909 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_X, 0.150f});
1910 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_Y, 0.060f});
1911 aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_X, 0.3127f});
1912 aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_Y, 0.3290f});
1913 aidlMetadata.push_back({PerFrameMetadataKey::MAX_LUMINANCE, 100.0f});
1914 aidlMetadata.push_back({PerFrameMetadataKey::MIN_LUMINANCE, 0.1f});
1915 aidlMetadata.push_back({PerFrameMetadataKey::MAX_CONTENT_LIGHT_LEVEL, 78.0});
1916 aidlMetadata.push_back({PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL, 62.0});
ramindani431aad42022-02-01 21:44:29 +00001917 mWriter.setLayerPerFrameMetadata(getPrimaryDisplayId(), layer, aidlMetadata);
ramindanidcfe3a82021-11-29 17:00:31 +00001918 execute();
1919
Ady Abraham3192f3d2021-12-03 16:08:56 -08001920 const auto errors = mReader.takeErrors();
1921 if (errors.size() == 1 && errors[0].errorCode == EX_UNSUPPORTED_OPERATION) {
ramindanidcfe3a82021-11-29 17:00:31 +00001922 GTEST_SUCCEED() << "SetLayerPerFrameMetadata is not supported";
ramindani431aad42022-02-01 21:44:29 +00001923 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001924 return;
1925 }
1926
ramindani431aad42022-02-01 21:44:29 +00001927 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001928}
1929
Alec Mourib1f16722022-02-07 13:03:44 -08001930TEST_P(GraphicsComposerAidlCommandTest, setLayerBrightness) {
ramindani431aad42022-02-01 21:44:29 +00001931 const auto& [layerStatus, layer] =
1932 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
Alec Mouri95e490b2022-01-06 13:46:58 -08001933
Alec Mourib1f16722022-02-07 13:03:44 -08001934 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, 0.2f);
Alec Mouri95e490b2022-01-06 13:46:58 -08001935 execute();
1936 ASSERT_TRUE(mReader.takeErrors().empty());
1937
Alec Mourib1f16722022-02-07 13:03:44 -08001938 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, 1.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08001939 execute();
1940 ASSERT_TRUE(mReader.takeErrors().empty());
1941
Alec Mourib1f16722022-02-07 13:03:44 -08001942 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, 0.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08001943 execute();
1944 ASSERT_TRUE(mReader.takeErrors().empty());
1945
Alec Mourib1f16722022-02-07 13:03:44 -08001946 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, -1.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08001947 execute();
Alec Mourib1f16722022-02-07 13:03:44 -08001948 {
1949 const auto errors = mReader.takeErrors();
1950 ASSERT_EQ(1, errors.size());
1951 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1952 }
1953
1954 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, std::nanf(""));
1955 execute();
1956 {
1957 const auto errors = mReader.takeErrors();
1958 ASSERT_EQ(1, errors.size());
1959 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1960 }
Alec Mouri95e490b2022-01-06 13:46:58 -08001961}
1962
ramindani431aad42022-02-01 21:44:29 +00001963TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints) {
ramindanidcfe3a82021-11-29 17:00:31 +00001964 Test_setActiveConfigWithConstraints({.delayForChange = 0, .refreshMiss = false});
1965}
1966
ramindani431aad42022-02-01 21:44:29 +00001967TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_Delayed) {
ramindanidcfe3a82021-11-29 17:00:31 +00001968 Test_setActiveConfigWithConstraints({.delayForChange = 300'000'000, // 300ms
1969 .refreshMiss = false});
1970}
1971
ramindani431aad42022-02-01 21:44:29 +00001972TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_MissRefresh) {
ramindanidcfe3a82021-11-29 17:00:31 +00001973 Test_setActiveConfigWithConstraints({.delayForChange = 0, .refreshMiss = true});
1974}
1975
ramindani431aad42022-02-01 21:44:29 +00001976TEST_P(GraphicsComposerAidlCommandTest, GetDisplayVsyncPeriod) {
ramindanidcfe3a82021-11-29 17:00:31 +00001977 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00001978 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
1979 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001980
ramindani431aad42022-02-01 21:44:29 +00001981 for (int32_t config : configs) {
1982 int32_t expectedVsyncPeriodNanos = display.getDisplayConfig(config).vsyncPeriod;
1983
ramindanidcfe3a82021-11-29 17:00:31 +00001984 VsyncPeriodChangeConstraints constraints;
1985
1986 constraints.desiredTimeNanos = systemTime();
1987 constraints.seamlessRequired = false;
ramindani431aad42022-02-01 21:44:29 +00001988
1989 const auto& [timelineStatus, timeline] =
1990 mComposerClient->setActiveConfigWithConstraints(&display, config, constraints);
1991 EXPECT_TRUE(timelineStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001992
1993 if (timeline.refreshRequired) {
1994 sendRefreshFrame(display, &timeline);
1995 }
ramindani431aad42022-02-01 21:44:29 +00001996 waitForVsyncPeriodChange(display.getDisplayId(), timeline, constraints.desiredTimeNanos,
1997 /*odPeriodNanos*/ 0, expectedVsyncPeriodNanos);
ramindanidcfe3a82021-11-29 17:00:31 +00001998
1999 int32_t vsyncPeriodNanos;
2000 int retryCount = 100;
2001 do {
2002 std::this_thread::sleep_for(10ms);
ramindani431aad42022-02-01 21:44:29 +00002003 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanosValue] =
2004 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
2005
2006 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
2007 vsyncPeriodNanos = vsyncPeriodNanosValue;
ramindanidcfe3a82021-11-29 17:00:31 +00002008 --retryCount;
2009 } while (vsyncPeriodNanos != expectedVsyncPeriodNanos && retryCount > 0);
2010
2011 EXPECT_EQ(vsyncPeriodNanos, expectedVsyncPeriodNanos);
2012
2013 // Make sure that the vsync period stays the same if the active config is not
2014 // changed.
2015 auto timeout = 1ms;
2016 for (int i = 0; i < 10; i++) {
2017 std::this_thread::sleep_for(timeout);
2018 timeout *= 2;
2019 vsyncPeriodNanos = 0;
ramindani431aad42022-02-01 21:44:29 +00002020 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanosValue] =
2021 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
2022
2023 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
2024 vsyncPeriodNanos = vsyncPeriodNanosValue;
ramindanidcfe3a82021-11-29 17:00:31 +00002025 EXPECT_EQ(vsyncPeriodNanos, expectedVsyncPeriodNanos);
2026 }
2027 }
2028 }
2029}
2030
ramindani431aad42022-02-01 21:44:29 +00002031TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_SeamlessNotAllowed) {
ramindanidcfe3a82021-11-29 17:00:31 +00002032 VsyncPeriodChangeConstraints constraints;
ramindanidcfe3a82021-11-29 17:00:31 +00002033 constraints.seamlessRequired = true;
2034 constraints.desiredTimeNanos = systemTime();
2035
2036 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00002037 forEachTwoConfigs(display.getDisplayId(), [&](int32_t config1, int32_t config2) {
2038 int32_t configGroup1 = display.getDisplayConfig(config1).configGroup;
2039 int32_t configGroup2 = display.getDisplayConfig(config2).configGroup;
ramindanidcfe3a82021-11-29 17:00:31 +00002040 if (configGroup1 != configGroup2) {
ramindani431aad42022-02-01 21:44:29 +00002041 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002042 sendRefreshFrame(display, nullptr);
ramindani431aad42022-02-01 21:44:29 +00002043 const auto& [status, _] = mComposerClient->setActiveConfigWithConstraints(
2044 &display, config2, constraints);
2045 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002046 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(
2047 status, IComposerClient::EX_SEAMLESS_NOT_ALLOWED));
ramindanidcfe3a82021-11-29 17:00:31 +00002048 }
2049 });
2050 }
2051}
2052
ramindani431aad42022-02-01 21:44:29 +00002053TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_NoTimestamp) {
2054 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ std::nullopt));
Ady Abraham72c5b502021-12-10 17:23:39 -08002055}
2056
ramindani431aad42022-02-01 21:44:29 +00002057TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_0) {
2058 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ 0));
Ady Abraham72c5b502021-12-10 17:23:39 -08002059}
2060
ramindani431aad42022-02-01 21:44:29 +00002061TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_5) {
2062 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ 5));
Ady Abraham72c5b502021-12-10 17:23:39 -08002063}
2064
ramindani431aad42022-02-01 21:44:29 +00002065TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Unsupported) {
2066 const bool hasDisplayIdleTimerSupport =
2067 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002068 if (!hasDisplayIdleTimerSupport) {
ramindani431aad42022-02-01 21:44:29 +00002069 const auto& status =
2070 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0);
2071 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002072 EXPECT_NO_FATAL_FAILURE(
2073 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
Midas Chiena0b56bd2022-01-13 23:27:33 +08002074 }
2075}
2076
ramindani431aad42022-02-01 21:44:29 +00002077TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_BadParameter) {
2078 const bool hasDisplayIdleTimerSupport =
2079 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002080 if (!hasDisplayIdleTimerSupport) {
2081 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2082 return;
2083 }
2084
ramindani431aad42022-02-01 21:44:29 +00002085 const auto& status =
2086 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ -1);
2087 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002088 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
Midas Chiena0b56bd2022-01-13 23:27:33 +08002089}
2090
ramindani431aad42022-02-01 21:44:29 +00002091TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Disable) {
2092 const bool hasDisplayIdleTimerSupport =
2093 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002094 if (!hasDisplayIdleTimerSupport) {
2095 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2096 return;
2097 }
2098
ramindani431aad42022-02-01 21:44:29 +00002099 EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002100 std::this_thread::sleep_for(1s);
ramindani431aad42022-02-01 21:44:29 +00002101 EXPECT_EQ(0, mComposerClient->getVsyncIdleCount());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002102}
2103
ramindani431aad42022-02-01 21:44:29 +00002104TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Timeout_2) {
2105 const bool hasDisplayIdleTimerSupport =
2106 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002107 if (!hasDisplayIdleTimerSupport) {
2108 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2109 return;
2110 }
2111
ramindani431aad42022-02-01 21:44:29 +00002112 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
2113 EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002114
Leon Scroggins IIIde057582022-01-13 12:26:00 -05002115 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002116 ASSERT_NE(nullptr, buffer->handle);
2117
2118 const auto layer = createOnScreenLayer();
ramindani431aad42022-02-01 21:44:29 +00002119 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer->handle,
2120 /*acquireFence*/ -1);
2121 int32_t vsyncIdleCount = mComposerClient->getVsyncIdleCount();
Midas Chiena0b56bd2022-01-13 23:27:33 +08002122 auto earlyVsyncIdleTime = systemTime() + std::chrono::nanoseconds(2s).count();
ramindani431aad42022-02-01 21:44:29 +00002123 EXPECT_TRUE(
2124 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 2000).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002125
2126 const sp<::android::Fence> presentFence =
ramindani431aad42022-02-01 21:44:29 +00002127 presentAndGetFence(ComposerClientWriter::kNoTimestamp);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002128 presentFence->waitForever(LOG_TAG);
2129
2130 std::this_thread::sleep_for(3s);
ramindani431aad42022-02-01 21:44:29 +00002131 if (vsyncIdleCount < mComposerClient->getVsyncIdleCount()) {
2132 EXPECT_GE(mComposerClient->getVsyncIdleTime(), earlyVsyncIdleTime);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002133 }
2134
ramindani431aad42022-02-01 21:44:29 +00002135 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002136}
2137
Kriti Dang4efe8602022-05-03 16:55:59 +02002138/*
2139 * Test that no two display configs are exactly the same.
2140 */
2141TEST_P(GraphicsComposerAidlTest, GetDisplayConfigNoRepetitions) {
2142 for (const auto& display : mDisplays) {
2143 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
2144 for (std::vector<int>::size_type i = 0; i < configs.size(); i++) {
2145 for (std::vector<int>::size_type j = i + 1; j < configs.size(); j++) {
2146 const auto& [widthStatus1, width1] = mComposerClient->getDisplayAttribute(
2147 display.getDisplayId(), configs[i], DisplayAttribute::WIDTH);
2148 const auto& [heightStatus1, height1] = mComposerClient->getDisplayAttribute(
2149 display.getDisplayId(), configs[i], DisplayAttribute::HEIGHT);
2150 const auto& [vsyncPeriodStatus1, vsyncPeriod1] =
2151 mComposerClient->getDisplayAttribute(display.getDisplayId(), configs[i],
2152 DisplayAttribute::VSYNC_PERIOD);
2153 const auto& [groupStatus1, group1] = mComposerClient->getDisplayAttribute(
2154 display.getDisplayId(), configs[i], DisplayAttribute::CONFIG_GROUP);
2155
2156 const auto& [widthStatus2, width2] = mComposerClient->getDisplayAttribute(
2157 display.getDisplayId(), configs[j], DisplayAttribute::WIDTH);
2158 const auto& [heightStatus2, height2] = mComposerClient->getDisplayAttribute(
2159 display.getDisplayId(), configs[j], DisplayAttribute::HEIGHT);
2160 const auto& [vsyncPeriodStatus2, vsyncPeriod2] =
2161 mComposerClient->getDisplayAttribute(display.getDisplayId(), configs[j],
2162 DisplayAttribute::VSYNC_PERIOD);
2163 const auto& [groupStatus2, group2] = mComposerClient->getDisplayAttribute(
2164 display.getDisplayId(), configs[j], DisplayAttribute::CONFIG_GROUP);
2165
2166 ASSERT_FALSE(width1 == width2 && height1 == height2 &&
2167 vsyncPeriod1 == vsyncPeriod2 && group1 == group2);
2168 }
2169 }
2170 }
2171}
2172
ramindanidcfe3a82021-11-29 17:00:31 +00002173GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlCommandTest);
2174INSTANTIATE_TEST_SUITE_P(
2175 PerInstance, GraphicsComposerAidlCommandTest,
2176 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
2177 ::android::PrintInstanceNameToString);
2178
ramindanid32ae8e2021-10-01 18:48:39 +00002179GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlTest);
2180INSTANTIATE_TEST_SUITE_P(
2181 PerInstance, GraphicsComposerAidlTest,
2182 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
2183 ::android::PrintInstanceNameToString);
2184} // namespace
2185} // namespace aidl::android::hardware::graphics::composer3::vts
2186
2187int main(int argc, char** argv) {
2188 ::testing::InitGoogleTest(&argc, argv);
2189
2190 using namespace std::chrono_literals;
2191 if (!android::base::WaitForProperty("init.svc.surfaceflinger", "stopped", 10s)) {
2192 ALOGE("Failed to stop init.svc.surfaceflinger");
2193 return -1;
2194 }
ramindanibeea10e2021-12-07 21:02:49 +00002195
2196 android::ProcessState::self()->setThreadPoolMaxThreadCount(4);
2197
2198 // The binder threadpool we start will inherit sched policy and priority
2199 // of (this) creating thread. We want the binder thread pool to have
2200 // SCHED_FIFO policy and priority 1 (lowest RT priority)
2201 // Once the pool is created we reset this thread's priority back to
2202 // original.
2203 // This thread policy is based on what we do in the SurfaceFlinger while starting
2204 // the thread pool and we need to replicate that for the VTS tests.
2205 int newPriority = 0;
2206 int origPolicy = sched_getscheduler(0);
2207 struct sched_param origSchedParam;
2208
2209 int errorInPriorityModification = sched_getparam(0, &origSchedParam);
2210 if (errorInPriorityModification == 0) {
2211 int policy = SCHED_FIFO;
2212 newPriority = sched_get_priority_min(policy);
2213
2214 struct sched_param param;
2215 param.sched_priority = newPriority;
2216
2217 errorInPriorityModification = sched_setscheduler(0, policy, &param);
2218 }
2219
2220 // start the thread pool
2221 android::ProcessState::self()->startThreadPool();
2222
2223 // Reset current thread's policy and priority
2224 if (errorInPriorityModification == 0) {
2225 errorInPriorityModification = sched_setscheduler(0, origPolicy, &origSchedParam);
2226 } else {
2227 ALOGE("Failed to set VtsHalGraphicsComposer3_TargetTest binder threadpool priority to "
2228 "SCHED_FIFO");
2229 }
2230
ramindanid32ae8e2021-10-01 18:48:39 +00002231 return RUN_ALL_TESTS();
ramindania9780262021-10-01 18:48:39 +00002232}