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