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