1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci
16094332d3Sopenharmony_ci#include "display_test.h"
17094332d3Sopenharmony_ci#include <stdio.h>
18094332d3Sopenharmony_ci#include "securec.h"
19094332d3Sopenharmony_ci#include "hdf_log.h"
20094332d3Sopenharmony_ci#include "loadbmp_test.h"
21094332d3Sopenharmony_ci
22094332d3Sopenharmony_ciDisplayTest g_displayTest;
23094332d3Sopenharmony_cistatic BufferHandle* g_buffer;
24094332d3Sopenharmony_ci
25094332d3Sopenharmony_cistatic int32_t LoadBmp(const int8_t *fileName, BufferHandle **buffer)
26094332d3Sopenharmony_ci{
27094332d3Sopenharmony_ci    int32_t ret;
28094332d3Sopenharmony_ci    uint8_t *pBuf = NULL;
29094332d3Sopenharmony_ci    OsdSurface surface;
30094332d3Sopenharmony_ci    OsdBitMapFileHeader bmpFileHeader = {0};
31094332d3Sopenharmony_ci    OsdBitMapInfo bmpInfo = {0};
32094332d3Sopenharmony_ci
33094332d3Sopenharmony_ci    if (fileName == NULL) {
34094332d3Sopenharmony_ci        HDF_LOGE("%s: fileName is null", __func__);
35094332d3Sopenharmony_ci        return DISPLAY_FAILURE;
36094332d3Sopenharmony_ci    }
37094332d3Sopenharmony_ci    if (GetBmpInfo(fileName, &bmpFileHeader, &bmpInfo) < 0) {
38094332d3Sopenharmony_ci        HDF_LOGE("%s: GetBmpInfo err", __func__);
39094332d3Sopenharmony_ci        return DISPLAY_FAILURE;
40094332d3Sopenharmony_ci    }
41094332d3Sopenharmony_ci    AllocInfo info = {
42094332d3Sopenharmony_ci        .width = bmpInfo.header.width + 1,
43094332d3Sopenharmony_ci        .height = bmpInfo.header.height + 1,
44094332d3Sopenharmony_ci        .format = PIXEL_FMT_RGBA_8888,
45094332d3Sopenharmony_ci        .usage =  HBM_USE_MEM_MMZ
46094332d3Sopenharmony_ci    };
47094332d3Sopenharmony_ci    // alloc picture buffer
48094332d3Sopenharmony_ci    if (g_displayTest.grallocFuncs->AllocMem != NULL) {
49094332d3Sopenharmony_ci        ret = g_displayTest.grallocFuncs->AllocMem(&info, buffer);
50094332d3Sopenharmony_ci        if (ret != DISPLAY_SUCCESS) {
51094332d3Sopenharmony_ci            HDF_LOGE("%s: pictureBuf alloc failure", __func__);
52094332d3Sopenharmony_ci            return DISPLAY_FAILURE;
53094332d3Sopenharmony_ci        }
54094332d3Sopenharmony_ci    }
55094332d3Sopenharmony_ci    // load bmp picture
56094332d3Sopenharmony_ci    pBuf = (uint8_t *)(*buffer)->virAddr;
57094332d3Sopenharmony_ci    surface.colorFmt = OSD_COLOR_FMT_RGB1555;
58094332d3Sopenharmony_ci    CreateSurfaceByBitMap(fileName, &surface, pBuf, (*buffer)->size);
59094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
60094332d3Sopenharmony_ci}
61094332d3Sopenharmony_ci
62094332d3Sopenharmony_cistatic void GetLayerInfo(LayerInfo *layInfo)
63094332d3Sopenharmony_ci{
64094332d3Sopenharmony_ci    layInfo->width = (uint32_t)g_displayTest.displayInfo.width;
65094332d3Sopenharmony_ci    layInfo->height = (uint32_t)g_displayTest.displayInfo.height;
66094332d3Sopenharmony_ci    layInfo->bpp = LAYER_BPP;
67094332d3Sopenharmony_ci    layInfo->pixFormat = PIXEL_FMT_RGBA_5551;
68094332d3Sopenharmony_ci    layInfo->type = LAYER_TYPE_GRAPHIC;
69094332d3Sopenharmony_ci}
70094332d3Sopenharmony_ci
71094332d3Sopenharmony_cistatic void WriteDataToBuf(int32_t width, int32_t height, uint16_t *pBuf)
72094332d3Sopenharmony_ci{
73094332d3Sopenharmony_ci    int32_t x;
74094332d3Sopenharmony_ci    int32_t y;
75094332d3Sopenharmony_ci
76094332d3Sopenharmony_ci    for (y = ((height / LINE_WIDTH) - LINE_WIDTH); y < ((height / LINE_WIDTH) + LINE_WIDTH); y++) {
77094332d3Sopenharmony_ci        for (x = 0; x < width; x++) {
78094332d3Sopenharmony_ci            *((uint16_t*)pBuf + y * width + x) = HIFB_RED_1555;
79094332d3Sopenharmony_ci        }
80094332d3Sopenharmony_ci    }
81094332d3Sopenharmony_ci    for (y = 0; y < height; y++) {
82094332d3Sopenharmony_ci        for (x = ((width / LINE_WIDTH) - LINE_WIDTH); x < ((width / LINE_WIDTH) + LINE_WIDTH); x++) {
83094332d3Sopenharmony_ci            *((uint16_t*)pBuf + y * width + x) = HIFB_RED_1555;
84094332d3Sopenharmony_ci        }
85094332d3Sopenharmony_ci    }
86094332d3Sopenharmony_ci}
87094332d3Sopenharmony_ci
88094332d3Sopenharmony_cistatic void PicSourceSurfaceInit(ISurface *surface, uint64_t phyAddr, int32_t bpp)
89094332d3Sopenharmony_ci{
90094332d3Sopenharmony_ci    surface->width = SAMPLE_IMAGE_WIDTH;
91094332d3Sopenharmony_ci    surface->height = SAMPLE_IMAGE_HEIGHT;
92094332d3Sopenharmony_ci    surface->phyAddr = phyAddr;
93094332d3Sopenharmony_ci    surface->enColorFmt = PIXEL_FMT_RGBA_5551;
94094332d3Sopenharmony_ci    surface->stride = SAMPLE_IMAGE_WIDTH * bpp / BITS_PER_BYTE;
95094332d3Sopenharmony_ci    surface->bAlphaExt1555 = true;
96094332d3Sopenharmony_ci    surface->bAlphaMax255  = true;
97094332d3Sopenharmony_ci    surface->alpha0 = 0XFF;
98094332d3Sopenharmony_ci    surface->alpha1 = 0XFF;
99094332d3Sopenharmony_ci}
100094332d3Sopenharmony_ci
101094332d3Sopenharmony_cistatic void DestSurfaceInit(ISurface *surface, uint64_t phyAddr, int32_t bpp)
102094332d3Sopenharmony_ci{
103094332d3Sopenharmony_ci    surface->width = (uint32_t)g_displayTest.displayInfo.width;
104094332d3Sopenharmony_ci    surface->height = (uint32_t)g_displayTest.displayInfo.height;
105094332d3Sopenharmony_ci    surface->phyAddr = phyAddr;
106094332d3Sopenharmony_ci    surface->enColorFmt = PIXEL_FMT_RGBA_5551;
107094332d3Sopenharmony_ci    surface->stride = g_displayTest.displayInfo.width * bpp / BITS_PER_BYTE;
108094332d3Sopenharmony_ci    surface->bAlphaExt1555 = true;
109094332d3Sopenharmony_ci    surface->bAlphaMax255  = true;
110094332d3Sopenharmony_ci    surface->alpha0 = 0XFF;
111094332d3Sopenharmony_ci    surface->alpha1 = 0XFF;
112094332d3Sopenharmony_ci    surface->bYCbCrClut = 0;
113094332d3Sopenharmony_ci}
114094332d3Sopenharmony_ci
115094332d3Sopenharmony_ciint32_t DisplayInit(void)
116094332d3Sopenharmony_ci{
117094332d3Sopenharmony_ci    int32_t ret;
118094332d3Sopenharmony_ci
119094332d3Sopenharmony_ci    ret = LayerInitialize(&g_displayTest.layerFuncs);
120094332d3Sopenharmony_ci    if (ret != DISPLAY_SUCCESS || g_displayTest.layerFuncs == NULL) {
121094332d3Sopenharmony_ci        HDF_LOGE("%s: layer initialize failure", __func__);
122094332d3Sopenharmony_ci        return DISPLAY_FAILURE;
123094332d3Sopenharmony_ci    }
124094332d3Sopenharmony_ci    ret = GrallocInitialize(&g_displayTest.grallocFuncs);
125094332d3Sopenharmony_ci    if (ret != DISPLAY_SUCCESS || g_displayTest.layerFuncs == NULL) {
126094332d3Sopenharmony_ci        HDF_LOGE("%s: gralloc initialize failure", __func__);
127094332d3Sopenharmony_ci        return DISPLAY_FAILURE;
128094332d3Sopenharmony_ci    }
129094332d3Sopenharmony_ci    ret = GfxInitialize(&g_displayTest.gfxFuncs);
130094332d3Sopenharmony_ci    if (ret != DISPLAY_SUCCESS || g_displayTest.gfxFuncs == NULL) {
131094332d3Sopenharmony_ci        HDF_LOGE("%s: gfx initialize failure", __func__);
132094332d3Sopenharmony_ci        return DISPLAY_FAILURE;
133094332d3Sopenharmony_ci    }
134094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
135094332d3Sopenharmony_ci}
136094332d3Sopenharmony_ci
137094332d3Sopenharmony_ciint32_t DisplayUninit(void)
138094332d3Sopenharmony_ci{
139094332d3Sopenharmony_ci    LayerUninitialize(g_displayTest.layerFuncs);
140094332d3Sopenharmony_ci    GrallocUninitialize(g_displayTest.grallocFuncs);
141094332d3Sopenharmony_ci    GfxUninitialize(g_displayTest.gfxFuncs);
142094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
143094332d3Sopenharmony_ci}
144094332d3Sopenharmony_ci
145094332d3Sopenharmony_ciint32_t InitDisplayTest(void)
146094332d3Sopenharmony_ci{
147094332d3Sopenharmony_ci    int32_t ret;
148094332d3Sopenharmony_ci
149094332d3Sopenharmony_ci    g_displayTest.devId = 0;
150094332d3Sopenharmony_ci    // init display
151094332d3Sopenharmony_ci    if (g_displayTest.layerFuncs->InitDisplay != NULL) {
152094332d3Sopenharmony_ci        ret = g_displayTest.layerFuncs->InitDisplay(g_displayTest.devId);
153094332d3Sopenharmony_ci        if (ret != DISPLAY_SUCCESS) {
154094332d3Sopenharmony_ci            HDF_LOGE("%s: MPI VO can't be opened repeatedly, so here bypass ret check", __func__);
155094332d3Sopenharmony_ci            return DISPLAY_SUCCESS;
156094332d3Sopenharmony_ci        }
157094332d3Sopenharmony_ci    }
158094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
159094332d3Sopenharmony_ci}
160094332d3Sopenharmony_ci
161094332d3Sopenharmony_ciint32_t DeinitDisplayTest(void)
162094332d3Sopenharmony_ci{
163094332d3Sopenharmony_ci    int32_t ret = DISPLAY_SUCCESS;
164094332d3Sopenharmony_ci
165094332d3Sopenharmony_ci    g_displayTest.devId = 0;
166094332d3Sopenharmony_ci    // deinit display
167094332d3Sopenharmony_ci    if (g_displayTest.layerFuncs->DeinitDisplay != NULL) {
168094332d3Sopenharmony_ci        HDF_LOGE("%s: Here bypass call DeinitDisplay func for keep test environment continuable", __func__);
169094332d3Sopenharmony_ci        if (ret != DISPLAY_SUCCESS) {
170094332d3Sopenharmony_ci            HDF_LOGE("%s: deinit display failed", __func__);
171094332d3Sopenharmony_ci            return DISPLAY_FAILURE;
172094332d3Sopenharmony_ci        }
173094332d3Sopenharmony_ci    }
174094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
175094332d3Sopenharmony_ci}
176094332d3Sopenharmony_ci
177094332d3Sopenharmony_ciint32_t GetDisplayInfoTest(void)
178094332d3Sopenharmony_ci{
179094332d3Sopenharmony_ci    int32_t ret;
180094332d3Sopenharmony_ci
181094332d3Sopenharmony_ci    g_displayTest.devId = 0;
182094332d3Sopenharmony_ci    // get display info
183094332d3Sopenharmony_ci    if (g_displayTest.layerFuncs->GetDisplayInfo != NULL) {
184094332d3Sopenharmony_ci        ret = g_displayTest.layerFuncs->GetDisplayInfo(g_displayTest.devId, &g_displayTest.displayInfo);
185094332d3Sopenharmony_ci        if (ret != DISPLAY_SUCCESS) {
186094332d3Sopenharmony_ci            HDF_LOGE("%s: get disp info failed", __func__);
187094332d3Sopenharmony_ci            return DISPLAY_FAILURE;
188094332d3Sopenharmony_ci        }
189094332d3Sopenharmony_ci    }
190094332d3Sopenharmony_ci    HDF_LOGI("%s: dispInfo width = %d", __func__, g_displayTest.displayInfo.width);
191094332d3Sopenharmony_ci    HDF_LOGI("%s: dispInfo height = %d", __func__, g_displayTest.displayInfo.height);
192094332d3Sopenharmony_ci    HDF_LOGI("%s: dispInfo rotAngle = %d", __func__, g_displayTest.displayInfo.rotAngle);
193094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
194094332d3Sopenharmony_ci}
195094332d3Sopenharmony_ci
196094332d3Sopenharmony_ciint32_t CreateLayerTest(void)
197094332d3Sopenharmony_ci{
198094332d3Sopenharmony_ci    int32_t ret;
199094332d3Sopenharmony_ci    LayerInfo layInfo;
200094332d3Sopenharmony_ci
201094332d3Sopenharmony_ci    g_displayTest.devId = 0;
202094332d3Sopenharmony_ci    // create layer
203094332d3Sopenharmony_ci    GetLayerInfo(&layInfo);
204094332d3Sopenharmony_ci    if (g_displayTest.layerFuncs->CreateLayer != NULL) {
205094332d3Sopenharmony_ci        ret = g_displayTest.layerFuncs->CreateLayer(g_displayTest.devId, &layInfo, &g_displayTest.layerId);
206094332d3Sopenharmony_ci        if (ret != DISPLAY_SUCCESS) {
207094332d3Sopenharmony_ci            HDF_LOGE("%s: CreateLayer fail", __func__);
208094332d3Sopenharmony_ci            return DISPLAY_FAILURE;
209094332d3Sopenharmony_ci        }
210094332d3Sopenharmony_ci    }
211094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
212094332d3Sopenharmony_ci}
213094332d3Sopenharmony_ci
214094332d3Sopenharmony_ciint32_t CloseLayerTest(void)
215094332d3Sopenharmony_ci{
216094332d3Sopenharmony_ci    int32_t ret;
217094332d3Sopenharmony_ci
218094332d3Sopenharmony_ci    if (g_displayTest.layerFuncs->CloseLayer != NULL) {
219094332d3Sopenharmony_ci        ret = g_displayTest.layerFuncs->CloseLayer(g_displayTest.devId, g_displayTest.layerId);
220094332d3Sopenharmony_ci        if (ret != DISPLAY_SUCCESS) {
221094332d3Sopenharmony_ci            HDF_LOGE("%s: CloseLayer fail", __func__);
222094332d3Sopenharmony_ci            return DISPLAY_FAILURE;
223094332d3Sopenharmony_ci        }
224094332d3Sopenharmony_ci    }
225094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
226094332d3Sopenharmony_ci}
227094332d3Sopenharmony_ci
228094332d3Sopenharmony_ciint32_t SetLayerVisibleTest(void)
229094332d3Sopenharmony_ci{
230094332d3Sopenharmony_ci    int32_t ret;
231094332d3Sopenharmony_ci
232094332d3Sopenharmony_ci    // set layer visible
233094332d3Sopenharmony_ci    if (g_displayTest.layerFuncs->SetLayerVisible != NULL) {
234094332d3Sopenharmony_ci        ret = g_displayTest.layerFuncs->SetLayerVisible(g_displayTest.devId, g_displayTest.layerId, true);
235094332d3Sopenharmony_ci        if (ret != DISPLAY_SUCCESS) {
236094332d3Sopenharmony_ci            HDF_LOGE("%s: SetLayerVisible fail", __func__);
237094332d3Sopenharmony_ci            return DISPLAY_FAILURE;
238094332d3Sopenharmony_ci        }
239094332d3Sopenharmony_ci    }
240094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
241094332d3Sopenharmony_ci}
242094332d3Sopenharmony_ci
243094332d3Sopenharmony_ciint32_t SetLayerDirtyRegionTest(void)
244094332d3Sopenharmony_ci{
245094332d3Sopenharmony_ci    int32_t ret;
246094332d3Sopenharmony_ci    IRect rect = {0, 0, g_displayTest.displayInfo.width, g_displayTest.displayInfo.height};
247094332d3Sopenharmony_ci
248094332d3Sopenharmony_ci    // set refresh region
249094332d3Sopenharmony_ci    if (g_displayTest.layerFuncs->SetLayerDirtyRegion != NULL) {
250094332d3Sopenharmony_ci        ret = g_displayTest.layerFuncs->SetLayerDirtyRegion(g_displayTest.devId, g_displayTest.layerId, &rect);
251094332d3Sopenharmony_ci        if (ret != DISPLAY_SUCCESS) {
252094332d3Sopenharmony_ci            HDF_LOGE("%s: SetLayerDirtyRegion fail", __func__);
253094332d3Sopenharmony_ci            return DISPLAY_FAILURE;
254094332d3Sopenharmony_ci        }
255094332d3Sopenharmony_ci    }
256094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
257094332d3Sopenharmony_ci}
258094332d3Sopenharmony_ci
259094332d3Sopenharmony_ciint32_t GetLayerBufferTest(void)
260094332d3Sopenharmony_ci{
261094332d3Sopenharmony_ci    int32_t ret;
262094332d3Sopenharmony_ci
263094332d3Sopenharmony_ci    if (g_displayTest.layerFuncs->GetLayerBuffer != NULL) {
264094332d3Sopenharmony_ci        ret = g_displayTest.layerFuncs->GetLayerBuffer(g_displayTest.devId, g_displayTest.layerId,
265094332d3Sopenharmony_ci                                                       &g_displayTest.buffer);
266094332d3Sopenharmony_ci        if (ret != DISPLAY_SUCCESS) {
267094332d3Sopenharmony_ci            HDF_LOGE("%s: GetLayerBuffer fail", __func__);
268094332d3Sopenharmony_ci            return DISPLAY_FAILURE;
269094332d3Sopenharmony_ci        }
270094332d3Sopenharmony_ci    }
271094332d3Sopenharmony_ci    // write buffer data
272094332d3Sopenharmony_ci    uint16_t *pBuf = (uint16_t *)g_displayTest.buffer.data.virAddr;
273094332d3Sopenharmony_ci    WriteDataToBuf(g_displayTest.displayInfo.width, g_displayTest.displayInfo.height, pBuf);
274094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
275094332d3Sopenharmony_ci}
276094332d3Sopenharmony_ci
277094332d3Sopenharmony_ciint32_t FlushTest(void)
278094332d3Sopenharmony_ci{
279094332d3Sopenharmony_ci    int32_t ret;
280094332d3Sopenharmony_ci
281094332d3Sopenharmony_ci    // refresh layer to display
282094332d3Sopenharmony_ci    if (g_displayTest.layerFuncs->Flush != NULL) {
283094332d3Sopenharmony_ci        ret = g_displayTest.layerFuncs->Flush(g_displayTest.devId, g_displayTest.layerId, &g_displayTest.buffer);
284094332d3Sopenharmony_ci        if (ret != DISPLAY_SUCCESS) {
285094332d3Sopenharmony_ci            HDF_LOGE("%s: flush fail", __func__);
286094332d3Sopenharmony_ci            return DISPLAY_FAILURE;
287094332d3Sopenharmony_ci        }
288094332d3Sopenharmony_ci    }
289094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
290094332d3Sopenharmony_ci}
291094332d3Sopenharmony_ci
292094332d3Sopenharmony_ciint32_t InitGfxTest(void)
293094332d3Sopenharmony_ci{
294094332d3Sopenharmony_ci    int32_t ret;
295094332d3Sopenharmony_ci    // init gfx
296094332d3Sopenharmony_ci    if (g_displayTest.gfxFuncs->InitGfx != NULL) {
297094332d3Sopenharmony_ci        ret = g_displayTest.gfxFuncs->InitGfx();
298094332d3Sopenharmony_ci        if (ret != DISPLAY_SUCCESS) {
299094332d3Sopenharmony_ci            HDF_LOGE("%s: init gfx fail", __func__);
300094332d3Sopenharmony_ci            return DISPLAY_FAILURE;
301094332d3Sopenharmony_ci        }
302094332d3Sopenharmony_ci    }
303094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
304094332d3Sopenharmony_ci}
305094332d3Sopenharmony_ci
306094332d3Sopenharmony_ciint32_t DeinitGfxTest(void)
307094332d3Sopenharmony_ci{
308094332d3Sopenharmony_ci    int32_t ret;
309094332d3Sopenharmony_ci    // deinit gfx
310094332d3Sopenharmony_ci    if (g_displayTest.gfxFuncs->DeinitGfx != NULL) {
311094332d3Sopenharmony_ci        ret = g_displayTest.gfxFuncs->DeinitGfx();
312094332d3Sopenharmony_ci        if (ret != DISPLAY_SUCCESS) {
313094332d3Sopenharmony_ci            HDF_LOGE("%s: deinit gfx fail", __func__);
314094332d3Sopenharmony_ci            return DISPLAY_FAILURE;
315094332d3Sopenharmony_ci        }
316094332d3Sopenharmony_ci    }
317094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
318094332d3Sopenharmony_ci}
319094332d3Sopenharmony_ci
320094332d3Sopenharmony_ciint32_t BlitTest(void)
321094332d3Sopenharmony_ci{
322094332d3Sopenharmony_ci    int32_t ret;
323094332d3Sopenharmony_ci    ISurface srcSurface = {0};
324094332d3Sopenharmony_ci    ISurface dstSurface = {0};
325094332d3Sopenharmony_ci    BufferHandle* pictureBuf = NULL;
326094332d3Sopenharmony_ci    uint32_t layerBufSize = g_displayTest.displayInfo.width * g_displayTest.displayInfo.height * PIXEL_BYTE;
327094332d3Sopenharmony_ci
328094332d3Sopenharmony_ci    // clean the layer buffer
329094332d3Sopenharmony_ci    (void)memset_s(g_displayTest.buffer.data.virAddr, layerBufSize, 0, layerBufSize);
330094332d3Sopenharmony_ci    // load bmp test picture
331094332d3Sopenharmony_ci    ret = LoadBmp((const int8_t *)PIC_RES_PATH, &pictureBuf);
332094332d3Sopenharmony_ci    if (ret != DISPLAY_SUCCESS) {
333094332d3Sopenharmony_ci        HDF_LOGE("%s: LoadBmp fail", __func__);
334094332d3Sopenharmony_ci        return DISPLAY_FAILURE;
335094332d3Sopenharmony_ci    }
336094332d3Sopenharmony_ci    // use picture buffer to create source surface
337094332d3Sopenharmony_ci    IRect srcRect = {0, 0, SAMPLE_IMAGE_WIDTH, SAMPLE_IMAGE_HEIGHT};
338094332d3Sopenharmony_ci    PicSourceSurfaceInit(&srcSurface, pictureBuf->phyAddr, LAYER_BPP);
339094332d3Sopenharmony_ci    // use layer buffer to create dest surface
340094332d3Sopenharmony_ci    IRect dstRect = srcRect;
341094332d3Sopenharmony_ci    DestSurfaceInit(&dstSurface, g_displayTest.buffer.data.phyAddr, LAYER_BPP);
342094332d3Sopenharmony_ci    // TDE: copy bmp picture buffer to layer buffer
343094332d3Sopenharmony_ci    if (g_displayTest.gfxFuncs->Blit != NULL) {
344094332d3Sopenharmony_ci        ret = g_displayTest.gfxFuncs->Blit(&srcSurface, &srcRect, &dstSurface, &dstRect, NULL);
345094332d3Sopenharmony_ci        if (ret != DISPLAY_SUCCESS) {
346094332d3Sopenharmony_ci            HDF_LOGE("%s: Blit fail", __func__);
347094332d3Sopenharmony_ci            goto EXIT;
348094332d3Sopenharmony_ci        }
349094332d3Sopenharmony_ci    }
350094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
351094332d3Sopenharmony_ci
352094332d3Sopenharmony_ciEXIT:
353094332d3Sopenharmony_ci    /* free picture buffer */
354094332d3Sopenharmony_ci    if (g_displayTest.grallocFuncs->FreeMem != NULL) {
355094332d3Sopenharmony_ci        g_displayTest.grallocFuncs->FreeMem(pictureBuf);
356094332d3Sopenharmony_ci    }
357094332d3Sopenharmony_ci    return ret;
358094332d3Sopenharmony_ci}
359094332d3Sopenharmony_ci
360094332d3Sopenharmony_ciint32_t FillRectTest(void)
361094332d3Sopenharmony_ci{
362094332d3Sopenharmony_ci    int32_t ret;
363094332d3Sopenharmony_ci    ISurface dstSurface = {0};
364094332d3Sopenharmony_ci    GfxOpt opt = {0};
365094332d3Sopenharmony_ci    IRect rect = {0, 0, SAMPLE_RECT_WIDTH, SAMPLE_RECT_HEIGHT};
366094332d3Sopenharmony_ci    uint32_t layerBufSize = g_displayTest.displayInfo.width * g_displayTest.displayInfo.height * PIXEL_BYTE;
367094332d3Sopenharmony_ci
368094332d3Sopenharmony_ci    opt.enGlobalAlpha = true;
369094332d3Sopenharmony_ci    opt.globalAlpha = MAX_GLOBLE_ALPHA;
370094332d3Sopenharmony_ci    // clean the layer buffer
371094332d3Sopenharmony_ci    (void)memset_s(g_displayTest.buffer.data.virAddr, layerBufSize, 0, layerBufSize);
372094332d3Sopenharmony_ci    DestSurfaceInit(&dstSurface, g_displayTest.buffer.data.phyAddr, LAYER_BPP);
373094332d3Sopenharmony_ci    // TDE: copy bmp picture buffer to layer buffer
374094332d3Sopenharmony_ci    if (g_displayTest.gfxFuncs->FillRect != NULL) {
375094332d3Sopenharmony_ci        ret = g_displayTest.gfxFuncs->FillRect(&dstSurface, &rect, HIFB_RED_1555, &opt);
376094332d3Sopenharmony_ci        if (ret != DISPLAY_SUCCESS) {
377094332d3Sopenharmony_ci            HDF_LOGE("%s: FillRect fail", __func__);
378094332d3Sopenharmony_ci            return ret;
379094332d3Sopenharmony_ci        }
380094332d3Sopenharmony_ci    }
381094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
382094332d3Sopenharmony_ci}
383094332d3Sopenharmony_ci
384094332d3Sopenharmony_ciint32_t AllocMemTest1(void)
385094332d3Sopenharmony_ci{
386094332d3Sopenharmony_ci    int32_t ret = DISPLAY_FAILURE;
387094332d3Sopenharmony_ci
388094332d3Sopenharmony_ci    AllocInfo info = {
389094332d3Sopenharmony_ci        .width = SAMPLE_IMAGE_WIDTH,
390094332d3Sopenharmony_ci        .height = SAMPLE_IMAGE_HEIGHT,
391094332d3Sopenharmony_ci        .format = PIXEL_FMT_RGBA_8888,
392094332d3Sopenharmony_ci        .usage =  HBM_USE_MEM_MMZ
393094332d3Sopenharmony_ci    };
394094332d3Sopenharmony_ci    if (g_displayTest.grallocFuncs->AllocMem != NULL) {
395094332d3Sopenharmony_ci        ret = g_displayTest.grallocFuncs->AllocMem(&info, &g_buffer);
396094332d3Sopenharmony_ci    }
397094332d3Sopenharmony_ci    if (ret != DISPLAY_SUCCESS) {
398094332d3Sopenharmony_ci        HDF_LOGE("%s: normal memory allocMem failed", __func__);
399094332d3Sopenharmony_ci        return ret;
400094332d3Sopenharmony_ci    }
401094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
402094332d3Sopenharmony_ci}
403094332d3Sopenharmony_ci
404094332d3Sopenharmony_ciint32_t MmapCacheTest(void)
405094332d3Sopenharmony_ci{
406094332d3Sopenharmony_ci    int32_t ret = DISPLAY_FAILURE;
407094332d3Sopenharmony_ci    void *mapCacheAddr = NULL;
408094332d3Sopenharmony_ci    AllocInfo info = {
409094332d3Sopenharmony_ci        .width = SAMPLE_RECT_WIDTH,
410094332d3Sopenharmony_ci        .height = SAMPLE_RECT_HEIGHT,
411094332d3Sopenharmony_ci        .format = PIXEL_FMT_RGBA_8888,
412094332d3Sopenharmony_ci        .usage =  HBM_USE_MEM_MMZ_CACHE
413094332d3Sopenharmony_ci    };
414094332d3Sopenharmony_ci
415094332d3Sopenharmony_ci    if (g_displayTest.grallocFuncs->AllocMem != NULL) {
416094332d3Sopenharmony_ci        ret = g_displayTest.grallocFuncs->AllocMem(&info, &g_buffer);
417094332d3Sopenharmony_ci    }
418094332d3Sopenharmony_ci    if (ret != DISPLAY_SUCCESS) {
419094332d3Sopenharmony_ci        HDF_LOGE("%s: normal memory allocMem failed", __func__);
420094332d3Sopenharmony_ci        return ret;
421094332d3Sopenharmony_ci    }
422094332d3Sopenharmony_ci
423094332d3Sopenharmony_ci    if (g_displayTest.grallocFuncs->MmapCache != NULL) {
424094332d3Sopenharmony_ci        mapCacheAddr = g_displayTest.grallocFuncs->MmapCache(g_buffer);
425094332d3Sopenharmony_ci        if (mapCacheAddr == NULL) {
426094332d3Sopenharmony_ci            return DISPLAY_FAILURE;
427094332d3Sopenharmony_ci        }
428094332d3Sopenharmony_ci    }
429094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
430094332d3Sopenharmony_ci}
431094332d3Sopenharmony_ci
432094332d3Sopenharmony_ciint32_t FreeMemTest(void)
433094332d3Sopenharmony_ci{
434094332d3Sopenharmony_ci    if (g_displayTest.grallocFuncs->FreeMem != NULL) {
435094332d3Sopenharmony_ci        g_displayTest.grallocFuncs->FreeMem(g_buffer);
436094332d3Sopenharmony_ci    }
437094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
438094332d3Sopenharmony_ci}
439094332d3Sopenharmony_ci
440094332d3Sopenharmony_ciint32_t AllocMemTest2(void)
441094332d3Sopenharmony_ci{
442094332d3Sopenharmony_ci    int32_t ret = DISPLAY_FAILURE;
443094332d3Sopenharmony_ci    AllocInfo info = {
444094332d3Sopenharmony_ci        .width = SAMPLE_IMAGE_WIDTH,
445094332d3Sopenharmony_ci        .height = SAMPLE_IMAGE_HEIGHT,
446094332d3Sopenharmony_ci        .format = PIXEL_FMT_RGBA_8888,
447094332d3Sopenharmony_ci        .usage =  HBM_USE_MEM_MMZ
448094332d3Sopenharmony_ci    };
449094332d3Sopenharmony_ci
450094332d3Sopenharmony_ci    if (g_displayTest.grallocFuncs->AllocMem != NULL) {
451094332d3Sopenharmony_ci        ret = g_displayTest.grallocFuncs->AllocMem(&info, &g_buffer);
452094332d3Sopenharmony_ci    }
453094332d3Sopenharmony_ci    if (ret != DISPLAY_SUCCESS) {
454094332d3Sopenharmony_ci        HDF_LOGE("%s: cache memory allocMem failed", __func__);
455094332d3Sopenharmony_ci        return ret;
456094332d3Sopenharmony_ci    }
457094332d3Sopenharmony_ci
458094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
459094332d3Sopenharmony_ci}
460094332d3Sopenharmony_ci
461094332d3Sopenharmony_ciint32_t FlushMCacheTest(void)
462094332d3Sopenharmony_ci{
463094332d3Sopenharmony_ci    int32_t ret;
464094332d3Sopenharmony_ci
465094332d3Sopenharmony_ci    if (g_displayTest.grallocFuncs->FlushMCache != NULL) {
466094332d3Sopenharmony_ci        ret = g_displayTest.grallocFuncs->FlushMCache(g_buffer);
467094332d3Sopenharmony_ci        if (ret != DISPLAY_SUCCESS) {
468094332d3Sopenharmony_ci            return ret;
469094332d3Sopenharmony_ci        }
470094332d3Sopenharmony_ci    }
471094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
472094332d3Sopenharmony_ci}
473