blob: 1efb022a5a132b43df9f9f7a7d3f5deb271655d5 [file] [log] [blame]
Jian Caob9fb3ed2019-04-16 16:51:27 +08001/*
2 * Copyright (c) 2014 Amlogic, Inc. All rights reserved.
3 *
4 * This source code is subject to the terms and conditions defined in the
5 * file 'LICENSE' which is part of this source code package.
6 *
7 * Description:
8 */
9
10#include <stdio.h>
11#include <stdlib.h>
12#include <unistd.h>
13#include <fcntl.h>
14#include <malloc.h>
15#include <string.h>
16#include <sys/time.h> /* for gettimeofday() */
Cao Jian53a15142019-08-16 13:58:17 +080017#include <pthread.h>
Jian Caob9fb3ed2019-04-16 16:51:27 +080018#include "ge2d_port.h"
19#include "aml_ge2d.h"
20
21/* #define FILE_DATA */
22static char SRC1_FILE_NAME[64] = "./fb1.rgb32";
23static char SRC2_FILE_NAME[64] = "./fb2.rgb32";
24static char DST_FILE_NAME[64] = "./out1.rgb32";
25
26static int SX_SRC1 = 1920;
27static int SY_SRC1 = 1080;
28static int SX_SRC2 = 1920;
29static int SY_SRC2 = 1080;
30static int SX_DST = 1920;
31static int SY_DST = 1080;
32
33static int src1_rect_x = 0;
34static int src1_rect_y = 0;
35static int src1_rect_w = 1920;
36static int src1_rect_h = 1080;
37static int src2_rect_x = 0;
38static int src2_rect_y = 0;
39static int src2_rect_w = 1920;
40static int src2_rect_h = 1080;
41static int dst_rect_x = 0;
42static int dst_rect_y = 0;
43static int dst_rect_w = 1920;
44static int dst_rect_h = 1080;
45static int rect_color = 0xff0000ff;
46static int SRC1_PIXFORMAT = PIXEL_FORMAT_RGBA_8888;
47static int SRC2_PIXFORMAT = PIXEL_FORMAT_RGBA_8888;
48static int DST_PIXFORMAT = PIXEL_FORMAT_YV12;
49static int src1_mem_alloc_type = AML_GE2D_MEM_DMABUF;
50static int src2_mem_alloc_type = AML_GE2D_MEM_DMABUF;
51static int dst_mem_alloc_type = AML_GE2D_MEM_DMABUF;
52static int dst_canvas_alloc = 0;
53static int src1_canvas_alloc = 1;
54static int src2_canvas_alloc = 1;
Cao Jian65331472019-11-01 21:01:49 +080055static int src1_plane_number = 1;
56static int src2_plane_number = 1;
57static int dst_plane_number = 1;
Jian Caob9fb3ed2019-04-16 16:51:27 +080058static int OP = AML_GE2D_STRETCHBLIT;
59static int src1_layer_mode = 0;
60static int src2_layer_mode = 0;
61static int gb1_alpha = 0xff;
62static int gb2_alpha = 0xff;
Cao Jiane80b1392019-08-07 20:59:47 +080063static int num_process = 1;
Cao Jian53a15142019-08-16 13:58:17 +080064static int num_thread = 1;
65static int num_process_per_thread = 1;
Cao Jian2b1d6972020-09-11 16:55:49 +080066static int separate_step = 0;
Cao Jian53a15142019-08-16 13:58:17 +080067
68#define THREADS_MAX_NUM (64)
Cao Jian2b1d6972020-09-11 16:55:49 +080069#define ATTACH_SRC (0x1)
70#define ATTACH_SRC2 (0x2)
71#define ATTACH_DST (0x4)
Cao Jiane80b1392019-08-07 20:59:47 +080072
73static inline unsigned long myclock()
74{
75 struct timeval tv;
76
77 gettimeofday (&tv, NULL);
78
79 return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
80}
Jian Caob9fb3ed2019-04-16 16:51:27 +080081
82static void set_ge2dinfo(aml_ge2d_info_t *pge2dinfo)
83{
84 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
85 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
86 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
Cao Jian65331472019-11-01 21:01:49 +080087 pge2dinfo->src_info[0].plane_number = src1_plane_number;
Jian Caob9fb3ed2019-04-16 16:51:27 +080088
89 pge2dinfo->src_info[1].canvas_w = SX_SRC2;
90 pge2dinfo->src_info[1].canvas_h = SY_SRC2;
91 pge2dinfo->src_info[1].format = SRC2_PIXFORMAT;
Cao Jian65331472019-11-01 21:01:49 +080092 pge2dinfo->src_info[1].plane_number = src2_plane_number;
Jian Caob9fb3ed2019-04-16 16:51:27 +080093
94 pge2dinfo->dst_info.canvas_w = SX_DST;
95 pge2dinfo->dst_info.canvas_h = SY_DST;
96 pge2dinfo->dst_info.format = DST_PIXFORMAT;
Cao Jian65331472019-11-01 21:01:49 +080097 pge2dinfo->dst_info.plane_number = dst_plane_number;
Jian Caob9fb3ed2019-04-16 16:51:27 +080098 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
99 pge2dinfo->offset = 0;
100 pge2dinfo->ge2d_op = OP;
101 pge2dinfo->blend_mode = BLEND_MODE_PREMULTIPLIED;
102
103 switch (pge2dinfo->ge2d_op)
104 {
105 case AML_GE2D_FILLRECTANGLE:
106 pge2dinfo->src_info[0].memtype = GE2D_CANVAS_TYPE_INVALID;
107 pge2dinfo->src_info[1].memtype = GE2D_CANVAS_TYPE_INVALID;
108 pge2dinfo->dst_info.memtype = dst_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
109 break;
110 case AML_GE2D_BLIT:
111 case AML_GE2D_STRETCHBLIT:
112 /* if not need alloc, set to GE2D_CANVAS_TYPE_INVALID
113 * otherwise set to GE2D_CANVAS_ALLOC
114 */
Cao Jian2b1d6972020-09-11 16:55:49 +0800115 pge2dinfo->src_info[0].memtype = src1_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800116 pge2dinfo->src_info[1].memtype = GE2D_CANVAS_TYPE_INVALID;
117 pge2dinfo->dst_info.memtype = dst_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
118 break;
119 case AML_GE2D_BLEND:
Cao Jian2b1d6972020-09-11 16:55:49 +0800120 pge2dinfo->src_info[0].memtype = src1_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
121 pge2dinfo->src_info[1].memtype = src2_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800122 pge2dinfo->dst_info.memtype = dst_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
123 break;
124 default:
125 E_GE2D("not support ge2d op,exit test!\n");
126 break;
127 }
128 /*set to AML_GE2D_MEM_DMABUF or AML_GE2D_MEM_ION*/
129 pge2dinfo->src_info[0].mem_alloc_type = src1_mem_alloc_type;
130 pge2dinfo->src_info[1].mem_alloc_type = src2_mem_alloc_type;
131 pge2dinfo->dst_info.mem_alloc_type = dst_mem_alloc_type;
132}
133
134static void print_usage(void)
135{
136 int i;
137 printf ("Usage: ge2d_feature_test [options]\n\n");
138 printf ("Options:\n\n");
139 printf (" --op <0:fillrect, 1:blend, 2:strechblit, 3:blit> ge2d operation case.\n");
140 printf (" --size <WxH> define src1/src2/dst size.\n");
141 printf (" --src1_memtype <0: ion, 1: dmabuf> define memory alloc type.\n");
142 printf (" --src2_memtype <0: ion, 1: dmabuf> define memory alloc type.\n");
143 printf (" --dst_memtype <0: ion, 1: dmabuf> define memory alloc type.\n");
Cao Jian65331472019-11-01 21:01:49 +0800144 printf (" --src1_format <num> define src1 format.\n");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800145 printf (" --src2_format <num> define src2 format.\n");
146 printf (" --dst_format <num> define dst format.\n");
Cao Jian65331472019-11-01 21:01:49 +0800147 printf (" --src1_size <WxH> define src1 size.\n");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800148 printf (" --src2_size <WxH> define src2 size.\n");
149 printf (" --dst_size <WxH> define dst size.\n");
Cao Jian65331472019-11-01 21:01:49 +0800150 printf (" --src1_file <name> define src1 file.\n");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800151 printf (" --src2_file <name> define src2 file.\n");
152 printf (" --dst_file <name> define dst file.\n");
Cao Jian65331472019-11-01 21:01:49 +0800153 printf (" --src1_canvas_alloc <num> define whether src1 need alloc mem 0:GE2D_CANVAS_OSD0 1:GE2D_CANVAS_ALLOC.\n");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800154 printf (" --src2_canvas_alloc <num> defien whether src2 need alloc mem 0:GE2D_CANVAS_OSD0 1:GE2D_CANVAS_ALLOC.\n");
Cao Jian65331472019-11-01 21:01:49 +0800155 printf (" --src1_rect <x_y_w_h> define src1 rect.\n");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800156 printf (" --src2_rect <x_y_w_h> define src2 rect.\n");
157 printf (" --dst_rect <x_y_w_h> define dst rect.\n");
158 printf (" --bo1 <layer_mode_num> define src1_layer_mode.\n");
159 printf (" --bo2 <layer_mode_num> define src2_layer_mode.\n");
160 printf (" --gb1 <gb1_alpha> define src1 global alpha.\n");
161 printf (" --gb2 <gb2_alpha> define src2 global alpha.\n");
162 printf (" --strechblit <x0_y0_w_h-x1_y1_w1_h1> define strechblit info.\n");
163 printf (" --fillrect <color_x_y_w_h> define fillrect info, color in rgba format.\n");
Cao Jian65331472019-11-01 21:01:49 +0800164 printf (" --src1_planenumber <num> define src1 plane number.\n");
165 printf (" --src2_planenumber <num> define src2 plane number.\n");
166 printf (" --dst_planenumber <num> define dst plane number.\n");
167 printf (" --n <num> process num times for performance test.\n");
Cao Jian53a15142019-08-16 13:58:17 +0800168 printf (" --p <num> multi-thread process, num of threads");
169 printf (" --p_n <num> num of process for every thread.\n");
Cao Jian2b1d6972020-09-11 16:55:49 +0800170 printf (" --s <num> separate steps. 0: invoke ge2d_process 1: invoke aml_ge2d_attach_dma_fd/ge2d_config/ge2d_execute/aml_ge2d_detach_dma_fd.\n");
171 printf (" or aml_ge2d_attach_dma_fd/aml_ge2d_process/aml_ge2d_detach_dma_fd");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800172 printf (" --help Print usage information.\n");
173 printf ("\n");
174}
175
176static int parse_command_line(int argc, char *argv[])
177{
178 int i;
179 /* parse command line */
180 for (i = 1; i < argc; i++) {
181 if (strncmp (argv[i], "--", 2) == 0) {
182 if (strcmp (argv[i] + 2, "help") == 0) {
183 print_usage();
184 return ge2d_fail;
185 }
186 else if (strcmp (argv[i] + 2, "op") == 0 && ++i < argc &&
187 sscanf (argv[i], "%d", &OP) == 1) {
188 continue;
189 }
190 else if (strcmp (argv[i] + 2, "src1_memtype") == 0 && ++i < argc &&
191 sscanf (argv[i], "%d", &src1_mem_alloc_type) == 1) {
192 continue;
193 }
194 else if (strcmp (argv[i] + 2, "src2_memtype") == 0 && ++i < argc &&
195 sscanf (argv[i], "%d", &src2_mem_alloc_type) == 1) {
196 continue;
197 }
198 else if (strcmp (argv[i] + 2, "dst_memtype") == 0 && ++i < argc &&
199 sscanf (argv[i], "%d", &dst_mem_alloc_type) == 1) {
200 continue;
201 }
202 else if (strcmp (argv[i] + 2, "bo1") == 0 && ++i < argc &&
203 sscanf (argv[i], "%d", &src1_layer_mode) == 1) {
204 continue;
205 }
206 else if (strcmp (argv[i] + 2, "bo2") == 0 && ++i < argc &&
207 sscanf (argv[i], "%d", &src2_layer_mode) == 1) {
208 continue;
209 }
210 else if (strcmp (argv[i] + 2, "gb1") == 0 && ++i < argc &&
211 sscanf (argv[i], "%d", &gb1_alpha) == 1) {
212 continue;
213 }
214 else if (strcmp (argv[i] + 2, "gb2") == 0 && ++i < argc &&
215 sscanf (argv[i], "%d", &gb2_alpha) == 1) {
216 continue;
217 }
218 else if (strcmp (argv[i] + 2, "src1_format") == 0 && ++i < argc &&
219 sscanf (argv[i], "%d", &SRC1_PIXFORMAT) == 1) {
220 continue;
221 }
222 else if (strcmp (argv[i] + 2, "src2_format") == 0 && ++i < argc &&
223 sscanf (argv[i], "%d", &SRC2_PIXFORMAT) == 1) {
224 continue;
225 }
226 else if (strcmp (argv[i] + 2, "dst_format") == 0 && ++i < argc &&
227 sscanf (argv[i], "%d", &DST_PIXFORMAT) == 1) {
228 continue;
229 }
230 else if (strcmp (argv[i] + 2, "size") == 0 && ++i < argc &&
231 sscanf (argv[i], "%dx%d", &SX_SRC1, &SY_SRC1) == 2) {
232 SX_SRC2 = SX_DST = SX_SRC1;
233 SY_SRC2 = SY_DST = SY_SRC1;
234 continue;
235 }
236 else if (strcmp (argv[i] + 2, "dst_size") == 0 && ++i < argc &&
237 sscanf (argv[i], "%dx%d", &SX_DST, &SY_DST) == 2) {
238 continue;
239 }
240 else if (strcmp (argv[i] + 2, "src1_size") == 0 && ++i < argc &&
241 sscanf (argv[i], "%dx%d", &SX_SRC1, &SY_SRC1) == 2) {
242 continue;
243 }
244 else if (strcmp (argv[i] + 2, "src2_size") == 0 && ++i < argc &&
245 sscanf (argv[i], "%dx%d", &SX_SRC2, &SY_SRC2) == 2) {
246 continue;
247 }
248 else if (strcmp (argv[i] + 2, "src1_rect") == 0 && ++i < argc &&
249 sscanf (argv[i], "%d_%d_%d_%d",
250 &src1_rect_x, &src1_rect_y, &src1_rect_w, &src1_rect_h) == 4) {
251 continue;
252 }
253 else if (strcmp (argv[i] + 2, "src2_rect") == 0 && ++i < argc &&
254 sscanf (argv[i], "%d_%d_%d_%d",
255 &src2_rect_x, &src2_rect_y, &src2_rect_w, &src2_rect_h) == 4) {
256 continue;
257 }
258 else if (strcmp (argv[i] + 2, "dst_rect") == 0 && ++i < argc &&
259 sscanf (argv[i], "%d_%d_%d_%d",
260 &dst_rect_x, &dst_rect_y, &dst_rect_w, &dst_rect_h) == 4) {
261 continue;
262 }
263 else if (strcmp (argv[i] + 2, "strechblit") == 0 && ++i < argc &&
264 sscanf (argv[i], "%d_%d_%d_%d-%d_%d_%d_%d",
265 &src1_rect_x, &src1_rect_y, &src1_rect_w, &src1_rect_h,
266 &dst_rect_x, &dst_rect_y, &dst_rect_w, &dst_rect_h) == 8) {
267 continue;
268 }
269 else if (strcmp (argv[i] + 2, "fillrect") == 0 && ++i < argc &&
270 sscanf (argv[i], "%x_%d_%d_%d_%d",
271 &rect_color, &dst_rect_x, &dst_rect_y, &dst_rect_w, &dst_rect_h) == 5) {
272 continue;
273 }
274 else if (strcmp (argv[i] + 2, "src1_file") == 0 && ++i < argc &&
Cao Jian65331472019-11-01 21:01:49 +0800275 sscanf (argv[i], "%s", SRC1_FILE_NAME) == 1) {
Jian Caob9fb3ed2019-04-16 16:51:27 +0800276 continue;
277 }
278 else if (strcmp (argv[i] + 2, "src2_file") == 0 && ++i < argc &&
Cao Jian65331472019-11-01 21:01:49 +0800279 sscanf (argv[i], "%s", SRC2_FILE_NAME) == 1) {
Jian Caob9fb3ed2019-04-16 16:51:27 +0800280 continue;
281 }
282 else if (strcmp (argv[i] + 2, "dst_file") == 0 && ++i < argc &&
Cao Jian65331472019-11-01 21:01:49 +0800283 sscanf (argv[i], "%s", DST_FILE_NAME) == 1) {
Jian Caob9fb3ed2019-04-16 16:51:27 +0800284 dst_canvas_alloc = 1;
285 continue;
286 }
287 else if (strcmp (argv[i] + 2, "src1_canvas_alloc") == 0 && ++i < argc &&
288 sscanf (argv[i], "%d", &src1_canvas_alloc) == 1) {
289 continue;
290 }
291 else if (strcmp (argv[i] + 2, "src2_canvas_alloc") == 0 && ++i < argc &&
292 sscanf (argv[i], "%d", &src2_canvas_alloc) == 1) {
293 continue;
294 }
Cao Jian65331472019-11-01 21:01:49 +0800295 else if (strcmp (argv[i] + 2, "src1_planenumber") == 0 && ++i < argc &&
296 sscanf (argv[i], "%d", &src1_plane_number) == 1) {
297 continue;
298 }
299 else if (strcmp (argv[i] + 2, "src2_planenumber") == 0 && ++i < argc &&
300 sscanf (argv[i], "%d", &src2_plane_number) == 1) {
301 continue;
302 }
303 else if (strcmp (argv[i] + 2, "dst_planenumber") == 0 && ++i < argc &&
304 sscanf (argv[i], "%d", &dst_plane_number) == 1) {
305 continue;
306 }
Cao Jiane80b1392019-08-07 20:59:47 +0800307 else if (strcmp (argv[i] + 2, "n") == 0 && ++i < argc &&
308 sscanf (argv[i], "%d", &num_process) == 1) {
309 continue;
310 }
Cao Jian53a15142019-08-16 13:58:17 +0800311 else if (strcmp (argv[i] + 2, "p") == 0 && ++i < argc &&
312 sscanf (argv[i], "%d", &num_thread) == 1) {
313 continue;
314 }
315 else if (strcmp (argv[i] + 2, "p_n") == 0 && ++i < argc &&
316 sscanf (argv[i], "%d", &num_process_per_thread) == 1) {
317 continue;
318 }
Cao Jian2b1d6972020-09-11 16:55:49 +0800319 else if (strcmp (argv[i] + 2, "s") == 0 && ++i < argc &&
320 sscanf (argv[i], "%d", &separate_step) == 1) {
321 continue;
322 }
323
Jian Caob9fb3ed2019-04-16 16:51:27 +0800324 }
325 }
326 return ge2d_success;
327}
328
Cao Jian65331472019-11-01 21:01:49 +0800329static int check_plane_number(int plane_number, int format)
330{
331 int ret = -1;
332 printf("plane_number=%d,format=%d\n", plane_number, format);
333 if (plane_number == 1) {
334 ret = 0;
335 } else if (plane_number == 2) {
336 if ((format == PIXEL_FORMAT_YCrCb_420_SP) ||
337 (format == PIXEL_FORMAT_YCbCr_420_SP_NV12) ||
338 (format == PIXEL_FORMAT_YCbCr_422_SP))
339 ret = 0;
340 } else if (plane_number == 3) {
341 if (format == PIXEL_FORMAT_YV12)
342 ret = 0;
343 }
344 return ret;
345}
Jian Caob9fb3ed2019-04-16 16:51:27 +0800346
Cao Jian53a15142019-08-16 13:58:17 +0800347static int aml_read_file_src1(aml_ge2d_t *amlge2d, const char* url)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800348{
349 int fd = -1;
350 int length = 0;
351 int read_num = 0;
Cao Jian65331472019-11-01 21:01:49 +0800352 int i;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800353
354 fd = open(url,O_RDONLY );
355 if (fd < 0) {
356 E_GE2D("read source file:%s open error\n",url);
357 return ge2d_fail;
358 }
Cao Jian65331472019-11-01 21:01:49 +0800359 for (i = 0; i < amlge2d->ge2dinfo.src_info[0].plane_number; i++) {
360 if (amlge2d->src_size[i] == 0) {
361 E_GE2D("src_size[i]=%d\n",amlge2d->src_size[i]);
362 close(fd);
363 return 0;
364 }
365 amlge2d->src_data[i] = (char*)malloc(amlge2d->src_size[i]);
366 if (!amlge2d->src_data[i]) {
367 E_GE2D("malloc for src_data failed\n");
368 close(fd);
369 return ge2d_fail;
370 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800371
Cao Jian65331472019-11-01 21:01:49 +0800372 read_num = read(fd,amlge2d->src_data[i],amlge2d->src_size[i]);
373 if (read_num <= 0) {
374 E_GE2D("read file read_num=%d error\n",read_num);
375 close(fd);
376 return ge2d_fail;
377 }
378
379 memcpy(amlge2d->ge2dinfo.src_info[0].vaddr[i], amlge2d->src_data[i], amlge2d->src_size[i]);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800380 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800381 close(fd);
382 return ge2d_success;
383}
384
Cao Jian53a15142019-08-16 13:58:17 +0800385static int aml_read_file_src2(aml_ge2d_t *amlge2d, const char* url)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800386{
387 int fd = -1;
388 int length = 0;
389 int read_num = 0;
Cao Jian65331472019-11-01 21:01:49 +0800390 int i;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800391
392 fd = open(url,O_RDONLY );
393 if (fd < 0) {
394 E_GE2D("read source file:%s open error\n",url);
395 return ge2d_fail;
396 }
Cao Jian65331472019-11-01 21:01:49 +0800397 for (i = 0; i < amlge2d->ge2dinfo.src_info[1].plane_number; i++) {
398 if (amlge2d->src2_size[i] == 0) {
399 E_GE2D("src2_size[i]=%d\n",amlge2d->src2_size[i]);
400 close(fd);
401 return 0;
402 }
403 amlge2d->src2_data[i] = (char*)malloc(amlge2d->src2_size[i]);
404 if (!amlge2d->src2_data[i]) {
405 E_GE2D("malloc for src_data failed\n");
406 close(fd);
407 return ge2d_fail;
408 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800409
Cao Jian65331472019-11-01 21:01:49 +0800410 read_num = read(fd,amlge2d->src2_data[i],amlge2d->src2_size[i]);
411 if (read_num <= 0) {
412 E_GE2D("read file read_num=%d error\n",read_num);
413 close(fd);
414 return ge2d_fail;
415 }
416
417 memcpy(amlge2d->ge2dinfo.src_info[1].vaddr[i], amlge2d->src2_data[i], amlge2d->src2_size[i]);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800418 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800419 close(fd);
420 return ge2d_success;
421}
422
Cao Jian53a15142019-08-16 13:58:17 +0800423static int aml_write_file(aml_ge2d_t *amlge2d, const char* url)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800424{
425 int fd = -1;
426 int length = 0;
427 int write_num = 0;
428 unsigned int *value;
Cao Jian65331472019-11-01 21:01:49 +0800429 int i;
430
Cao Jian53a15142019-08-16 13:58:17 +0800431 if ((GE2D_CANVAS_OSD0 == amlge2d->ge2dinfo.dst_info.memtype)
432 || (GE2D_CANVAS_OSD1 == amlge2d->ge2dinfo.dst_info.memtype))
Jian Caob9fb3ed2019-04-16 16:51:27 +0800433 return 0;
434
435 fd = open(url,O_RDWR | O_CREAT,0660);
436 if (fd < 0) {
437 E_GE2D("write file:%s open error\n",url);
438 return ge2d_fail;
439 }
Cao Jian65331472019-11-01 21:01:49 +0800440 for (i = 0; i < amlge2d->ge2dinfo.dst_info.plane_number; i++) {
441 if (amlge2d->dst_size[i] == 0) {
442 E_GE2D("dst_size[%d]=%d\n",i, amlge2d->dst_size[i]);
443 close(fd);
444 return 0;
445 }
446 amlge2d->dst_data[i] = (char*)malloc(amlge2d->dst_size[i]);
447 if (!amlge2d->dst_data[i]) {
448 E_GE2D("malloc for dst_data failed\n");
449 close(fd);
450 return ge2d_fail;
451 }
452 memcpy(amlge2d->dst_data[i], amlge2d->ge2dinfo.dst_info.vaddr[i], amlge2d->dst_size[i]);
453 printf("pixel: 0x%2x, 0x%2x,0x%2x,0x%2x, 0x%2x,0x%2x,0x%2x,0x%2x\n",
454 amlge2d->dst_data[i][0],
455 amlge2d->dst_data[i][1],
456 amlge2d->dst_data[i][2],
457 amlge2d->dst_data[i][3],
458 amlge2d->dst_data[i][4],
459 amlge2d->dst_data[i][5],
460 amlge2d->dst_data[i][6],
461 amlge2d->dst_data[i][7]);
462 write_num = write(fd,amlge2d->dst_data[i],amlge2d->dst_size[i]);
463 if (write_num <= 0) {
464 E_GE2D("write file write_num=%d error\n",write_num);
465 close(fd);
466 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800467 }
468 close(fd);
469 return ge2d_success;
470}
471
Cao Jian2b1d6972020-09-11 16:55:49 +0800472static int do_cmd(aml_ge2d_info_t *pge2dinfo)
473{
474 unsigned long stime;
475 int i, ret = -1;
476 int attach_flag = 0;
477
478 if (!pge2dinfo) {
479 printf("pge2dinfo is null\n");
480 return ge2d_fail;
481 }
482
483 if (separate_step) {
484 /* attach dma fd for src1/src2/dst */
485 switch (pge2dinfo->ge2d_op) {
486 case AML_GE2D_FILLRECTANGLE:
487 attach_flag = ATTACH_DST;
488 break;
489 case AML_GE2D_BLEND:
490 attach_flag = ATTACH_SRC | ATTACH_SRC2 | ATTACH_DST;
491 break;
492 case AML_GE2D_STRETCHBLIT:
493 case AML_GE2D_BLIT:
494 attach_flag = ATTACH_SRC | ATTACH_DST;
495 break;
496 default:
497 E_GE2D("%s, ge2d_op is invalid\n", __func__);
498 return ge2d_fail;
499 }
500
501 if (attach_flag | ATTACH_SRC) {
502 ret = aml_ge2d_attach_dma_fd(pge2dinfo, AML_GE2D_SRC);
503 if (ret < 0)
504 return ret;
505 }
506
507 if (attach_flag | ATTACH_SRC2) {
508 ret = aml_ge2d_attach_dma_fd(pge2dinfo, AML_GE2D_SRC2);
509 if (ret < 0)
510 return ret;
511 }
512
513 if (attach_flag | ATTACH_DST) {
514 ret = aml_ge2d_attach_dma_fd(pge2dinfo, AML_GE2D_DST);
515 if (ret < 0)
516 return ret;
517 }
518
519 /* config once or more times */
520 ret = aml_ge2d_config(pge2dinfo);
521 if (ret < 0)
522 return ret;
523
524 stime = myclock();
525 /* execute one or more times */
526 for (i = 0; i < num_process; i++) {
527 ret = aml_ge2d_execute(pge2dinfo);
528 if (ret < 0) {
529 printf("ge2d process failed, %s (%d)\n", __func__, __LINE__);
530 return ret;
531 }
532 }
533 /* detach dma fd for src1/src2/dst */
534 if (attach_flag | ATTACH_SRC)
535 aml_ge2d_detach_dma_fd(pge2dinfo, AML_GE2D_SRC);
536 if (attach_flag | ATTACH_SRC2)
537 aml_ge2d_detach_dma_fd(pge2dinfo, AML_GE2D_SRC2);
538 if (attach_flag | ATTACH_DST)
539 aml_ge2d_detach_dma_fd(pge2dinfo, AML_GE2D_DST);
540 } else {
541 stime = myclock();
542 for (i = 0; i < num_process; i++) {
543 ret = aml_ge2d_process(pge2dinfo);
544 if (ret < 0) {
545 printf("ge2d process failed, %s (%d)\n", __func__, __LINE__);
546 return ret;
547 }
548 }
549 }
550 printf("separate_step=%d time=%ld ms\n", separate_step, myclock() - stime);
551
552 return ret;
553}
554
Cao Jian53a15142019-08-16 13:58:17 +0800555static int do_fill_rectangle(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800556{
557 int ret = -1;
558 char code;
Cao Jiane80b1392019-08-07 20:59:47 +0800559 int i;
560 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +0800561 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800562
563 printf("do_fill_rectangle test case:\n");
564
565 pge2dinfo->color = rect_color;
566 pge2dinfo->dst_info.rect.x = dst_rect_x;
Cao Jian088facb2020-03-09 17:24:26 +0800567 pge2dinfo->dst_info.rect.y = dst_rect_y;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800568 pge2dinfo->dst_info.rect.w = dst_rect_w;
569 pge2dinfo->dst_info.rect.h = dst_rect_h;
Cao Jian2b1d6972020-09-11 16:55:49 +0800570 ret = do_cmd(pge2dinfo);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800571 #if 0
572 sleep(5);
573
574 printf("please enter any key do rotation test[90]\n");
575 code = getc(stdin);
576 pge2dinfo->dst_info.rotation = GE2D_ROTATION_180;
577 ret = aml_ge2d_process(pge2dinfo);
578 #endif
Cao Jian53a15142019-08-16 13:58:17 +0800579 if (ret < 0)
580 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800581 return ret;
582}
583
584
Cao Jian53a15142019-08-16 13:58:17 +0800585static int do_blend(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800586{
Cao Jian65331472019-11-01 21:01:49 +0800587 int ret = -1, i;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800588 char code = 0;
589 int shared_fd_bakup;
590 unsigned long offset_bakup = 0;
Cao Jiane80b1392019-08-07 20:59:47 +0800591 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +0800592 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
Cao Jiane80b1392019-08-07 20:59:47 +0800593
Jian Caob9fb3ed2019-04-16 16:51:27 +0800594 printf("do_blend test case:\n");
595
Cao Jian381fe962020-10-21 15:28:22 +0800596 if (pge2dinfo->cap_attr & SRC2_ALPHA) {
Jian Caob9fb3ed2019-04-16 16:51:27 +0800597 /* do blend src1 blend src2(dst) to dst */
598 printf("one step blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800599 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800600 if (ret < 0)
601 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +0800602 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800603 if (ret < 0)
604 return ge2d_fail;
605
606 pge2dinfo->src_info[0].rect.x = src1_rect_x;
607 pge2dinfo->src_info[0].rect.y = src1_rect_y;
608 pge2dinfo->src_info[0].rect.w = src1_rect_w;
609 pge2dinfo->src_info[0].rect.h = src1_rect_h;
610 pge2dinfo->src_info[0].fill_color_en = 0;
611
612 pge2dinfo->src_info[1].rect.x = src2_rect_x;
613 pge2dinfo->src_info[1].rect.y = src2_rect_y;
614 pge2dinfo->src_info[1].rect.w = src2_rect_w;
615 pge2dinfo->src_info[1].rect.h = src2_rect_h;
616 pge2dinfo->src_info[1].fill_color_en = 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800617
618 pge2dinfo->dst_info.rect.x = dst_rect_x;
619 pge2dinfo->dst_info.rect.y = dst_rect_y;
620 pge2dinfo->dst_info.rect.w = dst_rect_w;
621 pge2dinfo->dst_info.rect.h = dst_rect_h;
622 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
623
624 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
625 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
626 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
627 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
Cao Jian2b1d6972020-09-11 16:55:49 +0800628
629 ret = do_cmd(pge2dinfo);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800630 } else {
631 if (((gb1_alpha != 0xff)
632 && (gb2_alpha != 0xff))){
633 printf("two steps blend,two plane alpha\n");
634
635 if (src2_layer_mode == LAYER_MODE_COVERAGE) {
636 printf("two steps blend,src2 LAYER_MODE_COVERAGE\n");
Cao Jian53a15142019-08-16 13:58:17 +0800637 ret = aml_read_file_src1(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800638 if (ret < 0)
639 return ge2d_fail;
640
641 /* both plane alpha, do 2 steps */
642 /* step 1: strechbilt */
643 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
644 /* src2 do strechbilt to dst */
645 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
646 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
647 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
648 pge2dinfo->src_info[0].rect.x = 0;
649 pge2dinfo->src_info[0].rect.y = 0;
650 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
651 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
652 pge2dinfo->src_info[0].fill_color_en = 0;
653
654 pge2dinfo->src_info[1].canvas_w = SX_DST;
655 pge2dinfo->src_info[1].canvas_h = SY_DST;
656 pge2dinfo->src_info[1].format = DST_PIXFORMAT;
657 pge2dinfo->src_info[1].rect.x = 0;
658 pge2dinfo->src_info[1].rect.y = 0;
659 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
660 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
661 pge2dinfo->src_info[1].fill_color_en = 1;
662 pge2dinfo->src_info[1].def_color = 0x00;
663
664 pge2dinfo->dst_info.canvas_w = SX_DST;
665 pge2dinfo->dst_info.canvas_h = SY_DST;
666 pge2dinfo->dst_info.format = DST_PIXFORMAT;
667 pge2dinfo->dst_info.rect.x = 0;
668 pge2dinfo->dst_info.rect.y = 0;
669 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
670 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
671 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
672
673 pge2dinfo->src_info[0].layer_mode = LAYER_MODE_COVERAGE;
674 pge2dinfo->src_info[1].layer_mode = LAYER_MODE_COVERAGE;
675 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
676 pge2dinfo->src_info[1].plane_alpha = 0xff;
677 ret = aml_ge2d_process(pge2dinfo);
Cao Jian53a15142019-08-16 13:58:17 +0800678 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800679 if (ret < 0)
680 return ge2d_fail;
681
682 /* step2: blend src1 blend src2(dst) to dst */
683 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
684
685 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
686 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
687 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
688 pge2dinfo->src_info[0].rect.x = 0;
689 pge2dinfo->src_info[0].rect.y = 0;
690 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
691 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
692 pge2dinfo->src_info[0].fill_color_en = 0;
693
694 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
695 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
696 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
697 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
698 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
699 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
700 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800701 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
702 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800703 pge2dinfo->src_info[1].fill_color_en = 0;
704
705 pge2dinfo->dst_info.canvas_w = SX_DST;
706 pge2dinfo->dst_info.canvas_h = SY_DST;
707 pge2dinfo->dst_info.format = DST_PIXFORMAT;
708 pge2dinfo->dst_info.rect.x = 0;
709 pge2dinfo->dst_info.rect.y = 0;
710 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
711 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
712 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
713
714 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
715 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
716 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
717 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
718 ret = aml_ge2d_process(pge2dinfo);
719 } else {
Cao Jian53a15142019-08-16 13:58:17 +0800720 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800721 if (ret < 0)
722 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +0800723 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800724 if (ret < 0)
725 return ge2d_fail;
726 printf("two step: strechbilt+blend\n");
727 /* both plane alpha, do 2 steps */
728 /* step 1: strechbilt */
729 pge2dinfo->ge2d_op = AML_GE2D_STRETCHBLIT;
730 /* src2 do strechbilt to dst */
731 pge2dinfo->src_info[0].canvas_w = SX_SRC2;
732 pge2dinfo->src_info[0].canvas_h = SY_SRC2;
733 pge2dinfo->src_info[0].format = SRC2_PIXFORMAT;
734 pge2dinfo->src_info[0].rect.x = 0;
735 pge2dinfo->src_info[0].rect.y = 0;
736 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
737 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
738
Cao Jian65331472019-11-01 21:01:49 +0800739 shared_fd_bakup = pge2dinfo->src_info[0].shared_fd[0];
740 offset_bakup = pge2dinfo->src_info[0].offset[0];
741 pge2dinfo->src_info[0].shared_fd[0] = pge2dinfo->src_info[1].shared_fd[0];
742 pge2dinfo->src_info[0].offset[0] = pge2dinfo->src_info[1].offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800743
744 pge2dinfo->src_info[0].layer_mode = src2_layer_mode;
745 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
746 pge2dinfo->dst_info.canvas_w = SX_DST;
747 pge2dinfo->dst_info.canvas_h = SY_DST;
748 pge2dinfo->dst_info.format = DST_PIXFORMAT;
749 pge2dinfo->dst_info.rect.x = 0;
750 pge2dinfo->dst_info.rect.y = 0;
751 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
752 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
753 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
754 ret = aml_ge2d_process(pge2dinfo);
755
756 /* step2: blend src1 blend src2(dst) to dst */
757 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
758
759 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
760 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
761 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
762 pge2dinfo->src_info[0].rect.x = 0;
763 pge2dinfo->src_info[0].rect.y = 0;
764 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
765 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jian65331472019-11-01 21:01:49 +0800766 pge2dinfo->src_info[0].shared_fd[0] = shared_fd_bakup;
767 pge2dinfo->src_info[0].offset[0] = offset_bakup;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800768 pge2dinfo->src_info[0].fill_color_en = 0;
769
770 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
771 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
772 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
773 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
774 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
775 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
776 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800777 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
778 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800779 pge2dinfo->src_info[1].fill_color_en = 0;
780
781 pge2dinfo->dst_info.canvas_w = SX_DST;
782 pge2dinfo->dst_info.canvas_h = SY_DST;
783 pge2dinfo->dst_info.format = DST_PIXFORMAT;
784 pge2dinfo->dst_info.rect.x = 0;
785 pge2dinfo->dst_info.rect.y = 0;
786 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
787 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
788 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
789
790 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
791 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
792 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
793 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
794 ret = aml_ge2d_process(pge2dinfo);
795 }
796 } else if (src2_layer_mode == LAYER_MODE_COVERAGE){
797 printf("two steps blend,src2 LAYER_MODE_COVERAGE: two blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800798 ret = aml_read_file_src1(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800799 if (ret < 0)
800 return ge2d_fail;
801 /* both plane alpha, do 2 steps */
802 /* step 1: strechbilt */
803 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
804 /* src2 do strechbilt to dst */
805 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
806 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
807 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
808 pge2dinfo->src_info[0].rect.x = 0;
809 pge2dinfo->src_info[0].rect.y = 0;
810 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
811 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
812 pge2dinfo->src_info[0].fill_color_en = 0;
813
814 pge2dinfo->src_info[1].canvas_w = SX_DST;
815 pge2dinfo->src_info[1].canvas_h = SY_DST;
816 pge2dinfo->src_info[1].format = DST_PIXFORMAT;
817 pge2dinfo->src_info[1].rect.x = 0;
818 pge2dinfo->src_info[1].rect.y = 0;
819 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
820 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
821 pge2dinfo->src_info[1].fill_color_en = 1;
822 pge2dinfo->src_info[1].def_color = 0x00;
823
824 pge2dinfo->dst_info.canvas_w = SX_DST;
825 pge2dinfo->dst_info.canvas_h = SY_DST;
826 pge2dinfo->dst_info.format = DST_PIXFORMAT;
827 pge2dinfo->dst_info.rect.x = 0;
828 pge2dinfo->dst_info.rect.y = 0;
829 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
830 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
831 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
832
833 pge2dinfo->src_info[0].layer_mode = LAYER_MODE_COVERAGE;
834 pge2dinfo->src_info[1].layer_mode = LAYER_MODE_COVERAGE;
835 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
836 pge2dinfo->src_info[1].plane_alpha = 0xff;
837 ret = aml_ge2d_process(pge2dinfo);
Cao Jian53a15142019-08-16 13:58:17 +0800838 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800839 if (ret < 0)
840 return ge2d_fail;
841 /* step2: blend src1 blend src2(dst) to dst */
842 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
843
844 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
845 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
846 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
847 pge2dinfo->src_info[0].rect.x = 0;
848 pge2dinfo->src_info[0].rect.y = 0;
849 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
850 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
851 pge2dinfo->src_info[0].fill_color_en = 0;
852
853 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
854 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
855 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
856 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
857 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
858 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
859 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800860 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
861 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800862 pge2dinfo->src_info[1].fill_color_en = 0;
863
864 pge2dinfo->dst_info.canvas_w = SX_DST;
865 pge2dinfo->dst_info.canvas_h = SY_DST;
866 pge2dinfo->dst_info.format = DST_PIXFORMAT;
867 pge2dinfo->dst_info.rect.x = 0;
868 pge2dinfo->dst_info.rect.y = 0;
869 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
870 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
871 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
872
873 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
874 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
875 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
876 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
877 ret = aml_ge2d_process(pge2dinfo);
878 } else if ((src2_layer_mode == LAYER_MODE_NON)
879 && (src1_layer_mode != LAYER_MODE_PREMULTIPLIED)){
880 printf("two steps blend,src2 LAYER_MODE_NON:strechbilt+blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800881 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800882 if (ret < 0)
883 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +0800884 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800885 if (ret < 0)
886 return ge2d_fail;
887 /* both plane alpha, do 2 steps */
888 /* step 1: strechbilt */
889 pge2dinfo->ge2d_op = AML_GE2D_STRETCHBLIT;
890 /* src2 do strechbilt to dst */
891 pge2dinfo->src_info[0].canvas_w = SX_SRC2;
892 pge2dinfo->src_info[0].canvas_h = SY_SRC2;
893 pge2dinfo->src_info[0].format = SRC2_PIXFORMAT;
894 pge2dinfo->src_info[0].rect.x = 0;
895 pge2dinfo->src_info[0].rect.y = 0;
896 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
897 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
898
Cao Jian65331472019-11-01 21:01:49 +0800899 shared_fd_bakup = pge2dinfo->src_info[0].shared_fd[0];
900 offset_bakup = pge2dinfo->src_info[0].offset[0];
901 pge2dinfo->src_info[0].shared_fd[0] = pge2dinfo->src_info[1].shared_fd[0];
902 pge2dinfo->src_info[0].offset[0] = pge2dinfo->src_info[1].offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800903 pge2dinfo->src_info[0].layer_mode = src2_layer_mode;
904 pge2dinfo->src_info[0].plane_alpha = 0xff;
905 pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888;
906
907 pge2dinfo->dst_info.canvas_w = SX_DST;
908 pge2dinfo->dst_info.canvas_h = SY_DST;
909 pge2dinfo->dst_info.format = DST_PIXFORMAT;
910 pge2dinfo->dst_info.rect.x = 0;
911 pge2dinfo->dst_info.rect.y = 0;
912 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
913 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
914 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
915 ret = aml_ge2d_process(pge2dinfo);
916
917 /* step2: blend src1 blend src2(dst) to dst */
918 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
919
920 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
921 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
922 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
923 pge2dinfo->src_info[0].rect.x = 0;
924 pge2dinfo->src_info[0].rect.y = 0;
925 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
926 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jian65331472019-11-01 21:01:49 +0800927 pge2dinfo->src_info[0].shared_fd[0] = shared_fd_bakup;
928 pge2dinfo->src_info[0].offset[0] = offset_bakup;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800929 pge2dinfo->src_info[0].fill_color_en = 0;
930
931 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
932 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
933 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
934 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
935 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
936 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
937 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800938 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
939 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800940 pge2dinfo->src_info[1].fill_color_en = 0;
941
942 pge2dinfo->dst_info.canvas_w = SX_DST;
943 pge2dinfo->dst_info.canvas_h = SY_DST;
944 pge2dinfo->dst_info.format = DST_PIXFORMAT;
945 pge2dinfo->dst_info.rect.x = 0;
946 pge2dinfo->dst_info.rect.y = 0;
947 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
948 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
949 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
950 printf("two steps blend,src1_layer_mode=%d,src2_layer_mode=%d\n",src1_layer_mode,src2_layer_mode);
951
952 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
953 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
954 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
955 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
956 ret = aml_ge2d_process(pge2dinfo);
957 } else {
958 /* do blend src1 blend src2(dst) to dst */
959 printf("one step blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800960 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800961 if (ret < 0)
962 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +0800963 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800964 if (ret < 0)
965 return ge2d_fail;
966 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
967 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
968 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
969 pge2dinfo->src_info[0].rect.x = 0;
970 pge2dinfo->src_info[0].rect.y = 0;
971 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
972 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
973 pge2dinfo->src_info[0].fill_color_en = 0;
974
975 pge2dinfo->src_info[1].canvas_w = SX_SRC2;
976 pge2dinfo->src_info[1].canvas_h = SY_SRC2;
977 pge2dinfo->src_info[1].format = SRC2_PIXFORMAT;
978 pge2dinfo->src_info[1].rect.x = 0;
979 pge2dinfo->src_info[1].rect.y = 0;
980 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
981 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
982 pge2dinfo->src_info[1].fill_color_en = 0;
983 if (src2_layer_mode == LAYER_MODE_NON)
984 pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888;
985 pge2dinfo->dst_info.canvas_w = SX_DST;
986 pge2dinfo->dst_info.canvas_h = SY_DST;
987 pge2dinfo->dst_info.format = DST_PIXFORMAT;
988 pge2dinfo->dst_info.rect.x = 0;
989 pge2dinfo->dst_info.rect.y = 0;
990 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
991 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
992 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
993
994 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
995 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
996 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
997 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
998 ret = aml_ge2d_process(pge2dinfo);
999 }
1000 }
Cao Jian53a15142019-08-16 13:58:17 +08001001 if (ret < 0)
1002 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001003 return ret;
1004}
1005
1006
Cao Jian53a15142019-08-16 13:58:17 +08001007static int do_strechblit(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +08001008{
1009 int ret = -1;
1010 char code = 0;
Cao Jiane80b1392019-08-07 20:59:47 +08001011 int i;
1012 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +08001013 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
1014
Jian Caob9fb3ed2019-04-16 16:51:27 +08001015 printf("do_strechblit test case:\n");
Cao Jian53a15142019-08-16 13:58:17 +08001016 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001017 if (ret < 0)
1018 return ge2d_fail;
1019
1020 pge2dinfo->src_info[0].rect.x = src1_rect_x;
1021 pge2dinfo->src_info[0].rect.y = src1_rect_y;
1022 pge2dinfo->src_info[0].rect.w = src1_rect_w;
1023 pge2dinfo->src_info[0].rect.h = src1_rect_h;
1024 pge2dinfo->dst_info.rect.x = dst_rect_x;
1025 pge2dinfo->dst_info.rect.y = dst_rect_y;
1026 pge2dinfo->dst_info.rect.w = dst_rect_w;
1027 pge2dinfo->dst_info.rect.h = dst_rect_h;
1028 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
1029 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1030 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1031
Cao Jian2b1d6972020-09-11 16:55:49 +08001032 ret = do_cmd(pge2dinfo);
1033
Jian Caob9fb3ed2019-04-16 16:51:27 +08001034 #if 0
1035 sleep(5);
1036
1037 printf("please enter any key do rotation test[90]\n");
1038 code = getc(stdin);
1039 pge2dinfo->dst_info.rotation = GE2D_ROTATION_90;
1040 ret = aml_ge2d_process(pge2dinfo);
1041 #endif
Cao Jian53a15142019-08-16 13:58:17 +08001042 if (ret < 0)
1043 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001044 return ret;
1045
1046}
1047
Cao Jian53a15142019-08-16 13:58:17 +08001048static int do_blit(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +08001049{
1050 int ret = -1;
1051 char code = 0;
Cao Jiane80b1392019-08-07 20:59:47 +08001052 int i;
1053 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +08001054 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
1055
Jian Caob9fb3ed2019-04-16 16:51:27 +08001056 printf("do_blit test case:\n");
Cao Jian53a15142019-08-16 13:58:17 +08001057 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001058 if (ret < 0)
1059 return ge2d_fail;
1060
1061 pge2dinfo->src_info[0].rect.x = src1_rect_x;
1062 pge2dinfo->src_info[0].rect.y = src1_rect_y;
1063 pge2dinfo->src_info[0].rect.w = src1_rect_w;
1064 pge2dinfo->src_info[0].rect.h = src1_rect_h;
1065 pge2dinfo->dst_info.rect.x = dst_rect_x;
1066 pge2dinfo->dst_info.rect.y = dst_rect_y;
1067
1068 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
1069 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1070 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1071
Cao Jian2b1d6972020-09-11 16:55:49 +08001072 ret = do_cmd(pge2dinfo);
1073
Jian Caob9fb3ed2019-04-16 16:51:27 +08001074 #if 0
1075 sleep(5);
1076
1077 printf("please enter any key do rotation test[90]\n");
1078 code = getc(stdin);
1079 pge2dinfo->dst_info.rotation = GE2D_ROTATION_90;
1080 pge2dinfo->src_info[0].rect.x = 0;
1081 pge2dinfo->src_info[0].rect.y = 0;
1082 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
1083 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
1084 pge2dinfo->dst_info.rect.x = 0;
1085 pge2dinfo->dst_info.rect.y = 0;
1086
1087 ret = aml_ge2d_process(pge2dinfo);
1088 #endif
Cao Jian53a15142019-08-16 13:58:17 +08001089 if (ret < 0)
1090 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001091 return ret;
1092}
1093
Cao Jian53a15142019-08-16 13:58:17 +08001094void *main_run(void *arg)
Jian Caob9fb3ed2019-04-16 16:51:27 +08001095{
1096 int ret = -1;
Cao Jian65331472019-11-01 21:01:49 +08001097 int i = 0, run_time = 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +08001098 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +08001099 aml_ge2d_t amlge2d;
Cao Jian65331472019-11-01 21:01:49 +08001100 char dst_file_name[128] = {};
Jian Cao49c82bd2019-06-04 12:49:10 +08001101
Cao Jian65331472019-11-01 21:01:49 +08001102 for (run_time = 0; run_time < num_process_per_thread; run_time++) {
1103 printf("ThreadIdx -- %d, run time -- %d\n", *(int *)arg, run_time);
1104 memset(&amlge2d, 0, sizeof(aml_ge2d_t));
Cao Jian53a15142019-08-16 13:58:17 +08001105 memset(&(amlge2d.ge2dinfo.src_info[0]), 0, sizeof(buffer_info_t));
1106 memset(&(amlge2d.ge2dinfo.src_info[1]), 0, sizeof(buffer_info_t));
1107 memset(&(amlge2d.ge2dinfo.dst_info), 0, sizeof(buffer_info_t));
1108
Cao Jian2b1d6972020-09-11 16:55:49 +08001109 for (i = 0; i < GE2D_MAX_PLANE; i++) {
Cao Jian65331472019-11-01 21:01:49 +08001110 amlge2d.ge2dinfo.src_info[0].shared_fd[i] = -1;
1111 amlge2d.ge2dinfo.src_info[1].shared_fd[i] = -1;
1112 amlge2d.ge2dinfo.dst_info.shared_fd[i] = -1;
1113 }
Cao Jian53a15142019-08-16 13:58:17 +08001114 set_ge2dinfo(&amlge2d.ge2dinfo);
Cao Jian65331472019-11-01 21:01:49 +08001115 ret = check_plane_number(amlge2d.ge2dinfo.src_info[0].plane_number,
1116 amlge2d.ge2dinfo.src_info[0].format);
1117 if (ret < 0) {
1118 printf("Error src1 plane_number=[%d], format=%d\n",
1119 amlge2d.ge2dinfo.src_info[0].plane_number,
1120 amlge2d.ge2dinfo.src_info[0].format);
1121 return NULL;
1122 }
1123 ret = check_plane_number(amlge2d.ge2dinfo.src_info[1].plane_number,
1124 amlge2d.ge2dinfo.src_info[1].format);
1125 if (ret < 0) {
1126 printf("Error src2 plane_number=[%d],format=%d\n",
1127 amlge2d.ge2dinfo.src_info[1].plane_number,
1128 amlge2d.ge2dinfo.src_info[1].format);
1129 return NULL;
1130 }
1131 ret = check_plane_number(amlge2d.ge2dinfo.dst_info.plane_number,
1132 amlge2d.ge2dinfo.dst_info.format);
1133 if (ret < 0) {
1134 printf("Error dst plane_number=[%d],format=%d\n",
1135 amlge2d.ge2dinfo.dst_info.plane_number,
1136 amlge2d.ge2dinfo.dst_info.format);
1137 return NULL;
1138 }
Cao Jian53a15142019-08-16 13:58:17 +08001139
1140 ret = aml_ge2d_init(&amlge2d);
1141 if (ret < 0)
1142 return NULL;
1143
1144 ret = aml_ge2d_mem_alloc(&amlge2d);
1145 if (ret < 0)
1146 goto exit;
1147 #if 0
1148 /* if dma_buf and used fd alloc other driver */
1149 /* set dma buf fd */
1150 amlge2d.ge2dinfo.src_info[0].shared_fd = dma_fd;
1151 amlge2d.ge2dinfo.src_info[0].memtype = GE2D_CANVAS_ALLOC;
1152 #endif
1153
1154 switch (amlge2d.ge2dinfo.ge2d_op)
1155 {
1156 case AML_GE2D_FILLRECTANGLE:
1157 ret = do_fill_rectangle(&amlge2d);
1158 break;
1159 case AML_GE2D_BLEND:
1160 ret = do_blend(&amlge2d);
1161 break;
1162 case AML_GE2D_STRETCHBLIT:
1163 ret = do_strechblit(&amlge2d);
1164 break;
1165 case AML_GE2D_BLIT:
1166 ret = do_blit(&amlge2d);
1167 break;
1168 default:
1169 E_GE2D("not support ge2d op,exit test!\n");
1170 break;
1171 }
1172 if (ret < 0)
1173 goto exit;
1174
1175 if (amlge2d.ge2dinfo.dst_info.mem_alloc_type == AML_GE2D_MEM_ION)
1176 aml_ge2d_invalid_cache(&amlge2d.ge2dinfo);
Cao Jian65331472019-11-01 21:01:49 +08001177 sprintf(dst_file_name, "%s_thread%d_%d", DST_FILE_NAME, *(int *)arg, run_time);
1178 ret = aml_write_file(&amlge2d, dst_file_name);
Cao Jian53a15142019-08-16 13:58:17 +08001179 if (ret < 0)
1180 goto exit;
1181 exit:
Cao Jian65331472019-11-01 21:01:49 +08001182 for (i = 0; i < amlge2d.ge2dinfo.src_info[0].plane_number; i++) {
1183 if (amlge2d.src_data[i]) {
1184 free(amlge2d.src_data[i]);
1185 amlge2d.src_data[i] = NULL;
1186 }
Cao Jian53a15142019-08-16 13:58:17 +08001187 }
1188
Cao Jian65331472019-11-01 21:01:49 +08001189 for (i = 0; i < amlge2d.ge2dinfo.src_info[1].plane_number; i++) {
1190 if (amlge2d.src2_data[i]) {
1191 free(amlge2d.src2_data[i]);
1192 amlge2d.src2_data[i] = NULL;
1193 }
1194 }
1195
1196 for (i = 0; i < amlge2d.ge2dinfo.dst_info.plane_number; i++) {
1197 if (amlge2d.dst_data[i]) {
1198 free(amlge2d.dst_data[i]);
1199 amlge2d.dst_data[i] = NULL;
1200 }
1201 }
Cao Jian53a15142019-08-16 13:58:17 +08001202 aml_ge2d_mem_free(&amlge2d);
1203 aml_ge2d_exit(&amlge2d);
1204 }
1205 printf("ge2d feature_test exit!!!\n");
1206
1207 return NULL;
1208}
1209
1210int main(int argc, char **argv)
1211{
1212 int ret = -1, i;
1213 pthread_t thread[THREADS_MAX_NUM];
1214 int threadindex[THREADS_MAX_NUM];
1215
1216 if (num_thread > THREADS_MAX_NUM) {
1217 E_GE2D("num of thread greater than THREADS_MAX_NUM\n");
1218 return -1;
1219 }
1220 memset(&thread, 0, sizeof(thread));
1221
1222 ret = parse_command_line(argc, argv);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001223 if (ret == ge2d_fail)
1224 return ge2d_success;
1225
Cao Jian65331472019-11-01 21:01:49 +08001226 for (i = 0; i < num_thread; i++) {
Cao Jian53a15142019-08-16 13:58:17 +08001227 threadindex[i] = i;
Cao Jian65331472019-11-01 21:01:49 +08001228 ret = pthread_create(&(thread[i]), NULL, main_run, (void *)&threadindex[i]);
1229 if (ret != 0) {
Cao Jian53a15142019-08-16 13:58:17 +08001230 E_GE2D("integral thread %d creation failed!", i);
1231 return -1;
1232 }
1233 }
Cao Jian65331472019-11-01 21:01:49 +08001234 for (i = 0; i < num_thread; i++)
Cao Jian53a15142019-08-16 13:58:17 +08001235 pthread_join(thread[i], NULL);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001236
Cao Jian53a15142019-08-16 13:58:17 +08001237 return 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +08001238}