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