1 /*
2 * Copyright (c) 2021 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 "display_gralloc_test.h"
17 #include <securec.h>
18 #include "gtest/gtest.h"
19 #include "display_gralloc.h"
20 #include "display_test.h"
21
22 namespace {
23 #define ALIGN_UP(x, a) ((((x) + ((a)-1)) / (a)) * (a))
24 #define HEIGHT_ALIGN 2U
25
26 const AllocTestPrms GRALLOC_TEST_SETS[] = {
27 // num0
28 {
29 .allocInfo = {
30 .width = 1920,
31 .height = 1080,
32 .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE,
33 .format = PIXEL_FMT_RGBX_8888
34 },
35 .expectStride = 1920 * 4,
36 .expectSize = 1920 * 1080 * 4
37 },
38 // num1
39 {
40 .allocInfo = {
41 .width = 1080,
42 .height = 1920,
43 .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE,
44 .format = PIXEL_FMT_RGBX_8888
45 },
46 .expectStride = 1088 * 4,
47 .expectSize = 1920 * 1088 * 4
48 },
49 // num2
50 {
51 .allocInfo = {
52 .width = 1280,
53 .height = 720,
54 .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE,
55 .format = PIXEL_FMT_RGBX_8888
56 },
57 .expectStride = 1280 * 4,
58 .expectSize = 1280 * 720 * 4
59 },
60 // num3
61 {
62 .allocInfo = {
63 .width = 1080,
64 .height = 1920,
65 .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE,
66 .format = PIXEL_FMT_RGBA_8888
67 },
68 .expectStride = 1088 * 4,
69 .expectSize = 1920 * 1088 * 4
70 },
71 // num4
72 {
73 .allocInfo = {
74 .width = 1080,
75 .height = 1920,
76 .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE,
77 .format = PIXEL_FMT_RGB_888
78 },
79 .expectStride = 1088 * 3,
80 .expectSize = 1920 * 1088 * 3
81 },
82 // num5
83 {
84 .allocInfo = {
85 .width = 1080,
86 .height = 1920,
87 .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE,
88 .format = PIXEL_FMT_BGRA_8888
89 },
90 .expectStride = 1088 * 4,
91 .expectSize = 1920 * 1088 * 4
92 },
93 // num6
94 {
95 .allocInfo = {
96 .width = 1080,
97 .height = 1920,
98 .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE,
99 .format = PIXEL_FMT_BGRX_8888
100 },
101 .expectStride = 1088 * 4,
102 .expectSize = 1920 * 1088 * 4
103 },
104 // num7
105 {
106 .allocInfo = {
107 .width = 1080,
108 .height = 1920,
109 .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE,
110 .format = PIXEL_FMT_RGBA_4444
111 },
112 .expectStride = 1088 * 2,
113 .expectSize = 1920 * 1088 * 2
114 },
115 // num8
116 {
117 .allocInfo =
118 {
119 .width = 1080,
120 .height = 1920,
121 .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE,
122 .format = PIXEL_FMT_RGBX_4444
123 },
124 .expectStride = 1088 * 2,
125 .expectSize = 1920 * 1088 * 2
126 },
127 // num9
128 {
129 .allocInfo = {
130 .width = 1080,
131 .height = 1920,
132 .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE,
133 .format = PIXEL_FMT_BGRA_4444
134 },
135 .expectStride = 1088 * 2,
136 .expectSize = 1920 * 1088 * 2
137 },
138 // num10
139 {
140 .allocInfo = {
141 .width = 1080,
142 .height = 1920,
143 .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE,
144 .format = PIXEL_FMT_BGRX_4444
145 },
146 .expectStride = 1088 * 2,
147 .expectSize = 1920 * 1088 * 2
148 },
149 // num11
150 {
151 .allocInfo = {
152 .width = 1080,
153 .height = 1920,
154 .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE,
155 .format = PIXEL_FMT_BGR_565
156 },
157 .expectStride = 1088 * 2,
158 .expectSize = 1920 * 1088 * 2
159 },
160 // num12
161 {
162 .allocInfo = {
163 .width = 1080,
164 .height = 1920,
165 .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE,
166 .format = PIXEL_FMT_BGRA_5551
167 },
168 .expectStride = 1088 * 2,
169 .expectSize = 1920 * 1088 * 2
170 },
171 // num13
172 {
173 .allocInfo = {
174 .width = 1080,
175 .height = 1920,
176 .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE,
177 .format = PIXEL_FMT_BGRX_5551
178 },
179 .expectStride = 1088 * 2,
180 .expectSize = 1920 * 1088 * 2
181 },
182 // num14
183 {
184 .allocInfo = {
185 .width = 1080,
186 .height = 1920,
187 .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE,
188 .format = PIXEL_FMT_YCBCR_420_SP
189 },
190 .expectStride = 1088,
191 .expectSize = 1920 * 1088 * 3 / 2
192 },
193 // num15
194 {
195 .allocInfo = {
196 .width = 1080,
197 .height = 1920,
198 .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE,
199 .format = PIXEL_FMT_YCRCB_420_SP
200 },
201 .expectStride = 1088,
202 .expectSize = 1920 * 1088 * 3 / 2
203 },
204 // num16
205 {
206 .allocInfo = {
207 .width = 1080,
208 .height = 1920,
209 .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE,
210 .format = PIXEL_FMT_YCBCR_420_P
211 },
212 .expectStride = 1088,
213 .expectSize = 1920 * 1088 * 3 / 2
214 },
215 // num17
216 {
217 .allocInfo = {
218 .width = 1080,
219 .height = 1920,
220 .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE,
221 .format = PIXEL_FMT_YCRCB_420_P
222 },
223 .expectStride = 1088,
224 .expectSize = 1920 * 1088 * 3 / 2
225 },
226 // num18
227 {
228 .allocInfo = {
229 .width = 1080,
230 .height = 1920,
231 .usage = HBM_USE_MEM_DMA,
232 .format = PIXEL_FMT_RGBX_8888
233 },
234 .expectStride = 1088 * 4,
235 .expectSize = 1920 * 1088 * 4
236 },
237 // num19
238 {
239 .allocInfo = {
240 .width = 1080,
241 .height = 1920,
242 .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ,
243 .format = PIXEL_FMT_RGBX_8888
244 },
245 .expectStride = 1088 * 4,
246 .expectSize = 1920 * 1088 * 4
247 },
248 // num20
249 {
250 .allocInfo = {
251 .width = 1080,
252 .height = 1920,
253 .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_WRITE,
254 .format = PIXEL_FMT_RGBX_8888
255 },
256 .expectStride = 1088 * 4,
257 .expectSize = 1920 * 1088 * 4
258 },
259 };
260
CheckBufferHandle(AllocTestPrms & info,BufferHandle & buffer)261 static bool CheckBufferHandle(AllocTestPrms &info, BufferHandle &buffer)
262 {
263 if (buffer.stride != (ALIGN_UP(info.expectStride, HEIGHT_ALIGN))) {
264 DISPLAY_TEST_LOGE("stride check failed stride %d, expect stride %d ", buffer.stride, info.expectStride);
265 DISPLAY_TEST_LOGE("stride check failed format %d width %d, height %d ", info.allocInfo.format,
266 info.allocInfo.width, info.allocInfo.height);
267 return false;
268 }
269
270 if (buffer.size != info.expectSize) {
271 DISPLAY_TEST_LOGE("size check failed size %d, expect size %d ", buffer.size, info.expectSize);
272 DISPLAY_TEST_LOGE("stride check failed format %d width %d, height %d ", info.allocInfo.format,
273 info.allocInfo.width, info.allocInfo.height);
274 return false;
275 }
276 return true;
277 }
278
SetUp()279 void GrallocAllocTest::SetUp()
280 {
281 if (GrallocInitialize(&mGrallocFuncs) != DISPLAY_SUCCESS) {
282 DISPLAY_TEST_LOGE("DisplayInit failure\n");
283 ASSERT_TRUE(0);
284 }
285 }
286
TearDown()287 void GrallocAllocTest::TearDown()
288 {
289 if (GrallocUninitialize(mGrallocFuncs) != DISPLAY_SUCCESS) {
290 DISPLAY_TEST_LOGE("DisplayUninit failure\n");
291 ASSERT_TRUE(0);
292 }
293 }
294
AllocMemTest(AllocTestPrms & info)295 int32_t GrallocAllocTest::AllocMemTest(AllocTestPrms &info)
296 {
297 int ret;
298 BufferHandle *buffer = nullptr;
299 const int testCount = 21; // test 40 times
300 for (int i = 0; i < testCount; i++) {
301 ret = mGrallocFuncs->AllocMem(&info.allocInfo, &buffer);
302 if (ret != DISPLAY_SUCCESS) {
303 return ret;
304 }
305 void *vAddr = mGrallocFuncs->Mmap(buffer);
306 if (vAddr == nullptr) {
307 return DISPLAY_FAILURE;
308 }
309
310 if (info.allocInfo.usage & (HBM_USE_CPU_READ | HBM_USE_CPU_WRITE)) {
311 ret = mGrallocFuncs->InvalidateCache(buffer);
312 if (ret != DISPLAY_SUCCESS) {
313 return ret;
314 }
315 }
316 if (memset_s(vAddr, buffer->size, 0, buffer->size) != EOK) {
317 return DISPLAY_NOMEM;
318 }
319 DISPLAY_TEST_CHK_RETURN(!CheckBufferHandle(info, *buffer), DISPLAY_FAILURE,
320 DISPLAY_TEST_LOGE("buffer check failed"));
321 if (info.allocInfo.usage & (HBM_USE_CPU_READ | HBM_USE_CPU_WRITE)) {
322 ret = mGrallocFuncs->FlushCache(buffer);
323 if (ret != DISPLAY_SUCCESS) {
324 return ret;
325 }
326 }
327 mGrallocFuncs->Unmap((buffer));
328 mGrallocFuncs->FreeMem(buffer);
329 }
330
331 return DISPLAY_SUCCESS;
332 }
333
TEST(GrallocAllocTest,NULLPTR)334 TEST(GrallocAllocTest, NULLPTR)
335 {
336 int ret = GrallocInitialize(nullptr);
337 ASSERT_TRUE(ret != DISPLAY_SUCCESS);
338
339 GrallocFuncs *grallocFuncs;
340 AllocInfo allocInfo;
341 BufferHandle *hdl;
342 ret = GrallocInitialize(&grallocFuncs);
343 ASSERT_TRUE(ret == DISPLAY_SUCCESS);
344 ret = grallocFuncs->AllocMem(nullptr, nullptr);
345 ASSERT_TRUE(ret != DISPLAY_SUCCESS);
346 ret = grallocFuncs->AllocMem(&allocInfo, nullptr);
347 ASSERT_TRUE(ret != DISPLAY_SUCCESS);
348 ret = grallocFuncs->AllocMem(nullptr, &hdl);
349 ASSERT_TRUE(ret != DISPLAY_SUCCESS);
350 ret = grallocFuncs->InvalidateCache(nullptr);
351 ASSERT_TRUE(ret != DISPLAY_SUCCESS);
352 ret = grallocFuncs->FlushCache(nullptr);
353 ASSERT_TRUE(ret != DISPLAY_SUCCESS);
354 grallocFuncs->FreeMem(nullptr);
355 void *vAddr = grallocFuncs->Mmap(nullptr);
356 ASSERT_TRUE(vAddr == nullptr);
357 ret = grallocFuncs->Unmap(nullptr);
358 ASSERT_TRUE(ret != DISPLAY_SUCCESS);
359 ret = GrallocUninitialize(nullptr);
360 ASSERT_TRUE(ret != DISPLAY_SUCCESS);
361
362 ret = GrallocUninitialize(grallocFuncs);
363 ASSERT_TRUE(ret == DISPLAY_SUCCESS);
364 }
365
TEST_P(GrallocAllocTest,GrallocAlloc)366 TEST_P(GrallocAllocTest, GrallocAlloc)
367 {
368 AllocTestPrms params = GetParam();
369 int ret = AllocMemTest(params);
370 ASSERT_TRUE(ret == DISPLAY_SUCCESS);
371 }
372
373 INSTANTIATE_TEST_SUITE_P(AllocTest, GrallocAllocTest, ::testing::ValuesIn(GRALLOC_TEST_SETS));
374 }
375