• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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