blob: f8252b8d25e562e544412c0dd5ebce3154cd88d6 [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;
66
67#define THREADS_MAX_NUM (64)
Cao Jiane80b1392019-08-07 20:59:47 +080068
69static inline unsigned long myclock()
70{
71 struct timeval tv;
72
73 gettimeofday (&tv, NULL);
74
75 return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
76}
Jian Caob9fb3ed2019-04-16 16:51:27 +080077
78static void set_ge2dinfo(aml_ge2d_info_t *pge2dinfo)
79{
80 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
81 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
82 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
Cao Jian65331472019-11-01 21:01:49 +080083 pge2dinfo->src_info[0].plane_number = src1_plane_number;
Jian Caob9fb3ed2019-04-16 16:51:27 +080084
85 pge2dinfo->src_info[1].canvas_w = SX_SRC2;
86 pge2dinfo->src_info[1].canvas_h = SY_SRC2;
87 pge2dinfo->src_info[1].format = SRC2_PIXFORMAT;
Cao Jian65331472019-11-01 21:01:49 +080088 pge2dinfo->src_info[1].plane_number = src2_plane_number;
Jian Caob9fb3ed2019-04-16 16:51:27 +080089
90 pge2dinfo->dst_info.canvas_w = SX_DST;
91 pge2dinfo->dst_info.canvas_h = SY_DST;
92 pge2dinfo->dst_info.format = DST_PIXFORMAT;
Cao Jian65331472019-11-01 21:01:49 +080093 pge2dinfo->dst_info.plane_number = dst_plane_number;
Jian Caob9fb3ed2019-04-16 16:51:27 +080094 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
95 pge2dinfo->offset = 0;
96 pge2dinfo->ge2d_op = OP;
97 pge2dinfo->blend_mode = BLEND_MODE_PREMULTIPLIED;
98
99 switch (pge2dinfo->ge2d_op)
100 {
101 case AML_GE2D_FILLRECTANGLE:
102 pge2dinfo->src_info[0].memtype = GE2D_CANVAS_TYPE_INVALID;
103 pge2dinfo->src_info[1].memtype = GE2D_CANVAS_TYPE_INVALID;
104 pge2dinfo->dst_info.memtype = dst_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
105 break;
106 case AML_GE2D_BLIT:
107 case AML_GE2D_STRETCHBLIT:
108 /* if not need alloc, set to GE2D_CANVAS_TYPE_INVALID
109 * otherwise set to GE2D_CANVAS_ALLOC
110 */
111 pge2dinfo->src_info[0].memtype = src1_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;;
112 pge2dinfo->src_info[1].memtype = GE2D_CANVAS_TYPE_INVALID;
113 pge2dinfo->dst_info.memtype = dst_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
114 break;
115 case AML_GE2D_BLEND:
116 pge2dinfo->src_info[0].memtype = src1_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;;
117 pge2dinfo->src_info[1].memtype = src2_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;;
118 pge2dinfo->dst_info.memtype = dst_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
119 break;
120 default:
121 E_GE2D("not support ge2d op,exit test!\n");
122 break;
123 }
124 /*set to AML_GE2D_MEM_DMABUF or AML_GE2D_MEM_ION*/
125 pge2dinfo->src_info[0].mem_alloc_type = src1_mem_alloc_type;
126 pge2dinfo->src_info[1].mem_alloc_type = src2_mem_alloc_type;
127 pge2dinfo->dst_info.mem_alloc_type = dst_mem_alloc_type;
128}
129
130static void print_usage(void)
131{
132 int i;
133 printf ("Usage: ge2d_feature_test [options]\n\n");
134 printf ("Options:\n\n");
135 printf (" --op <0:fillrect, 1:blend, 2:strechblit, 3:blit> ge2d operation case.\n");
136 printf (" --size <WxH> define src1/src2/dst size.\n");
137 printf (" --src1_memtype <0: ion, 1: dmabuf> define memory alloc type.\n");
138 printf (" --src2_memtype <0: ion, 1: dmabuf> define memory alloc type.\n");
139 printf (" --dst_memtype <0: ion, 1: dmabuf> define memory alloc type.\n");
Cao Jian65331472019-11-01 21:01:49 +0800140 printf (" --src1_format <num> define src1 format.\n");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800141 printf (" --src2_format <num> define src2 format.\n");
142 printf (" --dst_format <num> define dst format.\n");
Cao Jian65331472019-11-01 21:01:49 +0800143 printf (" --src1_size <WxH> define src1 size.\n");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800144 printf (" --src2_size <WxH> define src2 size.\n");
145 printf (" --dst_size <WxH> define dst size.\n");
Cao Jian65331472019-11-01 21:01:49 +0800146 printf (" --src1_file <name> define src1 file.\n");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800147 printf (" --src2_file <name> define src2 file.\n");
148 printf (" --dst_file <name> define dst file.\n");
Cao Jian65331472019-11-01 21:01:49 +0800149 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 +0800150 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 +0800151 printf (" --src1_rect <x_y_w_h> define src1 rect.\n");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800152 printf (" --src2_rect <x_y_w_h> define src2 rect.\n");
153 printf (" --dst_rect <x_y_w_h> define dst rect.\n");
154 printf (" --bo1 <layer_mode_num> define src1_layer_mode.\n");
155 printf (" --bo2 <layer_mode_num> define src2_layer_mode.\n");
156 printf (" --gb1 <gb1_alpha> define src1 global alpha.\n");
157 printf (" --gb2 <gb2_alpha> define src2 global alpha.\n");
158 printf (" --strechblit <x0_y0_w_h-x1_y1_w1_h1> define strechblit info.\n");
159 printf (" --fillrect <color_x_y_w_h> define fillrect info, color in rgba format.\n");
Cao Jian65331472019-11-01 21:01:49 +0800160 printf (" --src1_planenumber <num> define src1 plane number.\n");
161 printf (" --src2_planenumber <num> define src2 plane number.\n");
162 printf (" --dst_planenumber <num> define dst plane number.\n");
163 printf (" --n <num> process num times for performance test.\n");
Cao Jian53a15142019-08-16 13:58:17 +0800164 printf (" --p <num> multi-thread process, num of threads");
165 printf (" --p_n <num> num of process for every thread.\n");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800166 printf (" --help Print usage information.\n");
167 printf ("\n");
168}
169
170static int parse_command_line(int argc, char *argv[])
171{
172 int i;
173 /* parse command line */
174 for (i = 1; i < argc; i++) {
175 if (strncmp (argv[i], "--", 2) == 0) {
176 if (strcmp (argv[i] + 2, "help") == 0) {
177 print_usage();
178 return ge2d_fail;
179 }
180 else if (strcmp (argv[i] + 2, "op") == 0 && ++i < argc &&
181 sscanf (argv[i], "%d", &OP) == 1) {
182 continue;
183 }
184 else if (strcmp (argv[i] + 2, "src1_memtype") == 0 && ++i < argc &&
185 sscanf (argv[i], "%d", &src1_mem_alloc_type) == 1) {
186 continue;
187 }
188 else if (strcmp (argv[i] + 2, "src2_memtype") == 0 && ++i < argc &&
189 sscanf (argv[i], "%d", &src2_mem_alloc_type) == 1) {
190 continue;
191 }
192 else if (strcmp (argv[i] + 2, "dst_memtype") == 0 && ++i < argc &&
193 sscanf (argv[i], "%d", &dst_mem_alloc_type) == 1) {
194 continue;
195 }
196 else if (strcmp (argv[i] + 2, "bo1") == 0 && ++i < argc &&
197 sscanf (argv[i], "%d", &src1_layer_mode) == 1) {
198 continue;
199 }
200 else if (strcmp (argv[i] + 2, "bo2") == 0 && ++i < argc &&
201 sscanf (argv[i], "%d", &src2_layer_mode) == 1) {
202 continue;
203 }
204 else if (strcmp (argv[i] + 2, "gb1") == 0 && ++i < argc &&
205 sscanf (argv[i], "%d", &gb1_alpha) == 1) {
206 continue;
207 }
208 else if (strcmp (argv[i] + 2, "gb2") == 0 && ++i < argc &&
209 sscanf (argv[i], "%d", &gb2_alpha) == 1) {
210 continue;
211 }
212 else if (strcmp (argv[i] + 2, "src1_format") == 0 && ++i < argc &&
213 sscanf (argv[i], "%d", &SRC1_PIXFORMAT) == 1) {
214 continue;
215 }
216 else if (strcmp (argv[i] + 2, "src2_format") == 0 && ++i < argc &&
217 sscanf (argv[i], "%d", &SRC2_PIXFORMAT) == 1) {
218 continue;
219 }
220 else if (strcmp (argv[i] + 2, "dst_format") == 0 && ++i < argc &&
221 sscanf (argv[i], "%d", &DST_PIXFORMAT) == 1) {
222 continue;
223 }
224 else if (strcmp (argv[i] + 2, "size") == 0 && ++i < argc &&
225 sscanf (argv[i], "%dx%d", &SX_SRC1, &SY_SRC1) == 2) {
226 SX_SRC2 = SX_DST = SX_SRC1;
227 SY_SRC2 = SY_DST = SY_SRC1;
228 continue;
229 }
230 else if (strcmp (argv[i] + 2, "dst_size") == 0 && ++i < argc &&
231 sscanf (argv[i], "%dx%d", &SX_DST, &SY_DST) == 2) {
232 continue;
233 }
234 else if (strcmp (argv[i] + 2, "src1_size") == 0 && ++i < argc &&
235 sscanf (argv[i], "%dx%d", &SX_SRC1, &SY_SRC1) == 2) {
236 continue;
237 }
238 else if (strcmp (argv[i] + 2, "src2_size") == 0 && ++i < argc &&
239 sscanf (argv[i], "%dx%d", &SX_SRC2, &SY_SRC2) == 2) {
240 continue;
241 }
242 else if (strcmp (argv[i] + 2, "src1_rect") == 0 && ++i < argc &&
243 sscanf (argv[i], "%d_%d_%d_%d",
244 &src1_rect_x, &src1_rect_y, &src1_rect_w, &src1_rect_h) == 4) {
245 continue;
246 }
247 else if (strcmp (argv[i] + 2, "src2_rect") == 0 && ++i < argc &&
248 sscanf (argv[i], "%d_%d_%d_%d",
249 &src2_rect_x, &src2_rect_y, &src2_rect_w, &src2_rect_h) == 4) {
250 continue;
251 }
252 else if (strcmp (argv[i] + 2, "dst_rect") == 0 && ++i < argc &&
253 sscanf (argv[i], "%d_%d_%d_%d",
254 &dst_rect_x, &dst_rect_y, &dst_rect_w, &dst_rect_h) == 4) {
255 continue;
256 }
257 else if (strcmp (argv[i] + 2, "strechblit") == 0 && ++i < argc &&
258 sscanf (argv[i], "%d_%d_%d_%d-%d_%d_%d_%d",
259 &src1_rect_x, &src1_rect_y, &src1_rect_w, &src1_rect_h,
260 &dst_rect_x, &dst_rect_y, &dst_rect_w, &dst_rect_h) == 8) {
261 continue;
262 }
263 else if (strcmp (argv[i] + 2, "fillrect") == 0 && ++i < argc &&
264 sscanf (argv[i], "%x_%d_%d_%d_%d",
265 &rect_color, &dst_rect_x, &dst_rect_y, &dst_rect_w, &dst_rect_h) == 5) {
266 continue;
267 }
268 else if (strcmp (argv[i] + 2, "src1_file") == 0 && ++i < argc &&
Cao Jian65331472019-11-01 21:01:49 +0800269 sscanf (argv[i], "%s", SRC1_FILE_NAME) == 1) {
Jian Caob9fb3ed2019-04-16 16:51:27 +0800270 continue;
271 }
272 else if (strcmp (argv[i] + 2, "src2_file") == 0 && ++i < argc &&
Cao Jian65331472019-11-01 21:01:49 +0800273 sscanf (argv[i], "%s", SRC2_FILE_NAME) == 1) {
Jian Caob9fb3ed2019-04-16 16:51:27 +0800274 continue;
275 }
276 else if (strcmp (argv[i] + 2, "dst_file") == 0 && ++i < argc &&
Cao Jian65331472019-11-01 21:01:49 +0800277 sscanf (argv[i], "%s", DST_FILE_NAME) == 1) {
Jian Caob9fb3ed2019-04-16 16:51:27 +0800278 dst_canvas_alloc = 1;
279 continue;
280 }
281 else if (strcmp (argv[i] + 2, "src1_canvas_alloc") == 0 && ++i < argc &&
282 sscanf (argv[i], "%d", &src1_canvas_alloc) == 1) {
283 continue;
284 }
285 else if (strcmp (argv[i] + 2, "src2_canvas_alloc") == 0 && ++i < argc &&
286 sscanf (argv[i], "%d", &src2_canvas_alloc) == 1) {
287 continue;
288 }
Cao Jian65331472019-11-01 21:01:49 +0800289 else if (strcmp (argv[i] + 2, "src1_planenumber") == 0 && ++i < argc &&
290 sscanf (argv[i], "%d", &src1_plane_number) == 1) {
291 continue;
292 }
293 else if (strcmp (argv[i] + 2, "src2_planenumber") == 0 && ++i < argc &&
294 sscanf (argv[i], "%d", &src2_plane_number) == 1) {
295 continue;
296 }
297 else if (strcmp (argv[i] + 2, "dst_planenumber") == 0 && ++i < argc &&
298 sscanf (argv[i], "%d", &dst_plane_number) == 1) {
299 continue;
300 }
Cao Jiane80b1392019-08-07 20:59:47 +0800301 else if (strcmp (argv[i] + 2, "n") == 0 && ++i < argc &&
302 sscanf (argv[i], "%d", &num_process) == 1) {
303 continue;
304 }
Cao Jian53a15142019-08-16 13:58:17 +0800305 else if (strcmp (argv[i] + 2, "p") == 0 && ++i < argc &&
306 sscanf (argv[i], "%d", &num_thread) == 1) {
307 continue;
308 }
309 else if (strcmp (argv[i] + 2, "p_n") == 0 && ++i < argc &&
310 sscanf (argv[i], "%d", &num_process_per_thread) == 1) {
311 continue;
312 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800313 }
314 }
315 return ge2d_success;
316}
317
Cao Jian65331472019-11-01 21:01:49 +0800318static int check_plane_number(int plane_number, int format)
319{
320 int ret = -1;
321 printf("plane_number=%d,format=%d\n", plane_number, format);
322 if (plane_number == 1) {
323 ret = 0;
324 } else if (plane_number == 2) {
325 if ((format == PIXEL_FORMAT_YCrCb_420_SP) ||
326 (format == PIXEL_FORMAT_YCbCr_420_SP_NV12) ||
327 (format == PIXEL_FORMAT_YCbCr_422_SP))
328 ret = 0;
329 } else if (plane_number == 3) {
330 if (format == PIXEL_FORMAT_YV12)
331 ret = 0;
332 }
333 return ret;
334}
Jian Caob9fb3ed2019-04-16 16:51:27 +0800335
Cao Jian53a15142019-08-16 13:58:17 +0800336static int aml_read_file_src1(aml_ge2d_t *amlge2d, const char* url)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800337{
338 int fd = -1;
339 int length = 0;
340 int read_num = 0;
Cao Jian65331472019-11-01 21:01:49 +0800341 int i;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800342
343 fd = open(url,O_RDONLY );
344 if (fd < 0) {
345 E_GE2D("read source file:%s open error\n",url);
346 return ge2d_fail;
347 }
Cao Jian65331472019-11-01 21:01:49 +0800348 for (i = 0; i < amlge2d->ge2dinfo.src_info[0].plane_number; i++) {
349 if (amlge2d->src_size[i] == 0) {
350 E_GE2D("src_size[i]=%d\n",amlge2d->src_size[i]);
351 close(fd);
352 return 0;
353 }
354 amlge2d->src_data[i] = (char*)malloc(amlge2d->src_size[i]);
355 if (!amlge2d->src_data[i]) {
356 E_GE2D("malloc for src_data failed\n");
357 close(fd);
358 return ge2d_fail;
359 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800360
Cao Jian65331472019-11-01 21:01:49 +0800361 read_num = read(fd,amlge2d->src_data[i],amlge2d->src_size[i]);
362 if (read_num <= 0) {
363 E_GE2D("read file read_num=%d error\n",read_num);
364 close(fd);
365 return ge2d_fail;
366 }
367
368 memcpy(amlge2d->ge2dinfo.src_info[0].vaddr[i], amlge2d->src_data[i], amlge2d->src_size[i]);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800369 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800370 close(fd);
371 return ge2d_success;
372}
373
Cao Jian53a15142019-08-16 13:58:17 +0800374static int aml_read_file_src2(aml_ge2d_t *amlge2d, const char* url)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800375{
376 int fd = -1;
377 int length = 0;
378 int read_num = 0;
Cao Jian65331472019-11-01 21:01:49 +0800379 int i;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800380
381 fd = open(url,O_RDONLY );
382 if (fd < 0) {
383 E_GE2D("read source file:%s open error\n",url);
384 return ge2d_fail;
385 }
Cao Jian65331472019-11-01 21:01:49 +0800386 for (i = 0; i < amlge2d->ge2dinfo.src_info[1].plane_number; i++) {
387 if (amlge2d->src2_size[i] == 0) {
388 E_GE2D("src2_size[i]=%d\n",amlge2d->src2_size[i]);
389 close(fd);
390 return 0;
391 }
392 amlge2d->src2_data[i] = (char*)malloc(amlge2d->src2_size[i]);
393 if (!amlge2d->src2_data[i]) {
394 E_GE2D("malloc for src_data failed\n");
395 close(fd);
396 return ge2d_fail;
397 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800398
Cao Jian65331472019-11-01 21:01:49 +0800399 read_num = read(fd,amlge2d->src2_data[i],amlge2d->src2_size[i]);
400 if (read_num <= 0) {
401 E_GE2D("read file read_num=%d error\n",read_num);
402 close(fd);
403 return ge2d_fail;
404 }
405
406 memcpy(amlge2d->ge2dinfo.src_info[1].vaddr[i], amlge2d->src2_data[i], amlge2d->src2_size[i]);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800407 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800408 close(fd);
409 return ge2d_success;
410}
411
Cao Jian53a15142019-08-16 13:58:17 +0800412static int aml_write_file(aml_ge2d_t *amlge2d, const char* url)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800413{
414 int fd = -1;
415 int length = 0;
416 int write_num = 0;
417 unsigned int *value;
Cao Jian65331472019-11-01 21:01:49 +0800418 int i;
419
Cao Jian53a15142019-08-16 13:58:17 +0800420 if ((GE2D_CANVAS_OSD0 == amlge2d->ge2dinfo.dst_info.memtype)
421 || (GE2D_CANVAS_OSD1 == amlge2d->ge2dinfo.dst_info.memtype))
Jian Caob9fb3ed2019-04-16 16:51:27 +0800422 return 0;
423
424 fd = open(url,O_RDWR | O_CREAT,0660);
425 if (fd < 0) {
426 E_GE2D("write file:%s open error\n",url);
427 return ge2d_fail;
428 }
Cao Jian65331472019-11-01 21:01:49 +0800429 for (i = 0; i < amlge2d->ge2dinfo.dst_info.plane_number; i++) {
430 if (amlge2d->dst_size[i] == 0) {
431 E_GE2D("dst_size[%d]=%d\n",i, amlge2d->dst_size[i]);
432 close(fd);
433 return 0;
434 }
435 amlge2d->dst_data[i] = (char*)malloc(amlge2d->dst_size[i]);
436 if (!amlge2d->dst_data[i]) {
437 E_GE2D("malloc for dst_data failed\n");
438 close(fd);
439 return ge2d_fail;
440 }
441 memcpy(amlge2d->dst_data[i], amlge2d->ge2dinfo.dst_info.vaddr[i], amlge2d->dst_size[i]);
442 printf("pixel: 0x%2x, 0x%2x,0x%2x,0x%2x, 0x%2x,0x%2x,0x%2x,0x%2x\n",
443 amlge2d->dst_data[i][0],
444 amlge2d->dst_data[i][1],
445 amlge2d->dst_data[i][2],
446 amlge2d->dst_data[i][3],
447 amlge2d->dst_data[i][4],
448 amlge2d->dst_data[i][5],
449 amlge2d->dst_data[i][6],
450 amlge2d->dst_data[i][7]);
451 write_num = write(fd,amlge2d->dst_data[i],amlge2d->dst_size[i]);
452 if (write_num <= 0) {
453 E_GE2D("write file write_num=%d error\n",write_num);
454 close(fd);
455 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800456 }
457 close(fd);
458 return ge2d_success;
459}
460
Cao Jian53a15142019-08-16 13:58:17 +0800461static int do_fill_rectangle(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800462{
463 int ret = -1;
464 char code;
Cao Jiane80b1392019-08-07 20:59:47 +0800465 int i;
466 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +0800467 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800468
469 printf("do_fill_rectangle test case:\n");
470
471 pge2dinfo->color = rect_color;
472 pge2dinfo->dst_info.rect.x = dst_rect_x;
Cao Jian088facb2020-03-09 17:24:26 +0800473 pge2dinfo->dst_info.rect.y = dst_rect_y;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800474 pge2dinfo->dst_info.rect.w = dst_rect_w;
475 pge2dinfo->dst_info.rect.h = dst_rect_h;
Cao Jiane80b1392019-08-07 20:59:47 +0800476 stime = myclock();
Cao Jian65331472019-11-01 21:01:49 +0800477 for (i = 0; i < num_process; i++) {
478 ret = aml_ge2d_process(pge2dinfo);
479 if (ret < 0) {
480 printf("ge2d process failed, %s (%d)\n", __func__, __LINE__);
481 return ret;
482 }
483 }
Cao Jiane80b1392019-08-07 20:59:47 +0800484 printf("time=%ld ms\n", myclock() - stime);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800485 #if 0
486 sleep(5);
487
488 printf("please enter any key do rotation test[90]\n");
489 code = getc(stdin);
490 pge2dinfo->dst_info.rotation = GE2D_ROTATION_180;
491 ret = aml_ge2d_process(pge2dinfo);
492 #endif
Cao Jian53a15142019-08-16 13:58:17 +0800493 if (ret < 0)
494 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800495 return ret;
496}
497
498
Cao Jian53a15142019-08-16 13:58:17 +0800499static int do_blend(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800500{
Cao Jian65331472019-11-01 21:01:49 +0800501 int ret = -1, i;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800502 char code = 0;
503 int shared_fd_bakup;
504 unsigned long offset_bakup = 0;
Cao Jiane80b1392019-08-07 20:59:47 +0800505 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +0800506 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
Cao Jiane80b1392019-08-07 20:59:47 +0800507
Jian Caob9fb3ed2019-04-16 16:51:27 +0800508 printf("do_blend test case:\n");
509
Jian Cao49c82bd2019-06-04 12:49:10 +0800510 if (pge2dinfo->cap_attr == 0x1) {
Jian Caob9fb3ed2019-04-16 16:51:27 +0800511 /* do blend src1 blend src2(dst) to dst */
512 printf("one step blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800513 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800514 if (ret < 0)
515 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +0800516 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800517 if (ret < 0)
518 return ge2d_fail;
519
520 pge2dinfo->src_info[0].rect.x = src1_rect_x;
521 pge2dinfo->src_info[0].rect.y = src1_rect_y;
522 pge2dinfo->src_info[0].rect.w = src1_rect_w;
523 pge2dinfo->src_info[0].rect.h = src1_rect_h;
524 pge2dinfo->src_info[0].fill_color_en = 0;
525
526 pge2dinfo->src_info[1].rect.x = src2_rect_x;
527 pge2dinfo->src_info[1].rect.y = src2_rect_y;
528 pge2dinfo->src_info[1].rect.w = src2_rect_w;
529 pge2dinfo->src_info[1].rect.h = src2_rect_h;
530 pge2dinfo->src_info[1].fill_color_en = 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800531
532 pge2dinfo->dst_info.rect.x = dst_rect_x;
533 pge2dinfo->dst_info.rect.y = dst_rect_y;
534 pge2dinfo->dst_info.rect.w = dst_rect_w;
535 pge2dinfo->dst_info.rect.h = dst_rect_h;
536 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
537
538 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
539 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
540 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
541 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
Cao Jiane80b1392019-08-07 20:59:47 +0800542 stime = myclock();
Cao Jian65331472019-11-01 21:01:49 +0800543 for (i = 0; i < num_process; i++) {
544 ret = aml_ge2d_process(pge2dinfo);
545 if (ret < 0) {
546 printf("ge2d process failed, %s (%d)\n", __func__, __LINE__);
547 return ret;
548 }
549 }
Cao Jiane80b1392019-08-07 20:59:47 +0800550 printf("time=%ld ms\n", myclock() - stime);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800551 } else {
552 if (((gb1_alpha != 0xff)
553 && (gb2_alpha != 0xff))){
554 printf("two steps blend,two plane alpha\n");
555
556 if (src2_layer_mode == LAYER_MODE_COVERAGE) {
557 printf("two steps blend,src2 LAYER_MODE_COVERAGE\n");
Cao Jian53a15142019-08-16 13:58:17 +0800558 ret = aml_read_file_src1(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800559 if (ret < 0)
560 return ge2d_fail;
561
562 /* both plane alpha, do 2 steps */
563 /* step 1: strechbilt */
564 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
565 /* src2 do strechbilt to dst */
566 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
567 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
568 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
569 pge2dinfo->src_info[0].rect.x = 0;
570 pge2dinfo->src_info[0].rect.y = 0;
571 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
572 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
573 pge2dinfo->src_info[0].fill_color_en = 0;
574
575 pge2dinfo->src_info[1].canvas_w = SX_DST;
576 pge2dinfo->src_info[1].canvas_h = SY_DST;
577 pge2dinfo->src_info[1].format = DST_PIXFORMAT;
578 pge2dinfo->src_info[1].rect.x = 0;
579 pge2dinfo->src_info[1].rect.y = 0;
580 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
581 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
582 pge2dinfo->src_info[1].fill_color_en = 1;
583 pge2dinfo->src_info[1].def_color = 0x00;
584
585 pge2dinfo->dst_info.canvas_w = SX_DST;
586 pge2dinfo->dst_info.canvas_h = SY_DST;
587 pge2dinfo->dst_info.format = DST_PIXFORMAT;
588 pge2dinfo->dst_info.rect.x = 0;
589 pge2dinfo->dst_info.rect.y = 0;
590 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
591 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
592 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
593
594 pge2dinfo->src_info[0].layer_mode = LAYER_MODE_COVERAGE;
595 pge2dinfo->src_info[1].layer_mode = LAYER_MODE_COVERAGE;
596 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
597 pge2dinfo->src_info[1].plane_alpha = 0xff;
598 ret = aml_ge2d_process(pge2dinfo);
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;
602
603 /* step2: blend src1 blend src2(dst) to dst */
604 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
605
606 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
607 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
608 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
609 pge2dinfo->src_info[0].rect.x = 0;
610 pge2dinfo->src_info[0].rect.y = 0;
611 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
612 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
613 pge2dinfo->src_info[0].fill_color_en = 0;
614
615 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
616 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
617 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
618 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
619 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
620 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
621 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800622 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
623 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800624 pge2dinfo->src_info[1].fill_color_en = 0;
625
626 pge2dinfo->dst_info.canvas_w = SX_DST;
627 pge2dinfo->dst_info.canvas_h = SY_DST;
628 pge2dinfo->dst_info.format = DST_PIXFORMAT;
629 pge2dinfo->dst_info.rect.x = 0;
630 pge2dinfo->dst_info.rect.y = 0;
631 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
632 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
633 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
634
635 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
636 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
637 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
638 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
639 ret = aml_ge2d_process(pge2dinfo);
640 } else {
Cao Jian53a15142019-08-16 13:58:17 +0800641 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800642 if (ret < 0)
643 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +0800644 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800645 if (ret < 0)
646 return ge2d_fail;
647 printf("two step: strechbilt+blend\n");
648 /* both plane alpha, do 2 steps */
649 /* step 1: strechbilt */
650 pge2dinfo->ge2d_op = AML_GE2D_STRETCHBLIT;
651 /* src2 do strechbilt to dst */
652 pge2dinfo->src_info[0].canvas_w = SX_SRC2;
653 pge2dinfo->src_info[0].canvas_h = SY_SRC2;
654 pge2dinfo->src_info[0].format = SRC2_PIXFORMAT;
655 pge2dinfo->src_info[0].rect.x = 0;
656 pge2dinfo->src_info[0].rect.y = 0;
657 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
658 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
659
Cao Jian65331472019-11-01 21:01:49 +0800660 shared_fd_bakup = pge2dinfo->src_info[0].shared_fd[0];
661 offset_bakup = pge2dinfo->src_info[0].offset[0];
662 pge2dinfo->src_info[0].shared_fd[0] = pge2dinfo->src_info[1].shared_fd[0];
663 pge2dinfo->src_info[0].offset[0] = pge2dinfo->src_info[1].offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800664
665 pge2dinfo->src_info[0].layer_mode = src2_layer_mode;
666 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
667 pge2dinfo->dst_info.canvas_w = SX_DST;
668 pge2dinfo->dst_info.canvas_h = SY_DST;
669 pge2dinfo->dst_info.format = DST_PIXFORMAT;
670 pge2dinfo->dst_info.rect.x = 0;
671 pge2dinfo->dst_info.rect.y = 0;
672 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
673 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
674 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
675 ret = aml_ge2d_process(pge2dinfo);
676
677 /* step2: blend src1 blend src2(dst) to dst */
678 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
679
680 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
681 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
682 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
683 pge2dinfo->src_info[0].rect.x = 0;
684 pge2dinfo->src_info[0].rect.y = 0;
685 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
686 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jian65331472019-11-01 21:01:49 +0800687 pge2dinfo->src_info[0].shared_fd[0] = shared_fd_bakup;
688 pge2dinfo->src_info[0].offset[0] = offset_bakup;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800689 pge2dinfo->src_info[0].fill_color_en = 0;
690
691 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
692 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
693 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
694 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
695 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
696 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
697 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800698 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
699 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800700 pge2dinfo->src_info[1].fill_color_en = 0;
701
702 pge2dinfo->dst_info.canvas_w = SX_DST;
703 pge2dinfo->dst_info.canvas_h = SY_DST;
704 pge2dinfo->dst_info.format = DST_PIXFORMAT;
705 pge2dinfo->dst_info.rect.x = 0;
706 pge2dinfo->dst_info.rect.y = 0;
707 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
708 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
709 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
710
711 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
712 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
713 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
714 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
715 ret = aml_ge2d_process(pge2dinfo);
716 }
717 } else if (src2_layer_mode == LAYER_MODE_COVERAGE){
718 printf("two steps blend,src2 LAYER_MODE_COVERAGE: two blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800719 ret = aml_read_file_src1(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800720 if (ret < 0)
721 return ge2d_fail;
722 /* both plane alpha, do 2 steps */
723 /* step 1: strechbilt */
724 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
725 /* src2 do strechbilt to dst */
726 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
727 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
728 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
729 pge2dinfo->src_info[0].rect.x = 0;
730 pge2dinfo->src_info[0].rect.y = 0;
731 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
732 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
733 pge2dinfo->src_info[0].fill_color_en = 0;
734
735 pge2dinfo->src_info[1].canvas_w = SX_DST;
736 pge2dinfo->src_info[1].canvas_h = SY_DST;
737 pge2dinfo->src_info[1].format = DST_PIXFORMAT;
738 pge2dinfo->src_info[1].rect.x = 0;
739 pge2dinfo->src_info[1].rect.y = 0;
740 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
741 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
742 pge2dinfo->src_info[1].fill_color_en = 1;
743 pge2dinfo->src_info[1].def_color = 0x00;
744
745 pge2dinfo->dst_info.canvas_w = SX_DST;
746 pge2dinfo->dst_info.canvas_h = SY_DST;
747 pge2dinfo->dst_info.format = DST_PIXFORMAT;
748 pge2dinfo->dst_info.rect.x = 0;
749 pge2dinfo->dst_info.rect.y = 0;
750 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
751 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
752 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
753
754 pge2dinfo->src_info[0].layer_mode = LAYER_MODE_COVERAGE;
755 pge2dinfo->src_info[1].layer_mode = LAYER_MODE_COVERAGE;
756 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
757 pge2dinfo->src_info[1].plane_alpha = 0xff;
758 ret = aml_ge2d_process(pge2dinfo);
Cao Jian53a15142019-08-16 13:58:17 +0800759 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800760 if (ret < 0)
761 return ge2d_fail;
762 /* step2: blend src1 blend src2(dst) to dst */
763 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
764
765 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
766 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
767 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
768 pge2dinfo->src_info[0].rect.x = 0;
769 pge2dinfo->src_info[0].rect.y = 0;
770 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
771 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
772 pge2dinfo->src_info[0].fill_color_en = 0;
773
774 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
775 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
776 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
777 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
778 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
779 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
780 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800781 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
782 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800783 pge2dinfo->src_info[1].fill_color_en = 0;
784
785 pge2dinfo->dst_info.canvas_w = SX_DST;
786 pge2dinfo->dst_info.canvas_h = SY_DST;
787 pge2dinfo->dst_info.format = DST_PIXFORMAT;
788 pge2dinfo->dst_info.rect.x = 0;
789 pge2dinfo->dst_info.rect.y = 0;
790 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
791 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
792 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
793
794 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
795 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
796 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
797 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
798 ret = aml_ge2d_process(pge2dinfo);
799 } else if ((src2_layer_mode == LAYER_MODE_NON)
800 && (src1_layer_mode != LAYER_MODE_PREMULTIPLIED)){
801 printf("two steps blend,src2 LAYER_MODE_NON:strechbilt+blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800802 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800803 if (ret < 0)
804 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +0800805 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800806 if (ret < 0)
807 return ge2d_fail;
808 /* both plane alpha, do 2 steps */
809 /* step 1: strechbilt */
810 pge2dinfo->ge2d_op = AML_GE2D_STRETCHBLIT;
811 /* src2 do strechbilt to dst */
812 pge2dinfo->src_info[0].canvas_w = SX_SRC2;
813 pge2dinfo->src_info[0].canvas_h = SY_SRC2;
814 pge2dinfo->src_info[0].format = SRC2_PIXFORMAT;
815 pge2dinfo->src_info[0].rect.x = 0;
816 pge2dinfo->src_info[0].rect.y = 0;
817 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
818 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
819
Cao Jian65331472019-11-01 21:01:49 +0800820 shared_fd_bakup = pge2dinfo->src_info[0].shared_fd[0];
821 offset_bakup = pge2dinfo->src_info[0].offset[0];
822 pge2dinfo->src_info[0].shared_fd[0] = pge2dinfo->src_info[1].shared_fd[0];
823 pge2dinfo->src_info[0].offset[0] = pge2dinfo->src_info[1].offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800824 pge2dinfo->src_info[0].layer_mode = src2_layer_mode;
825 pge2dinfo->src_info[0].plane_alpha = 0xff;
826 pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888;
827
828 pge2dinfo->dst_info.canvas_w = SX_DST;
829 pge2dinfo->dst_info.canvas_h = SY_DST;
830 pge2dinfo->dst_info.format = DST_PIXFORMAT;
831 pge2dinfo->dst_info.rect.x = 0;
832 pge2dinfo->dst_info.rect.y = 0;
833 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
834 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
835 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
836 ret = aml_ge2d_process(pge2dinfo);
837
838 /* step2: blend src1 blend src2(dst) to dst */
839 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
840
841 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
842 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
843 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
844 pge2dinfo->src_info[0].rect.x = 0;
845 pge2dinfo->src_info[0].rect.y = 0;
846 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
847 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jian65331472019-11-01 21:01:49 +0800848 pge2dinfo->src_info[0].shared_fd[0] = shared_fd_bakup;
849 pge2dinfo->src_info[0].offset[0] = offset_bakup;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800850 pge2dinfo->src_info[0].fill_color_en = 0;
851
852 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
853 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
854 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
855 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
856 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
857 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
858 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800859 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
860 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800861 pge2dinfo->src_info[1].fill_color_en = 0;
862
863 pge2dinfo->dst_info.canvas_w = SX_DST;
864 pge2dinfo->dst_info.canvas_h = SY_DST;
865 pge2dinfo->dst_info.format = DST_PIXFORMAT;
866 pge2dinfo->dst_info.rect.x = 0;
867 pge2dinfo->dst_info.rect.y = 0;
868 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
869 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
870 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
871 printf("two steps blend,src1_layer_mode=%d,src2_layer_mode=%d\n",src1_layer_mode,src2_layer_mode);
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 {
879 /* do blend src1 blend src2(dst) to dst */
880 printf("one step 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 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
888 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
889 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
890 pge2dinfo->src_info[0].rect.x = 0;
891 pge2dinfo->src_info[0].rect.y = 0;
892 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
893 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
894 pge2dinfo->src_info[0].fill_color_en = 0;
895
896 pge2dinfo->src_info[1].canvas_w = SX_SRC2;
897 pge2dinfo->src_info[1].canvas_h = SY_SRC2;
898 pge2dinfo->src_info[1].format = SRC2_PIXFORMAT;
899 pge2dinfo->src_info[1].rect.x = 0;
900 pge2dinfo->src_info[1].rect.y = 0;
901 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
902 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
903 pge2dinfo->src_info[1].fill_color_en = 0;
904 if (src2_layer_mode == LAYER_MODE_NON)
905 pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888;
906 pge2dinfo->dst_info.canvas_w = SX_DST;
907 pge2dinfo->dst_info.canvas_h = SY_DST;
908 pge2dinfo->dst_info.format = DST_PIXFORMAT;
909 pge2dinfo->dst_info.rect.x = 0;
910 pge2dinfo->dst_info.rect.y = 0;
911 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
912 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
913 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
914
915 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
916 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
917 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
918 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
919 ret = aml_ge2d_process(pge2dinfo);
920 }
921 }
Cao Jian53a15142019-08-16 13:58:17 +0800922 if (ret < 0)
923 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800924 return ret;
925}
926
927
Cao Jian53a15142019-08-16 13:58:17 +0800928static int do_strechblit(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800929{
930 int ret = -1;
931 char code = 0;
Cao Jiane80b1392019-08-07 20:59:47 +0800932 int i;
933 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +0800934 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
935
Jian Caob9fb3ed2019-04-16 16:51:27 +0800936 printf("do_strechblit test case:\n");
Cao Jian53a15142019-08-16 13:58:17 +0800937 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800938 if (ret < 0)
939 return ge2d_fail;
940
941 pge2dinfo->src_info[0].rect.x = src1_rect_x;
942 pge2dinfo->src_info[0].rect.y = src1_rect_y;
943 pge2dinfo->src_info[0].rect.w = src1_rect_w;
944 pge2dinfo->src_info[0].rect.h = src1_rect_h;
945 pge2dinfo->dst_info.rect.x = dst_rect_x;
946 pge2dinfo->dst_info.rect.y = dst_rect_y;
947 pge2dinfo->dst_info.rect.w = dst_rect_w;
948 pge2dinfo->dst_info.rect.h = dst_rect_h;
949 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
950 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
951 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
952
Cao Jiane80b1392019-08-07 20:59:47 +0800953 stime = myclock();
Cao Jian65331472019-11-01 21:01:49 +0800954 for (i = 0; i < num_process; i++) {
955 ret = aml_ge2d_process(pge2dinfo);
956 if (ret < 0) {
957 printf("ge2d process failed, %s (%d)\n", __func__, __LINE__);
958 return ret;
959 }
960 }
Cao Jiane80b1392019-08-07 20:59:47 +0800961 printf("time=%ld ms\n", myclock() - stime);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800962 #if 0
963 sleep(5);
964
965 printf("please enter any key do rotation test[90]\n");
966 code = getc(stdin);
967 pge2dinfo->dst_info.rotation = GE2D_ROTATION_90;
968 ret = aml_ge2d_process(pge2dinfo);
969 #endif
Cao Jian53a15142019-08-16 13:58:17 +0800970 if (ret < 0)
971 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800972 return ret;
973
974}
975
Cao Jian53a15142019-08-16 13:58:17 +0800976static int do_blit(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800977{
978 int ret = -1;
979 char code = 0;
Cao Jiane80b1392019-08-07 20:59:47 +0800980 int i;
981 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +0800982 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
983
Jian Caob9fb3ed2019-04-16 16:51:27 +0800984 printf("do_blit test case:\n");
Cao Jian53a15142019-08-16 13:58:17 +0800985 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800986 if (ret < 0)
987 return ge2d_fail;
988
989 pge2dinfo->src_info[0].rect.x = src1_rect_x;
990 pge2dinfo->src_info[0].rect.y = src1_rect_y;
991 pge2dinfo->src_info[0].rect.w = src1_rect_w;
992 pge2dinfo->src_info[0].rect.h = src1_rect_h;
993 pge2dinfo->dst_info.rect.x = dst_rect_x;
994 pge2dinfo->dst_info.rect.y = dst_rect_y;
995
996 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
997 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
998 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
999
Cao Jiane80b1392019-08-07 20:59:47 +08001000 stime = myclock();
Cao Jian65331472019-11-01 21:01:49 +08001001 for (i = 0; i < num_process; i++) {
1002 ret = aml_ge2d_process(pge2dinfo);
1003 if (ret < 0) {
1004 printf("ge2d process failed, %s (%d)\n", __func__, __LINE__);
1005 return ret;
1006 }
1007 }
Cao Jiane80b1392019-08-07 20:59:47 +08001008 printf("time=%ld ms\n", myclock() - stime);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001009 #if 0
1010 sleep(5);
1011
1012 printf("please enter any key do rotation test[90]\n");
1013 code = getc(stdin);
1014 pge2dinfo->dst_info.rotation = GE2D_ROTATION_90;
1015 pge2dinfo->src_info[0].rect.x = 0;
1016 pge2dinfo->src_info[0].rect.y = 0;
1017 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
1018 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
1019 pge2dinfo->dst_info.rect.x = 0;
1020 pge2dinfo->dst_info.rect.y = 0;
1021
1022 ret = aml_ge2d_process(pge2dinfo);
1023 #endif
Cao Jian53a15142019-08-16 13:58:17 +08001024 if (ret < 0)
1025 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001026 return ret;
1027}
1028
Cao Jian53a15142019-08-16 13:58:17 +08001029void *main_run(void *arg)
Jian Caob9fb3ed2019-04-16 16:51:27 +08001030{
1031 int ret = -1;
Cao Jian65331472019-11-01 21:01:49 +08001032 int i = 0, run_time = 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +08001033 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +08001034 aml_ge2d_t amlge2d;
Cao Jian65331472019-11-01 21:01:49 +08001035 char dst_file_name[128] = {};
Jian Cao49c82bd2019-06-04 12:49:10 +08001036
Cao Jian65331472019-11-01 21:01:49 +08001037 for (run_time = 0; run_time < num_process_per_thread; run_time++) {
1038 printf("ThreadIdx -- %d, run time -- %d\n", *(int *)arg, run_time);
1039 memset(&amlge2d, 0, sizeof(aml_ge2d_t));
Cao Jian53a15142019-08-16 13:58:17 +08001040 memset(&(amlge2d.ge2dinfo.src_info[0]), 0, sizeof(buffer_info_t));
1041 memset(&(amlge2d.ge2dinfo.src_info[1]), 0, sizeof(buffer_info_t));
1042 memset(&(amlge2d.ge2dinfo.dst_info), 0, sizeof(buffer_info_t));
1043
Cao Jian65331472019-11-01 21:01:49 +08001044 for (i = 0; i < MAX_PLANE; i++) {
1045 amlge2d.ge2dinfo.src_info[0].shared_fd[i] = -1;
1046 amlge2d.ge2dinfo.src_info[1].shared_fd[i] = -1;
1047 amlge2d.ge2dinfo.dst_info.shared_fd[i] = -1;
1048 }
Cao Jian53a15142019-08-16 13:58:17 +08001049 set_ge2dinfo(&amlge2d.ge2dinfo);
Cao Jian65331472019-11-01 21:01:49 +08001050 ret = check_plane_number(amlge2d.ge2dinfo.src_info[0].plane_number,
1051 amlge2d.ge2dinfo.src_info[0].format);
1052 if (ret < 0) {
1053 printf("Error src1 plane_number=[%d], format=%d\n",
1054 amlge2d.ge2dinfo.src_info[0].plane_number,
1055 amlge2d.ge2dinfo.src_info[0].format);
1056 return NULL;
1057 }
1058 ret = check_plane_number(amlge2d.ge2dinfo.src_info[1].plane_number,
1059 amlge2d.ge2dinfo.src_info[1].format);
1060 if (ret < 0) {
1061 printf("Error src2 plane_number=[%d],format=%d\n",
1062 amlge2d.ge2dinfo.src_info[1].plane_number,
1063 amlge2d.ge2dinfo.src_info[1].format);
1064 return NULL;
1065 }
1066 ret = check_plane_number(amlge2d.ge2dinfo.dst_info.plane_number,
1067 amlge2d.ge2dinfo.dst_info.format);
1068 if (ret < 0) {
1069 printf("Error dst plane_number=[%d],format=%d\n",
1070 amlge2d.ge2dinfo.dst_info.plane_number,
1071 amlge2d.ge2dinfo.dst_info.format);
1072 return NULL;
1073 }
Cao Jian53a15142019-08-16 13:58:17 +08001074
1075 ret = aml_ge2d_init(&amlge2d);
1076 if (ret < 0)
1077 return NULL;
1078
1079 ret = aml_ge2d_mem_alloc(&amlge2d);
1080 if (ret < 0)
1081 goto exit;
1082 #if 0
1083 /* if dma_buf and used fd alloc other driver */
1084 /* set dma buf fd */
1085 amlge2d.ge2dinfo.src_info[0].shared_fd = dma_fd;
1086 amlge2d.ge2dinfo.src_info[0].memtype = GE2D_CANVAS_ALLOC;
1087 #endif
1088
1089 switch (amlge2d.ge2dinfo.ge2d_op)
1090 {
1091 case AML_GE2D_FILLRECTANGLE:
1092 ret = do_fill_rectangle(&amlge2d);
1093 break;
1094 case AML_GE2D_BLEND:
1095 ret = do_blend(&amlge2d);
1096 break;
1097 case AML_GE2D_STRETCHBLIT:
1098 ret = do_strechblit(&amlge2d);
1099 break;
1100 case AML_GE2D_BLIT:
1101 ret = do_blit(&amlge2d);
1102 break;
1103 default:
1104 E_GE2D("not support ge2d op,exit test!\n");
1105 break;
1106 }
1107 if (ret < 0)
1108 goto exit;
1109
1110 if (amlge2d.ge2dinfo.dst_info.mem_alloc_type == AML_GE2D_MEM_ION)
1111 aml_ge2d_invalid_cache(&amlge2d.ge2dinfo);
Cao Jian65331472019-11-01 21:01:49 +08001112 sprintf(dst_file_name, "%s_thread%d_%d", DST_FILE_NAME, *(int *)arg, run_time);
1113 ret = aml_write_file(&amlge2d, dst_file_name);
Cao Jian53a15142019-08-16 13:58:17 +08001114 if (ret < 0)
1115 goto exit;
1116 exit:
Cao Jian65331472019-11-01 21:01:49 +08001117 for (i = 0; i < amlge2d.ge2dinfo.src_info[0].plane_number; i++) {
1118 if (amlge2d.src_data[i]) {
1119 free(amlge2d.src_data[i]);
1120 amlge2d.src_data[i] = NULL;
1121 }
Cao Jian53a15142019-08-16 13:58:17 +08001122 }
1123
Cao Jian65331472019-11-01 21:01:49 +08001124 for (i = 0; i < amlge2d.ge2dinfo.src_info[1].plane_number; i++) {
1125 if (amlge2d.src2_data[i]) {
1126 free(amlge2d.src2_data[i]);
1127 amlge2d.src2_data[i] = NULL;
1128 }
1129 }
1130
1131 for (i = 0; i < amlge2d.ge2dinfo.dst_info.plane_number; i++) {
1132 if (amlge2d.dst_data[i]) {
1133 free(amlge2d.dst_data[i]);
1134 amlge2d.dst_data[i] = NULL;
1135 }
1136 }
Cao Jian53a15142019-08-16 13:58:17 +08001137 aml_ge2d_mem_free(&amlge2d);
1138 aml_ge2d_exit(&amlge2d);
1139 }
1140 printf("ge2d feature_test exit!!!\n");
1141
1142 return NULL;
1143}
1144
1145int main(int argc, char **argv)
1146{
1147 int ret = -1, i;
1148 pthread_t thread[THREADS_MAX_NUM];
1149 int threadindex[THREADS_MAX_NUM];
1150
1151 if (num_thread > THREADS_MAX_NUM) {
1152 E_GE2D("num of thread greater than THREADS_MAX_NUM\n");
1153 return -1;
1154 }
1155 memset(&thread, 0, sizeof(thread));
1156
1157 ret = parse_command_line(argc, argv);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001158 if (ret == ge2d_fail)
1159 return ge2d_success;
1160
Cao Jian65331472019-11-01 21:01:49 +08001161 for (i = 0; i < num_thread; i++) {
Cao Jian53a15142019-08-16 13:58:17 +08001162 threadindex[i] = i;
Cao Jian65331472019-11-01 21:01:49 +08001163 ret = pthread_create(&(thread[i]), NULL, main_run, (void *)&threadindex[i]);
1164 if (ret != 0) {
Cao Jian53a15142019-08-16 13:58:17 +08001165 E_GE2D("integral thread %d creation failed!", i);
1166 return -1;
1167 }
1168 }
Cao Jian65331472019-11-01 21:01:49 +08001169 for (i = 0; i < num_thread; i++)
Cao Jian53a15142019-08-16 13:58:17 +08001170 pthread_join(thread[i], NULL);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001171
Cao Jian53a15142019-08-16 13:58:17 +08001172 return 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +08001173}