• 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 <mutex>
17 #include <chrono>
18 #include <cinttypes>
19 #include <algorithm>
20 #include <condition_variable>
21 #include <benchmark/benchmark.h>
22 #include <thread>
23 #include "gtest/gtest.h"
24 #include "v1_3/include/idisplay_composer_interface.h"
25 #include "v1_1/display_composer_type.h"
26 #include "v1_0/display_buffer_type.h"
27 #include "display_test.h"
28 #include "display_test_utils.h"
29 #include "hdi_composition_check.h"
30 #include "hdi_test_device.h"
31 #include "hdi_test_device_common.h"
32 #include "hdi_test_display.h"
33 #include "hdi_test_render_utils.h"
34 
35 using namespace OHOS::HDI::Display::Buffer::V1_0;
36 using namespace OHOS::HDI::Display::Composer::V1_3;
37 using namespace OHOS::HDI::Display::TEST;
38 using namespace testing::ext;
39 
40 static sptr<Composer::V1_3::IDisplayComposerInterface> g_composerDevice = nullptr;
41 static std::shared_ptr<IDisplayBuffer> g_gralloc = nullptr;
42 static std::vector<uint32_t> g_displayIds;
43 const int SLEEP_CONT_100 = 100;
44 
45 namespace {
46 class DisplayBenchmarkTest : public benchmark::Fixture {
47 public:
48     void TearDown(const ::benchmark::State &state);
49     static void OnMode(uint32_t modeId, uint64_t vBlankPeriod, void* data);
50     static void OnseamlessChange(uint32_t devId, void* data);
51     static void TestRefreshCallback(uint32_t devId, void* data);
52     static void OnHwcEvent(uint32_t devId, uint32_t eventId, const std::vector<int32_t>& eventData, void *data);
53 };
54 
TearDown(const::benchmark::State & state)55 void DisplayBenchmarkTest::TearDown(const ::benchmark::State &state)
56 {
57     HdiTestDevice::GetInstance().Clear();
58 }
59 
OnMode(uint32_t modeId,uint64_t vBlankPeriod,void * data)60 void DisplayBenchmarkTest::OnMode(uint32_t modeId, uint64_t vBlankPeriod, void* data)
61 {
62 }
63 
OnseamlessChange(uint32_t devId,void * data)64 void DisplayBenchmarkTest::OnseamlessChange(uint32_t devId, void* data)
65 {
66 }
67 
TestRefreshCallback(uint32_t devId,void * data)68 void DisplayBenchmarkTest::TestRefreshCallback(uint32_t devId, void* data)
69 {
70 }
71 
OnHwcEvent(uint32_t devId,uint32_t eventId,const std::vector<int32_t> & eventData,void * data)72 void DisplayBenchmarkTest::OnHwcEvent(uint32_t devId, uint32_t eventId, const std::vector<int32_t>& eventData,
73                                       void *data)
74 {
75 }
76 
GetFirstDisplay()77 static inline std::shared_ptr<HdiTestDisplay> GetFirstDisplay()
78 {
79     return HdiTestDevice::GetInstance().GetFirstDisplay();
80 }
81 
CreateTestLayer(LayerSettings setting,uint32_t zorder)82 static std::shared_ptr<HdiTestLayer> CreateTestLayer(LayerSettings setting, uint32_t zorder)
83 {
84     int ret;
85     HdiTestDevice::GetInstance();
86     DISPLAY_TEST_LOGE("color 0x%x", setting.color);
87     std::shared_ptr<HdiTestDisplay> display = HdiTestDevice::GetInstance().GetFirstDisplay();
88     DISPLAY_TEST_CHK_RETURN((display == nullptr), nullptr, DISPLAY_TEST_LOGE("can not get display"));
89 
90     std::shared_ptr<HdiTestLayer> layer = display->CreateHdiTestLayer(setting.bufferSize.w, setting.bufferSize.h);
91     DISPLAY_TEST_CHK_RETURN((layer == nullptr), nullptr, DISPLAY_TEST_LOGE("can not create hdi test layer"));
92 
93     layer->SetLayerPosition(setting.displayRect);
94 
95     layer->SetCompType(setting.compositionType);
96 
97     if ((setting.alpha >= 0) && (setting.alpha <= 0xff)) { // alpha rang 0x00 ~ 0xff
98         LayerAlpha alpha = { 0 };
99         alpha.gAlpha = setting.alpha;
100         alpha.enGlobalAlpha = true;
101         layer->SetAlpha(alpha);
102     }
103     HdiGrallocBuffer* handle = layer->GetFrontBuffer();
104     DISPLAY_TEST_CHK_RETURN((handle == nullptr), nullptr, DISPLAY_TEST_LOGE("can not get front buffer"));
105     ClearColor(*(handle->Get()), setting.color);
106     ret = layer->SwapFrontToBackQ();
107     DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), nullptr, DISPLAY_TEST_LOGE("SwapFrontToBackQ failed"));
108     layer->SetZorder(zorder);
109     layer->SetBlendType(setting.blendType);
110     layer->SetTransform(setting.rotate);
111     return layer;
112 }
113 
PrepareAndCommit()114 static int PrepareAndCommit()
115 {
116     int ret;
117     DISPLAY_TEST_LOGE();
118     std::shared_ptr<HdiTestDisplay> display = HdiTestDevice::GetInstance().GetFirstDisplay();
119     DISPLAY_TEST_CHK_RETURN((display == nullptr), DISPLAY_FAILURE, DISPLAY_TEST_LOGE("can not get display"));
120 
121     ret = display->PrepareDisplayLayers();
122     DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE,
123         DISPLAY_TEST_LOGE("PrepareDisplayLayers failed"));
124 
125     ret = display->Commit();
126     DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_TEST_LOGE("Commit failed"));
127     return DISPLAY_SUCCESS;
128 }
129 
AdjustLayerSettings(std::vector<LayerSettings> & settings,uint32_t w,uint32_t h)130 static void AdjustLayerSettings(std::vector<LayerSettings> &settings, uint32_t w, uint32_t h)
131 {
132     DISPLAY_TEST_LOGE();
133     for (uint32_t i = 0; i < settings.size(); i++) {
134         LayerSettings& setting = settings[i];
135         DISPLAY_TEST_LOGE("ratio w: %f  ratio h: %f", setting.rectRatio.w, setting.rectRatio.h);
136         if ((setting.rectRatio.w > 0.0f) && (setting.rectRatio.h > 0.0f)) {
137             setting.displayRect.h = static_cast<uint32_t>(setting.rectRatio.h * h);
138             setting.displayRect.w = static_cast<uint32_t>(setting.rectRatio.w * w);
139             setting.displayRect.x = static_cast<uint32_t>(setting.rectRatio.x * w);
140             setting.displayRect.y = static_cast<uint32_t>(setting.rectRatio.y * h);
141             DISPLAY_TEST_LOGE("display rect adust form %f %f %f %f to %{public}d %{public}d %{public}d %{public}d ",
142                 setting.rectRatio.x, setting.rectRatio.y, setting.rectRatio.w,
143                 setting.rectRatio.h, setting.displayRect.x, setting.displayRect.y,
144                 setting.displayRect.w, setting.displayRect.h);
145         }
146 
147         if ((setting.bufferRatio.h > 0.0f) || (setting.bufferRatio.w > 0.0f)) {
148             setting.bufferSize.h = static_cast<uint32_t>(setting.bufferRatio.h * h);
149             setting.bufferSize.w = static_cast<uint32_t>(setting.bufferRatio.w * w);
150             DISPLAY_TEST_LOGE("buffer size adjust for %f %f to %{public}d %{public}d",
151                 setting.bufferRatio.w, setting.bufferRatio.h, setting.bufferSize.w, setting.bufferSize.h);
152         }
153 
154         if ((setting.bufferSize.w == 0) || (setting.bufferSize.h == 0)) {
155             DISPLAY_TEST_LOGE("buffer size adjust for %{public}d %{public}d to %{public}d %{public}d",
156                 setting.bufferSize.w, setting.bufferSize.h, setting.displayRect.w, setting.displayRect.h);
157 
158             setting.bufferSize.w = setting.displayRect.w;
159             setting.bufferSize.h = setting.displayRect.h;
160         }
161     }
162 }
163 
CreateLayers(std::vector<LayerSettings> & settings)164 static std::vector<std::shared_ptr<HdiTestLayer>> CreateLayers(std::vector<LayerSettings> &settings)
165 {
166     DISPLAY_TEST_LOGE("settings %{public}zd", settings.size());
167     std::vector<std::shared_ptr<HdiTestLayer>> layers;
168     DisplayModeInfo mode = GetFirstDisplay()->GetCurrentMode();
169     AdjustLayerSettings(settings, mode.width, mode.height);
170     for (uint32_t i = 0; i < settings.size(); i++) {
171         LayerSettings setting = settings[i];
172 
173         auto layer = CreateTestLayer(setting, i);
174         layers.push_back(layer);
175     }
176     return layers;
177 }
178 
DestroyLayer(std::shared_ptr<HdiTestLayer> layer)179 static void DestroyLayer(std::shared_ptr<HdiTestLayer> layer)
180 {
181     std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_CONT_100));
182     auto ret = g_composerDevice->DestroyLayer(g_displayIds[0], layer->GetId());
183     if (ret != DISPLAY_SUCCESS && ret != DISPLAY_NOT_SUPPORT) {
184         DISPLAY_TEST_LOGD("DestroyLayer fail or not support, ret: %{public}d", ret);
185         return;
186     }
187     std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_CONT_100));
188 }
189 
190 /**
191   * @tc.name: SetClientBufferCacheCountTest
192   * @tc.desc: Benchmarktest for interface SetClientBufferCacheCount.
193   */
BENCHMARK_F(DisplayBenchmarkTest,SetClientBufferCacheCountTest)194 BENCHMARK_F(DisplayBenchmarkTest, SetClientBufferCacheCountTest)(benchmark::State &state)
195 {
196     int32_t ret;
197     const uint32_t CACHE_COUNT = 5;
198     for (auto _ : state) {
199         ret = g_composerDevice->SetClientBufferCacheCount(g_displayIds[0], CACHE_COUNT);
200     }
201     EXPECT_EQ(DISPLAY_SUCCESS, ret);
202 }
203 
204 /**
205   * @tc.name: GetDisplayCapabilityTest
206   * @tc.desc: Benchmarktest for interface GetDisplayCapability.
207   */
BENCHMARK_F(DisplayBenchmarkTest,GetDisplayCapabilityTest)208 BENCHMARK_F(DisplayBenchmarkTest, GetDisplayCapabilityTest)(benchmark::State &state)
209 {
210     int32_t ret;
211     DisplayCapability info;
212     for (auto _ : state) {
213         ret = g_composerDevice->GetDisplayCapability(g_displayIds[0], info);
214     }
215     EXPECT_EQ(DISPLAY_SUCCESS, ret);
216 }
217 
218 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, GetDisplayCapabilityTest)->
219     Iterations(100)->Repetitions(3)->ReportAggregatesOnly();
220 
221 /**
222   * @tc.name: GetDisplaySupportedModesTest
223   * @tc.desc: Benchmarktest for interface GetDisplaySupportedModes.
224   */
BENCHMARK_F(DisplayBenchmarkTest,GetDisplaySupportedModesTest)225 BENCHMARK_F(DisplayBenchmarkTest, GetDisplaySupportedModesTest)(benchmark::State &state)
226 {
227     int32_t ret;
228     std::vector<DisplayModeInfo> modes;
229     for (auto _ : state) {
230         ret = g_composerDevice->GetDisplaySupportedModes(g_displayIds[0], modes);
231     }
232     EXPECT_EQ(DISPLAY_SUCCESS, ret);
233 }
234 
235 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, GetDisplaySupportedModesTest)->
236     Iterations(100)->Repetitions(3)->ReportAggregatesOnly();
237 
238 /**
239   * @tc.name: GetDisplayModeTest
240   * @tc.desc: Benchmarktest for interface GetDisplayMode.
241   */
BENCHMARK_F(DisplayBenchmarkTest,GetDisplayModeTest)242 BENCHMARK_F(DisplayBenchmarkTest, GetDisplayModeTest)(benchmark::State &state)
243 {
244     int32_t ret;
245     uint32_t modeId = 0;
246     for (auto _ : state) {
247         ret = g_composerDevice->GetDisplayMode(modeId, modeId);
248     }
249     EXPECT_EQ(DISPLAY_SUCCESS, ret);
250 }
251 
252 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, GetDisplayModeTest)->
253     Iterations(100)->Repetitions(3)->ReportAggregatesOnly();
254 
255 /**
256   * @tc.name: SetDisplayModeTest
257   * @tc.desc: Benchmarktest for interface SetDisplayMode.
258   */
BENCHMARK_F(DisplayBenchmarkTest,SetDisplayModeTest)259 BENCHMARK_F(DisplayBenchmarkTest, SetDisplayModeTest)(benchmark::State &state)
260 {
261     int32_t ret;
262     const uint32_t modeId = 0;
263     for (auto _ : state) {
264         ret = g_composerDevice->SetDisplayMode(g_displayIds[0], modeId);
265     }
266     EXPECT_EQ(DISPLAY_SUCCESS, ret);
267 }
268 
269 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, SetDisplayModeTest)->
270     Iterations(100)->Repetitions(3)->ReportAggregatesOnly();
271 
272 /**
273   * @tc.name: GetDisplayPowerStatusTest
274   * @tc.desc: Benchmarktest for interface GetDisplayPowerStatus.
275   */
BENCHMARK_F(DisplayBenchmarkTest,GetDisplayPowerStatusTest)276 BENCHMARK_F(DisplayBenchmarkTest, GetDisplayPowerStatusTest)(benchmark::State &state)
277 {
278     int32_t ret;
279     Composer::V1_0::DispPowerStatus powerStatus = Composer::V1_0::DispPowerStatus::POWER_STATUS_OFF;
280     for (auto _ : state) {
281         ret = g_composerDevice->GetDisplayPowerStatus(g_displayIds[0], powerStatus);
282     }
283     EXPECT_EQ(DISPLAY_SUCCESS, ret);
284 }
285 
286 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, GetDisplayPowerStatusTest)->
287     Iterations(100)->Repetitions(3)->ReportAggregatesOnly();
288 
289 /**
290   * @tc.name: SetDisplayPowerStatusTest
291   * @tc.desc: Benchmarktest for interface SetDisplayPowerStatus.
292   */
BENCHMARK_F(DisplayBenchmarkTest,SetDisplayPowerStatusTest)293 BENCHMARK_F(DisplayBenchmarkTest, SetDisplayPowerStatusTest)(benchmark::State &state)
294 {
295     int32_t ret;
296     for (auto _ : state) {
297         ret = g_composerDevice->SetDisplayPowerStatus(g_displayIds[0],
298             Composer::V1_0::DispPowerStatus::POWER_STATUS_ON);
299     }
300     EXPECT_EQ(DISPLAY_SUCCESS, ret);
301 }
302 
303 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, SetDisplayPowerStatusTest)->
304     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
305 
306 /**
307   * @tc.name: GetDisplayBacklightTest
308   * @tc.desc: Benchmarktest for interface GetDisplayBacklight.
309   */
BENCHMARK_F(DisplayBenchmarkTest,GetDisplayBacklightTest)310 BENCHMARK_F(DisplayBenchmarkTest, GetDisplayBacklightTest)(benchmark::State &state)
311 {
312     int32_t ret;
313     uint32_t level;
314     for (auto _ : state) {
315         ret = g_composerDevice->GetDisplayBacklight(g_displayIds[0], level);
316     }
317     EXPECT_EQ(DISPLAY_SUCCESS, ret);
318 }
319 
320 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, GetDisplayBacklightTest)->
321     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
322 
323 /**
324   * @tc.name: SetDisplayBacklightTest
325   * @tc.desc: Benchmarktest for interface SetDisplayBacklight.
326   */
BENCHMARK_F(DisplayBenchmarkTest,SetDisplayBacklightTest)327 BENCHMARK_F(DisplayBenchmarkTest, SetDisplayBacklightTest)(benchmark::State &state)
328 {
329     int32_t ret;
330     const uint32_t level = 10;
331     for (auto _ : state) {
332         ret = g_composerDevice->SetDisplayBacklight(g_displayIds[0], level);
333     }
334     EXPECT_EQ(DISPLAY_SUCCESS, ret);
335 }
336 
337 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, SetDisplayBacklightTest)->
338     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
339 
340 /**
341   * @tc.name: CreateAndDestroyLayerTest
342   * @tc.desc: Benchmarktest for interface CreateLayer And DestroyLayer.
343   */
BENCHMARK_F(DisplayBenchmarkTest,CreateAndDestroyLayerTest)344 BENCHMARK_F(DisplayBenchmarkTest, CreateAndDestroyLayerTest)(benchmark::State &state)
345 {
346     int32_t ret;
347     LayerInfo layerInfo;
348     uint32_t layerId;
349     for (auto _ : state) {
350         uint32_t bufferCount = 3;
351         ret = g_composerDevice->CreateLayer(g_displayIds[0], layerInfo, bufferCount, layerId);
352         EXPECT_EQ(DISPLAY_SUCCESS, ret);
353         ret = g_composerDevice->DestroyLayer(g_displayIds[0], layerId);
354     }
355     EXPECT_EQ(DISPLAY_SUCCESS, ret);
356 }
357 
358 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, CreateAndDestroyLayerTest)->
359     Iterations(10)->Repetitions(3)->ReportAggregatesOnly();
360 
361 /**
362   * @tc.name: GetDisplayCompChangeTest
363   * @tc.desc: Benchmarktest for interface GetDisplayCompChange.
364   */
BENCHMARK_F(DisplayBenchmarkTest,GetDisplayCompChangeTest)365 BENCHMARK_F(DisplayBenchmarkTest, GetDisplayCompChangeTest)(benchmark::State &state)
366 {
367     std::vector<uint32_t> layers {};
368     std::vector<int32_t> type {};
369     int32_t ret;
370     for (auto _ : state) {
371         ret = g_composerDevice->GetDisplayCompChange(g_displayIds[0], layers, type);
372     }
373     EXPECT_EQ(DISPLAY_SUCCESS, ret);
374 }
375 
376 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, GetDisplayCompChangeTest)->
377     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
378 
379 /**
380   * @tc.name: GetDisplayReleaseFenceTest
381   * @tc.desc: Benchmarktest for interface GetDisplayReleaseFence.
382   */
BENCHMARK_F(DisplayBenchmarkTest,GetDisplayReleaseFenceTest)383 BENCHMARK_F(DisplayBenchmarkTest, GetDisplayReleaseFenceTest)(benchmark::State &state)
384 {
385     std::vector<uint32_t> layers {};
386     std::vector<int32_t> fences {};
387     int32_t ret;
388     for (auto _ : state) {
389         ret = g_composerDevice->GetDisplayReleaseFence(g_displayIds[0], layers, fences);
390     }
391     EXPECT_EQ(DISPLAY_SUCCESS, ret);
392 }
393 
394 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, GetDisplayReleaseFenceTest)->
395     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
396 
397 /**
398   * @tc.name: CreateAndDestroyVirtualDisplayTest
399   * @tc.desc: Benchmarktest for interface CreateVirtualDisplay and DestroyVirtualDisplay.
400   */
BENCHMARK_F(DisplayBenchmarkTest,CreateAndDestroyVirtualDisplayTest)401 BENCHMARK_F(DisplayBenchmarkTest, CreateAndDestroyVirtualDisplayTest)(benchmark::State &state)
402 {
403     int32_t ret;
404     const uint32_t WIDTH = 100;
405     const uint32_t HEIGHT = 100;
406     int32_t format = 0;
407     for (auto _ : state) {
408         ret = g_composerDevice->CreateVirtualDisplay(WIDTH, HEIGHT, format, g_displayIds[0]);
409         EXPECT_EQ(DISPLAY_FAILURE, ret);
410         ret = g_composerDevice->DestroyVirtualDisplay(g_displayIds[0]);
411     }
412     EXPECT_EQ(DISPLAY_FAILURE, ret);
413 }
414 
415 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, CreateAndDestroyVirtualDisplayTest)->
416     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
417 
418 /**
419   * @tc.name: SetVirtualDisplayBufferTest
420   * @tc.desc: Benchmarktest for interface SetVirtualDisplayBuffer.
421   */
BENCHMARK_F(DisplayBenchmarkTest,SetVirtualDisplayBufferTest)422 BENCHMARK_F(DisplayBenchmarkTest, SetVirtualDisplayBufferTest)(benchmark::State &state)
423 {
424     BufferHandle* buffer = nullptr;
425     int32_t ret;
426     int32_t fence = -1;
427 
428     AllocInfo info;
429     info.width  = 100;
430     info.height = 100;
431     info.usage = OHOS::HDI::Display::Composer::V1_0::HBM_USE_MEM_DMA |
432             OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_READ |
433             OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_WRITE;
434     info.format = Composer::V1_0::PIXEL_FMT_RGBA_8888;
435 
436     g_gralloc->AllocMem(info, buffer);
437     ASSERT_TRUE(buffer != nullptr);
438 
439     for (auto _ : state) {
440         ret = g_composerDevice->SetVirtualDisplayBuffer(g_displayIds[0], *buffer, fence);
441     }
442     g_gralloc->FreeMem(*buffer);
443     // not support
444     EXPECT_EQ(DISPLAY_FAILURE, ret);
445 }
446 
447 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, SetVirtualDisplayBufferTest)->
448     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
449 
450 /**
451   * @tc.name: SetDisplayPropertyTest
452   * @tc.desc: Benchmarktest for interface SetDisplayProperty.
453   */
BENCHMARK_F(DisplayBenchmarkTest,SetDisplayPropertyTest)454 BENCHMARK_F(DisplayBenchmarkTest, SetDisplayPropertyTest)(benchmark::State &state)
455 {
456     int32_t ret;
457     uint32_t id = 1;
458     uint64_t value = 0;
459     for (auto _ : state) {
460         ret = g_composerDevice->SetDisplayProperty(g_displayIds[0], id, value);
461     }
462     EXPECT_EQ(DISPLAY_FAILURE, ret);
463 }
464 
465 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, SetDisplayPropertyTest)->
466     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
467 
468 /**
469   * @tc.name: GetDisplayPropertyTest
470   * @tc.desc: Benchmarktest for interface GetDisplayProperty.
471   */
BENCHMARK_F(DisplayBenchmarkTest,GetDisplayPropertyTest)472 BENCHMARK_F(DisplayBenchmarkTest, GetDisplayPropertyTest)(benchmark::State &state)
473 {
474     int32_t ret;
475     uint32_t id = 1;
476     uint64_t value = 0;
477     for (auto _ : state) {
478         ret = g_composerDevice->GetDisplayProperty(g_displayIds[0], id, value);
479     }
480     int32_t result = DISPLAY_FAILURE;
481     if (ret == DISPLAY_SUCCESS || ret == DISPLAY_NOT_SUPPORT) {
482         result = DISPLAY_SUCCESS;
483     }
484     EXPECT_EQ(DISPLAY_SUCCESS, result);
485 }
486 
487 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, GetDisplayPropertyTest)->
488     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
489 
490 
491 /**
492   * @tc.name: GetDisplaySupportedModesExtTest
493   * @tc.desc: Benchmarktest for interface GetDisplaySupportedModesExtTest.
494   */
BENCHMARK_F(DisplayBenchmarkTest,GetDisplaySupportedModesExtTest)495 BENCHMARK_F(DisplayBenchmarkTest, GetDisplaySupportedModesExtTest)(benchmark::State &state)
496 {
497     int32_t ret;
498     std::vector<DisplayModeInfoExt> modes;
499     for (auto _ : state) {
500         ret = g_composerDevice->GetDisplaySupportedModesExt(g_displayIds[0], modes);
501     }
502     if (ret == DISPLAY_NOT_SUPPORT) {
503         return;
504     }
505     EXPECT_EQ(DISPLAY_SUCCESS, ret);
506 }
507 
508 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, GetDisplaySupportedModesExtTest)->
509     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
510 
511 /**
512   * @tc.name: SetDisplayModeAsyncTest
513   * @tc.desc: Benchmarktest for interface SetDisplayModeAsyncTest.
514   */
BENCHMARK_F(DisplayBenchmarkTest,SetDisplayModeAsyncTest)515 BENCHMARK_F(DisplayBenchmarkTest, SetDisplayModeAsyncTest)(benchmark::State &state)
516 {
517     int32_t ret;
518     uint32_t modeid = 0;
519     for (auto _ : state) {
520         ret = g_composerDevice->SetDisplayModeAsync(g_displayIds[0], modeid, OnMode);
521     }
522     if (ret == DISPLAY_NOT_SUPPORT) {
523         return;
524     }
525     EXPECT_EQ(DISPLAY_SUCCESS, ret);
526 }
527 
528 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, SetDisplayModeAsyncTest)->
529     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
530 
531 /**
532   * @tc.name: GetDisplayVBlankPeriodTest
533   * @tc.desc: Benchmarktest for interface GetDisplayVBlankPeriodTest.
534   */
BENCHMARK_F(DisplayBenchmarkTest,GetDisplayVBlankPeriodTest)535 BENCHMARK_F(DisplayBenchmarkTest, GetDisplayVBlankPeriodTest)(benchmark::State &state)
536 {
537     int32_t ret;
538     uint64_t period = 0;
539     for (auto _ : state) {
540         ret = g_composerDevice->GetDisplayVBlankPeriod(g_displayIds[0], period);
541     }
542     if (ret == DISPLAY_NOT_SUPPORT) {
543         return;
544     }
545     EXPECT_EQ(DISPLAY_SUCCESS, ret);
546 }
547 
548 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, GetDisplayVBlankPeriodTest)->
549     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
550 
551 /**
552   * @tc.name: RegSeamlessChangeCallbackTest
553   * @tc.desc: Benchmarktest for interface RegSeamlessChangeCallbackTest.
554   */
BENCHMARK_F(DisplayBenchmarkTest,RegSeamlessChangeCallbackTest)555 BENCHMARK_F(DisplayBenchmarkTest, RegSeamlessChangeCallbackTest)(benchmark::State &state)
556 {
557     int32_t ret;
558     for (auto _ : state) {
559         ret = g_composerDevice->RegSeamlessChangeCallback(OnseamlessChange, nullptr);
560     }
561     if (ret == DISPLAY_NOT_SUPPORT) {
562         return;
563     }
564     EXPECT_EQ(DISPLAY_SUCCESS, ret);
565 }
566 
567 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, RegSeamlessChangeCallbackTest)->
568     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
569 
570 /**
571   * @tc.name: SetLayerPerFrameParameterTest
572   * @tc.desc: Benchmarktest for interface SetLayerPerFrameParameter.
573   */
BENCHMARK_F(DisplayBenchmarkTest,SetLayerPerFrameParameterTest)574 BENCHMARK_F(DisplayBenchmarkTest, SetLayerPerFrameParameterTest)(benchmark::State &state)
575 {
576     int32_t ret;
577     LayerInfo layerInfo;
578     uint32_t layerId;
579     std::string key = "FilmFilter";
580     std::vector<int8_t> value = { 1 };
581     uint32_t bufferCount = 3;
582     ret = g_composerDevice->CreateLayer(g_displayIds[0], layerInfo, bufferCount, layerId);
583     EXPECT_EQ(DISPLAY_SUCCESS, ret);
584     for (auto _ : state) {
585         ret = g_composerDevice->SetLayerPerFrameParameter(g_displayIds[0], layerId, key, value);
586     }
587     g_composerDevice->DestroyLayer(g_displayIds[0], layerId);
588     if (ret == DISPLAY_NOT_SUPPORT) {
589         return;
590     }
591     EXPECT_EQ(DISPLAY_SUCCESS, ret);
592 }
593 
594 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, SetLayerPerFrameParameterTest)->
595     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
596 
597 /**
598   * @tc.name: GetSupportedLayerPerFrameParameterKeyTest
599   * @tc.desc: Benchmarktest for interface GetSupportedLayerPerFrameParameterKey.
600   */
BENCHMARK_F(DisplayBenchmarkTest,GetSupportedLayerPerFrameParameterKeyTest)601 BENCHMARK_F(DisplayBenchmarkTest, GetSupportedLayerPerFrameParameterKeyTest)(benchmark::State &state)
602 {
603     int32_t ret;
604     std::vector<std::string> keys;
605     for (auto _ : state) {
606         ret = g_composerDevice->GetSupportedLayerPerFrameParameterKey(keys);
607     }
608     if (ret == DISPLAY_NOT_SUPPORT) {
609         return;
610     }
611     EXPECT_EQ(DISPLAY_SUCCESS, ret);
612 }
613 
614 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, GetSupportedLayerPerFrameParameterKeyTest)->
615     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
616 
617 /**
618   * @tc.name: SetDisplayOverlayResolutionTest
619   * @tc.desc: Benchmarktest for interface SetDisplayOverlayResolution.
620   */
BENCHMARK_F(DisplayBenchmarkTest,SetDisplayOverlayResolutionTest)621 BENCHMARK_F(DisplayBenchmarkTest, SetDisplayOverlayResolutionTest)(benchmark::State &state)
622 {
623     int32_t ret;
624     DisplayModeInfo mode = HdiTestDevice::GetInstance().GetFirstDisplay()->GetCurrentMode();
625     for (auto _ : state) {
626         ret = g_composerDevice->SetDisplayOverlayResolution(g_displayIds[0], mode.width, mode.height);
627     }
628     if (ret == DISPLAY_NOT_SUPPORT) {
629         return;
630     }
631     EXPECT_EQ(DISPLAY_SUCCESS, ret);
632 }
633 
634 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, SetDisplayOverlayResolutionTest)->
635     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
636 
637 /**
638   * @tc.name: RegRefreshCallbackTest
639   * @tc.desc: Benchmarktest for interface RegRefreshCallback.
640   */
BENCHMARK_F(DisplayBenchmarkTest,RegRefreshCallbackTest)641 BENCHMARK_F(DisplayBenchmarkTest, RegRefreshCallbackTest)(benchmark::State &state)
642 {
643     int32_t ret;
644     for (auto _ : state) {
645         ret = g_composerDevice->RegRefreshCallback(TestRefreshCallback, nullptr);
646     }
647     if (ret == DISPLAY_NOT_SUPPORT) {
648         return;
649     }
650     EXPECT_EQ(DISPLAY_SUCCESS, ret);
651 }
652 
653 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, RegRefreshCallbackTest)->
654     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
655 
656 /**
657   * @tc.name: GetDisplaySupportedColorGamutsTest
658   * @tc.desc: Benchmarktest for interface GetDisplaySupportedColorGamuts.
659   */
BENCHMARK_F(DisplayBenchmarkTest,GetDisplaySupportedColorGamutsTest)660 BENCHMARK_F(DisplayBenchmarkTest, GetDisplaySupportedColorGamutsTest)(benchmark::State &state)
661 {
662     int32_t ret;
663     std::vector<ColorGamut> gamuts;
664     for (auto _ : state) {
665         ret = g_composerDevice->GetDisplaySupportedColorGamuts(g_displayIds[0], gamuts);
666     }
667     if (ret == DISPLAY_NOT_SUPPORT) {
668         return;
669     }
670     EXPECT_EQ(DISPLAY_SUCCESS, ret);
671 }
672 
673 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, GetDisplaySupportedColorGamutsTest)->
674     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
675 
676 /**
677   * @tc.name: GetHDRCapabilityInfosTest
678   * @tc.desc: Benchmarktest for interface GetHDRCapabilityInfos.
679   */
BENCHMARK_F(DisplayBenchmarkTest,GetHDRCapabilityInfosTest)680 BENCHMARK_F(DisplayBenchmarkTest, GetHDRCapabilityInfosTest)(benchmark::State &state)
681 {
682     int32_t ret;
683     HDRCapability info = { 0 };
684     for (auto _ : state) {
685         ret = g_composerDevice->GetHDRCapabilityInfos(g_displayIds[0], info);
686     }
687     if (ret == DISPLAY_NOT_SUPPORT) {
688         return;
689     }
690     EXPECT_EQ(DISPLAY_SUCCESS, ret);
691 }
692 
693 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, GetHDRCapabilityInfosTest)->
694     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
695 
696 /**
697   * @tc.name: SetDisplayClientCropTest
698   * @tc.desc: Benchmarktest for interface SetDisplayClientCrop.
699   */
BENCHMARK_F(DisplayBenchmarkTest,SetDisplayClientCropTest)700 BENCHMARK_F(DisplayBenchmarkTest, SetDisplayClientCropTest)(benchmark::State &state)
701 {
702     int32_t ret;
703     int32_t width = 100;
704     int32_t height = 100;
705     IRect rect = {0, 0, width, height};
706     for (auto _ : state) {
707         ret = g_composerDevice->SetDisplayClientCrop(g_displayIds[0], rect);
708     }
709     EXPECT_EQ(DISPLAY_FAILURE, ret);
710 }
711 
712 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, SetDisplayClientCropTest)->
713     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
714 
715 /**
716   * @tc.name: UpdateHardwareCursorTest
717   * @tc.desc: Benchmarktest for interface UpdateHardwareCursorTest.
718   */
BENCHMARK_F(DisplayBenchmarkTest,UpdateHardwareCursorTest)719 BENCHMARK_F(DisplayBenchmarkTest, UpdateHardwareCursorTest)(benchmark::State &state)
720 {
721     int32_t ret = 0;
722     int32_t x = 1;
723     int32_t y = 1;
724     BufferHandle* buffer = nullptr;
725 
726     AllocInfo info;
727     info.width  = 512;
728     info.height = 512;
729     info.usage = OHOS::HDI::Display::Composer::V1_0::HBM_USE_MEM_DMA |
730             OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_READ |
731             OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_WRITE |
732             OHOS::HDI::Display::Composer::V1_0::HBM_USE_HW_COMPOSER;
733     info.format = Composer::V1_0::PIXEL_FMT_RGBA_8888;
734 
735     g_gralloc->AllocMem(info, buffer);
736     ASSERT_TRUE(buffer != nullptr);
737 
738     std::vector<LayerSettings> settings = {
739         {.rectRatio = { 0, 0, 1.0f, 1.0f }, .color = RED},
740     };
741 
742     std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
743     ASSERT_TRUE((layers.size() > 0));
744 
745     auto layer = layers[0];
746     PrepareAndCommit();
747     sleep(1);
748     HdiTestDevice::GetInstance().Clear();
749     DestroyLayer(layer);
750 
751     for (auto _ : state) {
752         ret = g_composerDevice->UpdateHardwareCursor(g_displayIds[0], x, y, buffer);
753     }
754     if (ret == DISPLAY_SUCCESS || ret == DISPLAY_NOT_SUPPORT) {
755         ret = DISPLAY_SUCCESS;
756     }
757     g_gralloc->FreeMem(*buffer);
758     EXPECT_EQ(DISPLAY_SUCCESS, ret);
759 }
760 
761 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, UpdateHardwareCursorTest)->
762     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
763 
764 /**
765   * @tc.name: EnableHardwareCursorStatsTest
766   * @tc.desc: Benchmarktest for interface EnableHardwareCursorStatsTest.
767   */
BENCHMARK_F(DisplayBenchmarkTest,EnableHardwareCursorStatsTest)768 BENCHMARK_F(DisplayBenchmarkTest, EnableHardwareCursorStatsTest)(benchmark::State &state)
769 {
770     int32_t ret = 0;
771     bool enable = true;
772     for (auto _ : state) {
773         ret = g_composerDevice->EnableHardwareCursorStats(g_displayIds[0], enable);
774     }
775     if (ret == DISPLAY_SUCCESS || ret == DISPLAY_NOT_SUPPORT) {
776         ret = DISPLAY_SUCCESS;
777     }
778     EXPECT_EQ(DISPLAY_SUCCESS, ret);
779 }
780 
781 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, EnableHardwareCursorStatsTest)->
782     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
783 
784 /**
785   * @tc.name: GetHardwareCursorStatsTest
786   * @tc.desc: Benchmarktest for interface GetHardwareCursorStatsTest.
787   */
BENCHMARK_F(DisplayBenchmarkTest,GetHardwareCursorStatsTest)788 BENCHMARK_F(DisplayBenchmarkTest, GetHardwareCursorStatsTest)(benchmark::State &state)
789 {
790     int32_t ret = 0;
791     uint32_t frameCount = 0;
792     uint32_t vsyncCount = 0;
793     for (auto _ : state) {
794         ret = g_composerDevice->GetHardwareCursorStats(g_displayIds[0], frameCount, vsyncCount);
795     }
796     if (ret == DISPLAY_SUCCESS || ret == DISPLAY_NOT_SUPPORT) {
797         ret = DISPLAY_SUCCESS;
798     }
799     EXPECT_EQ(DISPLAY_SUCCESS, ret);
800 }
801 
802 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, GetHardwareCursorStatsTest)->
803     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
804 
805 /**
806   * @tc.name: ClearClientBufferTest
807   * @tc.desc: Benchmarktest for interface ClearClientBufferTest.
808   */
BENCHMARK_F(DisplayBenchmarkTest,ClearClientBufferTest)809 BENCHMARK_F(DisplayBenchmarkTest, ClearClientBufferTest)(benchmark::State &state)
810 {
811     int32_t ret = 0;
812     for (auto _ : state) {
813         ret = g_composerDevice->ClearClientBuffer(g_displayIds[0]);
814     }
815     if (ret == DISPLAY_NOT_SUPPORT) {
816         return;
817     }
818     EXPECT_EQ(DISPLAY_SUCCESS, ret);
819 }
820 
821 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, ClearClientBufferTest)->
822     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
823 
824 /**
825   * @tc.name: ClearLayerBufferTest
826   * @tc.desc: Benchmarktest for interface ClearLayerBufferTest.
827   */
BENCHMARK_F(DisplayBenchmarkTest,ClearLayerBufferTest)828 BENCHMARK_F(DisplayBenchmarkTest, ClearLayerBufferTest)(benchmark::State &state)
829 {
830     int32_t ret = 0;
831     uint32_t layerId = 1;
832     for (auto _ : state) {
833         ret = g_composerDevice->ClearLayerBuffer(g_displayIds[0], layerId);
834     }
835     if (ret == DISPLAY_NOT_SUPPORT) {
836         return;
837     }
838     EXPECT_EQ(DISPLAY_FAILURE, ret);
839 }
840 
841 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, ClearLayerBufferTest)->
842     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
843 
844 /**
845   * @tc.name: GetDisplayIdentificationData
846   * @tc.desc: Benchmarktest for interface GetDisplayIdentificationData.
847   */
BENCHMARK_F(DisplayBenchmarkTest,GetDisplayIdentificationData)848 BENCHMARK_F(DisplayBenchmarkTest, GetDisplayIdentificationData)(benchmark::State &state)
849 {
850     int32_t ret = 0;
851     uint8_t portId = 0;
852     std::vector<uint8_t> edidData = {};
853     for (auto _ : state) {
854         ret = g_composerDevice->GetDisplayIdentificationData(g_displayIds[0], portId, edidData);
855     }
856     if (ret == DISPLAY_NOT_SUPPORT) {
857         return;
858     }
859     EXPECT_EQ(DISPLAY_FAILURE, ret);
860 }
861 
862 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, GetDisplayIdentificationData)->
863     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
864 /**
865   * @tc.name: RegHwcEventCallbackTest
866   * @tc.desc: Benchmarktest for interface RegHwcEventCallbackTest.
867   */
BENCHMARK_F(DisplayBenchmarkTest,RegHwcEventCallbackTest)868 BENCHMARK_F(DisplayBenchmarkTest, RegHwcEventCallbackTest)(benchmark::State &state)
869 {
870     int32_t ret;
871     for (auto _ : state) {
872         ret = g_composerDevice->RegHwcEventCallback(OnHwcEvent, nullptr);
873     }
874     if (ret == DISPLAY_NOT_SUPPORT) {
875         return;
876     }
877     EXPECT_EQ(DISPLAY_SUCCESS, ret);
878 }
879 
880 BENCHMARK_REGISTER_F(DisplayBenchmarkTest, RegHwcEventCallbackTest)->
881     Iterations(30)->Repetitions(3)->ReportAggregatesOnly();
882 
883 } // namespace
884 
main(int argc,char ** argv)885 int main(int argc, char** argv)
886 {
887     int ret = HdiTestDevice::GetInstance().InitDevice();
888     DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_TEST_LOGE("Init Device Failed"));
889     ::testing::InitGoogleTest(&argc, argv);
890     ::benchmark::Initialize(&argc, argv);
891     if (::benchmark::ReportUnrecognizedArguments(argc, argv)) {
892         return 1;
893     }
894     g_composerDevice = HdiTestDevice::GetInstance().GetDeviceInterface();
895     DISPLAY_TEST_CHK_RETURN((g_composerDevice == nullptr), DISPLAY_FAILURE,
896         DISPLAY_TEST_LOGE("get composer interface failed"));
897     g_gralloc.reset(IDisplayBuffer::Get());
898     DISPLAY_TEST_CHK_RETURN((g_gralloc == nullptr), DISPLAY_FAILURE,
899         DISPLAY_TEST_LOGE("get buffer interface failed"));
900     auto display = HdiTestDevice::GetInstance().GetFirstDisplay();
901     if (display != nullptr) {
902         g_displayIds = HdiTestDevice::GetInstance().GetDevIds();
903         display->SetDisplayVsyncEnabled(false);
904     }
905     ::benchmark::RunSpecifiedBenchmarks();
906     ::benchmark::Shutdown();
907     HdiTestDevice::GetInstance().GetFirstDisplay()->ResetClientLayer();
908     return ret;
909 }
910