1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "hdi_composer_ut.h"
17 #include <chrono>
18 #include <cinttypes>
19 #include <algorithm>
20 #include "v1_0/include/idisplay_composer_interface.h"
21 #include "v1_2/include/idisplay_composer_interface.h"
22 #include "v1_2/display_composer_type.h"
23 #include "v1_0/display_buffer_type.h"
24 #include "display_test.h"
25 #include "display_test_utils.h"
26 #include "hdi_composition_check.h"
27 #include "hdi_test_device.h"
28 #include "hdi_test_device_common.h"
29 #include "hdi_test_display.h"
30 #include "hdi_test_render_utils.h"
31 #include "timer.h"
32 #include <sys/time.h>
33 #include <thread>
34
35 using namespace OHOS::HDI::Display::Buffer::V1_0;
36 using namespace OHOS::HDI::Display::Composer::V1_2;
37 using namespace OHOS::HDI::Display::TEST;
38 using namespace testing::ext;
39
40 static sptr<Composer::V1_2::IDisplayComposerInterface> g_composerDevice = nullptr;
41 static std::shared_ptr<IDisplayBuffer> g_gralloc = nullptr;
42 static std::vector<uint32_t> g_displayIds;
43 const int SLEEP_CONT_10 = 10;
44 const int SLEEP_CONT_100 = 100;
45 const int SLEEP_CONT_2000 = 2000;
46 static bool g_isOnSeamlessChangeCalled = false;
47 static bool g_isOnModeCalled = false;
48 static bool g_threadCtrl = false;
49
GetFirstDisplay()50 static inline std::shared_ptr<HdiTestDisplay> GetFirstDisplay()
51 {
52 return HdiTestDevice::GetInstance().GetFirstDisplay();
53 }
54
CheckComposition(std::vector<LayerSettings> & layers,BufferHandle * clientBuffer,uint32_t checkType=HdiCompositionCheck::CHECK_VERTEX)55 static int32_t CheckComposition(std::vector<LayerSettings> &layers, BufferHandle* clientBuffer,
56 uint32_t checkType = HdiCompositionCheck::CHECK_VERTEX)
57 {
58 DISPLAY_TEST_CHK_RETURN((clientBuffer == nullptr), DISPLAY_NULL_PTR, DISPLAY_TEST_LOGE("client buffer is nullptr"));
59 return HdiCompositionCheck::GetInstance().Check(layers, *clientBuffer, checkType);
60 }
61
CreateTestLayer(LayerSettings setting,uint32_t zorder)62 static std::shared_ptr<HdiTestLayer> CreateTestLayer(LayerSettings setting, uint32_t zorder)
63 {
64 int ret;
65 HdiTestDevice::GetInstance();
66 DISPLAY_TEST_LOGD("color 0x%x", setting.color);
67 std::shared_ptr<HdiTestDisplay> display = HdiTestDevice::GetInstance().GetFirstDisplay();
68 DISPLAY_TEST_CHK_RETURN((display == nullptr), nullptr, DISPLAY_TEST_LOGE("can not get display"));
69
70 std::shared_ptr<HdiTestLayer> layer = display->CreateHdiTestLayer(setting.bufferSize.w, setting.bufferSize.h);
71 DISPLAY_TEST_CHK_RETURN((layer == nullptr), nullptr, DISPLAY_TEST_LOGE("can not create hdi test layer"));
72
73 layer->SetLayerPosition(setting.displayRect);
74
75 layer->SetCompType(setting.compositionType);
76
77 if ((setting.alpha >= 0) && (setting.alpha <= 0xff)) { // alpha rang 0x00 ~ 0xff
78 LayerAlpha alpha = { 0 };
79 alpha.gAlpha = setting.alpha;
80 alpha.enGlobalAlpha = true;
81 layer->SetAlpha(alpha);
82 }
83 HdiGrallocBuffer* handle = layer->GetFrontBuffer();
84 DISPLAY_TEST_CHK_RETURN((handle == nullptr), nullptr, DISPLAY_TEST_LOGE("can not get front buffer"));
85 ClearColor(*(handle->Get()), setting.color);
86 ret = layer->SwapFrontToBackQ();
87 DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), nullptr, DISPLAY_TEST_LOGE("SwapFrontToBackQ failed"));
88 layer->SetZorder(zorder);
89 layer->SetBlendType(setting.blendType);
90 layer->SetTransform(setting.rotate);
91 return layer;
92 }
93
PrepareAndCommit()94 static int PrepareAndCommit()
95 {
96 int ret;
97 DISPLAY_TEST_LOGD();
98 std::shared_ptr<HdiTestDisplay> display = HdiTestDevice::GetInstance().GetFirstDisplay();
99 DISPLAY_TEST_CHK_RETURN((display == nullptr), DISPLAY_FAILURE, DISPLAY_TEST_LOGE("can not get display"));
100
101 ret = display->PrepareDisplayLayers(); // 确定顶压策略(是否走GPU合成)、刷新layer列表
102 DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE,
103 DISPLAY_TEST_LOGE("PrepareDisplayLayers failed"));
104
105 ret = display->Commit(); // 送显
106 DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_TEST_LOGE("Commit failed"));
107 return DISPLAY_SUCCESS;
108 }
109
LoopCommit()110 static void LoopCommit()
111 {
112 while (!g_threadCtrl) {
113 PrepareAndCommit();
114 std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_CONT_10));
115 }
116 }
117
TestVBlankCallback(unsigned int sequence,uint64_t ns,void * data)118 static void TestVBlankCallback(unsigned int sequence, uint64_t ns, void* data)
119 {
120 static uint64_t lastns;
121 DISPLAY_TEST_LOGD("seq %{public}d ns %" PRId64 " duration %" PRId64 " ns", sequence, ns, (ns - lastns));
122 lastns = ns;
123 VblankCtr::GetInstance().NotifyVblank(sequence, ns, data);
124 }
125
AdjustLayerSettings(std::vector<LayerSettings> & settings,uint32_t w,uint32_t h)126 static void AdjustLayerSettings(std::vector<LayerSettings> &settings, uint32_t w, uint32_t h)
127 {
128 DISPLAY_TEST_LOGD();
129 for (uint32_t i = 0; i < settings.size(); i++) {
130 LayerSettings& setting = settings[i];
131 DISPLAY_TEST_LOGD(" ratio w: %f ratio h: %f", setting.rectRatio.w, setting.rectRatio.h);
132 if ((setting.rectRatio.w > 0.0f) && (setting.rectRatio.h > 0.0f)) {
133 setting.displayRect.h = static_cast<uint32_t>(setting.rectRatio.h * h);
134 setting.displayRect.w = static_cast<uint32_t>(setting.rectRatio.w * w);
135 setting.displayRect.x = static_cast<uint32_t>(setting.rectRatio.x * w);
136 setting.displayRect.y = static_cast<uint32_t>(setting.rectRatio.y * h);
137 DISPLAY_TEST_LOGD("display rect adust form %f %f %f %f to %{public}d %{public}d %{public}d %{public}d ",
138 setting.rectRatio.x, setting.rectRatio.y, setting.rectRatio.w, setting.rectRatio.h,
139 setting.displayRect.x, setting.displayRect.y, setting.displayRect.w, setting.displayRect.h);
140 }
141
142 if ((setting.bufferRatio.h > 0.0f) || (setting.bufferRatio.w > 0.0f)) {
143 setting.bufferSize.h = static_cast<uint32_t>(setting.bufferRatio.h * h);
144 setting.bufferSize.w = static_cast<uint32_t>(setting.bufferRatio.w * w);
145 DISPLAY_TEST_LOGD("buffer size adjust for %f %f to %{public}d %{public}d",
146 setting.bufferRatio.w, setting.bufferRatio.h, setting.bufferSize.w, setting.bufferSize.h);
147 }
148
149 if ((setting.bufferSize.w == 0) || (setting.bufferSize.h == 0)) {
150 DISPLAY_TEST_LOGD("buffer size adjust for %{public}d %{public}d to %{public}d %{public}d",
151 setting.bufferSize.w, setting.bufferSize.h, setting.displayRect.w, setting.displayRect.h);
152
153 setting.bufferSize.w = setting.displayRect.w;
154 setting.bufferSize.h = setting.displayRect.h;
155 }
156 }
157 }
158
CreateLayers(std::vector<LayerSettings> & settings)159 static std::vector<std::shared_ptr<HdiTestLayer>> CreateLayers(std::vector<LayerSettings> &settings)
160 {
161 DISPLAY_TEST_LOGD("settings %{public}zd", settings.size());
162 std::vector<std::shared_ptr<HdiTestLayer>> layers;
163 DisplayModeInfo mode = GetFirstDisplay()->GetCurrentMode();
164 AdjustLayerSettings(settings, mode.width, mode.height);
165 for (uint32_t i = 0; i < settings.size(); i++) {
166 LayerSettings setting = settings[i];
167
168 auto layer = CreateTestLayer(setting, i);
169 layers.push_back(layer);
170 }
171
172 return layers;
173 }
174
PresentAndCheck(std::vector<LayerSettings> & layerSettings,uint32_t checkType=HdiCompositionCheck::CHECK_VERTEX)175 static inline void PresentAndCheck(std::vector<LayerSettings> &layerSettings,
176 uint32_t checkType = HdiCompositionCheck::CHECK_VERTEX)
177 {
178 int ret = PrepareAndCommit();
179 ASSERT_TRUE((ret == DISPLAY_SUCCESS));
180 if ((GetFirstDisplay()->SnapShot()) != nullptr) {
181 HdiTestDevice::GetInstance().GetGrallocInterface()->InvalidateCache(*(GetFirstDisplay()->SnapShot()));
182 ret = CheckComposition(layerSettings, GetFirstDisplay()->SnapShot(), checkType);
183 ASSERT_TRUE((ret == DISPLAY_SUCCESS));
184 }
185 }
186
DestroyLayer(std::shared_ptr<HdiTestLayer> layer)187 static void DestroyLayer(std::shared_ptr<HdiTestLayer> layer)
188 {
189 std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_CONT_100));
190 auto ret = g_composerDevice->DestroyLayer(g_displayIds[0], layer->GetId());
191 if (ret != DISPLAY_SUCCESS && ret != DISPLAY_NOT_SUPPORT) {
192 DISPLAY_TEST_LOGD("DestroyLayer fail or not support, ret: %{public}d", ret);
193 return;
194 }
195 std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_CONT_100));
196 }
197
SetUpTestCase()198 void DeviceTest::SetUpTestCase()
199 {
200 int ret = HdiTestDevice::GetInstance().InitDevice();
201 ASSERT_TRUE(ret == DISPLAY_SUCCESS);
202
203 g_composerDevice = HdiTestDevice::GetInstance().GetDeviceInterface();
204 ASSERT_TRUE(g_composerDevice != nullptr);
205
206 g_gralloc.reset(IDisplayBuffer::Get());
207 ASSERT_TRUE(g_gralloc != nullptr);
208
209 g_displayIds = HdiTestDevice::GetInstance().GetDevIds();
210 ASSERT_TRUE(g_displayIds.size() > 0);
211 }
212
TearDownTestCase()213 void DeviceTest::TearDownTestCase()
214 {
215 HdiTestDevice::GetInstance().Clear();
216 HdiTestDevice::GetInstance().GetFirstDisplay()->ResetClientLayer();
217 }
218
NotifyVblank(unsigned int sequence,uint64_t ns,const void * data)219 void VblankCtr::NotifyVblank(unsigned int sequence, uint64_t ns, const void* data)
220 {
221 DISPLAY_TEST_LOGD();
222 if (data != nullptr) {
223 DISPLAY_TEST_LOGD("sequence = %{public}u, ns = %" PRIu64 "", sequence, ns);
224 }
225 std::unique_lock<std::mutex> lg(vblankMutex_);
226 hasVblank_ = true;
227 vblankCondition_.notify_one();
228 DISPLAY_TEST_LOGD();
229 }
230
~VblankCtr()231 VblankCtr::~VblankCtr() {}
232
WaitVblank(uint32_t ms)233 int32_t VblankCtr::WaitVblank(uint32_t ms)
234 {
235 bool ret = false;
236 DISPLAY_TEST_LOGD();
237 std::unique_lock<std::mutex> lck(vblankMutex_);
238 ret = vblankCondition_.wait_for(lck, std::chrono::milliseconds(ms), [=] { return hasVblank_; });
239 DISPLAY_TEST_LOGD();
240 if (!ret) {
241 return DISPLAY_FAILURE;
242 }
243 return DISPLAY_SUCCESS;
244 }
245
246 HWTEST_F(DeviceTest, test_SetClientBufferCacheCount, TestSize.Level1)
247 {
248 const uint32_t CACHE_COUNT = 5;
249 auto ret = g_composerDevice->SetClientBufferCacheCount(g_displayIds[0], CACHE_COUNT);
250 EXPECT_EQ(DISPLAY_SUCCESS, ret);
251 }
252
253 HWTEST_F(DeviceTest, test_GetDisplayCapability, TestSize.Level1)
254 {
255 DisplayCapability info;
256 auto ret = g_composerDevice->GetDisplayCapability(g_displayIds[0], info);
257 EXPECT_EQ(DISPLAY_SUCCESS, ret);
258 }
259
260 HWTEST_F(DeviceTest, test_GetDisplaySupportedModes, TestSize.Level1)
261 {
262 std::vector<DisplayModeInfo> modes;
263 auto ret = g_composerDevice->GetDisplaySupportedModes(g_displayIds[0], modes);
264 EXPECT_EQ(DISPLAY_SUCCESS, ret);
265 }
266
267 HWTEST_F(DeviceTest, test_GetDisplayMode, TestSize.Level1)
268 {
269 uint32_t MODE = 0;
270 auto ret = g_composerDevice->GetDisplayMode(g_displayIds[0], MODE);
271 EXPECT_EQ(DISPLAY_SUCCESS, ret);
272 }
273
274 HWTEST_F(DeviceTest, test_SetDisplayMode, TestSize.Level1)
275 {
276 const uint32_t MODE = 0;
277 auto ret = g_composerDevice->SetDisplayMode(g_displayIds[0], MODE);
278 EXPECT_EQ(DISPLAY_SUCCESS, ret);
279 }
280
281 HWTEST_F(DeviceTest, test_GetDisplayPowerStatus, TestSize.Level1)
282 {
283 Composer::V1_0::DispPowerStatus powerStatus = Composer::V1_0::DispPowerStatus::POWER_STATUS_OFF;
284 auto ret = g_composerDevice->GetDisplayPowerStatus(g_displayIds[0], powerStatus);
285 EXPECT_EQ(DISPLAY_SUCCESS, ret);
286 }
287
288 HWTEST_F(DeviceTest, test_SetDisplayPowerStatus, TestSize.Level1)
289 {
290 auto ret = g_composerDevice->SetDisplayPowerStatus(g_displayIds[0],
291 Composer::V1_0::DispPowerStatus::POWER_STATUS_STANDBY);
292 EXPECT_EQ(DISPLAY_SUCCESS, ret);
293
294 ret = g_composerDevice->SetDisplayPowerStatus(g_displayIds[0], Composer::V1_0::DispPowerStatus::POWER_STATUS_ON);
295 EXPECT_EQ(DISPLAY_SUCCESS, ret);
296 }
297
298 #ifdef DISPLAY_COMMUNITY
299 HWTEST_F(DeviceTest, test_GetDisplayBacklight, TestSize.Level1)
300 {
301 uint32_t level;
302 auto ret = g_composerDevice->GetDisplayBacklight(g_displayIds[0], level);
303 EXPECT_EQ(DISPLAY_SUCCESS, ret);
304 }
305 #endif
306
307 HWTEST_F(DeviceTest, test_SetDisplayBacklight, TestSize.Level1)
308 {
309 const uint32_t LEVEL = 10;
310 auto ret = g_composerDevice->SetDisplayBacklight(g_displayIds[0], LEVEL);
311 EXPECT_EQ(DISPLAY_SUCCESS, ret);
312 }
313
314 HWTEST_F(DeviceTest, test_GetDisplayProperty, TestSize.Level1)
315 {
316 const uint32_t PROPERTY_ID = 1;
317 uint64_t propertyValue = 0;
318 auto ret = g_composerDevice->GetDisplayProperty(g_displayIds[0], PROPERTY_ID, propertyValue);
319 int32_t result = DISPLAY_FAILURE;
320 if (ret == DISPLAY_SUCCESS || ret == DISPLAY_NOT_SUPPORT) {
321 result = DISPLAY_SUCCESS;
322 }
323 EXPECT_EQ(DISPLAY_SUCCESS, result);
324 }
325
326 HWTEST_F(DeviceTest, test_SetHardwareCursorPosition, TestSize.Level1)
327 {
328 int32_t x = 1;
329 int32_t y = 1;
330 auto ret = g_composerDevice->SetHardwareCursorPosition(g_displayIds[0], x, y);
331 if (ret == DISPLAY_SUCCESS || ret == DISPLAY_NOT_SUPPORT) {
332 ret = DISPLAY_SUCCESS;
333 }
334 EXPECT_EQ(DISPLAY_SUCCESS, ret);
335 }
336
337 HWTEST_F(DeviceTest, test_EnableHardwareCursorStats, TestSize.Level1)
338 {
339 bool enable = true;
340 auto ret = g_composerDevice->EnableHardwareCursorStats(g_displayIds[0], enable);
341 if (ret == DISPLAY_SUCCESS || ret == DISPLAY_NOT_SUPPORT) {
342 ret = DISPLAY_SUCCESS;
343 }
344 EXPECT_EQ(DISPLAY_SUCCESS, ret);
345 }
346
347 HWTEST_F(DeviceTest, test_GetHardwareCursorStats, TestSize.Level1)
348 {
349 uint32_t frameCount = 0;
350 uint32_t vsyncCount = 0;
351 auto ret = g_composerDevice->GetHardwareCursorStats(g_displayIds[0], frameCount, vsyncCount);
352 if (ret == DISPLAY_SUCCESS || ret == DISPLAY_NOT_SUPPORT) {
353 ret = DISPLAY_SUCCESS;
354 }
355 EXPECT_EQ(DISPLAY_SUCCESS, ret);
356 }
357
358 HWTEST_F(DeviceTest, test_GetDisplayCompChange, TestSize.Level1)
359 {
360 std::vector<uint32_t> layers {};
361 std::vector<int32_t> type {};
362 auto ret = g_composerDevice->GetDisplayCompChange(g_displayIds[0], layers, type);
363 EXPECT_EQ(DISPLAY_SUCCESS, ret);
364 }
365
366 HWTEST_F(DeviceTest, test_SetDisplayClientCrop, TestSize.Level1)
367 {
368 const int32_t WIDTH = 1920;
369 const int32_t HEIGHT = 1080;
370 IRect rect = {0, 0, WIDTH, HEIGHT};
371 auto ret = g_composerDevice->SetDisplayClientCrop(g_displayIds[0], rect);
372 // not support
373 EXPECT_EQ(DISPLAY_FAILURE, ret);
374 }
375
376 HWTEST_F(DeviceTest, test_GetDisplayReleaseFence, TestSize.Level1)
377 {
378 std::vector<uint32_t> layers {};
379 std::vector<int32_t> fences {};
380 auto ret = g_composerDevice->GetDisplayReleaseFence(g_displayIds[0], layers, fences);
381 EXPECT_EQ(DISPLAY_SUCCESS, ret);
382 }
383
384 HWTEST_F(DeviceTest, test_SetDisplayClientBuffer, TestSize.Level1)
385 {
386 BufferHandle* buffer = nullptr;
387 const int32_t WIDTH = 800;
388 const int32_t HEIGHT = 600;
389
390 AllocInfo info;
391 info.width = WIDTH;
392 info.height = HEIGHT;
393 info.usage = OHOS::HDI::Display::Composer::V1_0::HBM_USE_MEM_DMA |
394 OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_READ |
395 OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_WRITE;
396 info.format = Composer::V1_0::PIXEL_FMT_RGBA_8888;
397
398 g_gralloc->AllocMem(info, buffer);
399 ASSERT_TRUE(buffer != nullptr);
400
401 uint32_t bufferSeq = 1;
402 auto ret = g_composerDevice->SetDisplayClientBuffer(g_displayIds[0], buffer, bufferSeq, -1);
403 g_gralloc->FreeMem(*buffer);
404 EXPECT_EQ(DISPLAY_SUCCESS, ret);
405 }
406
407 HWTEST_F(DeviceTest, test_SetDisplayClientDamage, TestSize.Level1)
408 {
409 const int32_t WIDTH = 1920;
410 const int32_t HEIGHT = 1080;
411 IRect rect = {0, 0, WIDTH, HEIGHT};
412 std::vector<IRect> vRects;
413 vRects.push_back(rect);
414 auto ret = g_composerDevice->SetDisplayClientDamage(g_displayIds[0], vRects);
415 // not support
416 EXPECT_EQ(DISPLAY_SUCCESS, ret);
417 }
418
419 HWTEST_F(DeviceTest, test_CreateVirtualDisplay, TestSize.Level1)
420 {
421 const uint32_t WIDTH = 1920;
422 const uint32_t HEIGHT = 1080;
423 int32_t format = 0;
424 uint32_t devId = 0;
425 auto ret = g_composerDevice->CreateVirtualDisplay(WIDTH, HEIGHT, format, devId);
426 // not support
427 EXPECT_EQ(DISPLAY_FAILURE, ret);
428 }
429
430 HWTEST_F(DeviceTest, test_DestroyVirtualDisplay, TestSize.Level1)
431 {
432 uint32_t devId = 0;
433 auto ret = g_composerDevice->DestroyVirtualDisplay(devId);
434 // not support
435 EXPECT_EQ(DISPLAY_FAILURE, ret);
436 }
437
438 HWTEST_F(DeviceTest, test_SetVirtualDisplayBuffer, TestSize.Level1)
439 {
440 BufferHandle* buffer = nullptr;
441 int32_t fence = -1;
442 const int32_t WIDTH = 800;
443 const int32_t HEIGHT = 600;
444
445 AllocInfo info;
446 info.width = WIDTH;
447 info.height = HEIGHT;
448 info.usage = OHOS::HDI::Display::Composer::V1_0::HBM_USE_MEM_DMA |
449 OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_READ |
450 OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_WRITE;
451 info.format = Composer::V1_0::PIXEL_FMT_RGBA_8888;
452
453 g_gralloc->AllocMem(info, buffer);
454 ASSERT_TRUE(buffer != nullptr);
455
456 auto ret = g_composerDevice->SetVirtualDisplayBuffer(g_displayIds[0], *buffer, fence);
457 g_gralloc->FreeMem(*buffer);
458 // not support
459 EXPECT_EQ(DISPLAY_FAILURE, ret);
460 }
461
462 HWTEST_F(DeviceTest, test_SetDisplayProperty, TestSize.Level1)
463 {
464 const uint32_t PROPERTY_ID = 1;
465 const uint64_t PROPERTY_VALUE = 0;
466 auto ret = g_composerDevice->SetDisplayProperty(g_displayIds[0], PROPERTY_ID, PROPERTY_VALUE);
467 // not support
468 EXPECT_EQ(DISPLAY_FAILURE, ret);
469 }
470
471 HWTEST_F(DeviceTest, test_SetLayerCrop, TestSize.Level1)
472 {
473 std::vector<LayerSettings> settings = {
474 {
475 .rectRatio = { 0, 0, 1.0f, 1.0f },
476 .color = RED
477 },
478 };
479 std::vector<uint32_t> splitColors = { { RED, GREEN, YELLOW, BLUE, PINK, PURPLE, CYAN, TRANSPARENT } };
480
481 std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
482 ASSERT_TRUE((layers.size() > 0));
483 // split the buffer
484 auto layer = layers[0];
485 HdiGrallocBuffer* handle = layer->GetBackBuffer(); // the backbuffer has not present now
486 ASSERT_TRUE((handle != nullptr));
487 auto splitRects = SplitBuffer(*(handle->Get()), splitColors);
488 PrepareAndCommit();
489 for (uint32_t i = 0; i < splitRects.size(); i++) {
490 settings[0].color = splitColors[i];
491 layer->SetLayerCrop(splitRects[i]);
492 PresentAndCheck(settings);
493 }
494
495 DestroyLayer(layer);
496 }
497
498 HWTEST_F(DeviceTest, test_SetLayerZorder, TestSize.Level1)
499 {
500 std::vector<LayerSettings> settings = {
501 {
502 .rectRatio = { 0, 0, 1.0f, 1.0f },
503 .color = RED
504 },
505 {
506 .rectRatio = { 0, 0, 1.0f, 1.0f },
507 .color = GREEN
508 },
509 {
510 .rectRatio = { 0, 0, 1.0f, 1.0f },
511 .color = YELLOW
512 },
513 };
514
515 std::vector<std::vector<int>> zorders = {
516 { 3, 2, 1 }, { 1, 3, 2 }, { 3, 1, 2 }, { 1, 2, 3 }, { 2, 1, 3 }, { 2, 3, 1 },
517 };
518 std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
519
520 for (const auto& zorderList : zorders) {
521 // adjust the zorder
522 for (uint32_t i = 0; i < zorderList.size(); i++) {
523 settings[i].zorder = zorderList[i];
524 layers[i]->SetZorder(zorderList[i]);
525 }
526 std::vector<LayerSettings> tempSettings = settings;
527 std::sort(tempSettings.begin(), tempSettings.end(),
__anon7b907af90202(const auto& l, auto const & r) 528 [=](const auto& l, auto const & r) { return l.zorder < r.zorder; });
529 // present and check
530 PresentAndCheck(tempSettings);
531 }
532 HdiTestDevice::GetInstance().Clear();
533 }
534
535 HWTEST_F(DeviceTest, test_SetLayerPreMulti, TestSize.Level1)
536 {
537 std::vector<LayerSettings> settings = {
538 {
539 .rectRatio = { 0, 0, 1.0f, 1.0f },
540 .color = GREEN
541 },
542 };
543
544 std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
545 ASSERT_TRUE((layers.size() > 0));
546 PrepareAndCommit();
547
548 auto layer = layers[0];
549 bool preMul = true;
550 auto ret = g_composerDevice->SetLayerPreMulti(g_displayIds[0], layer->GetId(), preMul);
551
552 PrepareAndCommit();
553 HdiTestDevice::GetInstance().Clear();
554 EXPECT_EQ(DISPLAY_SUCCESS, ret);
555
556 DestroyLayer(layer);
557 }
558
559 HWTEST_F(DeviceTest, test_SetLayerAlpha, TestSize.Level1)
560 {
561 std::vector<LayerSettings> settings = {
562 {
563 .rectRatio = { 0, 0, 1.0f, 1.0f },
564 .color = GREEN
565 },
566 {
567 .rectRatio = { 0, 0, 1.0f, 1.0f },
568 .color = RED
569 },
570 };
571
572 std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
573 ASSERT_TRUE((layers.size() > 0));
574
575 auto layer = layers[1];
576 LayerAlpha alpha = { 0 };
577 alpha.enGlobalAlpha = true;
578 alpha.enPixelAlpha = true;
579 alpha.gAlpha = 0;
580 alpha.alpha0 = 0;
581 alpha.alpha1 = 0;
582 layer->SetAlpha(alpha);
583
584 PrepareAndCommit();
585 HdiTestDevice::GetInstance().Clear();
586
587 DestroyLayer(layer);
588 }
589
590 HWTEST_F(DeviceTest, test_SetLayerRegion, TestSize.Level1)
591 {
592 std::vector<LayerSettings> settings = {
593 {.rectRatio = {0, 0, 1.0f, 1.0f}, .color = GREEN, .alpha = 0xFF}
594 };
595
596 std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
597 ASSERT_TRUE((layers.size() > 0));
598
599 const int32_t WIDTH = 100;
600 const int32_t HEIGHT = 100;
601 auto layer = layers[0];
602 IRect rect = {0, 0, WIDTH, HEIGHT};
603 auto ret = g_composerDevice->SetLayerRegion(g_displayIds[0], layer->GetId(), rect);
604
605 PrepareAndCommit();
606 EXPECT_EQ(DISPLAY_SUCCESS, ret);
607
608 DestroyLayer(layer);
609 }
610
611 HWTEST_F(DeviceTest, test_SetLayerDirtyRegion, TestSize.Level1)
612 {
613 std::vector<LayerSettings> settings = {
614 {
615 .rectRatio = { 0, 0, 1.0f, 1.0f },
616 .color = BLUE
617 }
618 };
619
620 std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
621 ASSERT_TRUE((layers.size() > 0));
622
623 auto layer = layers[0];
624
625 const int32_t WIDTH = 100;
626 const int32_t HEIGHT = 100;
627 IRect rect = {0, 0, WIDTH, HEIGHT};
628 std::vector<IRect> vRects;
629 vRects.push_back(rect);
630 auto ret = g_composerDevice->SetLayerDirtyRegion(g_displayIds[0], layer->GetId(), vRects);
631
632 PrepareAndCommit();
633 HdiTestDevice::GetInstance().Clear();
634
635 EXPECT_EQ(DISPLAY_SUCCESS, ret);
636
637 DestroyLayer(layer);
638 }
639
640 HWTEST_F(DeviceTest, test_SetLayerTransformMode, TestSize.Level1)
641 {
642 std::vector<LayerSettings> settings = {
643 {
644 .rectRatio = { 0, 0, 1.0f, 1.0f },
645 .color = RED
646 }
647 };
648
649 std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
650 ASSERT_TRUE((layers.size() > 0));
651
652 PrepareAndCommit();
653
654 auto layer = layers[0];
655
656 TransformType type = TransformType::ROTATE_90;
657 auto ret = g_composerDevice->SetLayerTransformMode(g_displayIds[0], layer->GetId(), type);
658 PrepareAndCommit();
659
660 type = TransformType::ROTATE_180;
661 ret = g_composerDevice->SetLayerTransformMode(g_displayIds[0], layer->GetId(), type);
662 PrepareAndCommit();
663
664 type = TransformType::ROTATE_270;
665 ret = g_composerDevice->SetLayerTransformMode(g_displayIds[0], layer->GetId(), type);
666 PrepareAndCommit();
667
668 EXPECT_EQ(DISPLAY_SUCCESS, ret);
669
670 DestroyLayer(layer);
671 }
672
673 HWTEST_F(DeviceTest, test_SetLayerVisibleRegion, TestSize.Level1)
674 {
675 std::vector<LayerSettings> settings = {
676 {
677 .rectRatio = { 0, 0, 1.0f, 1.0f },
678 .color = BLUE
679 }
680 };
681
682 std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
683 ASSERT_TRUE((layers.size() > 0));
684 PrepareAndCommit();
685 auto layer = layers[0];
686
687 const int32_t WIDTH = 500;
688 const int32_t HEIGHT = 500;
689 IRect region = {0, 0, WIDTH, HEIGHT};
690 std::vector<IRect> regions = {};
691 regions.push_back(region);
692 auto ret = g_composerDevice->SetLayerVisibleRegion(g_displayIds[0], layer->GetId(), regions);
693 PrepareAndCommit();
694
695 EXPECT_EQ(DISPLAY_SUCCESS, ret);
696
697 DestroyLayer(layer);
698 }
699
700 HWTEST_F(DeviceTest, test_SetLayerBuffer, TestSize.Level1)
701 {
702 std::vector<LayerSettings> settings = {
703 {
704 .rectRatio = { 0, 0, 1.0f, 1.0f },
705 .color = GREEN
706 }
707 };
708
709 std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
710 ASSERT_TRUE((layers.size() > 0));
711
712 auto layer = layers[0];
713
714 auto graphicBuffer = layer->AcquireBackBuffer();
__anon7b907af90302(const BufferHandle* buffer, uint32_t seqNo) 715 int32_t ret = graphicBuffer->SetGraphicBuffer([&](const BufferHandle* buffer, uint32_t seqNo) -> int32_t {
716 std::vector<uint32_t> deletingList;
717 int32_t result = g_composerDevice->SetLayerBuffer(g_displayIds[0], layer->GetId(), buffer, seqNo, -1,
718 deletingList);
719 return result;
720 });
721 PrepareAndCommit();
722
723 EXPECT_EQ(DISPLAY_SUCCESS, ret);
724
725 DestroyLayer(layer);
726 }
727
728 HWTEST_F(DeviceTest, test_SetLayerCompositionType, TestSize.Level1)
729 {
730 std::vector<LayerSettings> settings = {
731 {
732 .rectRatio = { 0, 0, 1.0f, 1.0f },
733 .color = BLUE
734 }
735 };
736
737 std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
738 ASSERT_TRUE((layers.size() > 0));
739
740 auto layer = layers[0];
741
742 Composer::V1_0::CompositionType type = Composer::V1_0::CompositionType::COMPOSITION_CLIENT;
743 auto ret = g_composerDevice->SetLayerCompositionType(g_displayIds[0], layer->GetId(), type);
744
745 PrepareAndCommit();
746
747 EXPECT_EQ(DISPLAY_SUCCESS, ret);
748
749 DestroyLayer(layer);
750 }
751
752 HWTEST_F(DeviceTest, test_SetLayerBlendType, TestSize.Level1)
753 {
754 std::vector<LayerSettings> settings = {
755 {
756 .rectRatio = { 0, 0, 1.0f, 1.0f },
757 .color = GREEN
758 }
759 };
760
761 std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
762 ASSERT_TRUE((layers.size() > 0));
763
764 auto layer = layers[0];
765
766 BlendType type = BlendType::BLEND_NONE;
767 auto ret = g_composerDevice->SetLayerBlendType(g_displayIds[0], layer->GetId(), type);
768
769 PrepareAndCommit();
770
771 EXPECT_EQ(DISPLAY_SUCCESS, ret);
772
773 DestroyLayer(layer);
774 }
775
776 HWTEST_F(DeviceTest, test_SetLayerMaskInfo, TestSize.Level1)
777 {
778 std::vector<LayerSettings> settings = {
779 {
780 .rectRatio = { 0, 0, 1.0f, 1.0f },
781 .color = GREEN
782 }
783 };
784
785 std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
786 ASSERT_TRUE((layers.size() > 0));
787
788 auto layer = layers[0];
789
790 MaskInfo maskInfo = MaskInfo::LAYER_HBM_SYNC;
791 auto ret = g_composerDevice->SetLayerMaskInfo(g_displayIds[0], layer->GetId(), maskInfo);
792
793 HdiTestDevice::GetInstance().Clear();
794
795 EXPECT_EQ(DISPLAY_SUCCESS, ret);
796 }
797
798 HWTEST_F(DeviceTest, test_SetLayerColor, TestSize.Level1)
799 {
800 std::vector<LayerSettings> settings = {
801 {
802 .rectRatio = { 0, 0, 1.0f, 1.0f },
803 .color = GREEN
804 }
805 };
806
807 std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
808 ASSERT_TRUE((layers.size() > 0));
809
810 auto layer = layers[0];
811 const uint32_t COLOR_R = 155;
812 const uint32_t COLOR_G = 224;
813 const uint32_t COLOR_B = 88;
814 const uint32_t COLOR_A = 128;
815
816 LayerColor layerColor = {
817 .r = COLOR_R,
818 .g = COLOR_G,
819 .b = COLOR_B,
820 .a = COLOR_A
821 };
822
823 auto ret = g_composerDevice->SetLayerColor(g_displayIds[0], layer->GetId(), layerColor);
824
825 PrepareAndCommit();
826
827 EXPECT_EQ(DISPLAY_SUCCESS, ret);
828
829 DestroyLayer(layer);
830 }
831
832 HWTEST_F(DeviceTest, test_DestroyLayer, TestSize.Level1)
833 {
834 std::vector<LayerSettings> settings = {
835 {
836 .rectRatio = { 0, 0, 1.0f, 1.0f },
837 .color = PURPLE
838 }
839 };
840
841 std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
842 ASSERT_TRUE((layers.size() > 0));
843 auto layer = layers[0];
844 PrepareAndCommit();
845
846 sleep(1);
847 auto ret = g_composerDevice->DestroyLayer(g_displayIds[0], layer->GetId());
848 EXPECT_EQ(DISPLAY_SUCCESS, ret);
849 std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_CONT_100));
850 }
851
852 HWTEST_F(DeviceTest, test_RegDisplayVBlankCallback, TestSize.Level1)
853 {
854 int ret;
855 DISPLAY_TEST_LOGD();
856 std::shared_ptr<HdiTestDisplay> display = HdiTestDevice::GetInstance().GetFirstDisplay();
857 ASSERT_TRUE(display != nullptr) << "get display failed";
858 ret = display->RegDisplayVBlankCallback(TestVBlankCallback, nullptr);
859 ASSERT_TRUE(ret == DISPLAY_SUCCESS) << "RegDisplayVBlankCallback failed";
860 ret = display->SetDisplayVsyncEnabled(true);
861 ASSERT_TRUE(ret == DISPLAY_SUCCESS) << "SetDisplayVsyncEnabled failed";
862
863 std::vector<LayerSettings> settings = {
864 {
865 .rectRatio = { 0, 0, 1.0f, 1.0f },
866 .color = PINK
867 },
868 };
869 std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
870 ASSERT_TRUE((layers.size() > 0));
871 VblankCtr::GetInstance().hasVblank_ = false;
872 PrepareAndCommit();
873 ret = VblankCtr::GetInstance().WaitVblank(SLEEP_CONT_100); // 100ms
874 ASSERT_TRUE(ret == DISPLAY_SUCCESS) << "WaitVblank timeout";
875 ret = display->SetDisplayVsyncEnabled(false);
876 ASSERT_TRUE(ret == DISPLAY_SUCCESS) << "SetDisplayVsyncEnabled failed";
877 usleep(SLEEP_CONT_100 * SLEEP_CONT_2000); // wait for 100ms avoid the last vsync.
878 VblankCtr::GetInstance().hasVblank_ = false;
879 ret = VblankCtr::GetInstance().WaitVblank(SLEEP_CONT_100); // 100ms
880 ASSERT_TRUE(ret != DISPLAY_SUCCESS) << "vblank do not disable";
881
882 DestroyLayer(layers[0]);
883 }
884
OnMode(uint32_t modeId,uint64_t vBlankPeriod,void * data)885 void DeviceTest::OnMode(uint32_t modeId, uint64_t vBlankPeriod, void* data)
886 {
887 g_isOnModeCalled = true;
888 }
889
OnSeamlessChange(uint32_t devId,void * data)890 void DeviceTest::OnSeamlessChange(uint32_t devId, void* data)
891 {
892 g_isOnSeamlessChangeCalled = true;
893 }
894
895 HWTEST_F(DeviceTest, test_GetDisplaySupportedModesExt, TestSize.Level1)
896 {
897 std::vector<DisplayModeInfoExt> modes;
898 auto ret = g_composerDevice->GetDisplaySupportedModesExt(g_displayIds[0], modes);
899 if (ret == DISPLAY_NOT_SUPPORT) {
900 DISPLAY_TEST_LOGD("GetDisplaySupportedModesExt not support");
901 return;
902 }
903 EXPECT_EQ(DISPLAY_SUCCESS, ret);
904 }
905
906 HWTEST_F(DeviceTest, test_SetDisplayModeAsync, TestSize.Level1)
907 {
908 g_isOnModeCalled = false;
909 std::vector<DisplayModeInfo> oldModes;
910 std::vector<LayerSettings> settings = {
911 {
912 .rectRatio = { 0, 0, 1.0f, 1.0f },
913 .color = RED
914 }
915 };
916
917 // 先注册VBlankCallback
918 auto ret = g_composerDevice->RegDisplayVBlankCallback(g_displayIds[0], TestVBlankCallback, nullptr);
919 ASSERT_TRUE(ret == DISPLAY_SUCCESS) << "RegDisplayVBlankCallback failed";
920
921 ret = g_composerDevice->GetDisplaySupportedModes(g_displayIds[0], oldModes);
922 ASSERT_EQ(DISPLAY_SUCCESS, ret);
923 ASSERT_EQ(oldModes.size() > 0, true);
924
925 uint32_t modeid = oldModes[0].id;
926 ret = g_composerDevice->SetDisplayModeAsync(g_displayIds[0], modeid, OnMode);
927 if (ret == DISPLAY_NOT_SUPPORT) {
928 return;
929 }
930 EXPECT_EQ(DISPLAY_SUCCESS, ret);
931 if (ret == DISPLAY_SUCCESS) {
932 std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
933 ASSERT_TRUE((layers.size() > 0));
934 g_threadCtrl = false;
935 std::thread commitThread(LoopCommit);
936 std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_CONT_100));
937 g_threadCtrl = true;
938 commitThread.join();
939 ASSERT_EQ(g_isOnModeCalled, true);
940
941 DestroyLayer(layers[0]);
942 }
943 }
944
945 HWTEST_F(DeviceTest, test_GetDisplayVBlankPeriod, TestSize.Level1)
946 {
947 uint64_t period = 0;
948 auto ret = g_composerDevice->GetDisplayVBlankPeriod(g_displayIds[0], period);
949 if (ret == DISPLAY_NOT_SUPPORT) {
950 DISPLAY_TEST_LOGD("GetDisplayVBlankPeriod not support");
951 return;
952 }
953 EXPECT_EQ(DISPLAY_SUCCESS, ret);
954 EXPECT_EQ(period != 0, true);
955 }
956
957 HWTEST_F(DeviceTest, test_RegSeamlessChangeCallback, TestSize.Level1)
958 {
959 g_isOnSeamlessChangeCalled = false;
960 auto ret = g_composerDevice->RegSeamlessChangeCallback(OnSeamlessChange, nullptr);
961 if (ret == DISPLAY_NOT_SUPPORT) {
962 DISPLAY_TEST_LOGD("RegSeamlessChangeCallback not support");
963 return;
964 }
965 EXPECT_EQ(DISPLAY_SUCCESS, ret);
966 if (ret == DISPLAY_SUCCESS) {
967 std::this_thread::sleep_for(std::chrono::milliseconds(5000));
968 ASSERT_EQ(g_isOnSeamlessChangeCalled, true);
969 }
970 }
971
972 HWTEST_F(DeviceTest, test_SetLayerPerFrameParameter, TestSize.Level1)
973 {
974 std::vector<LayerSettings> settings = {
975 {
976 .rectRatio = { 0, 0, 1.0f, 1.0f },
977 .color = GREEN
978 },
979 };
980
981 std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
982 ASSERT_TRUE((layers.size() > 0));
983 auto layer = layers[0];
984 std::vector<std::string> ValidKeys = { "FilmFilter", "ArsrDoEnhance", "SDRBrightnessRatio", "BrightnessNit",
985 "ViewGroupHasValidAlpha", "SourceCropTuning" };
986 std::string key;
987 std::vector<int8_t> value = { 1 };
988 key = "NotSupportKey";
989 auto ret = g_composerDevice->SetLayerPerFrameParameter(g_displayIds[0], layer->GetId(), key, value);
990 if (ret == DISPLAY_NOT_SUPPORT) {
991 DISPLAY_TEST_LOGD("SetLayerPerFrameParameter not support");
992 return;
993 }
994 ASSERT_EQ(ret, -1) << "key not support, ret:" << ret;
995 key = ValidKeys[0];
996 ret = g_composerDevice->SetLayerPerFrameParameter(g_displayIds[0], layer->GetId(), key, value);
997 ASSERT_EQ(ret, 0) << "key support, ret:" << ret;
998 if (ret == DISPLAY_NOT_SUPPORT) {
999 DISPLAY_TEST_LOGD("SetLayerPerFrameParameter not support");
1000 return;
1001 }
1002 EXPECT_EQ(DISPLAY_SUCCESS, ret);
1003 }
1004
1005 HWTEST_F(DeviceTest, test_GetSupportedLayerPerFrameParameterKey, TestSize.Level1)
1006 {
1007 std::vector<std::string> keys;
1008 auto ret = g_composerDevice->GetSupportedLayerPerFrameParameterKey(keys);
1009 if (ret == DISPLAY_NOT_SUPPORT) {
1010 DISPLAY_TEST_LOGD("GetSupportedLayerPerFrameParameterKey not support");
1011 return;
1012 }
1013 EXPECT_EQ(DISPLAY_SUCCESS, ret);
1014 }
1015
1016 HWTEST_F(DeviceTest, test_SetDisplayOverlayResolution, TestSize.Level1)
1017 {
1018 DisplayModeInfo mode = GetFirstDisplay()->GetCurrentMode();
1019 auto ret = g_composerDevice->SetDisplayOverlayResolution(g_displayIds[0], mode.width, mode.height);
1020 if (ret == DISPLAY_NOT_SUPPORT) {
1021 DISPLAY_TEST_LOGD("SetDisplayOverlayResolution not support");
1022 return;
1023 }
1024 EXPECT_EQ(DISPLAY_SUCCESS, ret);
1025 }
1026
TestRefreshCallback(uint32_t devId,void * data)1027 static void TestRefreshCallback(uint32_t devId, void* data)
1028 {
1029 }
1030
1031 HWTEST_F(DeviceTest, test_RegRefreshCallback, TestSize.Level1)
1032 {
1033 auto ret = g_composerDevice->RegRefreshCallback(TestRefreshCallback, nullptr);
1034 if (ret == DISPLAY_NOT_SUPPORT) {
1035 DISPLAY_TEST_LOGD("RegRefreshCallback not support");
1036 return;
1037 }
1038 EXPECT_EQ(DISPLAY_SUCCESS, ret);
1039 }
1040
1041 HWTEST_F(DeviceTest, test_GetDisplaySupportedColorGamuts, TestSize.Level1)
1042 {
1043 std::vector<ColorGamut> gamuts;
1044 auto ret = g_composerDevice->GetDisplaySupportedColorGamuts(g_displayIds[0], gamuts);
1045 if (ret == DISPLAY_NOT_SUPPORT) {
1046 DISPLAY_TEST_LOGD("GetDisplaySupportedColorGamuts not support");
1047 return;
1048 }
1049 EXPECT_EQ(DISPLAY_SUCCESS, ret);
1050 }
1051
1052 HWTEST_F(DeviceTest, test_GetHDRCapabilityInfos, TestSize.Level1)
1053 {
1054 HDRCapability info = { 0 };
1055 auto ret = g_composerDevice->GetHDRCapabilityInfos(g_displayIds[0], info);
1056 if (ret == DISPLAY_NOT_SUPPORT) {
1057 DISPLAY_TEST_LOGD("GetHDRCapabilityInfos not support");
1058 return;
1059 }
1060 EXPECT_EQ(DISPLAY_SUCCESS, ret);
1061 }
1062