blob: 759bfecca393ae4b3685e61f9230c1bad6560ce4 [file] [log] [blame]
ramindani431aad42022-02-01 21:44:29 +00001/**
2 * Copyright (c) 2022, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
ramindanid32ae8e2021-10-01 18:48:39 +000016#include <aidl/Gtest.h>
17#include <aidl/Vintf.h>
Ady Abraham3192f3d2021-12-03 16:08:56 -080018#include <aidl/android/hardware/graphics/common/BlendMode.h>
ramindani3335f7a2021-10-25 17:22:35 +000019#include <aidl/android/hardware/graphics/common/BufferUsage.h>
20#include <aidl/android/hardware/graphics/common/FRect.h>
Leon Scroggins IIIde057582022-01-13 12:26:00 -050021#include <aidl/android/hardware/graphics/common/PixelFormat.h>
ramindani3335f7a2021-10-25 17:22:35 +000022#include <aidl/android/hardware/graphics/common/Rect.h>
ramindani3335f7a2021-10-25 17:22:35 +000023#include <aidl/android/hardware/graphics/composer3/Composition.h>
ramindanid32ae8e2021-10-01 18:48:39 +000024#include <aidl/android/hardware/graphics/composer3/IComposer.h>
25#include <android-base/properties.h>
ramindania9780262021-10-01 18:48:39 +000026#include <android/binder_process.h>
Ady Abraham91c9d1a2021-12-15 18:14:45 -080027#include <android/hardware/graphics/composer3/ComposerClientReader.h>
28#include <android/hardware/graphics/composer3/ComposerClientWriter.h>
ramindanid32ae8e2021-10-01 18:48:39 +000029#include <binder/ProcessState.h>
30#include <gtest/gtest.h>
Ady Abraham72c5b502021-12-10 17:23:39 -080031#include <ui/Fence.h>
ramindani3335f7a2021-10-25 17:22:35 +000032#include <ui/GraphicBuffer.h>
33#include <ui/PixelFormat.h>
ramindani0291f112021-11-04 03:45:46 +000034#include <algorithm>
ramindani592b6512021-10-08 21:15:19 +000035#include <numeric>
ramindanid32ae8e2021-10-01 18:48:39 +000036#include <string>
ramindani1cb794e2021-10-13 20:45:23 +000037#include <thread>
ramindani458e53e2022-02-23 17:30:16 +000038#include "GraphicsComposerCallback.h"
39#include "VtsComposerClient.h"
ramindani3335f7a2021-10-25 17:22:35 +000040
ramindanid32ae8e2021-10-01 18:48:39 +000041#undef LOG_TAG
42#define LOG_TAG "VtsHalGraphicsComposer3_TargetTest"
43
44namespace aidl::android::hardware::graphics::composer3::vts {
45namespace {
46
ramindani1cb794e2021-10-13 20:45:23 +000047using namespace std::chrono_literals;
48
ramindanidcfe3a82021-11-29 17:00:31 +000049using ::android::GraphicBuffer;
50using ::android::sp;
51
ramindanid32ae8e2021-10-01 18:48:39 +000052class GraphicsComposerAidlTest : public ::testing::TestWithParam<std::string> {
ramindania9780262021-10-01 18:48:39 +000053 protected:
54 void SetUp() override {
ramindani431aad42022-02-01 21:44:29 +000055 mComposerClient = std::make_unique<VtsComposerClient>(GetParam());
56 ASSERT_TRUE(mComposerClient->createClient().isOk());
Jason Macnake531a092022-01-20 08:49:09 -080057
ramindani431aad42022-02-01 21:44:29 +000058 const auto& [status, displays] = mComposerClient->getDisplays();
Jason Macnake531a092022-01-20 08:49:09 -080059 ASSERT_TRUE(status.isOk());
ramindani431aad42022-02-01 21:44:29 +000060 mDisplays = displays;
ramindanidcfe3a82021-11-29 17:00:31 +000061
ramindani3335f7a2021-10-25 17:22:35 +000062 // explicitly disable vsync
63 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +000064 EXPECT_TRUE(mComposerClient->setVsync(display.getDisplayId(), false).isOk());
ramindani3335f7a2021-10-25 17:22:35 +000065 }
ramindani431aad42022-02-01 21:44:29 +000066 mComposerClient->setVsyncAllowed(false);
ramindania9780262021-10-01 18:48:39 +000067 }
68
ramindani3335f7a2021-10-25 17:22:35 +000069 void TearDown() override {
ramindani431aad42022-02-01 21:44:29 +000070 ASSERT_TRUE(mComposerClient->tearDown());
71 mComposerClient.reset();
ramindani3335f7a2021-10-25 17:22:35 +000072 }
ramindanic2b8d082021-11-06 02:03:50 +000073
ramindanid5751092022-04-22 22:30:20 +000074 void assertServiceSpecificError(const ScopedAStatus& status, int32_t serviceSpecificError) {
75 ASSERT_EQ(status.getExceptionCode(), EX_SERVICE_SPECIFIC);
76 ASSERT_EQ(status.getServiceSpecificError(), serviceSpecificError);
77 }
78
ramindani431aad42022-02-01 21:44:29 +000079 void Test_setContentTypeForDisplay(int64_t display,
80 const std::vector<ContentType>& supportedContentTypes,
81 ContentType contentType, const char* contentTypeStr) {
82 const bool contentTypeSupport =
83 std::find(supportedContentTypes.begin(), supportedContentTypes.end(),
84 contentType) != supportedContentTypes.end();
ramindanidcfe3a82021-11-29 17:00:31 +000085
86 if (!contentTypeSupport) {
ramindani431aad42022-02-01 21:44:29 +000087 const auto& status = mComposerClient->setContentType(display, contentType);
88 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +000089 EXPECT_NO_FATAL_FAILURE(
90 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindanidcfe3a82021-11-29 17:00:31 +000091 GTEST_SUCCEED() << contentTypeStr << " content type is not supported on display "
92 << std::to_string(display) << ", skipping test";
93 return;
94 }
95
96 EXPECT_TRUE(mComposerClient->setContentType(display, contentType).isOk());
97 EXPECT_TRUE(mComposerClient->setContentType(display, ContentType::NONE).isOk());
98 }
99
ramindani431aad42022-02-01 21:44:29 +0000100 void Test_setContentType(ContentType contentType, const char* contentTypeStr) {
ramindanidcfe3a82021-11-29 17:00:31 +0000101 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000102 const auto& [status, supportedContentTypes] =
103 mComposerClient->getSupportedContentTypes(display.getDisplayId());
104 EXPECT_TRUE(status.isOk());
105 Test_setContentTypeForDisplay(display.getDisplayId(), supportedContentTypes,
106 contentType, contentTypeStr);
ramindanidcfe3a82021-11-29 17:00:31 +0000107 }
108 }
109
Jason Macnak325e8232022-01-24 14:48:55 -0800110 bool hasCapability(Capability capability) {
ramindani431aad42022-02-01 21:44:29 +0000111 const auto& [status, capabilities] = mComposerClient->getCapabilities();
112 EXPECT_TRUE(status.isOk());
Jason Macnak325e8232022-01-24 14:48:55 -0800113 return std::any_of(
114 capabilities.begin(), capabilities.end(),
115 [&](const Capability& activeCapability) { return activeCapability == capability; });
116 }
117
ramindani431aad42022-02-01 21:44:29 +0000118 const VtsDisplay& getPrimaryDisplay() const { return mDisplays[0]; }
ramindania9780262021-10-01 18:48:39 +0000119
ramindani431aad42022-02-01 21:44:29 +0000120 int64_t getPrimaryDisplayId() const { return getPrimaryDisplay().getDisplayId(); }
ramindania9780262021-10-01 18:48:39 +0000121
ramindani431aad42022-02-01 21:44:29 +0000122 int64_t getInvalidDisplayId() const { return mComposerClient->getInvalidDisplayId(); }
ramindani1cb794e2021-10-13 20:45:23 +0000123
ramindani431aad42022-02-01 21:44:29 +0000124 VtsDisplay& getEditablePrimaryDisplay() { return mDisplays[0]; }
ramindani0291f112021-11-04 03:45:46 +0000125
ramindani3335f7a2021-10-25 17:22:35 +0000126 struct TestParameters {
127 nsecs_t delayForChange;
128 bool refreshMiss;
129 };
130
ramindani431aad42022-02-01 21:44:29 +0000131 std::unique_ptr<VtsComposerClient> mComposerClient;
ramindani1cb794e2021-10-13 20:45:23 +0000132 std::vector<VtsDisplay> mDisplays;
ramindani3335f7a2021-10-25 17:22:35 +0000133 // use the slot count usually set by SF
134 static constexpr uint32_t kBufferSlotCount = 64;
ramindanid32ae8e2021-10-01 18:48:39 +0000135};
136
ramindani431aad42022-02-01 21:44:29 +0000137TEST_P(GraphicsComposerAidlTest, GetDisplayCapabilities_BadDisplay) {
138 const auto& [status, _] = mComposerClient->getDisplayCapabilities(getInvalidDisplayId());
ramindani5f696942021-10-14 16:24:18 +0000139
ramindani431aad42022-02-01 21:44:29 +0000140 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000141 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindania9780262021-10-01 18:48:39 +0000142}
143
ramindani431aad42022-02-01 21:44:29 +0000144TEST_P(GraphicsComposerAidlTest, GetDisplayCapabilities) {
ramindania9780262021-10-01 18:48:39 +0000145 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000146 const auto& [status, capabilities] =
147 mComposerClient->getDisplayCapabilities(display.getDisplayId());
ramindania9780262021-10-01 18:48:39 +0000148
ramindani431aad42022-02-01 21:44:29 +0000149 EXPECT_TRUE(status.isOk());
ramindania9780262021-10-01 18:48:39 +0000150 }
ramindanid32ae8e2021-10-01 18:48:39 +0000151}
152
ramindani2740bac2021-11-24 22:58:32 +0000153TEST_P(GraphicsComposerAidlTest, DumpDebugInfo) {
ramindani431aad42022-02-01 21:44:29 +0000154 ASSERT_TRUE(mComposerClient->dumpDebugInfo().isOk());
ramindani2740bac2021-11-24 22:58:32 +0000155}
156
157TEST_P(GraphicsComposerAidlTest, CreateClientSingleton) {
158 std::shared_ptr<IComposerClient> composerClient;
ramindani431aad42022-02-01 21:44:29 +0000159 const auto& status = mComposerClient->createClient();
ramindani2740bac2021-11-24 22:58:32 +0000160
ramindani431aad42022-02-01 21:44:29 +0000161 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000162 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_NO_RESOURCES));
ramindani2740bac2021-11-24 22:58:32 +0000163}
164
ramindani592b6512021-10-08 21:15:19 +0000165TEST_P(GraphicsComposerAidlTest, GetDisplayIdentificationData) {
ramindani431aad42022-02-01 21:44:29 +0000166 const auto& [status0, displayIdentification0] =
167 mComposerClient->getDisplayIdentificationData(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000168 if (!status0.isOk() && status0.getExceptionCode() == EX_SERVICE_SPECIFIC &&
169 status0.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani431aad42022-02-01 21:44:29 +0000170 GTEST_SUCCEED() << "Display identification data not supported, skipping test";
ramindani592b6512021-10-08 21:15:19 +0000171 return;
172 }
ramindani431aad42022-02-01 21:44:29 +0000173 ASSERT_TRUE(status0.isOk()) << "failed to get display identification data";
ramindani592b6512021-10-08 21:15:19 +0000174 ASSERT_FALSE(displayIdentification0.data.empty());
175
176 constexpr size_t kEdidBlockSize = 128;
177 ASSERT_TRUE(displayIdentification0.data.size() % kEdidBlockSize == 0)
178 << "EDID blob length is not a multiple of " << kEdidBlockSize;
179
180 const uint8_t kEdidHeader[] = {0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00};
181 ASSERT_TRUE(std::equal(std::begin(kEdidHeader), std::end(kEdidHeader),
182 displayIdentification0.data.begin()))
183 << "EDID blob doesn't start with the fixed EDID header";
184 ASSERT_EQ(0, std::accumulate(displayIdentification0.data.begin(),
185 displayIdentification0.data.begin() + kEdidBlockSize,
186 static_cast<uint8_t>(0)))
187 << "EDID base block doesn't checksum";
188
ramindani431aad42022-02-01 21:44:29 +0000189 const auto& [status1, displayIdentification1] =
190 mComposerClient->getDisplayIdentificationData(getPrimaryDisplayId());
191 ASSERT_TRUE(status1.isOk());
ramindani592b6512021-10-08 21:15:19 +0000192
193 ASSERT_EQ(displayIdentification0.port, displayIdentification1.port) << "ports are not stable";
194 ASSERT_TRUE(displayIdentification0.data.size() == displayIdentification1.data.size() &&
195 std::equal(displayIdentification0.data.begin(), displayIdentification0.data.end(),
196 displayIdentification1.data.begin()))
197 << "data is not stable";
198}
199
200TEST_P(GraphicsComposerAidlTest, GetHdrCapabilities) {
ramindani431aad42022-02-01 21:44:29 +0000201 const auto& [status, hdrCapabilities] =
202 mComposerClient->getHdrCapabilities(getPrimaryDisplayId());
ramindani592b6512021-10-08 21:15:19 +0000203
ramindani431aad42022-02-01 21:44:29 +0000204 ASSERT_TRUE(status.isOk());
205 EXPECT_TRUE(hdrCapabilities.maxLuminance >= hdrCapabilities.minLuminance);
ramindani592b6512021-10-08 21:15:19 +0000206}
207
208TEST_P(GraphicsComposerAidlTest, GetPerFrameMetadataKeys) {
ramindani431aad42022-02-01 21:44:29 +0000209 const auto& [status, keys] = mComposerClient->getPerFrameMetadataKeys(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000210 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
211 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindanic2b8d082021-11-06 02:03:50 +0000212 GTEST_SUCCEED() << "getPerFrameMetadataKeys is not supported";
213 return;
ramindani592b6512021-10-08 21:15:19 +0000214 }
ramindani431aad42022-02-01 21:44:29 +0000215
216 ASSERT_TRUE(status.isOk());
217 EXPECT_TRUE(keys.size() >= 0);
ramindani592b6512021-10-08 21:15:19 +0000218}
219
220TEST_P(GraphicsComposerAidlTest, GetReadbackBufferAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000221 const auto& [status, _] = mComposerClient->getReadbackBufferAttributes(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000222 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
223 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani431aad42022-02-01 21:44:29 +0000224 GTEST_SUCCEED() << "getReadbackBufferAttributes is not supported";
225 return;
ramindani592b6512021-10-08 21:15:19 +0000226 }
ramindani431aad42022-02-01 21:44:29 +0000227
228 ASSERT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000229}
230
231TEST_P(GraphicsComposerAidlTest, GetRenderIntents) {
ramindani431aad42022-02-01 21:44:29 +0000232 const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
233 EXPECT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000234
ramindani431aad42022-02-01 21:44:29 +0000235 for (auto mode : modes) {
236 const auto& [intentStatus, intents] =
237 mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
238 EXPECT_TRUE(intentStatus.isOk());
ramindani592b6512021-10-08 21:15:19 +0000239 bool isHdr;
240 switch (mode) {
241 case ColorMode::BT2100_PQ:
242 case ColorMode::BT2100_HLG:
243 isHdr = true;
244 break;
245 default:
246 isHdr = false;
247 break;
248 }
249 RenderIntent requiredIntent =
250 isHdr ? RenderIntent::TONE_MAP_COLORIMETRIC : RenderIntent::COLORIMETRIC;
251
ramindani431aad42022-02-01 21:44:29 +0000252 const auto iter = std::find(intents.cbegin(), intents.cend(), requiredIntent);
ramindani592b6512021-10-08 21:15:19 +0000253 EXPECT_NE(intents.cend(), iter);
254 }
255}
256
ramindani431aad42022-02-01 21:44:29 +0000257TEST_P(GraphicsComposerAidlTest, GetRenderIntents_BadDisplay) {
258 const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
259 ASSERT_TRUE(status.isOk());
260
ramindani592b6512021-10-08 21:15:19 +0000261 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000262 const auto& [intentStatus, _] =
263 mComposerClient->getRenderIntents(getInvalidDisplayId(), mode);
264
265 EXPECT_FALSE(intentStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000266 EXPECT_NO_FATAL_FAILURE(
267 assertServiceSpecificError(intentStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani592b6512021-10-08 21:15:19 +0000268 }
269}
270
ramindani431aad42022-02-01 21:44:29 +0000271TEST_P(GraphicsComposerAidlTest, GetRenderIntents_BadParameter) {
272 const auto& [status, _] =
273 mComposerClient->getRenderIntents(getPrimaryDisplayId(), static_cast<ColorMode>(-1));
274
275 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000276 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindani592b6512021-10-08 21:15:19 +0000277}
278
279TEST_P(GraphicsComposerAidlTest, GetColorModes) {
ramindani431aad42022-02-01 21:44:29 +0000280 const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
281 ASSERT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000282
ramindani431aad42022-02-01 21:44:29 +0000283 const auto native = std::find(colorModes.cbegin(), colorModes.cend(), ColorMode::NATIVE);
284 EXPECT_NE(colorModes.cend(), native);
ramindani592b6512021-10-08 21:15:19 +0000285}
286
ramindani431aad42022-02-01 21:44:29 +0000287TEST_P(GraphicsComposerAidlTest, GetColorMode_BadDisplay) {
288 const auto& [status, _] = mComposerClient->getColorModes(getInvalidDisplayId());
ramindani592b6512021-10-08 21:15:19 +0000289
ramindani431aad42022-02-01 21:44:29 +0000290 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000291 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani592b6512021-10-08 21:15:19 +0000292}
293
294TEST_P(GraphicsComposerAidlTest, SetColorMode) {
ramindani431aad42022-02-01 21:44:29 +0000295 const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
296 EXPECT_TRUE(status.isOk());
297
ramindani592b6512021-10-08 21:15:19 +0000298 for (auto mode : colorModes) {
ramindani431aad42022-02-01 21:44:29 +0000299 const auto& [intentStatus, intents] =
300 mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
301 EXPECT_TRUE(intentStatus.isOk()) << "failed to get render intents";
302
ramindani592b6512021-10-08 21:15:19 +0000303 for (auto intent : intents) {
ramindani431aad42022-02-01 21:44:29 +0000304 const auto modeStatus =
305 mComposerClient->setColorMode(getPrimaryDisplayId(), mode, intent);
306 EXPECT_TRUE(modeStatus.isOk() ||
ramindanid5751092022-04-22 22:30:20 +0000307 (modeStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
308 IComposerClient::EX_UNSUPPORTED == modeStatus.getServiceSpecificError()))
ramindani592b6512021-10-08 21:15:19 +0000309 << "failed to set color mode";
310 }
311 }
312
ramindani431aad42022-02-01 21:44:29 +0000313 const auto modeStatus = mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE,
314 RenderIntent::COLORIMETRIC);
315 EXPECT_TRUE(modeStatus.isOk() ||
ramindanid5751092022-04-22 22:30:20 +0000316 (modeStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
317 IComposerClient::EX_UNSUPPORTED == modeStatus.getServiceSpecificError()))
ramindani592b6512021-10-08 21:15:19 +0000318 << "failed to set color mode";
319}
320
ramindani431aad42022-02-01 21:44:29 +0000321TEST_P(GraphicsComposerAidlTest, SetColorMode_BadDisplay) {
322 const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
323 ASSERT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000324
ramindani431aad42022-02-01 21:44:29 +0000325 for (auto mode : colorModes) {
326 const auto& [intentStatus, intents] =
327 mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
328 ASSERT_TRUE(intentStatus.isOk()) << "failed to get render intents";
329
330 for (auto intent : intents) {
331 auto const modeStatus =
332 mComposerClient->setColorMode(getInvalidDisplayId(), mode, intent);
333
334 EXPECT_FALSE(modeStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000335 EXPECT_NO_FATAL_FAILURE(
336 assertServiceSpecificError(modeStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani770d7082021-11-30 00:36:42 +0000337 }
338 }
ramindani592b6512021-10-08 21:15:19 +0000339}
340
ramindani431aad42022-02-01 21:44:29 +0000341TEST_P(GraphicsComposerAidlTest, SetColorMode_BadParameter) {
342 auto status = mComposerClient->setColorMode(getPrimaryDisplayId(), static_cast<ColorMode>(-1),
343 RenderIntent::COLORIMETRIC);
ramindani592b6512021-10-08 21:15:19 +0000344
ramindani431aad42022-02-01 21:44:29 +0000345 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000346 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindani592b6512021-10-08 21:15:19 +0000347
ramindani431aad42022-02-01 21:44:29 +0000348 status = mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE,
349 static_cast<RenderIntent>(-1));
ramindani592b6512021-10-08 21:15:19 +0000350
ramindani431aad42022-02-01 21:44:29 +0000351 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000352 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindani592b6512021-10-08 21:15:19 +0000353}
354
355TEST_P(GraphicsComposerAidlTest, GetDisplayedContentSamplingAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000356 int constexpr kInvalid = -1;
357 const auto& [status, format] =
358 mComposerClient->getDisplayedContentSamplingAttributes(getPrimaryDisplayId());
ramindani592b6512021-10-08 21:15:19 +0000359
ramindanid5751092022-04-22 22:30:20 +0000360 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
361 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani592b6512021-10-08 21:15:19 +0000362 SUCCEED() << "Device does not support optional extension. Test skipped";
363 return;
364 }
365
ramindani431aad42022-02-01 21:44:29 +0000366 ASSERT_TRUE(status.isOk());
367 EXPECT_NE(kInvalid, static_cast<int>(format.format));
368 EXPECT_NE(kInvalid, static_cast<int>(format.dataspace));
369 EXPECT_NE(kInvalid, static_cast<int>(format.componentMask));
ramindani592b6512021-10-08 21:15:19 +0000370};
371
372TEST_P(GraphicsComposerAidlTest, SetDisplayedContentSamplingEnabled) {
ramindani431aad42022-02-01 21:44:29 +0000373 int constexpr kMaxFrames = 10;
ramindani592b6512021-10-08 21:15:19 +0000374 FormatColorComponent enableAllComponents = FormatColorComponent::FORMAT_COMPONENT_0;
ramindani431aad42022-02-01 21:44:29 +0000375 auto status = mComposerClient->setDisplayedContentSamplingEnabled(
376 getPrimaryDisplayId(), /*isEnabled*/ true, enableAllComponents, kMaxFrames);
ramindanid5751092022-04-22 22:30:20 +0000377 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
378 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani592b6512021-10-08 21:15:19 +0000379 SUCCEED() << "Device does not support optional extension. Test skipped";
380 return;
381 }
ramindani431aad42022-02-01 21:44:29 +0000382 EXPECT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000383
ramindani431aad42022-02-01 21:44:29 +0000384 status = mComposerClient->setDisplayedContentSamplingEnabled(
385 getPrimaryDisplayId(), /*isEnabled*/ false, enableAllComponents, kMaxFrames);
386 EXPECT_TRUE(status.isOk());
ramindani592b6512021-10-08 21:15:19 +0000387}
388
389TEST_P(GraphicsComposerAidlTest, GetDisplayedContentSample) {
ramindani431aad42022-02-01 21:44:29 +0000390 const auto& [status, displayContentSamplingAttributes] =
391 mComposerClient->getDisplayedContentSamplingAttributes(getPrimaryDisplayId());
ramindanid5751092022-04-22 22:30:20 +0000392 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
393 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindanideb059e2021-11-18 01:57:25 +0000394 SUCCEED() << "Sampling attributes aren't supported on this device, test skipped";
395 return;
396 }
ramindani592b6512021-10-08 21:15:19 +0000397
ramindani431aad42022-02-01 21:44:29 +0000398 int64_t constexpr kMaxFrames = 10;
399 int64_t constexpr kTimestamp = 0;
400 const auto& [sampleStatus, displayContentSample] = mComposerClient->getDisplayedContentSample(
401 getPrimaryDisplayId(), kMaxFrames, kTimestamp);
ramindanid5751092022-04-22 22:30:20 +0000402 if (!sampleStatus.isOk() && sampleStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
ramindani431aad42022-02-01 21:44:29 +0000403 sampleStatus.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
ramindani592b6512021-10-08 21:15:19 +0000404 SUCCEED() << "Device does not support optional extension. Test skipped";
405 return;
406 }
407
ramindani431aad42022-02-01 21:44:29 +0000408 EXPECT_TRUE(sampleStatus.isOk());
409 const std::vector<std::vector<int64_t>> histogram = {
ramindani592b6512021-10-08 21:15:19 +0000410 displayContentSample.sampleComponent0, displayContentSample.sampleComponent1,
411 displayContentSample.sampleComponent2, displayContentSample.sampleComponent3};
412
ramindani3335f7a2021-10-25 17:22:35 +0000413 for (size_t i = 0; i < histogram.size(); i++) {
414 const bool shouldHaveHistogram =
415 static_cast<int>(displayContentSamplingAttributes.componentMask) & (1 << i);
416 EXPECT_EQ(shouldHaveHistogram, !histogram[i].empty());
ramindani592b6512021-10-08 21:15:19 +0000417 }
418}
419
ramindani431aad42022-02-01 21:44:29 +0000420TEST_P(GraphicsComposerAidlTest, GetDisplayConnectionType) {
421 const auto& [status, type] = mComposerClient->getDisplayConnectionType(getInvalidDisplayId());
422
423 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000424 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani431aad42022-02-01 21:44:29 +0000425
ramindani0291f112021-11-04 03:45:46 +0000426 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000427 const auto& [connectionTypeStatus, _] =
428 mComposerClient->getDisplayConnectionType(display.getDisplayId());
429 EXPECT_TRUE(connectionTypeStatus.isOk());
ramindani0291f112021-11-04 03:45:46 +0000430 }
431}
432
ramindani431aad42022-02-01 21:44:29 +0000433TEST_P(GraphicsComposerAidlTest, GetDisplayAttribute) {
ramindani0291f112021-11-04 03:45:46 +0000434 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000435 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
436 EXPECT_TRUE(status.isOk());
437
ramindani0291f112021-11-04 03:45:46 +0000438 for (const auto& config : configs) {
439 const std::array<DisplayAttribute, 4> requiredAttributes = {{
440 DisplayAttribute::WIDTH,
441 DisplayAttribute::HEIGHT,
442 DisplayAttribute::VSYNC_PERIOD,
443 DisplayAttribute::CONFIG_GROUP,
444 }};
ramindani0291f112021-11-04 03:45:46 +0000445 for (const auto& attribute : requiredAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000446 const auto& [attribStatus, value] = mComposerClient->getDisplayAttribute(
447 display.getDisplayId(), config, attribute);
448 EXPECT_TRUE(attribStatus.isOk());
ramindani0291f112021-11-04 03:45:46 +0000449 EXPECT_NE(-1, value);
450 }
451
452 const std::array<DisplayAttribute, 2> optionalAttributes = {{
453 DisplayAttribute::DPI_X,
454 DisplayAttribute::DPI_Y,
455 }};
456 for (const auto& attribute : optionalAttributes) {
ramindani431aad42022-02-01 21:44:29 +0000457 const auto& [attribStatus, value] = mComposerClient->getDisplayAttribute(
458 display.getDisplayId(), config, attribute);
ramindanid5751092022-04-22 22:30:20 +0000459 EXPECT_TRUE(attribStatus.isOk() ||
460 (attribStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
461 IComposerClient::EX_UNSUPPORTED ==
462 attribStatus.getServiceSpecificError()));
ramindani0291f112021-11-04 03:45:46 +0000463 }
464 }
465 }
466}
467
ramindani431aad42022-02-01 21:44:29 +0000468TEST_P(GraphicsComposerAidlTest, CheckConfigsAreValid) {
ramindani0291f112021-11-04 03:45:46 +0000469 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000470 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
471 EXPECT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000472
473 EXPECT_FALSE(std::any_of(configs.begin(), configs.end(), [](auto config) {
474 return config == IComposerClient::INVALID_CONFIGURATION;
475 }));
476 }
477}
478
ramindani431aad42022-02-01 21:44:29 +0000479TEST_P(GraphicsComposerAidlTest, GetDisplayVsyncPeriod_BadDisplay) {
480 const auto& [status, vsyncPeriodNanos] =
481 mComposerClient->getDisplayVsyncPeriod(getInvalidDisplayId());
482
483 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000484 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000485}
486
ramindani431aad42022-02-01 21:44:29 +0000487TEST_P(GraphicsComposerAidlTest, SetActiveConfigWithConstraints_BadDisplay) {
ramindani0291f112021-11-04 03:45:46 +0000488 VsyncPeriodChangeConstraints constraints;
ramindani0291f112021-11-04 03:45:46 +0000489 constraints.seamlessRequired = false;
490 constraints.desiredTimeNanos = systemTime();
ramindani431aad42022-02-01 21:44:29 +0000491 auto invalidDisplay = VtsDisplay(getInvalidDisplayId());
ramindani0291f112021-11-04 03:45:46 +0000492
ramindani431aad42022-02-01 21:44:29 +0000493 const auto& [status, timeline] = mComposerClient->setActiveConfigWithConstraints(
494 &invalidDisplay, /*config*/ 0, constraints);
495
496 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000497 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000498}
499
ramindani431aad42022-02-01 21:44:29 +0000500TEST_P(GraphicsComposerAidlTest, SetActiveConfigWithConstraints_BadConfig) {
ramindani0291f112021-11-04 03:45:46 +0000501 VsyncPeriodChangeConstraints constraints;
ramindani0291f112021-11-04 03:45:46 +0000502 constraints.seamlessRequired = false;
503 constraints.desiredTimeNanos = systemTime();
504
505 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000506 int32_t constexpr kInvalidConfigId = IComposerClient::INVALID_CONFIGURATION;
507 const auto& [status, _] = mComposerClient->setActiveConfigWithConstraints(
508 &display, kInvalidConfigId, constraints);
509
510 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000511 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_CONFIG));
ramindani0291f112021-11-04 03:45:46 +0000512 }
513}
514
ramindani431aad42022-02-01 21:44:29 +0000515TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig_BadDisplay) {
ramindani476314c2022-03-16 00:17:08 +0000516 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
517 GTEST_SUCCEED() << "Boot Display Config not supported";
518 return;
519 }
ramindani431aad42022-02-01 21:44:29 +0000520 const auto& status = mComposerClient->setBootDisplayConfig(getInvalidDisplayId(), /*config*/ 0);
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100521
ramindani431aad42022-02-01 21:44:29 +0000522 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000523 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100524}
525
ramindani431aad42022-02-01 21:44:29 +0000526TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig_BadConfig) {
ramindani476314c2022-03-16 00:17:08 +0000527 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
528 GTEST_SUCCEED() << "Boot Display Config not supported";
529 return;
530 }
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100531 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000532 int32_t constexpr kInvalidConfigId = IComposerClient::INVALID_CONFIGURATION;
533 const auto& status =
534 mComposerClient->setBootDisplayConfig(display.getDisplayId(), kInvalidConfigId);
535
536 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000537 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_CONFIG));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100538 }
539}
540
ramindani431aad42022-02-01 21:44:29 +0000541TEST_P(GraphicsComposerAidlTest, SetBootDisplayConfig) {
ramindani476314c2022-03-16 00:17:08 +0000542 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
543 GTEST_SUCCEED() << "Boot Display Config not supported";
544 return;
545 }
ramindani431aad42022-02-01 21:44:29 +0000546 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
547 EXPECT_TRUE(status.isOk());
548 for (const auto& config : configs) {
549 EXPECT_TRUE(mComposerClient->setBootDisplayConfig(getPrimaryDisplayId(), config).isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100550 }
551}
552
ramindani431aad42022-02-01 21:44:29 +0000553TEST_P(GraphicsComposerAidlTest, ClearBootDisplayConfig_BadDisplay) {
ramindani476314c2022-03-16 00:17:08 +0000554 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
555 GTEST_SUCCEED() << "Boot Display Config not supported";
556 return;
557 }
ramindani431aad42022-02-01 21:44:29 +0000558 const auto& status = mComposerClient->clearBootDisplayConfig(getInvalidDisplayId());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100559
ramindani431aad42022-02-01 21:44:29 +0000560 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000561 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100562}
563
ramindani431aad42022-02-01 21:44:29 +0000564TEST_P(GraphicsComposerAidlTest, ClearBootDisplayConfig) {
ramindani476314c2022-03-16 00:17:08 +0000565 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
566 GTEST_SUCCEED() << "Boot Display Config not supported";
567 return;
568 }
ramindani431aad42022-02-01 21:44:29 +0000569 EXPECT_TRUE(mComposerClient->clearBootDisplayConfig(getPrimaryDisplayId()).isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100570}
571
ramindani431aad42022-02-01 21:44:29 +0000572TEST_P(GraphicsComposerAidlTest, GetPreferredBootDisplayConfig_BadDisplay) {
ramindani476314c2022-03-16 00:17:08 +0000573 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
574 GTEST_SUCCEED() << "Boot Display Config not supported";
575 return;
576 }
ramindani431aad42022-02-01 21:44:29 +0000577 const auto& [status, _] = mComposerClient->getPreferredBootDisplayConfig(getInvalidDisplayId());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100578
ramindani431aad42022-02-01 21:44:29 +0000579 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000580 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100581}
582
ramindani431aad42022-02-01 21:44:29 +0000583TEST_P(GraphicsComposerAidlTest, GetPreferredBootDisplayConfig) {
ramindani476314c2022-03-16 00:17:08 +0000584 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
585 GTEST_SUCCEED() << "Boot Display Config not supported";
586 return;
587 }
ramindani431aad42022-02-01 21:44:29 +0000588 const auto& [status, preferredDisplayConfig] =
589 mComposerClient->getPreferredBootDisplayConfig(getPrimaryDisplayId());
590 EXPECT_TRUE(status.isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100591
ramindani431aad42022-02-01 21:44:29 +0000592 const auto& [configStatus, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
593
594 EXPECT_TRUE(configStatus.isOk());
Kriti Dang4c6e9eb2021-11-17 14:56:29 +0100595 EXPECT_NE(configs.end(), std::find(configs.begin(), configs.end(), preferredDisplayConfig));
596}
597
ramindani476314c2022-03-16 00:17:08 +0000598TEST_P(GraphicsComposerAidlTest, BootDisplayConfig_Unsupported) {
599 if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
600 const auto& [configStatus, config] =
601 mComposerClient->getActiveConfig(getPrimaryDisplayId());
602 EXPECT_TRUE(configStatus.isOk());
603
604 auto status = mComposerClient->setBootDisplayConfig(getPrimaryDisplayId(), config);
605 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000606 EXPECT_NO_FATAL_FAILURE(
607 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani476314c2022-03-16 00:17:08 +0000608
609 status = mComposerClient->getPreferredBootDisplayConfig(getPrimaryDisplayId()).first;
610 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000611 EXPECT_NO_FATAL_FAILURE(
612 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani476314c2022-03-16 00:17:08 +0000613
614 status = mComposerClient->clearBootDisplayConfig(getPrimaryDisplayId());
615 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000616 EXPECT_NO_FATAL_FAILURE(
617 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani476314c2022-03-16 00:17:08 +0000618 }
619}
620
ramindani431aad42022-02-01 21:44:29 +0000621TEST_P(GraphicsComposerAidlTest, SetAutoLowLatencyMode_BadDisplay) {
622 auto status = mComposerClient->setAutoLowLatencyMode(getInvalidDisplayId(), /*isEnabled*/ true);
623 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000624 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani431aad42022-02-01 21:44:29 +0000625
626 status = mComposerClient->setAutoLowLatencyMode(getInvalidDisplayId(), /*isEnabled*/ false);
627 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000628 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000629}
630
ramindani431aad42022-02-01 21:44:29 +0000631TEST_P(GraphicsComposerAidlTest, SetAutoLowLatencyMode) {
ramindani0291f112021-11-04 03:45:46 +0000632 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000633 const auto& [status, capabilities] =
634 mComposerClient->getDisplayCapabilities(display.getDisplayId());
635 ASSERT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000636
637 const bool allmSupport =
638 std::find(capabilities.begin(), capabilities.end(),
639 DisplayCapability::AUTO_LOW_LATENCY_MODE) != capabilities.end();
640
641 if (!allmSupport) {
ramindani431aad42022-02-01 21:44:29 +0000642 const auto& statusIsOn = mComposerClient->setAutoLowLatencyMode(display.getDisplayId(),
643 /*isEnabled*/ true);
644 EXPECT_FALSE(statusIsOn.isOk());
ramindanid5751092022-04-22 22:30:20 +0000645 EXPECT_NO_FATAL_FAILURE(
646 assertServiceSpecificError(statusIsOn, IComposerClient::EX_UNSUPPORTED));
ramindani431aad42022-02-01 21:44:29 +0000647 const auto& statusIsOff = mComposerClient->setAutoLowLatencyMode(display.getDisplayId(),
648 /*isEnabled*/ false);
649 EXPECT_FALSE(statusIsOff.isOk());
ramindanid5751092022-04-22 22:30:20 +0000650 EXPECT_NO_FATAL_FAILURE(
651 assertServiceSpecificError(statusIsOff, IComposerClient::EX_UNSUPPORTED));
ramindani0291f112021-11-04 03:45:46 +0000652 GTEST_SUCCEED() << "Auto Low Latency Mode is not supported on display "
ramindani431aad42022-02-01 21:44:29 +0000653 << std::to_string(display.getDisplayId()) << ", skipping test";
ramindani0291f112021-11-04 03:45:46 +0000654 return;
655 }
656
ramindani431aad42022-02-01 21:44:29 +0000657 EXPECT_TRUE(mComposerClient->setAutoLowLatencyMode(display.getDisplayId(), true).isOk());
658 EXPECT_TRUE(mComposerClient->setAutoLowLatencyMode(display.getDisplayId(), false).isOk());
ramindani0291f112021-11-04 03:45:46 +0000659 }
660}
661
ramindani431aad42022-02-01 21:44:29 +0000662TEST_P(GraphicsComposerAidlTest, GetSupportedContentTypes_BadDisplay) {
663 const auto& [status, _] = mComposerClient->getSupportedContentTypes(getInvalidDisplayId());
664
665 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000666 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000667}
668
ramindani431aad42022-02-01 21:44:29 +0000669TEST_P(GraphicsComposerAidlTest, GetSupportedContentTypes) {
ramindani0291f112021-11-04 03:45:46 +0000670 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000671 const auto& [status, supportedContentTypes] =
672 mComposerClient->getSupportedContentTypes(display.getDisplayId());
673 ASSERT_TRUE(status.isOk());
ramindani0291f112021-11-04 03:45:46 +0000674
675 const bool noneSupported =
676 std::find(supportedContentTypes.begin(), supportedContentTypes.end(),
677 ContentType::NONE) != supportedContentTypes.end();
ramindani431aad42022-02-01 21:44:29 +0000678
ramindani0291f112021-11-04 03:45:46 +0000679 EXPECT_FALSE(noneSupported);
680 }
681}
682
ramindani431aad42022-02-01 21:44:29 +0000683TEST_P(GraphicsComposerAidlTest, SetContentTypeNoneAlwaysAccepted) {
ramindani0291f112021-11-04 03:45:46 +0000684 for (const auto& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +0000685 EXPECT_TRUE(
686 mComposerClient->setContentType(display.getDisplayId(), ContentType::NONE).isOk());
ramindani0291f112021-11-04 03:45:46 +0000687 }
688}
689
ramindani431aad42022-02-01 21:44:29 +0000690TEST_P(GraphicsComposerAidlTest, SetContentType_BadDisplay) {
ramindani0291f112021-11-04 03:45:46 +0000691 constexpr ContentType types[] = {ContentType::NONE, ContentType::GRAPHICS, ContentType::PHOTO,
692 ContentType::CINEMA, ContentType::GAME};
693 for (const auto& type : types) {
ramindani431aad42022-02-01 21:44:29 +0000694 const auto& status = mComposerClient->setContentType(getInvalidDisplayId(), type);
ramindani0291f112021-11-04 03:45:46 +0000695
ramindani431aad42022-02-01 21:44:29 +0000696 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000697 EXPECT_NO_FATAL_FAILURE(
698 assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani0291f112021-11-04 03:45:46 +0000699 }
700}
701
ramindani431aad42022-02-01 21:44:29 +0000702TEST_P(GraphicsComposerAidlTest, SetGraphicsContentType) {
ramindani0291f112021-11-04 03:45:46 +0000703 Test_setContentType(ContentType::GRAPHICS, "GRAPHICS");
704}
705
ramindani431aad42022-02-01 21:44:29 +0000706TEST_P(GraphicsComposerAidlTest, SetPhotoContentType) {
ramindani0291f112021-11-04 03:45:46 +0000707 Test_setContentType(ContentType::PHOTO, "PHOTO");
708}
709
ramindani431aad42022-02-01 21:44:29 +0000710TEST_P(GraphicsComposerAidlTest, SetCinemaContentType) {
ramindani0291f112021-11-04 03:45:46 +0000711 Test_setContentType(ContentType::CINEMA, "CINEMA");
712}
713
ramindani431aad42022-02-01 21:44:29 +0000714TEST_P(GraphicsComposerAidlTest, SetGameContentType) {
ramindani0291f112021-11-04 03:45:46 +0000715 Test_setContentType(ContentType::GAME, "GAME");
716}
717
ramindanic2b8d082021-11-06 02:03:50 +0000718TEST_P(GraphicsComposerAidlTest, CreateVirtualDisplay) {
ramindani431aad42022-02-01 21:44:29 +0000719 const auto& [status, maxVirtualDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
720 EXPECT_TRUE(status.isOk());
721
ramindanic2b8d082021-11-06 02:03:50 +0000722 if (maxVirtualDisplayCount == 0) {
723 GTEST_SUCCEED() << "no virtual display support";
724 return;
725 }
726
ramindani431aad42022-02-01 21:44:29 +0000727 const auto& [virtualDisplayStatus, virtualDisplay] = mComposerClient->createVirtualDisplay(
728 /*width*/ 64, /*height*/ 64, common::PixelFormat::IMPLEMENTATION_DEFINED,
729 kBufferSlotCount);
ramindanic2b8d082021-11-06 02:03:50 +0000730
ramindani431aad42022-02-01 21:44:29 +0000731 ASSERT_TRUE(virtualDisplayStatus.isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000732 EXPECT_TRUE(mComposerClient->destroyVirtualDisplay(virtualDisplay.display).isOk());
733}
734
ramindani431aad42022-02-01 21:44:29 +0000735TEST_P(GraphicsComposerAidlTest, DestroyVirtualDisplay_BadDisplay) {
736 const auto& [status, maxDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
737 EXPECT_TRUE(status.isOk());
738
ramindani2740bac2021-11-24 22:58:32 +0000739 if (maxDisplayCount == 0) {
740 GTEST_SUCCEED() << "no virtual display support";
741 return;
742 }
ramindani2740bac2021-11-24 22:58:32 +0000743
ramindani431aad42022-02-01 21:44:29 +0000744 const auto& destroyStatus = mComposerClient->destroyVirtualDisplay(getInvalidDisplayId());
745
746 EXPECT_FALSE(destroyStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000747 EXPECT_NO_FATAL_FAILURE(
748 assertServiceSpecificError(destroyStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000749}
750
751TEST_P(GraphicsComposerAidlTest, CreateLayer) {
ramindani431aad42022-02-01 21:44:29 +0000752 const auto& [status, layer] =
753 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
ramindani2740bac2021-11-24 22:58:32 +0000754
ramindani431aad42022-02-01 21:44:29 +0000755 EXPECT_TRUE(status.isOk());
756 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000757}
758
ramindani431aad42022-02-01 21:44:29 +0000759TEST_P(GraphicsComposerAidlTest, CreateLayer_BadDisplay) {
760 const auto& [status, _] = mComposerClient->createLayer(getInvalidDisplayId(), kBufferSlotCount);
ramindani2740bac2021-11-24 22:58:32 +0000761
ramindani431aad42022-02-01 21:44:29 +0000762 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000763 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000764}
765
ramindani431aad42022-02-01 21:44:29 +0000766TEST_P(GraphicsComposerAidlTest, DestroyLayer_BadDisplay) {
767 const auto& [status, layer] =
768 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
769 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000770
ramindani431aad42022-02-01 21:44:29 +0000771 const auto& destroyStatus = mComposerClient->destroyLayer(getInvalidDisplayId(), layer);
ramindani2740bac2021-11-24 22:58:32 +0000772
ramindani431aad42022-02-01 21:44:29 +0000773 EXPECT_FALSE(destroyStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000774 EXPECT_NO_FATAL_FAILURE(
775 assertServiceSpecificError(destroyStatus, IComposerClient::EX_BAD_DISPLAY));
ramindani431aad42022-02-01 21:44:29 +0000776 ASSERT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000777}
778
ramindani431aad42022-02-01 21:44:29 +0000779TEST_P(GraphicsComposerAidlTest, DestroyLayer_BadLayerError) {
ramindani2740bac2021-11-24 22:58:32 +0000780 // We haven't created any layers yet, so any id should be invalid
ramindani431aad42022-02-01 21:44:29 +0000781 const auto& status = mComposerClient->destroyLayer(getPrimaryDisplayId(), /*layer*/ 1);
ramindani2740bac2021-11-24 22:58:32 +0000782
ramindani431aad42022-02-01 21:44:29 +0000783 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000784 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_LAYER));
ramindani2740bac2021-11-24 22:58:32 +0000785}
786
ramindani431aad42022-02-01 21:44:29 +0000787TEST_P(GraphicsComposerAidlTest, GetActiveConfig_BadDisplay) {
788 const auto& [status, _] = mComposerClient->getActiveConfig(getInvalidDisplayId());
ramindani2740bac2021-11-24 22:58:32 +0000789
ramindani431aad42022-02-01 21:44:29 +0000790 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000791 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000792}
793
794TEST_P(GraphicsComposerAidlTest, GetDisplayConfig) {
ramindani431aad42022-02-01 21:44:29 +0000795 const auto& [status, _] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
796 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000797}
798
ramindani431aad42022-02-01 21:44:29 +0000799TEST_P(GraphicsComposerAidlTest, GetDisplayConfig_BadDisplay) {
800 const auto& [status, _] = mComposerClient->getDisplayConfigs(getInvalidDisplayId());
ramindani2740bac2021-11-24 22:58:32 +0000801
ramindani431aad42022-02-01 21:44:29 +0000802 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000803 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindani2740bac2021-11-24 22:58:32 +0000804}
805
806TEST_P(GraphicsComposerAidlTest, GetDisplayName) {
ramindani431aad42022-02-01 21:44:29 +0000807 const auto& [status, _] = mComposerClient->getDisplayName(getPrimaryDisplayId());
808 EXPECT_TRUE(status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000809}
810
ramindani431aad42022-02-01 21:44:29 +0000811TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation_BadDisplay) {
812 const auto& [status, _] = mComposerClient->getDisplayPhysicalOrientation(getInvalidDisplayId());
Ady Abrahamae12e382022-01-13 18:06:21 -0800813
ramindani431aad42022-02-01 21:44:29 +0000814 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000815 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
Ady Abrahamae12e382022-01-13 18:06:21 -0800816}
817
818TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation) {
819 const auto allowedDisplayOrientations = std::array<Transform, 4>{
820 Transform::NONE,
821 Transform::ROT_90,
822 Transform::ROT_180,
823 Transform::ROT_270,
824 };
825
ramindani431aad42022-02-01 21:44:29 +0000826 const auto& [status, displayOrientation] =
827 mComposerClient->getDisplayPhysicalOrientation(getPrimaryDisplayId());
Ady Abrahamae12e382022-01-13 18:06:21 -0800828
ramindani431aad42022-02-01 21:44:29 +0000829 EXPECT_TRUE(status.isOk());
Ady Abrahamae12e382022-01-13 18:06:21 -0800830 EXPECT_NE(std::find(allowedDisplayOrientations.begin(), allowedDisplayOrientations.end(),
831 displayOrientation),
832 allowedDisplayOrientations.end());
833}
834
ramindani2740bac2021-11-24 22:58:32 +0000835TEST_P(GraphicsComposerAidlTest, SetClientTargetSlotCount) {
ramindani431aad42022-02-01 21:44:29 +0000836 EXPECT_TRUE(mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kBufferSlotCount)
837 .isOk());
ramindani2740bac2021-11-24 22:58:32 +0000838}
839
840TEST_P(GraphicsComposerAidlTest, SetActiveConfig) {
ramindani431aad42022-02-01 21:44:29 +0000841 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
842 EXPECT_TRUE(status.isOk());
843
844 for (const auto& config : configs) {
845 auto display = getEditablePrimaryDisplay();
846 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
847 const auto& [configStatus, config1] =
848 mComposerClient->getActiveConfig(getPrimaryDisplayId());
849 EXPECT_TRUE(configStatus.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000850 EXPECT_EQ(config, config1);
851 }
852}
853
854TEST_P(GraphicsComposerAidlTest, SetActiveConfigPowerCycle) {
ramindani431aad42022-02-01 21:44:29 +0000855 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
856 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000857
ramindani431aad42022-02-01 21:44:29 +0000858 const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
859 EXPECT_TRUE(status.isOk());
860
861 for (const auto& config : configs) {
862 auto display = getEditablePrimaryDisplay();
863 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
864 const auto& [config1Status, config1] =
865 mComposerClient->getActiveConfig(getPrimaryDisplayId());
866 EXPECT_TRUE(config1Status.isOk());
ramindani2740bac2021-11-24 22:58:32 +0000867 EXPECT_EQ(config, config1);
868
ramindani431aad42022-02-01 21:44:29 +0000869 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
870 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
871 const auto& [config2Status, config2] =
872 mComposerClient->getActiveConfig(getPrimaryDisplayId());
873 EXPECT_TRUE(config2Status.isOk());
874 EXPECT_EQ(config, config2);
ramindani2740bac2021-11-24 22:58:32 +0000875 }
876}
877
ramindani2740bac2021-11-24 22:58:32 +0000878TEST_P(GraphicsComposerAidlTest, SetPowerModeUnsupported) {
ramindani431aad42022-02-01 21:44:29 +0000879 const auto& [status, capabilities] =
880 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
881 ASSERT_TRUE(status.isOk());
882
Ady Abraham6679baf2021-12-08 18:28:27 -0800883 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
884 DisplayCapability::DOZE) != capabilities.end();
885 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
886 DisplayCapability::SUSPEND) != capabilities.end();
ramindani2740bac2021-11-24 22:58:32 +0000887
ramindani431aad42022-02-01 21:44:29 +0000888 if (!isDozeSupported) {
889 const auto& powerModeDozeStatus =
890 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE);
891 EXPECT_FALSE(powerModeDozeStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000892 EXPECT_NO_FATAL_FAILURE(
893 assertServiceSpecificError(powerModeDozeStatus, IComposerClient::EX_UNSUPPORTED));
ramindani431aad42022-02-01 21:44:29 +0000894
895 const auto& powerModeDozeSuspendStatus =
896 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
897 EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000898 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeDozeSuspendStatus,
899 IComposerClient::EX_UNSUPPORTED));
ramindani2740bac2021-11-24 22:58:32 +0000900 }
Ady Abraham6679baf2021-12-08 18:28:27 -0800901
902 if (!isSuspendSupported) {
ramindani431aad42022-02-01 21:44:29 +0000903 const auto& powerModeSuspendStatus =
904 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON_SUSPEND);
905 EXPECT_FALSE(powerModeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000906 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeSuspendStatus,
907 IComposerClient::EX_UNSUPPORTED));
Ady Abraham6679baf2021-12-08 18:28:27 -0800908
ramindani431aad42022-02-01 21:44:29 +0000909 const auto& powerModeDozeSuspendStatus =
910 mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
911 EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
ramindanid5751092022-04-22 22:30:20 +0000912 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeDozeSuspendStatus,
913 IComposerClient::EX_UNSUPPORTED));
Ady Abraham6679baf2021-12-08 18:28:27 -0800914 }
ramindani2740bac2021-11-24 22:58:32 +0000915}
916
917TEST_P(GraphicsComposerAidlTest, SetVsyncEnabled) {
ramindani431aad42022-02-01 21:44:29 +0000918 mComposerClient->setVsyncAllowed(true);
ramindani2740bac2021-11-24 22:58:32 +0000919
ramindani431aad42022-02-01 21:44:29 +0000920 EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), true).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000921 usleep(60 * 1000);
ramindani431aad42022-02-01 21:44:29 +0000922 EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), false).isOk());
ramindani2740bac2021-11-24 22:58:32 +0000923
ramindani431aad42022-02-01 21:44:29 +0000924 mComposerClient->setVsyncAllowed(false);
ramindani2740bac2021-11-24 22:58:32 +0000925}
926
ramindanic2b8d082021-11-06 02:03:50 +0000927TEST_P(GraphicsComposerAidlTest, SetPowerMode) {
ramindani431aad42022-02-01 21:44:29 +0000928 const auto& [status, capabilities] =
929 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
930 ASSERT_TRUE(status.isOk());
931
Ady Abraham6679baf2021-12-08 18:28:27 -0800932 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
933 DisplayCapability::DOZE) != capabilities.end();
934 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
935 DisplayCapability::SUSPEND) != capabilities.end();
936
ramindanic2b8d082021-11-06 02:03:50 +0000937 std::vector<PowerMode> modes;
938 modes.push_back(PowerMode::OFF);
ramindanic2b8d082021-11-06 02:03:50 +0000939 modes.push_back(PowerMode::ON);
940
Ady Abraham6679baf2021-12-08 18:28:27 -0800941 if (isSuspendSupported) {
942 modes.push_back(PowerMode::ON_SUSPEND);
943 }
944
ramindani770d7082021-11-30 00:36:42 +0000945 if (isDozeSupported) {
946 modes.push_back(PowerMode::DOZE);
Ady Abraham6679baf2021-12-08 18:28:27 -0800947 }
948
949 if (isSuspendSupported && isDozeSupported) {
ramindani770d7082021-11-30 00:36:42 +0000950 modes.push_back(PowerMode::DOZE_SUSPEND);
951 }
952
ramindanic2b8d082021-11-06 02:03:50 +0000953 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000954 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000955 }
956}
957
958TEST_P(GraphicsComposerAidlTest, SetPowerModeVariations) {
ramindani431aad42022-02-01 21:44:29 +0000959 const auto& [status, capabilities] =
960 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
961 ASSERT_TRUE(status.isOk());
962
Ady Abraham6679baf2021-12-08 18:28:27 -0800963 const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
964 DisplayCapability::DOZE) != capabilities.end();
965 const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
966 DisplayCapability::SUSPEND) != capabilities.end();
967
ramindanic2b8d082021-11-06 02:03:50 +0000968 std::vector<PowerMode> modes;
969
970 modes.push_back(PowerMode::OFF);
ramindani770d7082021-11-30 00:36:42 +0000971 modes.push_back(PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +0000972 modes.push_back(PowerMode::OFF);
ramindanic2b8d082021-11-06 02:03:50 +0000973 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000974 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000975 }
ramindani770d7082021-11-30 00:36:42 +0000976 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +0000977
ramindani770d7082021-11-30 00:36:42 +0000978 modes.push_back(PowerMode::OFF);
979 modes.push_back(PowerMode::OFF);
980 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000981 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindani770d7082021-11-30 00:36:42 +0000982 }
ramindanic2b8d082021-11-06 02:03:50 +0000983 modes.clear();
984
985 modes.push_back(PowerMode::ON);
986 modes.push_back(PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +0000987 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000988 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +0000989 }
ramindanic2b8d082021-11-06 02:03:50 +0000990 modes.clear();
991
Ady Abraham6679baf2021-12-08 18:28:27 -0800992 if (isSuspendSupported) {
993 modes.push_back(PowerMode::ON_SUSPEND);
994 modes.push_back(PowerMode::ON_SUSPEND);
995 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +0000996 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
Ady Abraham6679baf2021-12-08 18:28:27 -0800997 }
998 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +0000999 }
1000
ramindanic2b8d082021-11-06 02:03:50 +00001001 if (isDozeSupported) {
ramindanic2b8d082021-11-06 02:03:50 +00001002 modes.push_back(PowerMode::DOZE);
1003 modes.push_back(PowerMode::DOZE);
ramindanic2b8d082021-11-06 02:03:50 +00001004 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001005 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001006 }
ramindanic2b8d082021-11-06 02:03:50 +00001007 modes.clear();
Ady Abraham6679baf2021-12-08 18:28:27 -08001008 }
ramindanic2b8d082021-11-06 02:03:50 +00001009
Ady Abraham6679baf2021-12-08 18:28:27 -08001010 if (isSuspendSupported && isDozeSupported) {
ramindanic2b8d082021-11-06 02:03:50 +00001011 modes.push_back(PowerMode::DOZE_SUSPEND);
1012 modes.push_back(PowerMode::DOZE_SUSPEND);
ramindanic2b8d082021-11-06 02:03:50 +00001013 for (auto mode : modes) {
ramindani431aad42022-02-01 21:44:29 +00001014 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
ramindanic2b8d082021-11-06 02:03:50 +00001015 }
Ady Abraham6679baf2021-12-08 18:28:27 -08001016 modes.clear();
ramindanic2b8d082021-11-06 02:03:50 +00001017 }
1018}
1019
ramindani431aad42022-02-01 21:44:29 +00001020TEST_P(GraphicsComposerAidlTest, SetPowerMode_BadDisplay) {
1021 const auto& status = mComposerClient->setPowerMode(getInvalidDisplayId(), PowerMode::ON);
ramindanic2b8d082021-11-06 02:03:50 +00001022
ramindani431aad42022-02-01 21:44:29 +00001023 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001024 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindanic2b8d082021-11-06 02:03:50 +00001025}
1026
ramindani431aad42022-02-01 21:44:29 +00001027TEST_P(GraphicsComposerAidlTest, SetPowerMode_BadParameter) {
1028 const auto& status =
1029 mComposerClient->setPowerMode(getPrimaryDisplayId(), static_cast<PowerMode>(-1));
ramindanic2b8d082021-11-06 02:03:50 +00001030
ramindani431aad42022-02-01 21:44:29 +00001031 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001032 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanic2b8d082021-11-06 02:03:50 +00001033}
1034
ramindanic2b8d082021-11-06 02:03:50 +00001035TEST_P(GraphicsComposerAidlTest, GetDataspaceSaturationMatrix) {
ramindani431aad42022-02-01 21:44:29 +00001036 const auto& [status, matrix] =
1037 mComposerClient->getDataspaceSaturationMatrix(common::Dataspace::SRGB_LINEAR);
1038 ASSERT_TRUE(status.isOk());
1039 ASSERT_EQ(16, matrix.size()); // matrix should not be empty if call succeeded.
ramindanideb059e2021-11-18 01:57:25 +00001040
ramindanic2b8d082021-11-06 02:03:50 +00001041 // the last row is known
ramindani431aad42022-02-01 21:44:29 +00001042 EXPECT_EQ(0.0f, matrix[12]);
1043 EXPECT_EQ(0.0f, matrix[13]);
1044 EXPECT_EQ(0.0f, matrix[14]);
1045 EXPECT_EQ(1.0f, matrix[15]);
ramindanic2b8d082021-11-06 02:03:50 +00001046}
1047
ramindani431aad42022-02-01 21:44:29 +00001048TEST_P(GraphicsComposerAidlTest, GetDataspaceSaturationMatrix_BadParameter) {
1049 const auto& [status, matrix] =
1050 mComposerClient->getDataspaceSaturationMatrix(common::Dataspace::UNKNOWN);
ramindanic2b8d082021-11-06 02:03:50 +00001051
ramindani431aad42022-02-01 21:44:29 +00001052 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00001053 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanic2b8d082021-11-06 02:03:50 +00001054}
1055
ramindanidcfe3a82021-11-29 17:00:31 +00001056// Tests for Command.
1057class GraphicsComposerAidlCommandTest : public GraphicsComposerAidlTest {
1058 protected:
ramindanidcfe3a82021-11-29 17:00:31 +00001059 void TearDown() override {
Ady Abraham3192f3d2021-12-03 16:08:56 -08001060 const auto errors = mReader.takeErrors();
1061 ASSERT_TRUE(mReader.takeErrors().empty());
ramindani431aad42022-02-01 21:44:29 +00001062 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001063
ramindanidcfe3a82021-11-29 17:00:31 +00001064 ASSERT_NO_FATAL_FAILURE(GraphicsComposerAidlTest::TearDown());
1065 }
1066
1067 void execute() {
Ady Abraham3192f3d2021-12-03 16:08:56 -08001068 const auto& commands = mWriter.getPendingCommands();
1069 if (commands.empty()) {
1070 mWriter.reset();
1071 return;
ramindanidcfe3a82021-11-29 17:00:31 +00001072 }
1073
ramindani431aad42022-02-01 21:44:29 +00001074 auto [status, results] = mComposerClient->executeCommands(commands);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001075 ASSERT_TRUE(status.isOk()) << "executeCommands failed " << status.getDescription();
ramindanidcfe3a82021-11-29 17:00:31 +00001076
Ady Abraham46219f52021-12-20 09:44:31 -08001077 mReader.parse(std::move(results));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001078 mWriter.reset();
ramindanidcfe3a82021-11-29 17:00:31 +00001079 }
1080
1081 static inline auto toTimePoint(nsecs_t time) {
1082 return std::chrono::time_point<std::chrono::steady_clock>(std::chrono::nanoseconds(time));
1083 }
1084
ramindanidcfe3a82021-11-29 17:00:31 +00001085 void forEachTwoConfigs(int64_t display, std::function<void(int32_t, int32_t)> func) {
ramindani431aad42022-02-01 21:44:29 +00001086 const auto& [status, displayConfigs] = mComposerClient->getDisplayConfigs(display);
1087 ASSERT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001088 for (const int32_t config1 : displayConfigs) {
1089 for (const int32_t config2 : displayConfigs) {
1090 if (config1 != config2) {
1091 func(config1, config2);
1092 }
1093 }
1094 }
1095 }
1096
1097 void waitForVsyncPeriodChange(int64_t display, const VsyncPeriodChangeTimeline& timeline,
1098 int64_t desiredTimeNanos, int64_t oldPeriodNanos,
1099 int64_t newPeriodNanos) {
1100 const auto kChangeDeadline = toTimePoint(timeline.newVsyncAppliedTimeNanos) + 100ms;
1101 while (std::chrono::steady_clock::now() <= kChangeDeadline) {
ramindani431aad42022-02-01 21:44:29 +00001102 const auto& [status, vsyncPeriodNanos] =
1103 mComposerClient->getDisplayVsyncPeriod(display);
1104 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001105 if (systemTime() <= desiredTimeNanos) {
1106 EXPECT_EQ(vsyncPeriodNanos, oldPeriodNanos);
1107 } else if (vsyncPeriodNanos == newPeriodNanos) {
1108 break;
1109 }
1110 std::this_thread::sleep_for(std::chrono::nanoseconds(oldPeriodNanos));
1111 }
1112 }
1113
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001114 sp<GraphicBuffer> allocate(::android::PixelFormat pixelFormat) {
ramindanidcfe3a82021-11-29 17:00:31 +00001115 return sp<GraphicBuffer>::make(
ramindani431aad42022-02-01 21:44:29 +00001116 static_cast<uint32_t>(getPrimaryDisplay().getDisplayWidth()),
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001117 static_cast<uint32_t>(getPrimaryDisplay().getDisplayHeight()), pixelFormat,
ramindani431aad42022-02-01 21:44:29 +00001118 /*layerCount*/ 1U,
ramindanidcfe3a82021-11-29 17:00:31 +00001119 (static_cast<uint64_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
1120 static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
1121 static_cast<uint64_t>(common::BufferUsage::COMPOSER_OVERLAY)),
1122 "VtsHalGraphicsComposer3_TargetTest");
1123 }
1124
1125 void sendRefreshFrame(const VtsDisplay& display, const VsyncPeriodChangeTimeline* timeline) {
1126 if (timeline != nullptr) {
1127 // Refresh time should be before newVsyncAppliedTimeNanos
1128 EXPECT_LT(timeline->refreshTimeNanos, timeline->newVsyncAppliedTimeNanos);
1129
1130 std::this_thread::sleep_until(toTimePoint(timeline->refreshTimeNanos));
1131 }
1132
ramindani431aad42022-02-01 21:44:29 +00001133 EXPECT_TRUE(mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::ON).isOk());
1134 EXPECT_TRUE(mComposerClient
1135 ->setColorMode(display.getDisplayId(), ColorMode::NATIVE,
1136 RenderIntent::COLORIMETRIC)
1137 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001138
ramindani431aad42022-02-01 21:44:29 +00001139 const auto& [status, layer] =
1140 mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount);
1141 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001142 {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001143 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindanidcfe3a82021-11-29 17:00:31 +00001144 ASSERT_NE(nullptr, buffer);
1145 ASSERT_EQ(::android::OK, buffer->initCheck());
1146 ASSERT_NE(nullptr, buffer->handle);
1147
ramindani431aad42022-02-01 21:44:29 +00001148 configureLayer(display, layer, Composition::DEVICE, display.getFrameRect(),
1149 display.getCrop());
1150 mWriter.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer->handle,
1151 /*acquireFence*/ -1);
1152 mWriter.setLayerDataspace(display.getDisplayId(), layer, common::Dataspace::UNKNOWN);
ramindanidcfe3a82021-11-29 17:00:31 +00001153
ramindani431aad42022-02-01 21:44:29 +00001154 mWriter.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001155 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001156 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001157
ramindani431aad42022-02-01 21:44:29 +00001158 mWriter.presentDisplay(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001159 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001160 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001161 }
1162
1163 {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001164 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindanidcfe3a82021-11-29 17:00:31 +00001165 ASSERT_NE(nullptr, buffer->handle);
1166
ramindani431aad42022-02-01 21:44:29 +00001167 mWriter.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer->handle,
1168 /*acquireFence*/ -1);
1169 mWriter.setLayerSurfaceDamage(display.getDisplayId(), layer,
Ady Abraham3192f3d2021-12-03 16:08:56 -08001170 std::vector<Rect>(1, {0, 0, 10, 10}));
ramindani431aad42022-02-01 21:44:29 +00001171 mWriter.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
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
ramindani431aad42022-02-01 21:44:29 +00001175 mWriter.presentDisplay(display.getDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001176 execute();
1177 }
1178
ramindani431aad42022-02-01 21:44:29 +00001179 EXPECT_TRUE(mComposerClient->destroyLayer(display.getDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001180 }
1181
Ady Abraham72c5b502021-12-10 17:23:39 -08001182 sp<::android::Fence> presentAndGetFence(
1183 std::optional<ClockMonotonicTimestamp> expectedPresentTime) {
ramindani431aad42022-02-01 21:44:29 +00001184 mWriter.validateDisplay(getPrimaryDisplayId(), expectedPresentTime);
Ady Abraham72c5b502021-12-10 17:23:39 -08001185 execute();
1186 EXPECT_TRUE(mReader.takeErrors().empty());
1187
ramindani431aad42022-02-01 21:44:29 +00001188 mWriter.presentDisplay(getPrimaryDisplayId());
Ady Abraham72c5b502021-12-10 17:23:39 -08001189 execute();
1190 EXPECT_TRUE(mReader.takeErrors().empty());
1191
ramindani431aad42022-02-01 21:44:29 +00001192 auto presentFence = mReader.takePresentFence(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -08001193 // take ownership
1194 const int fenceOwner = presentFence.get();
1195 *presentFence.getR() = -1;
1196 EXPECT_NE(-1, fenceOwner);
1197 return sp<::android::Fence>::make(fenceOwner);
Ady Abraham72c5b502021-12-10 17:23:39 -08001198 }
1199
1200 int32_t getVsyncPeriod() {
ramindani431aad42022-02-01 21:44:29 +00001201 const auto& [status, activeConfig] =
1202 mComposerClient->getActiveConfig(getPrimaryDisplayId());
1203 EXPECT_TRUE(status.isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001204
ramindani431aad42022-02-01 21:44:29 +00001205 const auto& [vsyncPeriodStatus, vsyncPeriod] = mComposerClient->getDisplayAttribute(
1206 getPrimaryDisplayId(), activeConfig, DisplayAttribute::VSYNC_PERIOD);
1207 EXPECT_TRUE(vsyncPeriodStatus.isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001208 return vsyncPeriod;
1209 }
1210
1211 int64_t createOnScreenLayer() {
ramindani431aad42022-02-01 21:44:29 +00001212 const auto& [status, layer] =
1213 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1214 EXPECT_TRUE(status.isOk());
1215 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1216 getPrimaryDisplay().getDisplayHeight()};
1217 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1218 (float)getPrimaryDisplay().getDisplayHeight()};
1219 configureLayer(getPrimaryDisplay(), layer, Composition::DEVICE, displayFrame, cropRect);
1220 mWriter.setLayerDataspace(getPrimaryDisplayId(), layer, common::Dataspace::UNKNOWN);
Ady Abraham72c5b502021-12-10 17:23:39 -08001221 return layer;
1222 }
1223
Midas Chiena0b56bd2022-01-13 23:27:33 +08001224 bool hasDisplayCapability(int64_t display, DisplayCapability cap) {
ramindani431aad42022-02-01 21:44:29 +00001225 const auto& [status, capabilities] = mComposerClient->getDisplayCapabilities(display);
1226 EXPECT_TRUE(status.isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08001227
1228 return std::find(capabilities.begin(), capabilities.end(), cap) != capabilities.end();
1229 }
1230
ramindanidcfe3a82021-11-29 17:00:31 +00001231 void Test_setActiveConfigWithConstraints(const TestParameters& params) {
1232 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00001233 forEachTwoConfigs(display.getDisplayId(), [&](int32_t config1, int32_t config2) {
1234 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001235 sendRefreshFrame(display, nullptr);
1236
ramindani431aad42022-02-01 21:44:29 +00001237 const auto displayConfigGroup1 = display.getDisplayConfig(config1);
1238 int32_t vsyncPeriod1 = displayConfigGroup1.vsyncPeriod;
1239 int32_t configGroup1 = displayConfigGroup1.configGroup;
1240
1241 const auto displayConfigGroup2 = display.getDisplayConfig(config2);
1242 int32_t vsyncPeriod2 = displayConfigGroup2.vsyncPeriod;
1243 int32_t configGroup2 = displayConfigGroup2.configGroup;
ramindanidcfe3a82021-11-29 17:00:31 +00001244
1245 if (vsyncPeriod1 == vsyncPeriod2) {
1246 return; // continue
1247 }
1248
1249 // We don't allow delayed change when changing config groups
1250 if (params.delayForChange > 0 && configGroup1 != configGroup2) {
1251 return; // continue
1252 }
1253
ramindanidcfe3a82021-11-29 17:00:31 +00001254 VsyncPeriodChangeConstraints constraints = {
1255 .desiredTimeNanos = systemTime() + params.delayForChange,
1256 .seamlessRequired = false};
ramindani431aad42022-02-01 21:44:29 +00001257 const auto& [status, timeline] = mComposerClient->setActiveConfigWithConstraints(
1258 &display, config2, constraints);
1259 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001260
1261 EXPECT_TRUE(timeline.newVsyncAppliedTimeNanos >= constraints.desiredTimeNanos);
1262 // Refresh rate should change within a reasonable time
1263 constexpr std::chrono::nanoseconds kReasonableTimeForChange = 1s; // 1 second
1264 EXPECT_TRUE(timeline.newVsyncAppliedTimeNanos - constraints.desiredTimeNanos <=
1265 kReasonableTimeForChange.count());
1266
1267 if (timeline.refreshRequired) {
1268 if (params.refreshMiss) {
1269 // Miss the refresh frame on purpose to make sure the implementation sends a
1270 // callback
1271 std::this_thread::sleep_until(toTimePoint(timeline.refreshTimeNanos) +
1272 100ms);
1273 }
1274 sendRefreshFrame(display, &timeline);
1275 }
ramindani431aad42022-02-01 21:44:29 +00001276 waitForVsyncPeriodChange(display.getDisplayId(), timeline,
1277 constraints.desiredTimeNanos, vsyncPeriod1, vsyncPeriod2);
ramindanidcfe3a82021-11-29 17:00:31 +00001278
1279 // At this point the refresh rate should have changed already, however in rare
1280 // cases the implementation might have missed the deadline. In this case a new
1281 // timeline should have been provided.
ramindani431aad42022-02-01 21:44:29 +00001282 auto newTimeline = mComposerClient->takeLastVsyncPeriodChangeTimeline();
ramindanidcfe3a82021-11-29 17:00:31 +00001283 if (timeline.refreshRequired && params.refreshMiss) {
1284 EXPECT_TRUE(newTimeline.has_value());
1285 }
1286
1287 if (newTimeline.has_value()) {
1288 if (newTimeline->refreshRequired) {
1289 sendRefreshFrame(display, &newTimeline.value());
1290 }
ramindani431aad42022-02-01 21:44:29 +00001291 waitForVsyncPeriodChange(display.getDisplayId(), newTimeline.value(),
ramindanidcfe3a82021-11-29 17:00:31 +00001292 constraints.desiredTimeNanos, vsyncPeriod1,
1293 vsyncPeriod2);
1294 }
1295
ramindani431aad42022-02-01 21:44:29 +00001296 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanos] =
1297 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
1298 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001299 EXPECT_EQ(vsyncPeriodNanos, vsyncPeriod2);
1300 });
1301 }
1302 }
1303
Ady Abraham72c5b502021-12-10 17:23:39 -08001304 void Test_expectedPresentTime(std::optional<int> framesDelay) {
Jason Macnak325e8232022-01-24 14:48:55 -08001305 if (hasCapability(Capability::PRESENT_FENCE_IS_NOT_RELIABLE)) {
1306 GTEST_SUCCEED() << "Device has unreliable present fences capability, skipping";
1307 return;
1308 }
1309
ramindani431aad42022-02-01 21:44:29 +00001310 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001311
1312 const auto vsyncPeriod = getVsyncPeriod();
1313
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001314 const auto buffer1 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
1315 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
Ady Abraham72c5b502021-12-10 17:23:39 -08001316 ASSERT_NE(nullptr, buffer1);
1317 ASSERT_NE(nullptr, buffer2);
1318
1319 const auto layer = createOnScreenLayer();
ramindani431aad42022-02-01 21:44:29 +00001320 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer1->handle,
1321 /*acquireFence*/ -1);
Ady Abraham72c5b502021-12-10 17:23:39 -08001322 const sp<::android::Fence> presentFence1 =
1323 presentAndGetFence(ComposerClientWriter::kNoTimestamp);
1324 presentFence1->waitForever(LOG_TAG);
1325
1326 auto expectedPresentTime = presentFence1->getSignalTime() + vsyncPeriod;
1327 if (framesDelay.has_value()) {
1328 expectedPresentTime += *framesDelay * vsyncPeriod;
1329 }
1330
ramindani431aad42022-02-01 21:44:29 +00001331 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer2->handle,
1332 /*acquireFence*/ -1);
Ady Abraham72c5b502021-12-10 17:23:39 -08001333 const auto setExpectedPresentTime = [&]() -> std::optional<ClockMonotonicTimestamp> {
1334 if (!framesDelay.has_value()) {
1335 return ComposerClientWriter::kNoTimestamp;
1336 } else if (*framesDelay == 0) {
1337 return ClockMonotonicTimestamp{0};
1338 }
1339 return ClockMonotonicTimestamp{expectedPresentTime};
1340 }();
1341
1342 const sp<::android::Fence> presentFence2 = presentAndGetFence(setExpectedPresentTime);
1343 presentFence2->waitForever(LOG_TAG);
1344
1345 const auto actualPresentTime = presentFence2->getSignalTime();
Ady Abrahamdf084f32022-01-10 14:10:23 -08001346 EXPECT_GE(actualPresentTime, expectedPresentTime - vsyncPeriod / 2);
Ady Abraham72c5b502021-12-10 17:23:39 -08001347
ramindani431aad42022-02-01 21:44:29 +00001348 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
Ady Abraham72c5b502021-12-10 17:23:39 -08001349 }
1350
ramindani431aad42022-02-01 21:44:29 +00001351 void configureLayer(const VtsDisplay& display, int64_t layer, Composition composition,
1352 const Rect& displayFrame, const FRect& cropRect) {
1353 mWriter.setLayerCompositionType(display.getDisplayId(), layer, composition);
1354 mWriter.setLayerDisplayFrame(display.getDisplayId(), layer, displayFrame);
1355 mWriter.setLayerPlaneAlpha(display.getDisplayId(), layer, /*alpha*/ 1);
1356 mWriter.setLayerSourceCrop(display.getDisplayId(), layer, cropRect);
1357 mWriter.setLayerTransform(display.getDisplayId(), layer, static_cast<Transform>(0));
1358 mWriter.setLayerVisibleRegion(display.getDisplayId(), layer,
1359 std::vector<Rect>(1, displayFrame));
1360 mWriter.setLayerZOrder(display.getDisplayId(), layer, /*z*/ 10);
1361 mWriter.setLayerBlendMode(display.getDisplayId(), layer, BlendMode::NONE);
1362 mWriter.setLayerSurfaceDamage(display.getDisplayId(), layer,
1363 std::vector<Rect>(1, displayFrame));
1364 }
ramindanidcfe3a82021-11-29 17:00:31 +00001365 // clang-format off
1366 const std::array<float, 16> kIdentity = {{
1367 1.0f, 0.0f, 0.0f, 0.0f,
1368 0.0f, 1.0f, 0.0f, 0.0f,
1369 0.0f, 0.0f, 1.0f, 0.0f,
1370 0.0f, 0.0f, 0.0f, 1.0f,
1371 }};
1372 // clang-format on
1373
Ady Abraham91c9d1a2021-12-15 18:14:45 -08001374 ComposerClientWriter mWriter;
1375 ComposerClientReader mReader;
ramindanidcfe3a82021-11-29 17:00:31 +00001376};
1377
ramindani431aad42022-02-01 21:44:29 +00001378TEST_P(GraphicsComposerAidlCommandTest, SetColorTransform) {
1379 mWriter.setColorTransform(getPrimaryDisplayId(), kIdentity.data());
ramindanidcfe3a82021-11-29 17:00:31 +00001380 execute();
1381}
1382
1383TEST_P(GraphicsComposerAidlCommandTest, SetLayerColorTransform) {
ramindani431aad42022-02-01 21:44:29 +00001384 const auto& [status, layer] =
1385 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1386 EXPECT_TRUE(status.isOk());
1387 mWriter.setLayerColorTransform(getPrimaryDisplayId(), layer, kIdentity.data());
ramindanidcfe3a82021-11-29 17:00:31 +00001388 execute();
1389
Ady Abraham3192f3d2021-12-03 16:08:56 -08001390 const auto errors = mReader.takeErrors();
Jason Macnak062bc9a2022-01-20 15:00:09 -08001391 if (errors.size() == 1 && errors[0].errorCode == IComposerClient::EX_UNSUPPORTED) {
ramindanidcfe3a82021-11-29 17:00:31 +00001392 GTEST_SUCCEED() << "setLayerColorTransform is not supported";
1393 return;
1394 }
1395}
1396
Alec Mouri60564e12021-12-09 18:48:20 -08001397TEST_P(GraphicsComposerAidlCommandTest, SetDisplayBrightness) {
ramindani431aad42022-02-01 21:44:29 +00001398 const auto& [status, capabilities] =
1399 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
1400 ASSERT_TRUE(status.isOk());
Alec Mouri60564e12021-12-09 18:48:20 -08001401 bool brightnessSupport = std::find(capabilities.begin(), capabilities.end(),
1402 DisplayCapability::BRIGHTNESS) != capabilities.end();
1403 if (!brightnessSupport) {
Alec Mouri03b6daa2022-03-23 18:45:02 +00001404 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.5f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001405 execute();
1406 const auto errors = mReader.takeErrors();
1407 EXPECT_EQ(1, errors.size());
Jason Macnak062bc9a2022-01-20 15:00:09 -08001408 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, errors[0].errorCode);
Alec Mouri60564e12021-12-09 18:48:20 -08001409 GTEST_SUCCEED() << "SetDisplayBrightness is not supported";
1410 return;
1411 }
1412
Alec Mouri03b6daa2022-03-23 18:45:02 +00001413 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001414 execute();
1415 EXPECT_TRUE(mReader.takeErrors().empty());
1416
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 EXPECT_TRUE(mReader.takeErrors().empty());
1420
Alec Mouri03b6daa2022-03-23 18:45:02 +00001421 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 1.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001422 execute();
1423 EXPECT_TRUE(mReader.takeErrors().empty());
1424
Alec Mouri03b6daa2022-03-23 18:45:02 +00001425 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ -1.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001426 execute();
1427 EXPECT_TRUE(mReader.takeErrors().empty());
1428
Alec Mouri03b6daa2022-03-23 18:45:02 +00001429 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 2.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001430 execute();
1431 {
1432 const auto errors = mReader.takeErrors();
ramindanib3bdf052022-01-12 18:27:05 +00001433 ASSERT_EQ(1, errors.size());
Alec Mouri60564e12021-12-09 18:48:20 -08001434 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1435 }
1436
Alec Mouri03b6daa2022-03-23 18:45:02 +00001437 mWriter.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ -2.0f, -1.f);
Alec Mouri60564e12021-12-09 18:48:20 -08001438 execute();
1439 {
1440 const auto errors = mReader.takeErrors();
ramindanib3bdf052022-01-12 18:27:05 +00001441 ASSERT_EQ(1, errors.size());
Alec Mouri60564e12021-12-09 18:48:20 -08001442 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1443 }
1444}
1445
ramindani431aad42022-02-01 21:44:29 +00001446TEST_P(GraphicsComposerAidlCommandTest, SetClientTarget) {
1447 EXPECT_TRUE(mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kBufferSlotCount)
1448 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001449
ramindani431aad42022-02-01 21:44:29 +00001450 mWriter.setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, nullptr, /*acquireFence*/ -1,
1451 Dataspace::UNKNOWN, std::vector<Rect>());
ramindanidcfe3a82021-11-29 17:00:31 +00001452
1453 execute();
1454}
1455
ramindani431aad42022-02-01 21:44:29 +00001456TEST_P(GraphicsComposerAidlCommandTest, SetOutputBuffer) {
1457 const auto& [status, virtualDisplayCount] = mComposerClient->getMaxVirtualDisplayCount();
1458 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001459 if (virtualDisplayCount == 0) {
1460 GTEST_SUCCEED() << "no virtual display support";
1461 return;
1462 }
1463
ramindani431aad42022-02-01 21:44:29 +00001464 const auto& [displayStatus, display] = mComposerClient->createVirtualDisplay(
1465 /*width*/ 64, /*height*/ 64, common::PixelFormat::IMPLEMENTATION_DEFINED,
1466 kBufferSlotCount);
1467 EXPECT_TRUE(displayStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001468
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001469 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001470 const auto handle = buffer->handle;
ramindani431aad42022-02-01 21:44:29 +00001471 mWriter.setOutputBuffer(display.display, /*slot*/ 0, handle, /*releaseFence*/ -1);
ramindanidcfe3a82021-11-29 17:00:31 +00001472 execute();
1473}
1474
ramindani431aad42022-02-01 21:44:29 +00001475TEST_P(GraphicsComposerAidlCommandTest, ValidDisplay) {
1476 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001477 execute();
1478}
1479
ramindani431aad42022-02-01 21:44:29 +00001480TEST_P(GraphicsComposerAidlCommandTest, AcceptDisplayChanges) {
1481 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1482 mWriter.acceptDisplayChanges(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001483 execute();
1484}
1485
ramindani431aad42022-02-01 21:44:29 +00001486TEST_P(GraphicsComposerAidlCommandTest, PresentDisplay) {
1487 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1488 mWriter.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001489 execute();
1490}
1491
1492/**
1493 * Test IComposerClient::Command::PRESENT_DISPLAY
1494 *
1495 * Test that IComposerClient::Command::PRESENT_DISPLAY works without
1496 * additional call to validateDisplay when only the layer buffer handle and
1497 * surface damage have been set
1498 */
ramindani431aad42022-02-01 21:44:29 +00001499TEST_P(GraphicsComposerAidlCommandTest, PresentDisplayNoLayerStateChanges) {
Jason Macnak325e8232022-01-24 14:48:55 -08001500 if (!hasCapability(Capability::SKIP_VALIDATE)) {
ramindanidcfe3a82021-11-29 17:00:31 +00001501 GTEST_SUCCEED() << "Device does not have skip validate capability, skipping";
1502 return;
1503 }
ramindani431aad42022-02-01 21:44:29 +00001504 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001505
ramindani431aad42022-02-01 21:44:29 +00001506 const auto& [renderIntentsStatus, renderIntents] =
1507 mComposerClient->getRenderIntents(getPrimaryDisplayId(), ColorMode::NATIVE);
1508 EXPECT_TRUE(renderIntentsStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001509 for (auto intent : renderIntents) {
ramindani431aad42022-02-01 21:44:29 +00001510 EXPECT_TRUE(mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE, intent)
1511 .isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001512
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001513 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001514 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001515 ASSERT_NE(nullptr, handle);
1516
ramindani431aad42022-02-01 21:44:29 +00001517 const auto& [layerStatus, layer] =
1518 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1519 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001520
ramindani431aad42022-02-01 21:44:29 +00001521 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1522 getPrimaryDisplay().getDisplayHeight()};
1523 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1524 (float)getPrimaryDisplay().getDisplayHeight()};
1525 configureLayer(getPrimaryDisplay(), layer, Composition::CURSOR, displayFrame, cropRect);
1526 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle,
1527 /*acquireFence*/ -1);
1528 mWriter.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1529 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001530 execute();
ramindani431aad42022-02-01 21:44:29 +00001531 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanidcfe3a82021-11-29 17:00:31 +00001532 GTEST_SUCCEED() << "Composition change requested, skipping test";
1533 return;
1534 }
1535
Ady Abraham3192f3d2021-12-03 16:08:56 -08001536 ASSERT_TRUE(mReader.takeErrors().empty());
ramindani431aad42022-02-01 21:44:29 +00001537 mWriter.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001538 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001539 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001540
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001541 const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001542 const auto handle2 = buffer2->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001543 ASSERT_NE(nullptr, handle2);
ramindani431aad42022-02-01 21:44:29 +00001544 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle2,
1545 /*acquireFence*/ -1);
1546 mWriter.setLayerSurfaceDamage(getPrimaryDisplayId(), layer,
1547 std::vector<Rect>(1, {0, 0, 10, 10}));
1548 mWriter.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001549 execute();
1550 }
1551}
1552
ramindani431aad42022-02-01 21:44:29 +00001553TEST_P(GraphicsComposerAidlCommandTest, SetLayerCursorPosition) {
1554 const auto& [layerStatus, layer] =
1555 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1556 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001557
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001558 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001559 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001560 ASSERT_NE(nullptr, handle);
ramindanidcfe3a82021-11-29 17:00:31 +00001561
ramindani431aad42022-02-01 21:44:29 +00001562 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
1563
1564 Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
1565 getPrimaryDisplay().getDisplayHeight()};
1566 FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
1567 (float)getPrimaryDisplay().getDisplayHeight()};
1568 configureLayer(getPrimaryDisplay(), layer, Composition::CURSOR, displayFrame, cropRect);
1569 mWriter.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1570 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanidcfe3a82021-11-29 17:00:31 +00001571
1572 execute();
Ady Abraham46219f52021-12-20 09:44:31 -08001573
ramindani431aad42022-02-01 21:44:29 +00001574 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanidcfe3a82021-11-29 17:00:31 +00001575 GTEST_SUCCEED() << "Composition change requested, skipping test";
1576 return;
1577 }
ramindani431aad42022-02-01 21:44:29 +00001578 mWriter.presentDisplay(getPrimaryDisplayId());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001579 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001580
ramindani431aad42022-02-01 21:44:29 +00001581 mWriter.setLayerCursorPosition(getPrimaryDisplayId(), layer, /*x*/ 1, /*y*/ 1);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001582 execute();
1583
ramindani431aad42022-02-01 21:44:29 +00001584 mWriter.setLayerCursorPosition(getPrimaryDisplayId(), layer, /*x*/ 0, /*y*/ 0);
1585 mWriter.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1586 mWriter.presentDisplay(getPrimaryDisplayId());
ramindanidcfe3a82021-11-29 17:00:31 +00001587 execute();
1588}
1589
ramindani431aad42022-02-01 21:44:29 +00001590TEST_P(GraphicsComposerAidlCommandTest, SetLayerBuffer) {
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001591 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001592 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001593 ASSERT_NE(nullptr, handle);
1594
ramindani431aad42022-02-01 21:44:29 +00001595 const auto& [layerStatus, layer] =
1596 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1597 EXPECT_TRUE(layerStatus.isOk());
1598 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
ramindanidcfe3a82021-11-29 17:00:31 +00001599 execute();
1600}
1601
ramindani431aad42022-02-01 21:44:29 +00001602TEST_P(GraphicsComposerAidlCommandTest, SetLayerSurfaceDamage) {
1603 const auto& [layerStatus, layer] =
1604 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1605 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001606
1607 Rect empty{0, 0, 0, 0};
1608 Rect unit{0, 0, 1, 1};
1609
ramindani431aad42022-02-01 21:44:29 +00001610 mWriter.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
ramindanidcfe3a82021-11-29 17:00:31 +00001611 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001612 ASSERT_TRUE(mReader.takeErrors().empty());
1613
ramindani431aad42022-02-01 21:44:29 +00001614 mWriter.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001615 execute();
1616 ASSERT_TRUE(mReader.takeErrors().empty());
1617
ramindani431aad42022-02-01 21:44:29 +00001618 mWriter.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001619 execute();
1620 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001621}
1622
ramindani431aad42022-02-01 21:44:29 +00001623TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlockingRegion) {
1624 const auto& [layerStatus, layer] =
1625 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1626 EXPECT_TRUE(layerStatus.isOk());
Leon Scroggins III03318152022-01-13 12:24:19 -05001627
1628 Rect empty{0, 0, 0, 0};
1629 Rect unit{0, 0, 1, 1};
1630
ramindani431aad42022-02-01 21:44:29 +00001631 mWriter.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
Leon Scroggins III03318152022-01-13 12:24:19 -05001632 execute();
1633 ASSERT_TRUE(mReader.takeErrors().empty());
1634
ramindani431aad42022-02-01 21:44:29 +00001635 mWriter.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Leon Scroggins III03318152022-01-13 12:24:19 -05001636 execute();
1637 ASSERT_TRUE(mReader.takeErrors().empty());
1638
ramindani431aad42022-02-01 21:44:29 +00001639 mWriter.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
Leon Scroggins III03318152022-01-13 12:24:19 -05001640 execute();
1641 ASSERT_TRUE(mReader.takeErrors().empty());
1642}
1643
ramindani431aad42022-02-01 21:44:29 +00001644TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlendMode) {
1645 const auto& [layerStatus, layer] =
1646 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1647 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001648
ramindani431aad42022-02-01 21:44:29 +00001649 mWriter.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::NONE);
ramindanidcfe3a82021-11-29 17:00:31 +00001650 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001651 ASSERT_TRUE(mReader.takeErrors().empty());
1652
ramindani431aad42022-02-01 21:44:29 +00001653 mWriter.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::PREMULTIPLIED);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001654 execute();
1655 ASSERT_TRUE(mReader.takeErrors().empty());
1656
ramindani431aad42022-02-01 21:44:29 +00001657 mWriter.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::COVERAGE);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001658 execute();
1659 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001660}
1661
ramindani431aad42022-02-01 21:44:29 +00001662TEST_P(GraphicsComposerAidlCommandTest, SetLayerColor) {
1663 const auto& [layerStatus, layer] =
1664 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1665 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001666
ramindani431aad42022-02-01 21:44:29 +00001667 mWriter.setLayerColor(getPrimaryDisplayId(), layer, Color{1.0f, 1.0f, 1.0f, 1.0f});
ramindanidcfe3a82021-11-29 17:00:31 +00001668 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001669 ASSERT_TRUE(mReader.takeErrors().empty());
1670
ramindani431aad42022-02-01 21:44:29 +00001671 mWriter.setLayerColor(getPrimaryDisplayId(), layer, Color{0.0f, 0.0f, 0.0f, 0.0f});
Ady Abraham3192f3d2021-12-03 16:08:56 -08001672 execute();
1673 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001674}
1675
ramindani431aad42022-02-01 21:44:29 +00001676TEST_P(GraphicsComposerAidlCommandTest, SetLayerCompositionType) {
1677 const auto& [layerStatus, layer] =
1678 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1679 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001680
ramindani431aad42022-02-01 21:44:29 +00001681 mWriter.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CLIENT);
ramindanidcfe3a82021-11-29 17:00:31 +00001682 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001683 ASSERT_TRUE(mReader.takeErrors().empty());
1684
ramindani431aad42022-02-01 21:44:29 +00001685 mWriter.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::DEVICE);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001686 execute();
1687 ASSERT_TRUE(mReader.takeErrors().empty());
1688
ramindani431aad42022-02-01 21:44:29 +00001689 mWriter.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::SOLID_COLOR);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001690 execute();
1691 ASSERT_TRUE(mReader.takeErrors().empty());
1692
ramindani431aad42022-02-01 21:44:29 +00001693 mWriter.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CURSOR);
1694 execute();
1695}
1696
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001697TEST_P(GraphicsComposerAidlCommandTest, DisplayDecoration) {
1698 for (VtsDisplay& display : mDisplays) {
1699 const auto [layerStatus, layer] =
1700 mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount);
1701 EXPECT_TRUE(layerStatus.isOk());
1702
1703 const auto [error, support] =
1704 mComposerClient->getDisplayDecorationSupport(display.getDisplayId());
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001705
Leon Scroggins III91590872022-02-23 09:51:21 -05001706 const auto format = (error.isOk() && support) ? support->format
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001707 : aidl::android::hardware::graphics::common::PixelFormat::RGBA_8888;
1708 const auto decorBuffer = allocate(static_cast<::android::PixelFormat>(format));
1709 ASSERT_NE(nullptr, decorBuffer);
1710 if (::android::OK != decorBuffer->initCheck()) {
1711 if (support) {
1712 FAIL() << "Device advertised display decoration support with format "
1713 << aidl::android::hardware::graphics::common::toString(format)
1714 << " but failed to allocate it!";
1715 } else {
1716 FAIL() << "Device advertised NO display decoration support, but it should "
1717 << "still be able to allocate "
1718 << aidl::android::hardware::graphics::common::toString(format);
1719 }
1720 }
1721
1722 mWriter.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, decorBuffer->handle,
1723 /*acquireFence*/ -1);
1724 mWriter.setLayerCompositionType(display.getDisplayId(), layer,
1725 Composition::DISPLAY_DECORATION);
1726 mWriter.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp);
1727 execute();
1728 if (support) {
1729 ASSERT_TRUE(mReader.takeErrors().empty());
1730 } else {
1731 const auto errors = mReader.takeErrors();
1732 ASSERT_EQ(1, errors.size());
Leon Scroggins III6455e792022-02-24 12:18:58 -05001733 EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, errors[0].errorCode);
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001734 }
1735 }
1736}
1737
ramindani431aad42022-02-01 21:44:29 +00001738TEST_P(GraphicsComposerAidlCommandTest, SetLayerDataspace) {
1739 const auto& [layerStatus, layer] =
1740 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1741 EXPECT_TRUE(layerStatus.isOk());
1742
1743 mWriter.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
1744 execute();
1745}
1746
1747TEST_P(GraphicsComposerAidlCommandTest, SetLayerDisplayFrame) {
1748 const auto& [layerStatus, layer] =
1749 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1750 EXPECT_TRUE(layerStatus.isOk());
1751
1752 mWriter.setLayerDisplayFrame(getPrimaryDisplayId(), layer, Rect{0, 0, 1, 1});
1753 execute();
1754}
1755
1756TEST_P(GraphicsComposerAidlCommandTest, SetLayerPlaneAlpha) {
1757 const auto& [layerStatus, layer] =
1758 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1759 EXPECT_TRUE(layerStatus.isOk());
1760
1761 mWriter.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 0.0f);
1762 execute();
1763 ASSERT_TRUE(mReader.takeErrors().empty());
1764
1765 mWriter.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 1.0f);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001766 execute();
1767 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001768}
1769
ramindani431aad42022-02-01 21:44:29 +00001770TEST_P(GraphicsComposerAidlCommandTest, SetLayerSidebandStream) {
Jason Macnak325e8232022-01-24 14:48:55 -08001771 if (!hasCapability(Capability::SIDEBAND_STREAM)) {
ramindanidcfe3a82021-11-29 17:00:31 +00001772 GTEST_SUCCEED() << "no sideband stream support";
1773 return;
1774 }
1775
Leon Scroggins IIIde057582022-01-13 12:26:00 -05001776 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ramindani3d18f922021-12-13 20:24:47 +00001777 const auto handle = buffer->handle;
ramindanidcfe3a82021-11-29 17:00:31 +00001778 ASSERT_NE(nullptr, handle);
1779
ramindani431aad42022-02-01 21:44:29 +00001780 const auto& [layerStatus, layer] =
1781 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1782 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001783
ramindani431aad42022-02-01 21:44:29 +00001784 mWriter.setLayerSidebandStream(getPrimaryDisplayId(), layer, handle);
ramindanidcfe3a82021-11-29 17:00:31 +00001785 execute();
1786}
1787
ramindani431aad42022-02-01 21:44:29 +00001788TEST_P(GraphicsComposerAidlCommandTest, SetLayerSourceCrop) {
1789 const auto& [layerStatus, layer] =
1790 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1791 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001792
ramindani431aad42022-02-01 21:44:29 +00001793 mWriter.setLayerSourceCrop(getPrimaryDisplayId(), layer, FRect{0.0f, 0.0f, 1.0f, 1.0f});
ramindanidcfe3a82021-11-29 17:00:31 +00001794 execute();
1795}
1796
ramindani431aad42022-02-01 21:44:29 +00001797TEST_P(GraphicsComposerAidlCommandTest, SetLayerTransform) {
1798 const auto& [layerStatus, layer] =
1799 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1800 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001801
ramindani431aad42022-02-01 21:44:29 +00001802 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, static_cast<Transform>(0));
ramindanidcfe3a82021-11-29 17:00:31 +00001803 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001804 ASSERT_TRUE(mReader.takeErrors().empty());
1805
ramindani431aad42022-02-01 21:44:29 +00001806 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_H);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001807 execute();
1808 ASSERT_TRUE(mReader.takeErrors().empty());
1809
ramindani431aad42022-02-01 21:44:29 +00001810 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_V);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001811 execute();
1812 ASSERT_TRUE(mReader.takeErrors().empty());
1813
ramindani431aad42022-02-01 21:44:29 +00001814 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_90);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001815 execute();
1816 ASSERT_TRUE(mReader.takeErrors().empty());
1817
ramindani431aad42022-02-01 21:44:29 +00001818 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_180);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001819 execute();
1820 ASSERT_TRUE(mReader.takeErrors().empty());
1821
ramindani431aad42022-02-01 21:44:29 +00001822 mWriter.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_270);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001823 execute();
1824 ASSERT_TRUE(mReader.takeErrors().empty());
1825
ramindani431aad42022-02-01 21:44:29 +00001826 mWriter.setLayerTransform(getPrimaryDisplayId(), layer,
Ady Abraham3192f3d2021-12-03 16:08:56 -08001827 static_cast<Transform>(static_cast<int>(Transform::FLIP_H) |
1828 static_cast<int>(Transform::ROT_90)));
1829 execute();
1830 ASSERT_TRUE(mReader.takeErrors().empty());
1831
ramindani431aad42022-02-01 21:44:29 +00001832 mWriter.setLayerTransform(getPrimaryDisplayId(), layer,
Ady Abraham3192f3d2021-12-03 16:08:56 -08001833 static_cast<Transform>(static_cast<int>(Transform::FLIP_V) |
1834 static_cast<int>(Transform::ROT_90)));
1835 execute();
1836 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001837}
1838
ramindani431aad42022-02-01 21:44:29 +00001839TEST_P(GraphicsComposerAidlCommandTest, SetLayerVisibleRegion) {
1840 const auto& [layerStatus, layer] =
1841 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1842 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001843
1844 Rect empty{0, 0, 0, 0};
1845 Rect unit{0, 0, 1, 1};
1846
ramindani431aad42022-02-01 21:44:29 +00001847 mWriter.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
ramindanidcfe3a82021-11-29 17:00:31 +00001848 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001849 ASSERT_TRUE(mReader.takeErrors().empty());
1850
ramindani431aad42022-02-01 21:44:29 +00001851 mWriter.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
Ady Abraham3192f3d2021-12-03 16:08:56 -08001852 execute();
1853 ASSERT_TRUE(mReader.takeErrors().empty());
1854
ramindani431aad42022-02-01 21:44:29 +00001855 mWriter.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
Ady Abraham3192f3d2021-12-03 16:08:56 -08001856 execute();
1857 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001858}
1859
ramindani431aad42022-02-01 21:44:29 +00001860TEST_P(GraphicsComposerAidlCommandTest, SetLayerZOrder) {
1861 const auto& [layerStatus, layer] =
1862 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1863 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001864
ramindani431aad42022-02-01 21:44:29 +00001865 mWriter.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 10);
ramindanidcfe3a82021-11-29 17:00:31 +00001866 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001867 ASSERT_TRUE(mReader.takeErrors().empty());
1868
ramindani431aad42022-02-01 21:44:29 +00001869 mWriter.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 0);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001870 execute();
1871 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcfe3a82021-11-29 17:00:31 +00001872}
1873
ramindani431aad42022-02-01 21:44:29 +00001874TEST_P(GraphicsComposerAidlCommandTest, SetLayerPerFrameMetadata) {
1875 const auto& [layerStatus, layer] =
1876 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
1877 EXPECT_TRUE(layerStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001878
ramindanidcfe3a82021-11-29 17:00:31 +00001879 /**
1880 * DISPLAY_P3 is a color space that uses the DCI_P3 primaries,
1881 * the D65 white point and the SRGB transfer functions.
1882 * Rendering Intent: Colorimetric
1883 * Primaries:
1884 * x y
1885 * green 0.265 0.690
1886 * blue 0.150 0.060
1887 * red 0.680 0.320
1888 * white (D65) 0.3127 0.3290
1889 */
1890
1891 std::vector<PerFrameMetadata> aidlMetadata;
1892 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X, 0.680f});
1893 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y, 0.320f});
1894 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_X, 0.265f});
1895 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_Y, 0.690f});
1896 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_X, 0.150f});
1897 aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_Y, 0.060f});
1898 aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_X, 0.3127f});
1899 aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_Y, 0.3290f});
1900 aidlMetadata.push_back({PerFrameMetadataKey::MAX_LUMINANCE, 100.0f});
1901 aidlMetadata.push_back({PerFrameMetadataKey::MIN_LUMINANCE, 0.1f});
1902 aidlMetadata.push_back({PerFrameMetadataKey::MAX_CONTENT_LIGHT_LEVEL, 78.0});
1903 aidlMetadata.push_back({PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL, 62.0});
ramindani431aad42022-02-01 21:44:29 +00001904 mWriter.setLayerPerFrameMetadata(getPrimaryDisplayId(), layer, aidlMetadata);
ramindanidcfe3a82021-11-29 17:00:31 +00001905 execute();
1906
Ady Abraham3192f3d2021-12-03 16:08:56 -08001907 const auto errors = mReader.takeErrors();
1908 if (errors.size() == 1 && errors[0].errorCode == EX_UNSUPPORTED_OPERATION) {
ramindanidcfe3a82021-11-29 17:00:31 +00001909 GTEST_SUCCEED() << "SetLayerPerFrameMetadata is not supported";
ramindani431aad42022-02-01 21:44:29 +00001910 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001911 return;
1912 }
1913
ramindani431aad42022-02-01 21:44:29 +00001914 EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001915}
1916
Alec Mourib1f16722022-02-07 13:03:44 -08001917TEST_P(GraphicsComposerAidlCommandTest, setLayerBrightness) {
ramindani431aad42022-02-01 21:44:29 +00001918 const auto& [layerStatus, layer] =
1919 mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
Alec Mouri95e490b2022-01-06 13:46:58 -08001920
Alec Mourib1f16722022-02-07 13:03:44 -08001921 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, 0.2f);
Alec Mouri95e490b2022-01-06 13:46:58 -08001922 execute();
1923 ASSERT_TRUE(mReader.takeErrors().empty());
1924
Alec Mourib1f16722022-02-07 13:03:44 -08001925 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, 1.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08001926 execute();
1927 ASSERT_TRUE(mReader.takeErrors().empty());
1928
Alec Mourib1f16722022-02-07 13:03:44 -08001929 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, 0.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08001930 execute();
1931 ASSERT_TRUE(mReader.takeErrors().empty());
1932
Alec Mourib1f16722022-02-07 13:03:44 -08001933 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, -1.f);
Alec Mouri95e490b2022-01-06 13:46:58 -08001934 execute();
Alec Mourib1f16722022-02-07 13:03:44 -08001935 {
1936 const auto errors = mReader.takeErrors();
1937 ASSERT_EQ(1, errors.size());
1938 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1939 }
1940
1941 mWriter.setLayerBrightness(getPrimaryDisplayId(), layer, std::nanf(""));
1942 execute();
1943 {
1944 const auto errors = mReader.takeErrors();
1945 ASSERT_EQ(1, errors.size());
1946 EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
1947 }
Alec Mouri95e490b2022-01-06 13:46:58 -08001948}
1949
ramindani431aad42022-02-01 21:44:29 +00001950TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints) {
ramindanidcfe3a82021-11-29 17:00:31 +00001951 Test_setActiveConfigWithConstraints({.delayForChange = 0, .refreshMiss = false});
1952}
1953
ramindani431aad42022-02-01 21:44:29 +00001954TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_Delayed) {
ramindanidcfe3a82021-11-29 17:00:31 +00001955 Test_setActiveConfigWithConstraints({.delayForChange = 300'000'000, // 300ms
1956 .refreshMiss = false});
1957}
1958
ramindani431aad42022-02-01 21:44:29 +00001959TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_MissRefresh) {
ramindanidcfe3a82021-11-29 17:00:31 +00001960 Test_setActiveConfigWithConstraints({.delayForChange = 0, .refreshMiss = true});
1961}
1962
ramindani431aad42022-02-01 21:44:29 +00001963TEST_P(GraphicsComposerAidlCommandTest, GetDisplayVsyncPeriod) {
ramindanidcfe3a82021-11-29 17:00:31 +00001964 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00001965 const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
1966 EXPECT_TRUE(status.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001967
ramindani431aad42022-02-01 21:44:29 +00001968 for (int32_t config : configs) {
1969 int32_t expectedVsyncPeriodNanos = display.getDisplayConfig(config).vsyncPeriod;
1970
ramindanidcfe3a82021-11-29 17:00:31 +00001971 VsyncPeriodChangeConstraints constraints;
1972
1973 constraints.desiredTimeNanos = systemTime();
1974 constraints.seamlessRequired = false;
ramindani431aad42022-02-01 21:44:29 +00001975
1976 const auto& [timelineStatus, timeline] =
1977 mComposerClient->setActiveConfigWithConstraints(&display, config, constraints);
1978 EXPECT_TRUE(timelineStatus.isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00001979
1980 if (timeline.refreshRequired) {
1981 sendRefreshFrame(display, &timeline);
1982 }
ramindani431aad42022-02-01 21:44:29 +00001983 waitForVsyncPeriodChange(display.getDisplayId(), timeline, constraints.desiredTimeNanos,
1984 /*odPeriodNanos*/ 0, expectedVsyncPeriodNanos);
ramindanidcfe3a82021-11-29 17:00:31 +00001985
1986 int32_t vsyncPeriodNanos;
1987 int retryCount = 100;
1988 do {
1989 std::this_thread::sleep_for(10ms);
ramindani431aad42022-02-01 21:44:29 +00001990 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanosValue] =
1991 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
1992
1993 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
1994 vsyncPeriodNanos = vsyncPeriodNanosValue;
ramindanidcfe3a82021-11-29 17:00:31 +00001995 --retryCount;
1996 } while (vsyncPeriodNanos != expectedVsyncPeriodNanos && retryCount > 0);
1997
1998 EXPECT_EQ(vsyncPeriodNanos, expectedVsyncPeriodNanos);
1999
2000 // Make sure that the vsync period stays the same if the active config is not
2001 // changed.
2002 auto timeout = 1ms;
2003 for (int i = 0; i < 10; i++) {
2004 std::this_thread::sleep_for(timeout);
2005 timeout *= 2;
2006 vsyncPeriodNanos = 0;
ramindani431aad42022-02-01 21:44:29 +00002007 const auto& [vsyncPeriodNanosStatus, vsyncPeriodNanosValue] =
2008 mComposerClient->getDisplayVsyncPeriod(display.getDisplayId());
2009
2010 EXPECT_TRUE(vsyncPeriodNanosStatus.isOk());
2011 vsyncPeriodNanos = vsyncPeriodNanosValue;
ramindanidcfe3a82021-11-29 17:00:31 +00002012 EXPECT_EQ(vsyncPeriodNanos, expectedVsyncPeriodNanos);
2013 }
2014 }
2015 }
2016}
2017
ramindani431aad42022-02-01 21:44:29 +00002018TEST_P(GraphicsComposerAidlCommandTest, SetActiveConfigWithConstraints_SeamlessNotAllowed) {
ramindanidcfe3a82021-11-29 17:00:31 +00002019 VsyncPeriodChangeConstraints constraints;
ramindanidcfe3a82021-11-29 17:00:31 +00002020 constraints.seamlessRequired = true;
2021 constraints.desiredTimeNanos = systemTime();
2022
2023 for (VtsDisplay& display : mDisplays) {
ramindani431aad42022-02-01 21:44:29 +00002024 forEachTwoConfigs(display.getDisplayId(), [&](int32_t config1, int32_t config2) {
2025 int32_t configGroup1 = display.getDisplayConfig(config1).configGroup;
2026 int32_t configGroup2 = display.getDisplayConfig(config2).configGroup;
ramindanidcfe3a82021-11-29 17:00:31 +00002027 if (configGroup1 != configGroup2) {
ramindani431aad42022-02-01 21:44:29 +00002028 EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
ramindanidcfe3a82021-11-29 17:00:31 +00002029 sendRefreshFrame(display, nullptr);
ramindani431aad42022-02-01 21:44:29 +00002030 const auto& [status, _] = mComposerClient->setActiveConfigWithConstraints(
2031 &display, config2, constraints);
2032 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002033 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(
2034 status, IComposerClient::EX_SEAMLESS_NOT_ALLOWED));
ramindanidcfe3a82021-11-29 17:00:31 +00002035 }
2036 });
2037 }
2038}
2039
ramindani431aad42022-02-01 21:44:29 +00002040TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_NoTimestamp) {
2041 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ std::nullopt));
Ady Abraham72c5b502021-12-10 17:23:39 -08002042}
2043
ramindani431aad42022-02-01 21:44:29 +00002044TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_0) {
2045 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ 0));
Ady Abraham72c5b502021-12-10 17:23:39 -08002046}
2047
ramindani431aad42022-02-01 21:44:29 +00002048TEST_P(GraphicsComposerAidlCommandTest, ExpectedPresentTime_5) {
2049 ASSERT_NO_FATAL_FAILURE(Test_expectedPresentTime(/*framesDelay*/ 5));
Ady Abraham72c5b502021-12-10 17:23:39 -08002050}
2051
ramindani431aad42022-02-01 21:44:29 +00002052TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Unsupported) {
2053 const bool hasDisplayIdleTimerSupport =
2054 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002055 if (!hasDisplayIdleTimerSupport) {
ramindani431aad42022-02-01 21:44:29 +00002056 const auto& status =
2057 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0);
2058 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002059 EXPECT_NO_FATAL_FAILURE(
2060 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
Midas Chiena0b56bd2022-01-13 23:27:33 +08002061 }
2062}
2063
ramindani431aad42022-02-01 21:44:29 +00002064TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_BadParameter) {
2065 const bool hasDisplayIdleTimerSupport =
2066 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002067 if (!hasDisplayIdleTimerSupport) {
2068 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2069 return;
2070 }
2071
ramindani431aad42022-02-01 21:44:29 +00002072 const auto& status =
2073 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ -1);
2074 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +00002075 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
Midas Chiena0b56bd2022-01-13 23:27:33 +08002076}
2077
ramindani431aad42022-02-01 21:44:29 +00002078TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Disable) {
2079 const bool hasDisplayIdleTimerSupport =
2080 hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002081 if (!hasDisplayIdleTimerSupport) {
2082 GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
2083 return;
2084 }
2085
ramindani431aad42022-02-01 21:44:29 +00002086 EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002087 std::this_thread::sleep_for(1s);
ramindani431aad42022-02-01 21:44:29 +00002088 EXPECT_EQ(0, mComposerClient->getVsyncIdleCount());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002089}
2090
ramindani431aad42022-02-01 21:44:29 +00002091TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Timeout_2) {
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->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
2100 EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002101
Leon Scroggins IIIde057582022-01-13 12:26:00 -05002102 const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002103 ASSERT_NE(nullptr, buffer->handle);
2104
2105 const auto layer = createOnScreenLayer();
ramindani431aad42022-02-01 21:44:29 +00002106 mWriter.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer->handle,
2107 /*acquireFence*/ -1);
2108 int32_t vsyncIdleCount = mComposerClient->getVsyncIdleCount();
Midas Chiena0b56bd2022-01-13 23:27:33 +08002109 auto earlyVsyncIdleTime = systemTime() + std::chrono::nanoseconds(2s).count();
ramindani431aad42022-02-01 21:44:29 +00002110 EXPECT_TRUE(
2111 mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 2000).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002112
2113 const sp<::android::Fence> presentFence =
ramindani431aad42022-02-01 21:44:29 +00002114 presentAndGetFence(ComposerClientWriter::kNoTimestamp);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002115 presentFence->waitForever(LOG_TAG);
2116
2117 std::this_thread::sleep_for(3s);
ramindani431aad42022-02-01 21:44:29 +00002118 if (vsyncIdleCount < mComposerClient->getVsyncIdleCount()) {
2119 EXPECT_GE(mComposerClient->getVsyncIdleTime(), earlyVsyncIdleTime);
Midas Chiena0b56bd2022-01-13 23:27:33 +08002120 }
2121
ramindani431aad42022-02-01 21:44:29 +00002122 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
Midas Chiena0b56bd2022-01-13 23:27:33 +08002123}
2124
ramindanidcfe3a82021-11-29 17:00:31 +00002125GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlCommandTest);
2126INSTANTIATE_TEST_SUITE_P(
2127 PerInstance, GraphicsComposerAidlCommandTest,
2128 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
2129 ::android::PrintInstanceNameToString);
2130
ramindanid32ae8e2021-10-01 18:48:39 +00002131GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlTest);
2132INSTANTIATE_TEST_SUITE_P(
2133 PerInstance, GraphicsComposerAidlTest,
2134 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
2135 ::android::PrintInstanceNameToString);
2136} // namespace
2137} // namespace aidl::android::hardware::graphics::composer3::vts
2138
2139int main(int argc, char** argv) {
2140 ::testing::InitGoogleTest(&argc, argv);
2141
2142 using namespace std::chrono_literals;
2143 if (!android::base::WaitForProperty("init.svc.surfaceflinger", "stopped", 10s)) {
2144 ALOGE("Failed to stop init.svc.surfaceflinger");
2145 return -1;
2146 }
ramindanibeea10e2021-12-07 21:02:49 +00002147
2148 android::ProcessState::self()->setThreadPoolMaxThreadCount(4);
2149
2150 // The binder threadpool we start will inherit sched policy and priority
2151 // of (this) creating thread. We want the binder thread pool to have
2152 // SCHED_FIFO policy and priority 1 (lowest RT priority)
2153 // Once the pool is created we reset this thread's priority back to
2154 // original.
2155 // This thread policy is based on what we do in the SurfaceFlinger while starting
2156 // the thread pool and we need to replicate that for the VTS tests.
2157 int newPriority = 0;
2158 int origPolicy = sched_getscheduler(0);
2159 struct sched_param origSchedParam;
2160
2161 int errorInPriorityModification = sched_getparam(0, &origSchedParam);
2162 if (errorInPriorityModification == 0) {
2163 int policy = SCHED_FIFO;
2164 newPriority = sched_get_priority_min(policy);
2165
2166 struct sched_param param;
2167 param.sched_priority = newPriority;
2168
2169 errorInPriorityModification = sched_setscheduler(0, policy, &param);
2170 }
2171
2172 // start the thread pool
2173 android::ProcessState::self()->startThreadPool();
2174
2175 // Reset current thread's policy and priority
2176 if (errorInPriorityModification == 0) {
2177 errorInPriorityModification = sched_setscheduler(0, origPolicy, &origSchedParam);
2178 } else {
2179 ALOGE("Failed to set VtsHalGraphicsComposer3_TargetTest binder threadpool priority to "
2180 "SCHED_FIFO");
2181 }
2182
ramindanid32ae8e2021-10-01 18:48:39 +00002183 return RUN_ALL_TESTS();
ramindania9780262021-10-01 18:48:39 +00002184}