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