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