blob: 4559d6d9be76decd00efa454f1c7ae72f5a9d4fc [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() */
17#include "ge2d_port.h"
18#include "aml_ge2d.h"
19
20/* #define FILE_DATA */
21static char SRC1_FILE_NAME[64] = "./fb1.rgb32";
22static char SRC2_FILE_NAME[64] = "./fb2.rgb32";
23static char DST_FILE_NAME[64] = "./out1.rgb32";
24
25static int SX_SRC1 = 1920;
26static int SY_SRC1 = 1080;
27static int SX_SRC2 = 1920;
28static int SY_SRC2 = 1080;
29static int SX_DST = 1920;
30static int SY_DST = 1080;
31
32static int src1_rect_x = 0;
33static int src1_rect_y = 0;
34static int src1_rect_w = 1920;
35static int src1_rect_h = 1080;
36static int src2_rect_x = 0;
37static int src2_rect_y = 0;
38static int src2_rect_w = 1920;
39static int src2_rect_h = 1080;
40static int dst_rect_x = 0;
41static int dst_rect_y = 0;
42static int dst_rect_w = 1920;
43static int dst_rect_h = 1080;
44static int rect_color = 0xff0000ff;
45static int SRC1_PIXFORMAT = PIXEL_FORMAT_RGBA_8888;
46static int SRC2_PIXFORMAT = PIXEL_FORMAT_RGBA_8888;
47static int DST_PIXFORMAT = PIXEL_FORMAT_YV12;
48static int src1_mem_alloc_type = AML_GE2D_MEM_DMABUF;
49static int src2_mem_alloc_type = AML_GE2D_MEM_DMABUF;
50static int dst_mem_alloc_type = AML_GE2D_MEM_DMABUF;
51static int dst_canvas_alloc = 0;
52static int src1_canvas_alloc = 1;
53static int src2_canvas_alloc = 1;
54static int OP = AML_GE2D_STRETCHBLIT;
55static int src1_layer_mode = 0;
56static int src2_layer_mode = 0;
57static int gb1_alpha = 0xff;
58static int gb2_alpha = 0xff;
Jian Caob9fb3ed2019-04-16 16:51:27 +080059aml_ge2d_t amlge2d;
Cao Jiane80b1392019-08-07 20:59:47 +080060static int num_process = 1;
61
62static inline unsigned long myclock()
63{
64 struct timeval tv;
65
66 gettimeofday (&tv, NULL);
67
68 return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
69}
Jian Caob9fb3ed2019-04-16 16:51:27 +080070
71static void set_ge2dinfo(aml_ge2d_info_t *pge2dinfo)
72{
73 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
74 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
75 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
76
77 pge2dinfo->src_info[1].canvas_w = SX_SRC2;
78 pge2dinfo->src_info[1].canvas_h = SY_SRC2;
79 pge2dinfo->src_info[1].format = SRC2_PIXFORMAT;
80
81 pge2dinfo->dst_info.canvas_w = SX_DST;
82 pge2dinfo->dst_info.canvas_h = SY_DST;
83 pge2dinfo->dst_info.format = DST_PIXFORMAT;
84 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
85 pge2dinfo->offset = 0;
86 pge2dinfo->ge2d_op = OP;
87 pge2dinfo->blend_mode = BLEND_MODE_PREMULTIPLIED;
88
89 switch (pge2dinfo->ge2d_op)
90 {
91 case AML_GE2D_FILLRECTANGLE:
92 pge2dinfo->src_info[0].memtype = GE2D_CANVAS_TYPE_INVALID;
93 pge2dinfo->src_info[1].memtype = GE2D_CANVAS_TYPE_INVALID;
94 pge2dinfo->dst_info.memtype = dst_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
95 break;
96 case AML_GE2D_BLIT:
97 case AML_GE2D_STRETCHBLIT:
98 /* if not need alloc, set to GE2D_CANVAS_TYPE_INVALID
99 * otherwise set to GE2D_CANVAS_ALLOC
100 */
101 pge2dinfo->src_info[0].memtype = src1_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;;
102 pge2dinfo->src_info[1].memtype = GE2D_CANVAS_TYPE_INVALID;
103 pge2dinfo->dst_info.memtype = dst_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
104 break;
105 case AML_GE2D_BLEND:
106 pge2dinfo->src_info[0].memtype = src1_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;;
107 pge2dinfo->src_info[1].memtype = src2_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;;
108 pge2dinfo->dst_info.memtype = dst_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
109 break;
110 default:
111 E_GE2D("not support ge2d op,exit test!\n");
112 break;
113 }
114 /*set to AML_GE2D_MEM_DMABUF or AML_GE2D_MEM_ION*/
115 pge2dinfo->src_info[0].mem_alloc_type = src1_mem_alloc_type;
116 pge2dinfo->src_info[1].mem_alloc_type = src2_mem_alloc_type;
117 pge2dinfo->dst_info.mem_alloc_type = dst_mem_alloc_type;
118}
119
120static void print_usage(void)
121{
122 int i;
123 printf ("Usage: ge2d_feature_test [options]\n\n");
124 printf ("Options:\n\n");
125 printf (" --op <0:fillrect, 1:blend, 2:strechblit, 3:blit> ge2d operation case.\n");
126 printf (" --size <WxH> define src1/src2/dst size.\n");
127 printf (" --src1_memtype <0: ion, 1: dmabuf> define memory alloc type.\n");
128 printf (" --src2_memtype <0: ion, 1: dmabuf> define memory alloc type.\n");
129 printf (" --dst_memtype <0: ion, 1: dmabuf> define memory alloc type.\n");
130 printf (" --src1_format <num> define src format.\n");
131 printf (" --src2_format <num> define src2 format.\n");
132 printf (" --dst_format <num> define dst format.\n");
133 printf (" --src1_size <WxH> define src size.\n");
134 printf (" --src2_size <WxH> define src2 size.\n");
135 printf (" --dst_size <WxH> define dst size.\n");
136 printf (" --src1_file <name> define src file.\n");
137 printf (" --src2_file <name> define src2 file.\n");
138 printf (" --dst_file <name> define dst file.\n");
139 printf (" --src1_canvas_alloc <num> define whether src need alloc mem 0:GE2D_CANVAS_OSD0 1:GE2D_CANVAS_ALLOC.\n");
140 printf (" --src2_canvas_alloc <num> defien whether src2 need alloc mem 0:GE2D_CANVAS_OSD0 1:GE2D_CANVAS_ALLOC.\n");
141 printf (" --src1_rect <x_y_w_h> define src rect.\n");
142 printf (" --src2_rect <x_y_w_h> define src2 rect.\n");
143 printf (" --dst_rect <x_y_w_h> define dst rect.\n");
144 printf (" --bo1 <layer_mode_num> define src1_layer_mode.\n");
145 printf (" --bo2 <layer_mode_num> define src2_layer_mode.\n");
146 printf (" --gb1 <gb1_alpha> define src1 global alpha.\n");
147 printf (" --gb2 <gb2_alpha> define src2 global alpha.\n");
148 printf (" --strechblit <x0_y0_w_h-x1_y1_w1_h1> define strechblit info.\n");
149 printf (" --fillrect <color_x_y_w_h> define fillrect info, color in rgba format.\n");
Cao Jiane80b1392019-08-07 20:59:47 +0800150 printf (" --n <num> process num times.\n");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800151 printf (" --help Print usage information.\n");
152 printf ("\n");
153}
154
155static int parse_command_line(int argc, char *argv[])
156{
157 int i;
158 /* parse command line */
159 for (i = 1; i < argc; i++) {
160 if (strncmp (argv[i], "--", 2) == 0) {
161 if (strcmp (argv[i] + 2, "help") == 0) {
162 print_usage();
163 return ge2d_fail;
164 }
165 else if (strcmp (argv[i] + 2, "op") == 0 && ++i < argc &&
166 sscanf (argv[i], "%d", &OP) == 1) {
167 continue;
168 }
169 else if (strcmp (argv[i] + 2, "src1_memtype") == 0 && ++i < argc &&
170 sscanf (argv[i], "%d", &src1_mem_alloc_type) == 1) {
171 continue;
172 }
173 else if (strcmp (argv[i] + 2, "src2_memtype") == 0 && ++i < argc &&
174 sscanf (argv[i], "%d", &src2_mem_alloc_type) == 1) {
175 continue;
176 }
177 else if (strcmp (argv[i] + 2, "dst_memtype") == 0 && ++i < argc &&
178 sscanf (argv[i], "%d", &dst_mem_alloc_type) == 1) {
179 continue;
180 }
181 else if (strcmp (argv[i] + 2, "bo1") == 0 && ++i < argc &&
182 sscanf (argv[i], "%d", &src1_layer_mode) == 1) {
183 continue;
184 }
185 else if (strcmp (argv[i] + 2, "bo2") == 0 && ++i < argc &&
186 sscanf (argv[i], "%d", &src2_layer_mode) == 1) {
187 continue;
188 }
189 else if (strcmp (argv[i] + 2, "gb1") == 0 && ++i < argc &&
190 sscanf (argv[i], "%d", &gb1_alpha) == 1) {
191 continue;
192 }
193 else if (strcmp (argv[i] + 2, "gb2") == 0 && ++i < argc &&
194 sscanf (argv[i], "%d", &gb2_alpha) == 1) {
195 continue;
196 }
197 else if (strcmp (argv[i] + 2, "src1_format") == 0 && ++i < argc &&
198 sscanf (argv[i], "%d", &SRC1_PIXFORMAT) == 1) {
199 continue;
200 }
201 else if (strcmp (argv[i] + 2, "src2_format") == 0 && ++i < argc &&
202 sscanf (argv[i], "%d", &SRC2_PIXFORMAT) == 1) {
203 continue;
204 }
205 else if (strcmp (argv[i] + 2, "dst_format") == 0 && ++i < argc &&
206 sscanf (argv[i], "%d", &DST_PIXFORMAT) == 1) {
207 continue;
208 }
209 else if (strcmp (argv[i] + 2, "size") == 0 && ++i < argc &&
210 sscanf (argv[i], "%dx%d", &SX_SRC1, &SY_SRC1) == 2) {
211 SX_SRC2 = SX_DST = SX_SRC1;
212 SY_SRC2 = SY_DST = SY_SRC1;
213 continue;
214 }
215 else if (strcmp (argv[i] + 2, "dst_size") == 0 && ++i < argc &&
216 sscanf (argv[i], "%dx%d", &SX_DST, &SY_DST) == 2) {
217 continue;
218 }
219 else if (strcmp (argv[i] + 2, "src1_size") == 0 && ++i < argc &&
220 sscanf (argv[i], "%dx%d", &SX_SRC1, &SY_SRC1) == 2) {
221 continue;
222 }
223 else if (strcmp (argv[i] + 2, "src2_size") == 0 && ++i < argc &&
224 sscanf (argv[i], "%dx%d", &SX_SRC2, &SY_SRC2) == 2) {
225 continue;
226 }
227 else if (strcmp (argv[i] + 2, "src1_rect") == 0 && ++i < argc &&
228 sscanf (argv[i], "%d_%d_%d_%d",
229 &src1_rect_x, &src1_rect_y, &src1_rect_w, &src1_rect_h) == 4) {
230 continue;
231 }
232 else if (strcmp (argv[i] + 2, "src2_rect") == 0 && ++i < argc &&
233 sscanf (argv[i], "%d_%d_%d_%d",
234 &src2_rect_x, &src2_rect_y, &src2_rect_w, &src2_rect_h) == 4) {
235 continue;
236 }
237 else if (strcmp (argv[i] + 2, "dst_rect") == 0 && ++i < argc &&
238 sscanf (argv[i], "%d_%d_%d_%d",
239 &dst_rect_x, &dst_rect_y, &dst_rect_w, &dst_rect_h) == 4) {
240 continue;
241 }
242 else if (strcmp (argv[i] + 2, "strechblit") == 0 && ++i < argc &&
243 sscanf (argv[i], "%d_%d_%d_%d-%d_%d_%d_%d",
244 &src1_rect_x, &src1_rect_y, &src1_rect_w, &src1_rect_h,
245 &dst_rect_x, &dst_rect_y, &dst_rect_w, &dst_rect_h) == 8) {
246 continue;
247 }
248 else if (strcmp (argv[i] + 2, "fillrect") == 0 && ++i < argc &&
249 sscanf (argv[i], "%x_%d_%d_%d_%d",
250 &rect_color, &dst_rect_x, &dst_rect_y, &dst_rect_w, &dst_rect_h) == 5) {
251 continue;
252 }
253 else if (strcmp (argv[i] + 2, "src1_file") == 0 && ++i < argc &&
254 sscanf (argv[i], "%s", &SRC1_FILE_NAME) == 1) {
255 continue;
256 }
257 else if (strcmp (argv[i] + 2, "src2_file") == 0 && ++i < argc &&
258 sscanf (argv[i], "%s", &SRC2_FILE_NAME) == 1) {
259 continue;
260 }
261 else if (strcmp (argv[i] + 2, "dst_file") == 0 && ++i < argc &&
262 sscanf (argv[i], "%s", &DST_FILE_NAME) == 1) {
263 dst_canvas_alloc = 1;
264 continue;
265 }
266 else if (strcmp (argv[i] + 2, "src1_canvas_alloc") == 0 && ++i < argc &&
267 sscanf (argv[i], "%d", &src1_canvas_alloc) == 1) {
268 continue;
269 }
270 else if (strcmp (argv[i] + 2, "src2_canvas_alloc") == 0 && ++i < argc &&
271 sscanf (argv[i], "%d", &src2_canvas_alloc) == 1) {
272 continue;
273 }
Cao Jiane80b1392019-08-07 20:59:47 +0800274 else if (strcmp (argv[i] + 2, "n") == 0 && ++i < argc &&
275 sscanf (argv[i], "%d", &num_process) == 1) {
276 continue;
277 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800278 }
279 }
280 return ge2d_success;
281}
282
283
284int aml_read_file_src1(const char* url , aml_ge2d_info_t *pge2dinfo)
285{
286 int fd = -1;
287 int length = 0;
288 int read_num = 0;
289 if (amlge2d.src_size == 0)
290 return 0;
291
292 fd = open(url,O_RDONLY );
293 if (fd < 0) {
294 E_GE2D("read source file:%s open error\n",url);
295 return ge2d_fail;
296 }
297
298 amlge2d.src_data = (char*)malloc(amlge2d.src_size);
299 if (!amlge2d.src_data) {
300 E_GE2D("malloc for src_data failed\n");
301 return ge2d_fail;
302 }
303
304 read_num = read(fd,amlge2d.src_data,amlge2d.src_size);
305 if (read_num <= 0) {
306 E_GE2D("read file read_num=%d error\n",read_num);
307 return ge2d_fail;
308 }
309
310 memcpy(pge2dinfo->src_info[0].vaddr, amlge2d.src_data, amlge2d.src_size);
311 close(fd);
312 return ge2d_success;
313}
314
315int aml_read_file_src2(const char* url , aml_ge2d_info_t *pge2dinfo)
316{
317 int fd = -1;
318 int length = 0;
319 int read_num = 0;
320 if (amlge2d.src2_size == 0)
321 return 0;
322
323 fd = open(url,O_RDONLY );
324 if (fd < 0) {
325 E_GE2D("read source file:%s open error\n",url);
326 return ge2d_fail;
327 }
328
329 amlge2d.src2_data = (char*)malloc(amlge2d.src2_size);
330 if (!amlge2d.src2_data) {
331 E_GE2D("malloc for src_data failed\n");
332 return ge2d_fail;
333 }
334
335 read_num = read(fd,amlge2d.src2_data,amlge2d.src2_size);
336 if (read_num <= 0) {
337 E_GE2D("read file read_num=%d error\n",read_num);
338 return ge2d_fail;
339 }
340
341 memcpy(pge2dinfo->src_info[1].vaddr, amlge2d.src2_data, amlge2d.src2_size);
342 close(fd);
343 return ge2d_success;
344}
345
346int aml_write_file(const char* url , aml_ge2d_info_t *pge2dinfo)
347{
348 int fd = -1;
349 int length = 0;
350 int write_num = 0;
351 unsigned int *value;
352 if (amlge2d.dst_size == 0)
353 return 0;
354 if ((GE2D_CANVAS_OSD0 == pge2dinfo->dst_info.memtype)
355 || (GE2D_CANVAS_OSD1 == pge2dinfo->dst_info.memtype))
356 return 0;
357
358 fd = open(url,O_RDWR | O_CREAT,0660);
359 if (fd < 0) {
360 E_GE2D("write file:%s open error\n",url);
361 return ge2d_fail;
362 }
363
364 amlge2d.dst_data = (char*)malloc(amlge2d.dst_size);
365 if (!amlge2d.dst_data) {
366 E_GE2D("malloc for dst_data failed\n");
367 return ge2d_fail;
368 }
369
370 memcpy(amlge2d.dst_data,pge2dinfo->dst_info.vaddr,amlge2d.dst_size);
371 printf("pixel: 0x%2x, 0x%2x,0x%2x,0x%2x, 0x%2x,0x%2x,0x%2x,0x%2x\n",
372 amlge2d.dst_data[0],
373 amlge2d.dst_data[1],
374 amlge2d.dst_data[2],
375 amlge2d.dst_data[3],
376 amlge2d.dst_data[4],
377 amlge2d.dst_data[5],
378 amlge2d.dst_data[6],
379 amlge2d.dst_data[7]);
380 write_num = write(fd,amlge2d.dst_data,amlge2d.dst_size);
381 if (write_num <= 0) {
382 E_GE2D("write file write_num=%d error\n",write_num);
383 }
384 close(fd);
385 return ge2d_success;
386}
387
388
389static int do_fill_rectangle(aml_ge2d_info_t *pge2dinfo)
390{
391 int ret = -1;
392 char code;
Cao Jiane80b1392019-08-07 20:59:47 +0800393 int i;
394 unsigned long stime;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800395
396 printf("do_fill_rectangle test case:\n");
397
398 pge2dinfo->color = rect_color;
399 pge2dinfo->dst_info.rect.x = dst_rect_x;
400 pge2dinfo->dst_info.rect.y = dst_rect_x;
401 pge2dinfo->dst_info.rect.w = dst_rect_w;
402 pge2dinfo->dst_info.rect.h = dst_rect_h;
Cao Jiane80b1392019-08-07 20:59:47 +0800403 stime = myclock();
404 for (i = 0; i < num_process; i++)
405 ret = aml_ge2d_process(pge2dinfo);
406 printf("time=%ld ms\n", myclock() - stime);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800407 #if 0
408 sleep(5);
409
410 printf("please enter any key do rotation test[90]\n");
411 code = getc(stdin);
412 pge2dinfo->dst_info.rotation = GE2D_ROTATION_180;
413 ret = aml_ge2d_process(pge2dinfo);
414 #endif
415 if (ret < 0)
416 printf("%s failed\n", __func__);
417 return ret;
418}
419
420
421static int do_blend(aml_ge2d_info_t *pge2dinfo)
422{
423 int ret = -1;
424 char code = 0;
425 int shared_fd_bakup;
426 unsigned long offset_bakup = 0;
Cao Jiane80b1392019-08-07 20:59:47 +0800427 int i;
428 unsigned long stime;
429
Jian Caob9fb3ed2019-04-16 16:51:27 +0800430 printf("do_blend test case:\n");
431
Jian Cao49c82bd2019-06-04 12:49:10 +0800432 if (pge2dinfo->cap_attr == 0x1) {
Jian Caob9fb3ed2019-04-16 16:51:27 +0800433 /* do blend src1 blend src2(dst) to dst */
434 printf("one step blend\n");
435 ret = aml_read_file_src1(SRC1_FILE_NAME,pge2dinfo);
436 if (ret < 0)
437 return ge2d_fail;
438 ret = aml_read_file_src2(SRC2_FILE_NAME,pge2dinfo);
439 if (ret < 0)
440 return ge2d_fail;
441
442 pge2dinfo->src_info[0].rect.x = src1_rect_x;
443 pge2dinfo->src_info[0].rect.y = src1_rect_y;
444 pge2dinfo->src_info[0].rect.w = src1_rect_w;
445 pge2dinfo->src_info[0].rect.h = src1_rect_h;
446 pge2dinfo->src_info[0].fill_color_en = 0;
447
448 pge2dinfo->src_info[1].rect.x = src2_rect_x;
449 pge2dinfo->src_info[1].rect.y = src2_rect_y;
450 pge2dinfo->src_info[1].rect.w = src2_rect_w;
451 pge2dinfo->src_info[1].rect.h = src2_rect_h;
452 pge2dinfo->src_info[1].fill_color_en = 0;
453 if ((src2_layer_mode == LAYER_MODE_NON) && (src1_layer_mode == LAYER_MODE_PREMULTIPLIED))
454 pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888;
455
456 pge2dinfo->dst_info.rect.x = dst_rect_x;
457 pge2dinfo->dst_info.rect.y = dst_rect_y;
458 pge2dinfo->dst_info.rect.w = dst_rect_w;
459 pge2dinfo->dst_info.rect.h = dst_rect_h;
460 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
461
462 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
463 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
464 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
465 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
Cao Jiane80b1392019-08-07 20:59:47 +0800466 stime = myclock();
467 for (i = 0; i < num_process; i++)
468 ret = aml_ge2d_process(pge2dinfo);
469 printf("time=%ld ms\n", myclock() - stime);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800470 } else {
471 if (((gb1_alpha != 0xff)
472 && (gb2_alpha != 0xff))){
473 printf("two steps blend,two plane alpha\n");
474
475 if (src2_layer_mode == LAYER_MODE_COVERAGE) {
476 printf("two steps blend,src2 LAYER_MODE_COVERAGE\n");
477 ret = aml_read_file_src1(SRC2_FILE_NAME,pge2dinfo);
478 if (ret < 0)
479 return ge2d_fail;
480
481 /* both plane alpha, do 2 steps */
482 /* step 1: strechbilt */
483 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
484 /* src2 do strechbilt to dst */
485 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
486 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
487 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
488 pge2dinfo->src_info[0].rect.x = 0;
489 pge2dinfo->src_info[0].rect.y = 0;
490 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
491 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
492 pge2dinfo->src_info[0].fill_color_en = 0;
493
494 pge2dinfo->src_info[1].canvas_w = SX_DST;
495 pge2dinfo->src_info[1].canvas_h = SY_DST;
496 pge2dinfo->src_info[1].format = DST_PIXFORMAT;
497 pge2dinfo->src_info[1].rect.x = 0;
498 pge2dinfo->src_info[1].rect.y = 0;
499 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
500 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
501 pge2dinfo->src_info[1].fill_color_en = 1;
502 pge2dinfo->src_info[1].def_color = 0x00;
503
504 pge2dinfo->dst_info.canvas_w = SX_DST;
505 pge2dinfo->dst_info.canvas_h = SY_DST;
506 pge2dinfo->dst_info.format = DST_PIXFORMAT;
507 pge2dinfo->dst_info.rect.x = 0;
508 pge2dinfo->dst_info.rect.y = 0;
509 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
510 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
511 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
512
513 pge2dinfo->src_info[0].layer_mode = LAYER_MODE_COVERAGE;
514 pge2dinfo->src_info[1].layer_mode = LAYER_MODE_COVERAGE;
515 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
516 pge2dinfo->src_info[1].plane_alpha = 0xff;
517 ret = aml_ge2d_process(pge2dinfo);
518 ret = aml_read_file_src1(SRC1_FILE_NAME,pge2dinfo);
519 if (ret < 0)
520 return ge2d_fail;
521
522 /* step2: blend src1 blend src2(dst) to dst */
523 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
524
525 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
526 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
527 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
528 pge2dinfo->src_info[0].rect.x = 0;
529 pge2dinfo->src_info[0].rect.y = 0;
530 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
531 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
532 pge2dinfo->src_info[0].fill_color_en = 0;
533
534 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
535 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
536 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
537 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
538 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
539 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
540 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
541 pge2dinfo->src_info[1].shared_fd = pge2dinfo->dst_info.shared_fd;
542 pge2dinfo->src_info[1].offset = pge2dinfo->dst_info.offset;
543 pge2dinfo->src_info[1].fill_color_en = 0;
544
545 pge2dinfo->dst_info.canvas_w = SX_DST;
546 pge2dinfo->dst_info.canvas_h = SY_DST;
547 pge2dinfo->dst_info.format = DST_PIXFORMAT;
548 pge2dinfo->dst_info.rect.x = 0;
549 pge2dinfo->dst_info.rect.y = 0;
550 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
551 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
552 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
553
554 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
555 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
556 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
557 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
558 ret = aml_ge2d_process(pge2dinfo);
559 } else {
560 ret = aml_read_file_src1(SRC1_FILE_NAME,pge2dinfo);
561 if (ret < 0)
562 return ge2d_fail;
563 ret = aml_read_file_src2(SRC2_FILE_NAME,pge2dinfo);
564 if (ret < 0)
565 return ge2d_fail;
566 printf("two step: strechbilt+blend\n");
567 /* both plane alpha, do 2 steps */
568 /* step 1: strechbilt */
569 pge2dinfo->ge2d_op = AML_GE2D_STRETCHBLIT;
570 /* src2 do strechbilt to dst */
571 pge2dinfo->src_info[0].canvas_w = SX_SRC2;
572 pge2dinfo->src_info[0].canvas_h = SY_SRC2;
573 pge2dinfo->src_info[0].format = SRC2_PIXFORMAT;
574 pge2dinfo->src_info[0].rect.x = 0;
575 pge2dinfo->src_info[0].rect.y = 0;
576 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
577 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
578
579 shared_fd_bakup = pge2dinfo->src_info[0].shared_fd;
580 offset_bakup = pge2dinfo->src_info[0].offset;
581 pge2dinfo->src_info[0].shared_fd = pge2dinfo->src_info[1].shared_fd;
582 pge2dinfo->src_info[0].offset = pge2dinfo->src_info[1].offset;
583
584 pge2dinfo->src_info[0].layer_mode = src2_layer_mode;
585 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
586 pge2dinfo->dst_info.canvas_w = SX_DST;
587 pge2dinfo->dst_info.canvas_h = SY_DST;
588 pge2dinfo->dst_info.format = DST_PIXFORMAT;
589 pge2dinfo->dst_info.rect.x = 0;
590 pge2dinfo->dst_info.rect.y = 0;
591 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
592 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
593 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
594 ret = aml_ge2d_process(pge2dinfo);
595
596 /* step2: blend src1 blend src2(dst) to dst */
597 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
598
599 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
600 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
601 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
602 pge2dinfo->src_info[0].rect.x = 0;
603 pge2dinfo->src_info[0].rect.y = 0;
604 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
605 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
606 pge2dinfo->src_info[0].shared_fd = shared_fd_bakup;
607 pge2dinfo->src_info[0].offset = offset_bakup;
608 pge2dinfo->src_info[0].fill_color_en = 0;
609
610 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
611 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
612 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
613 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
614 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
615 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
616 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
617 pge2dinfo->src_info[1].shared_fd = pge2dinfo->dst_info.shared_fd;
618 pge2dinfo->src_info[1].offset = pge2dinfo->dst_info.offset;
619 pge2dinfo->src_info[1].fill_color_en = 0;
620
621 pge2dinfo->dst_info.canvas_w = SX_DST;
622 pge2dinfo->dst_info.canvas_h = SY_DST;
623 pge2dinfo->dst_info.format = DST_PIXFORMAT;
624 pge2dinfo->dst_info.rect.x = 0;
625 pge2dinfo->dst_info.rect.y = 0;
626 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
627 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
628 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
629
630 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
631 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
632 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
633 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
634 ret = aml_ge2d_process(pge2dinfo);
635 }
636 } else if (src2_layer_mode == LAYER_MODE_COVERAGE){
637 printf("two steps blend,src2 LAYER_MODE_COVERAGE: two blend\n");
638 ret = aml_read_file_src1(SRC2_FILE_NAME,pge2dinfo);
639 if (ret < 0)
640 return ge2d_fail;
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);
678 ret = aml_read_file_src1(SRC1_FILE_NAME,pge2dinfo);
679 if (ret < 0)
680 return ge2d_fail;
681 /* step2: blend src1 blend src2(dst) to dst */
682 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
683
684 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
685 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
686 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
687 pge2dinfo->src_info[0].rect.x = 0;
688 pge2dinfo->src_info[0].rect.y = 0;
689 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
690 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
691 pge2dinfo->src_info[0].fill_color_en = 0;
692
693 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
694 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
695 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
696 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
697 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
698 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
699 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
700 pge2dinfo->src_info[1].shared_fd = pge2dinfo->dst_info.shared_fd;
701 pge2dinfo->src_info[1].offset = pge2dinfo->dst_info.offset;
702 pge2dinfo->src_info[1].fill_color_en = 0;
703
704 pge2dinfo->dst_info.canvas_w = SX_DST;
705 pge2dinfo->dst_info.canvas_h = SY_DST;
706 pge2dinfo->dst_info.format = DST_PIXFORMAT;
707 pge2dinfo->dst_info.rect.x = 0;
708 pge2dinfo->dst_info.rect.y = 0;
709 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
710 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
711 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
712
713 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
714 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
715 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
716 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
717 ret = aml_ge2d_process(pge2dinfo);
718 } else if ((src2_layer_mode == LAYER_MODE_NON)
719 && (src1_layer_mode != LAYER_MODE_PREMULTIPLIED)){
720 printf("two steps blend,src2 LAYER_MODE_NON:strechbilt+blend\n");
721 ret = aml_read_file_src1(SRC1_FILE_NAME,pge2dinfo);
722 if (ret < 0)
723 return ge2d_fail;
724 ret = aml_read_file_src2(SRC2_FILE_NAME,pge2dinfo);
725 if (ret < 0)
726 return ge2d_fail;
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
739 shared_fd_bakup = pge2dinfo->src_info[0].shared_fd;
740 offset_bakup = pge2dinfo->src_info[0].offset;
741 pge2dinfo->src_info[0].shared_fd = pge2dinfo->src_info[1].shared_fd;
742 pge2dinfo->src_info[0].offset = pge2dinfo->src_info[1].offset;
743 pge2dinfo->src_info[0].layer_mode = src2_layer_mode;
744 pge2dinfo->src_info[0].plane_alpha = 0xff;
745 pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888;
746
747 pge2dinfo->dst_info.canvas_w = SX_DST;
748 pge2dinfo->dst_info.canvas_h = SY_DST;
749 pge2dinfo->dst_info.format = DST_PIXFORMAT;
750 pge2dinfo->dst_info.rect.x = 0;
751 pge2dinfo->dst_info.rect.y = 0;
752 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
753 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
754 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
755 ret = aml_ge2d_process(pge2dinfo);
756
757 /* step2: blend src1 blend src2(dst) to dst */
758 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
759
760 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
761 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
762 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
763 pge2dinfo->src_info[0].rect.x = 0;
764 pge2dinfo->src_info[0].rect.y = 0;
765 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
766 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
767 pge2dinfo->src_info[0].shared_fd = shared_fd_bakup;
768 pge2dinfo->src_info[0].offset = offset_bakup;
769 pge2dinfo->src_info[0].fill_color_en = 0;
770
771 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
772 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
773 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
774 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
775 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
776 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
777 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
778 pge2dinfo->src_info[1].shared_fd = pge2dinfo->dst_info.shared_fd;
779 pge2dinfo->src_info[1].offset = pge2dinfo->dst_info.offset;
780 pge2dinfo->src_info[1].fill_color_en = 0;
781
782 pge2dinfo->dst_info.canvas_w = SX_DST;
783 pge2dinfo->dst_info.canvas_h = SY_DST;
784 pge2dinfo->dst_info.format = DST_PIXFORMAT;
785 pge2dinfo->dst_info.rect.x = 0;
786 pge2dinfo->dst_info.rect.y = 0;
787 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
788 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
789 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
790 printf("two steps blend,src1_layer_mode=%d,src2_layer_mode=%d\n",src1_layer_mode,src2_layer_mode);
791
792 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
793 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
794 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
795 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
796 ret = aml_ge2d_process(pge2dinfo);
797 } else {
798 /* do blend src1 blend src2(dst) to dst */
799 printf("one step blend\n");
800 ret = aml_read_file_src1(SRC1_FILE_NAME,pge2dinfo);
801 if (ret < 0)
802 return ge2d_fail;
803 ret = aml_read_file_src2(SRC2_FILE_NAME,pge2dinfo);
804 if (ret < 0)
805 return ge2d_fail;
806 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
807 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
808 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
809 pge2dinfo->src_info[0].rect.x = 0;
810 pge2dinfo->src_info[0].rect.y = 0;
811 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
812 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
813 pge2dinfo->src_info[0].fill_color_en = 0;
814
815 pge2dinfo->src_info[1].canvas_w = SX_SRC2;
816 pge2dinfo->src_info[1].canvas_h = SY_SRC2;
817 pge2dinfo->src_info[1].format = SRC2_PIXFORMAT;
818 pge2dinfo->src_info[1].rect.x = 0;
819 pge2dinfo->src_info[1].rect.y = 0;
820 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
821 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
822 pge2dinfo->src_info[1].fill_color_en = 0;
823 if (src2_layer_mode == LAYER_MODE_NON)
824 pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888;
825 pge2dinfo->dst_info.canvas_w = SX_DST;
826 pge2dinfo->dst_info.canvas_h = SY_DST;
827 pge2dinfo->dst_info.format = DST_PIXFORMAT;
828 pge2dinfo->dst_info.rect.x = 0;
829 pge2dinfo->dst_info.rect.y = 0;
830 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
831 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
832 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
833
834 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
835 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
836 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
837 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
838 ret = aml_ge2d_process(pge2dinfo);
839 }
840 }
841 if (ret < 0)
842 printf("%s failed\n", __func__);
843 return ret;
844}
845
846
847static int do_strechblit(aml_ge2d_info_t *pge2dinfo)
848{
849 int ret = -1;
850 char code = 0;
Cao Jiane80b1392019-08-07 20:59:47 +0800851 int i;
852 unsigned long stime;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800853 printf("do_strechblit test case:\n");
854 ret = aml_read_file_src1(SRC1_FILE_NAME,pge2dinfo);
855 if (ret < 0)
856 return ge2d_fail;
857
858 pge2dinfo->src_info[0].rect.x = src1_rect_x;
859 pge2dinfo->src_info[0].rect.y = src1_rect_y;
860 pge2dinfo->src_info[0].rect.w = src1_rect_w;
861 pge2dinfo->src_info[0].rect.h = src1_rect_h;
862 pge2dinfo->dst_info.rect.x = dst_rect_x;
863 pge2dinfo->dst_info.rect.y = dst_rect_y;
864 pge2dinfo->dst_info.rect.w = dst_rect_w;
865 pge2dinfo->dst_info.rect.h = dst_rect_h;
866 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
867 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
868 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
869
Cao Jiane80b1392019-08-07 20:59:47 +0800870 stime = myclock();
871 for (i = 0; i < num_process; i++)
872 ret = aml_ge2d_process(pge2dinfo);
873 printf("time=%ld ms\n", myclock() - stime);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800874 #if 0
875 sleep(5);
876
877 printf("please enter any key do rotation test[90]\n");
878 code = getc(stdin);
879 pge2dinfo->dst_info.rotation = GE2D_ROTATION_90;
880 ret = aml_ge2d_process(pge2dinfo);
881 #endif
882 if (ret < 0)
883 printf("%s failed\n", __func__);
884 return ret;
885
886}
887
888static int do_blit(aml_ge2d_info_t *pge2dinfo)
889{
890 int ret = -1;
891 char code = 0;
Cao Jiane80b1392019-08-07 20:59:47 +0800892 int i;
893 unsigned long stime;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800894 printf("do_blit test case:\n");
895 ret = aml_read_file_src1(SRC1_FILE_NAME,pge2dinfo);
896 if (ret < 0)
897 return ge2d_fail;
898
899 pge2dinfo->src_info[0].rect.x = src1_rect_x;
900 pge2dinfo->src_info[0].rect.y = src1_rect_y;
901 pge2dinfo->src_info[0].rect.w = src1_rect_w;
902 pge2dinfo->src_info[0].rect.h = src1_rect_h;
903 pge2dinfo->dst_info.rect.x = dst_rect_x;
904 pge2dinfo->dst_info.rect.y = dst_rect_y;
905
906 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
907 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
908 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
909
Cao Jiane80b1392019-08-07 20:59:47 +0800910 stime = myclock();
911 for (i = 0; i < num_process; i++)
912 ret = aml_ge2d_process(pge2dinfo);
913 printf("time=%ld ms\n", myclock() - stime);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800914 #if 0
915 sleep(5);
916
917 printf("please enter any key do rotation test[90]\n");
918 code = getc(stdin);
919 pge2dinfo->dst_info.rotation = GE2D_ROTATION_90;
920 pge2dinfo->src_info[0].rect.x = 0;
921 pge2dinfo->src_info[0].rect.y = 0;
922 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
923 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
924 pge2dinfo->dst_info.rect.x = 0;
925 pge2dinfo->dst_info.rect.y = 0;
926
927 ret = aml_ge2d_process(pge2dinfo);
928 #endif
929 if (ret < 0)
930 printf("%s failed\n", __func__);
931 return ret;
932}
933
934int main(int argc, char **argv)
935{
936 int ret = -1;
937 int i = 0;
938 unsigned long stime;
939 memset(&amlge2d,0x0,sizeof(aml_ge2d_t));
940 memset(&(amlge2d.ge2dinfo.src_info[0]), 0, sizeof(buffer_info_t));
941 memset(&(amlge2d.ge2dinfo.src_info[1]), 0, sizeof(buffer_info_t));
942 memset(&(amlge2d.ge2dinfo.dst_info), 0, sizeof(buffer_info_t));
Jian Cao49c82bd2019-06-04 12:49:10 +0800943
Jian Caob9fb3ed2019-04-16 16:51:27 +0800944 ret = parse_command_line(argc,argv);
945 if (ret == ge2d_fail)
946 return ge2d_success;
947
948 set_ge2dinfo(&amlge2d.ge2dinfo);
949
Jian Cao49c82bd2019-06-04 12:49:10 +0800950 ret = aml_ge2d_init(&amlge2d);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800951 if (ret < 0)
952 return ge2d_fail;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800953
954 ret = aml_ge2d_mem_alloc(&amlge2d);
955 if (ret < 0)
956 goto exit;
957#if 0
958 /* if dma_buf and used fd alloc other driver */
959 /* set dma buf fd */
960 amlge2d.ge2dinfo.src_info[0].shared_fd = dma_fd;
961 amlge2d.ge2dinfo.src_info[0].memtype = GE2D_CANVAS_ALLOC;
962#endif
963
964 switch (amlge2d.ge2dinfo.ge2d_op)
965 {
966 case AML_GE2D_FILLRECTANGLE:
967 ret = do_fill_rectangle(&amlge2d.ge2dinfo);
968 break;
969 case AML_GE2D_BLEND:
970 ret = do_blend(&amlge2d.ge2dinfo);
971 break;
972 case AML_GE2D_STRETCHBLIT:
973 ret = do_strechblit(&amlge2d.ge2dinfo);
974 break;
975 case AML_GE2D_BLIT:
976 ret = do_blit(&amlge2d.ge2dinfo);
977 break;
978 default:
979 E_GE2D("not support ge2d op,exit test!\n");
980 break;
981 }
Jian Cao49c82bd2019-06-04 12:49:10 +0800982 if (ret < 0)
983 goto exit;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800984 ret = aml_write_file(DST_FILE_NAME,&amlge2d.ge2dinfo);
Jian Cao49c82bd2019-06-04 12:49:10 +0800985 if (ret < 0)
986 goto exit;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800987exit:
988 if (amlge2d.src_data) {
989 free(amlge2d.src_data);
990 amlge2d.src_data = NULL;
991 }
992 if (amlge2d.src2_data) {
993 free(amlge2d.src2_data);
994 amlge2d.src2_data = NULL;
995 }
996 if (amlge2d.dst_data) {
997 free(amlge2d.dst_data);
998 amlge2d.dst_data = NULL;
999 }
1000 aml_ge2d_mem_free(&amlge2d);
Jian Cao49c82bd2019-06-04 12:49:10 +08001001 aml_ge2d_exit(&amlge2d);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001002 printf("ge2d feature_test exit!!!\n");
1003 return ge2d_success;
1004}