blob: 99b7cdeb366e69107fc9dd823038e2a26d7abde6 [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;
473 pge2dinfo->dst_info.rect.y = dst_rect_x;
474 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;
531 if ((src2_layer_mode == LAYER_MODE_NON) && (src1_layer_mode == LAYER_MODE_PREMULTIPLIED))
532 pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888;
533
534 pge2dinfo->dst_info.rect.x = dst_rect_x;
535 pge2dinfo->dst_info.rect.y = dst_rect_y;
536 pge2dinfo->dst_info.rect.w = dst_rect_w;
537 pge2dinfo->dst_info.rect.h = dst_rect_h;
538 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
539
540 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
541 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
542 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
543 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
Cao Jiane80b1392019-08-07 20:59:47 +0800544 stime = myclock();
Cao Jian65331472019-11-01 21:01:49 +0800545 for (i = 0; i < num_process; i++) {
546 ret = aml_ge2d_process(pge2dinfo);
547 if (ret < 0) {
548 printf("ge2d process failed, %s (%d)\n", __func__, __LINE__);
549 return ret;
550 }
551 }
Cao Jiane80b1392019-08-07 20:59:47 +0800552 printf("time=%ld ms\n", myclock() - stime);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800553 } else {
554 if (((gb1_alpha != 0xff)
555 && (gb2_alpha != 0xff))){
556 printf("two steps blend,two plane alpha\n");
557
558 if (src2_layer_mode == LAYER_MODE_COVERAGE) {
559 printf("two steps blend,src2 LAYER_MODE_COVERAGE\n");
Cao Jian53a15142019-08-16 13:58:17 +0800560 ret = aml_read_file_src1(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800561 if (ret < 0)
562 return ge2d_fail;
563
564 /* both plane alpha, do 2 steps */
565 /* step 1: strechbilt */
566 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
567 /* src2 do strechbilt to dst */
568 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
569 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
570 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
571 pge2dinfo->src_info[0].rect.x = 0;
572 pge2dinfo->src_info[0].rect.y = 0;
573 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
574 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
575 pge2dinfo->src_info[0].fill_color_en = 0;
576
577 pge2dinfo->src_info[1].canvas_w = SX_DST;
578 pge2dinfo->src_info[1].canvas_h = SY_DST;
579 pge2dinfo->src_info[1].format = DST_PIXFORMAT;
580 pge2dinfo->src_info[1].rect.x = 0;
581 pge2dinfo->src_info[1].rect.y = 0;
582 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
583 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
584 pge2dinfo->src_info[1].fill_color_en = 1;
585 pge2dinfo->src_info[1].def_color = 0x00;
586
587 pge2dinfo->dst_info.canvas_w = SX_DST;
588 pge2dinfo->dst_info.canvas_h = SY_DST;
589 pge2dinfo->dst_info.format = DST_PIXFORMAT;
590 pge2dinfo->dst_info.rect.x = 0;
591 pge2dinfo->dst_info.rect.y = 0;
592 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
593 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
594 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
595
596 pge2dinfo->src_info[0].layer_mode = LAYER_MODE_COVERAGE;
597 pge2dinfo->src_info[1].layer_mode = LAYER_MODE_COVERAGE;
598 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
599 pge2dinfo->src_info[1].plane_alpha = 0xff;
600 ret = aml_ge2d_process(pge2dinfo);
Cao Jian53a15142019-08-16 13:58:17 +0800601 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800602 if (ret < 0)
603 return ge2d_fail;
604
605 /* step2: blend src1 blend src2(dst) to dst */
606 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
607
608 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
609 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
610 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
611 pge2dinfo->src_info[0].rect.x = 0;
612 pge2dinfo->src_info[0].rect.y = 0;
613 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
614 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
615 pge2dinfo->src_info[0].fill_color_en = 0;
616
617 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
618 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
619 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
620 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
621 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
622 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
623 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800624 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
625 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800626 pge2dinfo->src_info[1].fill_color_en = 0;
627
628 pge2dinfo->dst_info.canvas_w = SX_DST;
629 pge2dinfo->dst_info.canvas_h = SY_DST;
630 pge2dinfo->dst_info.format = DST_PIXFORMAT;
631 pge2dinfo->dst_info.rect.x = 0;
632 pge2dinfo->dst_info.rect.y = 0;
633 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
634 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
635 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
636
637 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
638 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
639 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
640 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
641 ret = aml_ge2d_process(pge2dinfo);
642 } else {
Cao Jian53a15142019-08-16 13:58:17 +0800643 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800644 if (ret < 0)
645 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +0800646 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800647 if (ret < 0)
648 return ge2d_fail;
649 printf("two step: strechbilt+blend\n");
650 /* both plane alpha, do 2 steps */
651 /* step 1: strechbilt */
652 pge2dinfo->ge2d_op = AML_GE2D_STRETCHBLIT;
653 /* src2 do strechbilt to dst */
654 pge2dinfo->src_info[0].canvas_w = SX_SRC2;
655 pge2dinfo->src_info[0].canvas_h = SY_SRC2;
656 pge2dinfo->src_info[0].format = SRC2_PIXFORMAT;
657 pge2dinfo->src_info[0].rect.x = 0;
658 pge2dinfo->src_info[0].rect.y = 0;
659 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
660 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
661
Cao Jian65331472019-11-01 21:01:49 +0800662 shared_fd_bakup = pge2dinfo->src_info[0].shared_fd[0];
663 offset_bakup = pge2dinfo->src_info[0].offset[0];
664 pge2dinfo->src_info[0].shared_fd[0] = pge2dinfo->src_info[1].shared_fd[0];
665 pge2dinfo->src_info[0].offset[0] = pge2dinfo->src_info[1].offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800666
667 pge2dinfo->src_info[0].layer_mode = src2_layer_mode;
668 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
669 pge2dinfo->dst_info.canvas_w = SX_DST;
670 pge2dinfo->dst_info.canvas_h = SY_DST;
671 pge2dinfo->dst_info.format = DST_PIXFORMAT;
672 pge2dinfo->dst_info.rect.x = 0;
673 pge2dinfo->dst_info.rect.y = 0;
674 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
675 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
676 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
677 ret = aml_ge2d_process(pge2dinfo);
678
679 /* step2: blend src1 blend src2(dst) to dst */
680 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
681
682 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
683 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
684 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
685 pge2dinfo->src_info[0].rect.x = 0;
686 pge2dinfo->src_info[0].rect.y = 0;
687 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
688 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jian65331472019-11-01 21:01:49 +0800689 pge2dinfo->src_info[0].shared_fd[0] = shared_fd_bakup;
690 pge2dinfo->src_info[0].offset[0] = offset_bakup;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800691 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;
Cao Jian65331472019-11-01 21:01:49 +0800700 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
701 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800702 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 }
719 } else if (src2_layer_mode == LAYER_MODE_COVERAGE){
720 printf("two steps blend,src2 LAYER_MODE_COVERAGE: two blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800721 ret = aml_read_file_src1(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800722 if (ret < 0)
723 return ge2d_fail;
724 /* both plane alpha, do 2 steps */
725 /* step 1: strechbilt */
726 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
727 /* src2 do strechbilt to dst */
728 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
729 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
730 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
731 pge2dinfo->src_info[0].rect.x = 0;
732 pge2dinfo->src_info[0].rect.y = 0;
733 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
734 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
735 pge2dinfo->src_info[0].fill_color_en = 0;
736
737 pge2dinfo->src_info[1].canvas_w = SX_DST;
738 pge2dinfo->src_info[1].canvas_h = SY_DST;
739 pge2dinfo->src_info[1].format = DST_PIXFORMAT;
740 pge2dinfo->src_info[1].rect.x = 0;
741 pge2dinfo->src_info[1].rect.y = 0;
742 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
743 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
744 pge2dinfo->src_info[1].fill_color_en = 1;
745 pge2dinfo->src_info[1].def_color = 0x00;
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
756 pge2dinfo->src_info[0].layer_mode = LAYER_MODE_COVERAGE;
757 pge2dinfo->src_info[1].layer_mode = LAYER_MODE_COVERAGE;
758 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
759 pge2dinfo->src_info[1].plane_alpha = 0xff;
760 ret = aml_ge2d_process(pge2dinfo);
Cao Jian53a15142019-08-16 13:58:17 +0800761 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800762 if (ret < 0)
763 return ge2d_fail;
764 /* step2: blend src1 blend src2(dst) to dst */
765 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
766
767 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
768 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
769 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
770 pge2dinfo->src_info[0].rect.x = 0;
771 pge2dinfo->src_info[0].rect.y = 0;
772 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
773 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
774 pge2dinfo->src_info[0].fill_color_en = 0;
775
776 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
777 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
778 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
779 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
780 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
781 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
782 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800783 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
784 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800785 pge2dinfo->src_info[1].fill_color_en = 0;
786
787 pge2dinfo->dst_info.canvas_w = SX_DST;
788 pge2dinfo->dst_info.canvas_h = SY_DST;
789 pge2dinfo->dst_info.format = DST_PIXFORMAT;
790 pge2dinfo->dst_info.rect.x = 0;
791 pge2dinfo->dst_info.rect.y = 0;
792 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
793 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
794 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
795
796 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
797 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
798 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
799 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
800 ret = aml_ge2d_process(pge2dinfo);
801 } else if ((src2_layer_mode == LAYER_MODE_NON)
802 && (src1_layer_mode != LAYER_MODE_PREMULTIPLIED)){
803 printf("two steps blend,src2 LAYER_MODE_NON:strechbilt+blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800804 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800805 if (ret < 0)
806 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +0800807 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800808 if (ret < 0)
809 return ge2d_fail;
810 /* both plane alpha, do 2 steps */
811 /* step 1: strechbilt */
812 pge2dinfo->ge2d_op = AML_GE2D_STRETCHBLIT;
813 /* src2 do strechbilt to dst */
814 pge2dinfo->src_info[0].canvas_w = SX_SRC2;
815 pge2dinfo->src_info[0].canvas_h = SY_SRC2;
816 pge2dinfo->src_info[0].format = SRC2_PIXFORMAT;
817 pge2dinfo->src_info[0].rect.x = 0;
818 pge2dinfo->src_info[0].rect.y = 0;
819 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
820 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
821
Cao Jian65331472019-11-01 21:01:49 +0800822 shared_fd_bakup = pge2dinfo->src_info[0].shared_fd[0];
823 offset_bakup = pge2dinfo->src_info[0].offset[0];
824 pge2dinfo->src_info[0].shared_fd[0] = pge2dinfo->src_info[1].shared_fd[0];
825 pge2dinfo->src_info[0].offset[0] = pge2dinfo->src_info[1].offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800826 pge2dinfo->src_info[0].layer_mode = src2_layer_mode;
827 pge2dinfo->src_info[0].plane_alpha = 0xff;
828 pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888;
829
830 pge2dinfo->dst_info.canvas_w = SX_DST;
831 pge2dinfo->dst_info.canvas_h = SY_DST;
832 pge2dinfo->dst_info.format = DST_PIXFORMAT;
833 pge2dinfo->dst_info.rect.x = 0;
834 pge2dinfo->dst_info.rect.y = 0;
835 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
836 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
837 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
838 ret = aml_ge2d_process(pge2dinfo);
839
840 /* step2: blend src1 blend src2(dst) to dst */
841 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
842
843 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
844 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
845 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
846 pge2dinfo->src_info[0].rect.x = 0;
847 pge2dinfo->src_info[0].rect.y = 0;
848 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
849 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jian65331472019-11-01 21:01:49 +0800850 pge2dinfo->src_info[0].shared_fd[0] = shared_fd_bakup;
851 pge2dinfo->src_info[0].offset[0] = offset_bakup;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800852 pge2dinfo->src_info[0].fill_color_en = 0;
853
854 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
855 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
856 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
857 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
858 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
859 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
860 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800861 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
862 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800863 pge2dinfo->src_info[1].fill_color_en = 0;
864
865 pge2dinfo->dst_info.canvas_w = SX_DST;
866 pge2dinfo->dst_info.canvas_h = SY_DST;
867 pge2dinfo->dst_info.format = DST_PIXFORMAT;
868 pge2dinfo->dst_info.rect.x = 0;
869 pge2dinfo->dst_info.rect.y = 0;
870 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
871 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
872 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
873 printf("two steps blend,src1_layer_mode=%d,src2_layer_mode=%d\n",src1_layer_mode,src2_layer_mode);
874
875 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
876 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
877 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
878 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
879 ret = aml_ge2d_process(pge2dinfo);
880 } else {
881 /* do blend src1 blend src2(dst) to dst */
882 printf("one step blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800883 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800884 if (ret < 0)
885 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +0800886 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800887 if (ret < 0)
888 return ge2d_fail;
889 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
890 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
891 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
892 pge2dinfo->src_info[0].rect.x = 0;
893 pge2dinfo->src_info[0].rect.y = 0;
894 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
895 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
896 pge2dinfo->src_info[0].fill_color_en = 0;
897
898 pge2dinfo->src_info[1].canvas_w = SX_SRC2;
899 pge2dinfo->src_info[1].canvas_h = SY_SRC2;
900 pge2dinfo->src_info[1].format = SRC2_PIXFORMAT;
901 pge2dinfo->src_info[1].rect.x = 0;
902 pge2dinfo->src_info[1].rect.y = 0;
903 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
904 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
905 pge2dinfo->src_info[1].fill_color_en = 0;
906 if (src2_layer_mode == LAYER_MODE_NON)
907 pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888;
908 pge2dinfo->dst_info.canvas_w = SX_DST;
909 pge2dinfo->dst_info.canvas_h = SY_DST;
910 pge2dinfo->dst_info.format = DST_PIXFORMAT;
911 pge2dinfo->dst_info.rect.x = 0;
912 pge2dinfo->dst_info.rect.y = 0;
913 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
914 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
915 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
916
917 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
918 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
919 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
920 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
921 ret = aml_ge2d_process(pge2dinfo);
922 }
923 }
Cao Jian53a15142019-08-16 13:58:17 +0800924 if (ret < 0)
925 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800926 return ret;
927}
928
929
Cao Jian53a15142019-08-16 13:58:17 +0800930static int do_strechblit(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800931{
932 int ret = -1;
933 char code = 0;
Cao Jiane80b1392019-08-07 20:59:47 +0800934 int i;
935 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +0800936 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
937
Jian Caob9fb3ed2019-04-16 16:51:27 +0800938 printf("do_strechblit test case:\n");
Cao Jian53a15142019-08-16 13:58:17 +0800939 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800940 if (ret < 0)
941 return ge2d_fail;
942
943 pge2dinfo->src_info[0].rect.x = src1_rect_x;
944 pge2dinfo->src_info[0].rect.y = src1_rect_y;
945 pge2dinfo->src_info[0].rect.w = src1_rect_w;
946 pge2dinfo->src_info[0].rect.h = src1_rect_h;
947 pge2dinfo->dst_info.rect.x = dst_rect_x;
948 pge2dinfo->dst_info.rect.y = dst_rect_y;
949 pge2dinfo->dst_info.rect.w = dst_rect_w;
950 pge2dinfo->dst_info.rect.h = dst_rect_h;
951 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
952 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
953 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
954
Cao Jiane80b1392019-08-07 20:59:47 +0800955 stime = myclock();
Cao Jian65331472019-11-01 21:01:49 +0800956 for (i = 0; i < num_process; i++) {
957 ret = aml_ge2d_process(pge2dinfo);
958 if (ret < 0) {
959 printf("ge2d process failed, %s (%d)\n", __func__, __LINE__);
960 return ret;
961 }
962 }
Cao Jiane80b1392019-08-07 20:59:47 +0800963 printf("time=%ld ms\n", myclock() - stime);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800964 #if 0
965 sleep(5);
966
967 printf("please enter any key do rotation test[90]\n");
968 code = getc(stdin);
969 pge2dinfo->dst_info.rotation = GE2D_ROTATION_90;
970 ret = aml_ge2d_process(pge2dinfo);
971 #endif
Cao Jian53a15142019-08-16 13:58:17 +0800972 if (ret < 0)
973 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800974 return ret;
975
976}
977
Cao Jian53a15142019-08-16 13:58:17 +0800978static int do_blit(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800979{
980 int ret = -1;
981 char code = 0;
Cao Jiane80b1392019-08-07 20:59:47 +0800982 int i;
983 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +0800984 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
985
Jian Caob9fb3ed2019-04-16 16:51:27 +0800986 printf("do_blit test case:\n");
Cao Jian53a15142019-08-16 13:58:17 +0800987 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800988 if (ret < 0)
989 return ge2d_fail;
990
991 pge2dinfo->src_info[0].rect.x = src1_rect_x;
992 pge2dinfo->src_info[0].rect.y = src1_rect_y;
993 pge2dinfo->src_info[0].rect.w = src1_rect_w;
994 pge2dinfo->src_info[0].rect.h = src1_rect_h;
995 pge2dinfo->dst_info.rect.x = dst_rect_x;
996 pge2dinfo->dst_info.rect.y = dst_rect_y;
997
998 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
999 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1000 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1001
Cao Jiane80b1392019-08-07 20:59:47 +08001002 stime = myclock();
Cao Jian65331472019-11-01 21:01:49 +08001003 for (i = 0; i < num_process; i++) {
1004 ret = aml_ge2d_process(pge2dinfo);
1005 if (ret < 0) {
1006 printf("ge2d process failed, %s (%d)\n", __func__, __LINE__);
1007 return ret;
1008 }
1009 }
Cao Jiane80b1392019-08-07 20:59:47 +08001010 printf("time=%ld ms\n", myclock() - stime);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001011 #if 0
1012 sleep(5);
1013
1014 printf("please enter any key do rotation test[90]\n");
1015 code = getc(stdin);
1016 pge2dinfo->dst_info.rotation = GE2D_ROTATION_90;
1017 pge2dinfo->src_info[0].rect.x = 0;
1018 pge2dinfo->src_info[0].rect.y = 0;
1019 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
1020 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
1021 pge2dinfo->dst_info.rect.x = 0;
1022 pge2dinfo->dst_info.rect.y = 0;
1023
1024 ret = aml_ge2d_process(pge2dinfo);
1025 #endif
Cao Jian53a15142019-08-16 13:58:17 +08001026 if (ret < 0)
1027 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001028 return ret;
1029}
1030
Cao Jian53a15142019-08-16 13:58:17 +08001031void *main_run(void *arg)
Jian Caob9fb3ed2019-04-16 16:51:27 +08001032{
1033 int ret = -1;
Cao Jian65331472019-11-01 21:01:49 +08001034 int i = 0, run_time = 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +08001035 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +08001036 aml_ge2d_t amlge2d;
Cao Jian65331472019-11-01 21:01:49 +08001037 char dst_file_name[128] = {};
Jian Cao49c82bd2019-06-04 12:49:10 +08001038
Cao Jian65331472019-11-01 21:01:49 +08001039 for (run_time = 0; run_time < num_process_per_thread; run_time++) {
1040 printf("ThreadIdx -- %d, run time -- %d\n", *(int *)arg, run_time);
1041 memset(&amlge2d, 0, sizeof(aml_ge2d_t));
Cao Jian53a15142019-08-16 13:58:17 +08001042 memset(&(amlge2d.ge2dinfo.src_info[0]), 0, sizeof(buffer_info_t));
1043 memset(&(amlge2d.ge2dinfo.src_info[1]), 0, sizeof(buffer_info_t));
1044 memset(&(amlge2d.ge2dinfo.dst_info), 0, sizeof(buffer_info_t));
1045
Cao Jian65331472019-11-01 21:01:49 +08001046 for (i = 0; i < MAX_PLANE; i++) {
1047 amlge2d.ge2dinfo.src_info[0].shared_fd[i] = -1;
1048 amlge2d.ge2dinfo.src_info[1].shared_fd[i] = -1;
1049 amlge2d.ge2dinfo.dst_info.shared_fd[i] = -1;
1050 }
Cao Jian53a15142019-08-16 13:58:17 +08001051 set_ge2dinfo(&amlge2d.ge2dinfo);
Cao Jian65331472019-11-01 21:01:49 +08001052 ret = check_plane_number(amlge2d.ge2dinfo.src_info[0].plane_number,
1053 amlge2d.ge2dinfo.src_info[0].format);
1054 if (ret < 0) {
1055 printf("Error src1 plane_number=[%d], format=%d\n",
1056 amlge2d.ge2dinfo.src_info[0].plane_number,
1057 amlge2d.ge2dinfo.src_info[0].format);
1058 return NULL;
1059 }
1060 ret = check_plane_number(amlge2d.ge2dinfo.src_info[1].plane_number,
1061 amlge2d.ge2dinfo.src_info[1].format);
1062 if (ret < 0) {
1063 printf("Error src2 plane_number=[%d],format=%d\n",
1064 amlge2d.ge2dinfo.src_info[1].plane_number,
1065 amlge2d.ge2dinfo.src_info[1].format);
1066 return NULL;
1067 }
1068 ret = check_plane_number(amlge2d.ge2dinfo.dst_info.plane_number,
1069 amlge2d.ge2dinfo.dst_info.format);
1070 if (ret < 0) {
1071 printf("Error dst plane_number=[%d],format=%d\n",
1072 amlge2d.ge2dinfo.dst_info.plane_number,
1073 amlge2d.ge2dinfo.dst_info.format);
1074 return NULL;
1075 }
Cao Jian53a15142019-08-16 13:58:17 +08001076
1077 ret = aml_ge2d_init(&amlge2d);
1078 if (ret < 0)
1079 return NULL;
1080
1081 ret = aml_ge2d_mem_alloc(&amlge2d);
1082 if (ret < 0)
1083 goto exit;
1084 #if 0
1085 /* if dma_buf and used fd alloc other driver */
1086 /* set dma buf fd */
1087 amlge2d.ge2dinfo.src_info[0].shared_fd = dma_fd;
1088 amlge2d.ge2dinfo.src_info[0].memtype = GE2D_CANVAS_ALLOC;
1089 #endif
1090
1091 switch (amlge2d.ge2dinfo.ge2d_op)
1092 {
1093 case AML_GE2D_FILLRECTANGLE:
1094 ret = do_fill_rectangle(&amlge2d);
1095 break;
1096 case AML_GE2D_BLEND:
1097 ret = do_blend(&amlge2d);
1098 break;
1099 case AML_GE2D_STRETCHBLIT:
1100 ret = do_strechblit(&amlge2d);
1101 break;
1102 case AML_GE2D_BLIT:
1103 ret = do_blit(&amlge2d);
1104 break;
1105 default:
1106 E_GE2D("not support ge2d op,exit test!\n");
1107 break;
1108 }
1109 if (ret < 0)
1110 goto exit;
1111
1112 if (amlge2d.ge2dinfo.dst_info.mem_alloc_type == AML_GE2D_MEM_ION)
1113 aml_ge2d_invalid_cache(&amlge2d.ge2dinfo);
Cao Jian65331472019-11-01 21:01:49 +08001114 sprintf(dst_file_name, "%s_thread%d_%d", DST_FILE_NAME, *(int *)arg, run_time);
1115 ret = aml_write_file(&amlge2d, dst_file_name);
Cao Jian53a15142019-08-16 13:58:17 +08001116 if (ret < 0)
1117 goto exit;
1118 exit:
Cao Jian65331472019-11-01 21:01:49 +08001119 for (i = 0; i < amlge2d.ge2dinfo.src_info[0].plane_number; i++) {
1120 if (amlge2d.src_data[i]) {
1121 free(amlge2d.src_data[i]);
1122 amlge2d.src_data[i] = NULL;
1123 }
Cao Jian53a15142019-08-16 13:58:17 +08001124 }
1125
Cao Jian65331472019-11-01 21:01:49 +08001126 for (i = 0; i < amlge2d.ge2dinfo.src_info[1].plane_number; i++) {
1127 if (amlge2d.src2_data[i]) {
1128 free(amlge2d.src2_data[i]);
1129 amlge2d.src2_data[i] = NULL;
1130 }
1131 }
1132
1133 for (i = 0; i < amlge2d.ge2dinfo.dst_info.plane_number; i++) {
1134 if (amlge2d.dst_data[i]) {
1135 free(amlge2d.dst_data[i]);
1136 amlge2d.dst_data[i] = NULL;
1137 }
1138 }
Cao Jian53a15142019-08-16 13:58:17 +08001139 aml_ge2d_mem_free(&amlge2d);
1140 aml_ge2d_exit(&amlge2d);
1141 }
1142 printf("ge2d feature_test exit!!!\n");
1143
1144 return NULL;
1145}
1146
1147int main(int argc, char **argv)
1148{
1149 int ret = -1, i;
1150 pthread_t thread[THREADS_MAX_NUM];
1151 int threadindex[THREADS_MAX_NUM];
1152
1153 if (num_thread > THREADS_MAX_NUM) {
1154 E_GE2D("num of thread greater than THREADS_MAX_NUM\n");
1155 return -1;
1156 }
1157 memset(&thread, 0, sizeof(thread));
1158
1159 ret = parse_command_line(argc, argv);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001160 if (ret == ge2d_fail)
1161 return ge2d_success;
1162
Cao Jian65331472019-11-01 21:01:49 +08001163 for (i = 0; i < num_thread; i++) {
Cao Jian53a15142019-08-16 13:58:17 +08001164 threadindex[i] = i;
Cao Jian65331472019-11-01 21:01:49 +08001165 ret = pthread_create(&(thread[i]), NULL, main_run, (void *)&threadindex[i]);
1166 if (ret != 0) {
Cao Jian53a15142019-08-16 13:58:17 +08001167 E_GE2D("integral thread %d creation failed!", i);
1168 return -1;
1169 }
1170 }
Cao Jian65331472019-11-01 21:01:49 +08001171 for (i = 0; i < num_thread; i++)
Cao Jian53a15142019-08-16 13:58:17 +08001172 pthread_join(thread[i], NULL);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001173
Cao Jian53a15142019-08-16 13:58:17 +08001174 return 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +08001175}