19762338dSopenharmony_ci/* 29762338dSopenharmony_ci * Copyright (c) 2023-2024 Huawei Device Co., Ltd. 39762338dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 49762338dSopenharmony_ci * you may not use this file except in compliance with the License. 59762338dSopenharmony_ci * You may obtain a copy of the License at 69762338dSopenharmony_ci * 79762338dSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 89762338dSopenharmony_ci * 99762338dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 109762338dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 119762338dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 129762338dSopenharmony_ci * See the License for the specific language governing permissions and 139762338dSopenharmony_ci * limitations under the License. 149762338dSopenharmony_ci */ 159762338dSopenharmony_ci#include "display_buffer_ut.h" 169762338dSopenharmony_ci#include <securec.h> 179762338dSopenharmony_ci 189762338dSopenharmony_ci#include "gtest/gtest.h" 199762338dSopenharmony_ci#include "v1_0/display_buffer_type.h" 209762338dSopenharmony_ci#include "v1_0/display_composer_type.h" 219762338dSopenharmony_ci#include "hdf_base.h" 229762338dSopenharmony_ci#include "hdf_log.h" 239762338dSopenharmony_ci 249762338dSopenharmony_cinamespace OHOS { 259762338dSopenharmony_cinamespace HDI { 269762338dSopenharmony_cinamespace Display { 279762338dSopenharmony_cinamespace TEST { 289762338dSopenharmony_ciusing namespace testing::ext; 299762338dSopenharmony_ciusing namespace OHOS::HDI::Display::Composer::V1_0; 309762338dSopenharmony_ciusing namespace OHOS::HDI::Display::Buffer::V1_1; 319762338dSopenharmony_ciusing OHOS::HDI::Display::Buffer::V1_0::AllocInfo; 329762338dSopenharmony_ci#ifndef DISPLAY_TEST_CHK_RETURN 339762338dSopenharmony_ci#define DISPLAY_TEST_CHK_RETURN(val, ret, ...) \ 349762338dSopenharmony_ci do { \ 359762338dSopenharmony_ci if (val) { \ 369762338dSopenharmony_ci __VA_ARGS__; \ 379762338dSopenharmony_ci return (ret); \ 389762338dSopenharmony_ci } \ 399762338dSopenharmony_ci } while (0) 409762338dSopenharmony_ci#endif 419762338dSopenharmony_ci 429762338dSopenharmony_ciconst uint32_t ALLOC_SIZE_1080 = 1080; // alloc size 1080 439762338dSopenharmony_ciconst uint32_t ALLOC_SIZE_1920 = 1920; // alloc size 1920 449762338dSopenharmony_ciconst uint32_t ALLOC_SIZE_1280 = 1280; // alloc size 1280 459762338dSopenharmony_ciconst uint32_t ALLOC_SIZE_720 = 720; // alloc size 720 469762338dSopenharmony_ci 479762338dSopenharmony_ciconst AllocInfo DISPLAY_BUFFER_TEST_SETS[] = { 489762338dSopenharmony_ci // num0 499762338dSopenharmony_ci { 509762338dSopenharmony_ci .width = ALLOC_SIZE_1920, 519762338dSopenharmony_ci .height = ALLOC_SIZE_1080, 529762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE, 539762338dSopenharmony_ci .format = PIXEL_FMT_RGBX_8888 549762338dSopenharmony_ci }, 559762338dSopenharmony_ci // num1 569762338dSopenharmony_ci { 579762338dSopenharmony_ci .width = ALLOC_SIZE_1080, 589762338dSopenharmony_ci .height = ALLOC_SIZE_1920, 599762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE, 609762338dSopenharmony_ci .format = PIXEL_FMT_RGBX_8888 619762338dSopenharmony_ci }, 629762338dSopenharmony_ci // num2 639762338dSopenharmony_ci { 649762338dSopenharmony_ci .width = ALLOC_SIZE_1280, 659762338dSopenharmony_ci .height = ALLOC_SIZE_720, 669762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE, 679762338dSopenharmony_ci .format = PIXEL_FMT_RGBX_8888 689762338dSopenharmony_ci }, 699762338dSopenharmony_ci // num3 709762338dSopenharmony_ci { 719762338dSopenharmony_ci .width = ALLOC_SIZE_1080, 729762338dSopenharmony_ci .height = ALLOC_SIZE_1920, 739762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE, 749762338dSopenharmony_ci .format = PIXEL_FMT_RGBA_8888 759762338dSopenharmony_ci }, 769762338dSopenharmony_ci // num4 779762338dSopenharmony_ci { 789762338dSopenharmony_ci .width = ALLOC_SIZE_1080, 799762338dSopenharmony_ci .height = ALLOC_SIZE_1920, 809762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE, 819762338dSopenharmony_ci .format = PIXEL_FMT_BGRA_8888 829762338dSopenharmony_ci }, 839762338dSopenharmony_ci 849762338dSopenharmony_ci // num5 859762338dSopenharmony_ci { 869762338dSopenharmony_ci .width = ALLOC_SIZE_1080, 879762338dSopenharmony_ci .height = ALLOC_SIZE_1920, 889762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE, 899762338dSopenharmony_ci .format = PIXEL_FMT_YCBCR_420_SP 909762338dSopenharmony_ci }, 919762338dSopenharmony_ci // num6 929762338dSopenharmony_ci { 939762338dSopenharmony_ci .width = ALLOC_SIZE_1080, 949762338dSopenharmony_ci .height = ALLOC_SIZE_1920, 959762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE, 969762338dSopenharmony_ci .format = PIXEL_FMT_YCRCB_420_SP 979762338dSopenharmony_ci }, 989762338dSopenharmony_ci // num7 999762338dSopenharmony_ci { 1009762338dSopenharmony_ci .width = ALLOC_SIZE_1080, 1019762338dSopenharmony_ci .height = ALLOC_SIZE_1920, 1029762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE, 1039762338dSopenharmony_ci .format = PIXEL_FMT_YCBCR_420_P 1049762338dSopenharmony_ci }, 1059762338dSopenharmony_ci // num8 1069762338dSopenharmony_ci { 1079762338dSopenharmony_ci .width = ALLOC_SIZE_1080, 1089762338dSopenharmony_ci .height = ALLOC_SIZE_1920, 1099762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE, 1109762338dSopenharmony_ci .format = PIXEL_FMT_YCRCB_420_P 1119762338dSopenharmony_ci }, 1129762338dSopenharmony_ci // num9 1139762338dSopenharmony_ci { 1149762338dSopenharmony_ci .width = ALLOC_SIZE_1080, 1159762338dSopenharmony_ci .height = ALLOC_SIZE_1920, 1169762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA, 1179762338dSopenharmony_ci .format = PIXEL_FMT_RGBX_8888 1189762338dSopenharmony_ci }, 1199762338dSopenharmony_ci // num10 1209762338dSopenharmony_ci { 1219762338dSopenharmony_ci .width = ALLOC_SIZE_1080, 1229762338dSopenharmony_ci .height = ALLOC_SIZE_1920, 1239762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ, 1249762338dSopenharmony_ci .format = PIXEL_FMT_RGBX_8888 1259762338dSopenharmony_ci }, 1269762338dSopenharmony_ci // num11 1279762338dSopenharmony_ci { 1289762338dSopenharmony_ci .width = ALLOC_SIZE_1080, 1299762338dSopenharmony_ci .height = ALLOC_SIZE_1920, 1309762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_WRITE, 1319762338dSopenharmony_ci .format = PIXEL_FMT_RGBX_8888 1329762338dSopenharmony_ci }, 1339762338dSopenharmony_ci#ifdef DISPLAY_COMMUNITY 1349762338dSopenharmony_ci // num12 1359762338dSopenharmony_ci { 1369762338dSopenharmony_ci .width = ALLOC_SIZE_1080, 1379762338dSopenharmony_ci .height = ALLOC_SIZE_1920, 1389762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE, 1399762338dSopenharmony_ci .format = PIXEL_FMT_RGB_888 1409762338dSopenharmony_ci }, 1419762338dSopenharmony_ci // num13 1429762338dSopenharmony_ci { 1439762338dSopenharmony_ci .width = ALLOC_SIZE_1080, 1449762338dSopenharmony_ci .height = ALLOC_SIZE_1920, 1459762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE, 1469762338dSopenharmony_ci .format = PIXEL_FMT_BGRX_8888 1479762338dSopenharmony_ci }, 1489762338dSopenharmony_ci // num14 1499762338dSopenharmony_ci { 1509762338dSopenharmony_ci .width = ALLOC_SIZE_1080, 1519762338dSopenharmony_ci .height = ALLOC_SIZE_1920, 1529762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE, 1539762338dSopenharmony_ci .format = PIXEL_FMT_RGBA_4444 1549762338dSopenharmony_ci }, 1559762338dSopenharmony_ci // num15 1569762338dSopenharmony_ci { 1579762338dSopenharmony_ci .width = ALLOC_SIZE_1080, 1589762338dSopenharmony_ci .height = ALLOC_SIZE_1920, 1599762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE, 1609762338dSopenharmony_ci .format = PIXEL_FMT_RGBX_4444 1619762338dSopenharmony_ci }, 1629762338dSopenharmony_ci // num16 1639762338dSopenharmony_ci { 1649762338dSopenharmony_ci .width = ALLOC_SIZE_1080, 1659762338dSopenharmony_ci .height = ALLOC_SIZE_1920, 1669762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE, 1679762338dSopenharmony_ci .format = PIXEL_FMT_BGRA_4444 1689762338dSopenharmony_ci }, 1699762338dSopenharmony_ci // num17 1709762338dSopenharmony_ci { 1719762338dSopenharmony_ci .width = ALLOC_SIZE_1080, 1729762338dSopenharmony_ci .height = ALLOC_SIZE_1920, 1739762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE, 1749762338dSopenharmony_ci .format = PIXEL_FMT_BGRX_4444 1759762338dSopenharmony_ci }, 1769762338dSopenharmony_ci // num18 1779762338dSopenharmony_ci { 1789762338dSopenharmony_ci .width = ALLOC_SIZE_1080, 1799762338dSopenharmony_ci .height = ALLOC_SIZE_1920, 1809762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE, 1819762338dSopenharmony_ci .format = PIXEL_FMT_BGR_565 1829762338dSopenharmony_ci }, 1839762338dSopenharmony_ci // num19 1849762338dSopenharmony_ci { 1859762338dSopenharmony_ci .width = ALLOC_SIZE_1080, 1869762338dSopenharmony_ci .height = ALLOC_SIZE_1920, 1879762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE, 1889762338dSopenharmony_ci .format = PIXEL_FMT_BGRA_5551 1899762338dSopenharmony_ci }, 1909762338dSopenharmony_ci // num20 1919762338dSopenharmony_ci { 1929762338dSopenharmony_ci .width = ALLOC_SIZE_1080, 1939762338dSopenharmony_ci .height = ALLOC_SIZE_1920, 1949762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE, 1959762338dSopenharmony_ci .format = PIXEL_FMT_BGRX_5551 1969762338dSopenharmony_ci }, 1979762338dSopenharmony_ci#else 1989762338dSopenharmony_ci /** 1999762338dSopenharmony_ci * @tc.number: SUB_Driver_Display_HEBC_0100 2009762338dSopenharmony_ci * @tc.desc: Apply for a hebc format buffer 2019762338dSopenharmony_ci * @tc.size: MediumTest 2029762338dSopenharmony_ci * @tc.type: Function 2039762338dSopenharmony_ci */ 2049762338dSopenharmony_ci { 2059762338dSopenharmony_ci .width = ALLOC_SIZE_1080, 2069762338dSopenharmony_ci .height = ALLOC_SIZE_1920, 2079762338dSopenharmony_ci .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_WRITE, 2089762338dSopenharmony_ci .format = PIXEL_FMT_RGBA_1010102 2099762338dSopenharmony_ci }, 2109762338dSopenharmony_ci#endif // DISPLAY_COMMUNITY 2119762338dSopenharmony_ci}; 2129762338dSopenharmony_ci 2139762338dSopenharmony_civoid DisplayBufferUt::SetUp() 2149762338dSopenharmony_ci{ 2159762338dSopenharmony_ci displayBuffer_ = IDisplayBuffer::Get(); 2169762338dSopenharmony_ci if (displayBuffer_ == nullptr) { 2179762338dSopenharmony_ci HDF_LOGE("IDisplayBuffer get failed"); 2189762338dSopenharmony_ci ASSERT_TRUE(0); 2199762338dSopenharmony_ci } 2209762338dSopenharmony_ci} 2219762338dSopenharmony_ci 2229762338dSopenharmony_civoid DisplayBufferUt::TearDown() 2239762338dSopenharmony_ci{ 2249762338dSopenharmony_ci} 2259762338dSopenharmony_ci 2269762338dSopenharmony_civoid DisplayBufferUt::MetadataTest(BufferHandle& handle) 2279762338dSopenharmony_ci{ 2289762338dSopenharmony_ci int32_t ret = displayBuffer_->RegisterBuffer(handle); 2299762338dSopenharmony_ci EXPECT_TRUE(ret == DISPLAY_NOT_SUPPORT || ret == DISPLAY_SUCCESS); 2309762338dSopenharmony_ci 2319762338dSopenharmony_ci uint32_t key = 1; 2329762338dSopenharmony_ci std::vector<uint8_t> values = {1, 2, 3}; 2339762338dSopenharmony_ci std::vector<uint32_t> keys = {}; 2349762338dSopenharmony_ci std::vector<uint8_t> rets = {}; 2359762338dSopenharmony_ci ret = displayBuffer_->SetMetadata(handle, key, values); 2369762338dSopenharmony_ci EXPECT_TRUE(ret == DISPLAY_NOT_SUPPORT || ret == DISPLAY_SUCCESS); 2379762338dSopenharmony_ci ret = displayBuffer_->GetMetadata(handle, key, rets); 2389762338dSopenharmony_ci EXPECT_TRUE(ret == DISPLAY_NOT_SUPPORT || ret == DISPLAY_SUCCESS); 2399762338dSopenharmony_ci if (ret != DISPLAY_NOT_SUPPORT) { 2409762338dSopenharmony_ci EXPECT_TRUE(rets == values); 2419762338dSopenharmony_ci } 2429762338dSopenharmony_ci 2439762338dSopenharmony_ci ret = displayBuffer_->ListMetadataKeys(handle, keys); 2449762338dSopenharmony_ci EXPECT_TRUE(ret == DISPLAY_NOT_SUPPORT || ret == DISPLAY_SUCCESS); 2459762338dSopenharmony_ci if (ret != DISPLAY_NOT_SUPPORT) { 2469762338dSopenharmony_ci EXPECT_TRUE(keys.size() == 1 && keys[0] == key); 2479762338dSopenharmony_ci } 2489762338dSopenharmony_ci 2499762338dSopenharmony_ci ret = displayBuffer_->EraseMetadataKey(handle, key); 2509762338dSopenharmony_ci EXPECT_TRUE(ret == DISPLAY_NOT_SUPPORT || ret == DISPLAY_SUCCESS); 2519762338dSopenharmony_ci if (ret != DISPLAY_NOT_SUPPORT) { 2529762338dSopenharmony_ci rets = {}; 2539762338dSopenharmony_ci ret = displayBuffer_->GetMetadata(handle, key, rets); 2549762338dSopenharmony_ci EXPECT_TRUE(ret != DISPLAY_SUCCESS); 2559762338dSopenharmony_ci } 2569762338dSopenharmony_ci} 2579762338dSopenharmony_ci 2589762338dSopenharmony_ciint32_t DisplayBufferUt::AllocMemTest(AllocInfo& info) 2599762338dSopenharmony_ci{ 2609762338dSopenharmony_ci int ret; 2619762338dSopenharmony_ci BufferHandle *buffer = nullptr; 2629762338dSopenharmony_ci const int TEST_COUNT = 40; // test 40 times 2639762338dSopenharmony_ci for (int i = 0; i < TEST_COUNT; i++) { 2649762338dSopenharmony_ci ret = displayBuffer_->AllocMem(info, buffer); 2659762338dSopenharmony_ci if (ret == DISPLAY_NOT_SUPPORT) { 2669762338dSopenharmony_ci HDF_LOGE("%{public}s: AllocMem not support, ret=%{public}d", __func__, ret); 2679762338dSopenharmony_ci return DISPLAY_SUCCESS; 2689762338dSopenharmony_ci } 2699762338dSopenharmony_ci if (ret != DISPLAY_SUCCESS || buffer == nullptr) { 2709762338dSopenharmony_ci HDF_LOGE("AllocMem failed"); 2719762338dSopenharmony_ci return ret; 2729762338dSopenharmony_ci } 2739762338dSopenharmony_ci MetadataTest(*buffer); 2749762338dSopenharmony_ci void *vAddr = displayBuffer_->Mmap(*buffer); 2759762338dSopenharmony_ci if (vAddr == nullptr) { 2769762338dSopenharmony_ci HDF_LOGE("Mmap failed"); 2779762338dSopenharmony_ci displayBuffer_->FreeMem(*buffer); 2789762338dSopenharmony_ci return DISPLAY_FAILURE; 2799762338dSopenharmony_ci } 2809762338dSopenharmony_ci if (info.usage & (HBM_USE_CPU_READ | HBM_USE_CPU_WRITE)) { 2819762338dSopenharmony_ci ret = displayBuffer_->InvalidateCache(*buffer); 2829762338dSopenharmony_ci if (ret != DISPLAY_SUCCESS) { 2839762338dSopenharmony_ci HDF_LOGE("InvalidateCache failed"); 2849762338dSopenharmony_ci displayBuffer_->Unmap(*buffer); 2859762338dSopenharmony_ci displayBuffer_->FreeMem(*buffer); 2869762338dSopenharmony_ci return ret; 2879762338dSopenharmony_ci } 2889762338dSopenharmony_ci } 2899762338dSopenharmony_ci if (memset_s(vAddr, buffer->size, 0, buffer->size) != EOK) { 2909762338dSopenharmony_ci HDF_LOGE("Insufficient memory"); 2919762338dSopenharmony_ci displayBuffer_->Unmap(*buffer); 2929762338dSopenharmony_ci displayBuffer_->FreeMem(*buffer); 2939762338dSopenharmony_ci return DISPLAY_NOMEM; 2949762338dSopenharmony_ci } 2959762338dSopenharmony_ci if (info.usage & (HBM_USE_CPU_READ | HBM_USE_CPU_WRITE)) { 2969762338dSopenharmony_ci ret = displayBuffer_->FlushCache(*buffer); 2979762338dSopenharmony_ci if (ret != DISPLAY_SUCCESS) { 2989762338dSopenharmony_ci HDF_LOGE("FlushCache failed"); 2999762338dSopenharmony_ci displayBuffer_->Unmap(*buffer); 3009762338dSopenharmony_ci displayBuffer_->FreeMem(*buffer); 3019762338dSopenharmony_ci return ret; 3029762338dSopenharmony_ci } 3039762338dSopenharmony_ci } 3049762338dSopenharmony_ci displayBuffer_->Unmap(*buffer); 3059762338dSopenharmony_ci displayBuffer_->FreeMem(*buffer); 3069762338dSopenharmony_ci } 3079762338dSopenharmony_ci return DISPLAY_SUCCESS; 3089762338dSopenharmony_ci} 3099762338dSopenharmony_ci 3109762338dSopenharmony_ciTEST_P(DisplayBufferUt, DisplayBufferUt) 3119762338dSopenharmony_ci{ 3129762338dSopenharmony_ci AllocInfo params = GetParam(); 3139762338dSopenharmony_ci int ret = AllocMemTest(params); 3149762338dSopenharmony_ci ASSERT_TRUE(ret == DISPLAY_SUCCESS); 3159762338dSopenharmony_ci} 3169762338dSopenharmony_ci 3179762338dSopenharmony_ci/** 3189762338dSopenharmony_ci * @tc.number: SUB_Driver_Display_HDI_0100-2100 3199762338dSopenharmony_ci * @tc.desc: Set different information testing memory interfaces 3209762338dSopenharmony_ci * @tc.size: MediumTest 3219762338dSopenharmony_ci * @tc.type: Function 3229762338dSopenharmony_ci */ 3239762338dSopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllocTest, DisplayBufferUt, ::testing::ValuesIn(DISPLAY_BUFFER_TEST_SETS)); 3249762338dSopenharmony_ci} // OHOS 3259762338dSopenharmony_ci} // HDI 3269762338dSopenharmony_ci} // DISPLAY 3279762338dSopenharmony_ci} // TEST 328