blob: ce2f625f4f7ff78737110196d6f0a9dde5ab9719 [file] [log] [blame]
Jian Caob9fb3ed2019-04-16 16:51:27 +08001/*
2 * Copyright (c) 2014 Amlogic, Inc. All rights reserved.
3 *
4 * This source code is subject to the terms and conditions defined in the
5 * file 'LICENSE' which is part of this source code package.
6 *
7 * Description:
8 */
9
10#include <stdio.h>
11#include <stdlib.h>
12#include <unistd.h>
13#include <fcntl.h>
14#include <malloc.h>
15#include <string.h>
16#include <sys/time.h> /* for gettimeofday() */
Cao Jian53a15142019-08-16 13:58:17 +080017#include <pthread.h>
Jian Caob9fb3ed2019-04-16 16:51:27 +080018#include "ge2d_port.h"
19#include "aml_ge2d.h"
20
21/* #define FILE_DATA */
22static char SRC1_FILE_NAME[64] = "./fb1.rgb32";
23static char SRC2_FILE_NAME[64] = "./fb2.rgb32";
24static char DST_FILE_NAME[64] = "./out1.rgb32";
25
26static int SX_SRC1 = 1920;
27static int SY_SRC1 = 1080;
28static int SX_SRC2 = 1920;
29static int SY_SRC2 = 1080;
30static int SX_DST = 1920;
31static int SY_DST = 1080;
32
33static int src1_rect_x = 0;
34static int src1_rect_y = 0;
35static int src1_rect_w = 1920;
36static int src1_rect_h = 1080;
37static int src2_rect_x = 0;
38static int src2_rect_y = 0;
39static int src2_rect_w = 1920;
40static int src2_rect_h = 1080;
41static int dst_rect_x = 0;
42static int dst_rect_y = 0;
43static int dst_rect_w = 1920;
44static int dst_rect_h = 1080;
45static int rect_color = 0xff0000ff;
46static int SRC1_PIXFORMAT = PIXEL_FORMAT_RGBA_8888;
47static int SRC2_PIXFORMAT = PIXEL_FORMAT_RGBA_8888;
48static int DST_PIXFORMAT = PIXEL_FORMAT_YV12;
49static int src1_mem_alloc_type = AML_GE2D_MEM_DMABUF;
50static int src2_mem_alloc_type = AML_GE2D_MEM_DMABUF;
51static int dst_mem_alloc_type = AML_GE2D_MEM_DMABUF;
52static int dst_canvas_alloc = 0;
53static int src1_canvas_alloc = 1;
54static int src2_canvas_alloc = 1;
Cao Jian65331472019-11-01 21:01:49 +080055static int src1_plane_number = 1;
56static int src2_plane_number = 1;
57static int dst_plane_number = 1;
Jian Caob9fb3ed2019-04-16 16:51:27 +080058static int OP = AML_GE2D_STRETCHBLIT;
59static int src1_layer_mode = 0;
60static int src2_layer_mode = 0;
61static int gb1_alpha = 0xff;
62static int gb2_alpha = 0xff;
Cao Jiane80b1392019-08-07 20:59:47 +080063static int num_process = 1;
Cao Jian53a15142019-08-16 13:58:17 +080064static int num_thread = 1;
65static int num_process_per_thread = 1;
Cao Jian2b1d6972020-09-11 16:55:49 +080066static int separate_step = 0;
Cao Jianb3f2fce2020-11-16 19:39:13 +080067static int rotation_option = 0;
Cao Jiane3ff29d2020-12-15 16:40:50 +080068static int dst_rpt_times = 0;
69static int dst_signed_mode = 0;
Cao Jian53a15142019-08-16 13:58:17 +080070
71#define THREADS_MAX_NUM (64)
Cao Jian2b1d6972020-09-11 16:55:49 +080072#define ATTACH_SRC (0x1)
73#define ATTACH_SRC2 (0x2)
74#define ATTACH_DST (0x4)
Cao Jiane80b1392019-08-07 20:59:47 +080075
Cao Jianb3f2fce2020-11-16 19:39:13 +080076static int ge2d_rotation(int rotation_option)
77{
78 switch (rotation_option) {
79 case 0:
80 return GE2D_ROTATION_0;
81 case 1:
82 return GE2D_ROTATION_90;
83 case 2:
84 return GE2D_ROTATION_180;
85 case 3:
86 return GE2D_ROTATION_270;
87 case 4:
88 return GE2D_MIRROR_X;
89 case 5:
90 return GE2D_MIRROR_Y;
91 default:
92 E_GE2D("wrong ge2d rotation option\n");
93 return 0;
94 }
95}
96
Cao Jiane80b1392019-08-07 20:59:47 +080097static inline unsigned long myclock()
98{
Cao Jianb3f2fce2020-11-16 19:39:13 +080099 struct timeval tv;
Cao Jiane80b1392019-08-07 20:59:47 +0800100
Cao Jianb3f2fce2020-11-16 19:39:13 +0800101 gettimeofday (&tv, NULL);
Cao Jiane80b1392019-08-07 20:59:47 +0800102
Cao Jianb3f2fce2020-11-16 19:39:13 +0800103 return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
Cao Jiane80b1392019-08-07 20:59:47 +0800104}
Jian Caob9fb3ed2019-04-16 16:51:27 +0800105
106static void set_ge2dinfo(aml_ge2d_info_t *pge2dinfo)
107{
108 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
109 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
110 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
Cao Jian65331472019-11-01 21:01:49 +0800111 pge2dinfo->src_info[0].plane_number = src1_plane_number;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800112
113 pge2dinfo->src_info[1].canvas_w = SX_SRC2;
114 pge2dinfo->src_info[1].canvas_h = SY_SRC2;
115 pge2dinfo->src_info[1].format = SRC2_PIXFORMAT;
Cao Jian65331472019-11-01 21:01:49 +0800116 pge2dinfo->src_info[1].plane_number = src2_plane_number;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800117
118 pge2dinfo->dst_info.canvas_w = SX_DST;
119 pge2dinfo->dst_info.canvas_h = SY_DST;
120 pge2dinfo->dst_info.format = DST_PIXFORMAT;
Cao Jian65331472019-11-01 21:01:49 +0800121 pge2dinfo->dst_info.plane_number = dst_plane_number;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800122 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800123 pge2dinfo->offset = 0;
124 pge2dinfo->ge2d_op = OP;
125 pge2dinfo->blend_mode = BLEND_MODE_PREMULTIPLIED;
126
127 switch (pge2dinfo->ge2d_op)
128 {
129 case AML_GE2D_FILLRECTANGLE:
130 pge2dinfo->src_info[0].memtype = GE2D_CANVAS_TYPE_INVALID;
131 pge2dinfo->src_info[1].memtype = GE2D_CANVAS_TYPE_INVALID;
132 pge2dinfo->dst_info.memtype = dst_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
133 break;
134 case AML_GE2D_BLIT:
135 case AML_GE2D_STRETCHBLIT:
136 /* if not need alloc, set to GE2D_CANVAS_TYPE_INVALID
137 * otherwise set to GE2D_CANVAS_ALLOC
138 */
Cao Jian2b1d6972020-09-11 16:55:49 +0800139 pge2dinfo->src_info[0].memtype = src1_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800140 pge2dinfo->src_info[1].memtype = GE2D_CANVAS_TYPE_INVALID;
141 pge2dinfo->dst_info.memtype = dst_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
142 break;
143 case AML_GE2D_BLEND:
Cao Jian2b1d6972020-09-11 16:55:49 +0800144 pge2dinfo->src_info[0].memtype = src1_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
145 pge2dinfo->src_info[1].memtype = src2_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800146 pge2dinfo->dst_info.memtype = dst_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
147 break;
148 default:
149 E_GE2D("not support ge2d op,exit test!\n");
150 break;
151 }
152 /*set to AML_GE2D_MEM_DMABUF or AML_GE2D_MEM_ION*/
153 pge2dinfo->src_info[0].mem_alloc_type = src1_mem_alloc_type;
154 pge2dinfo->src_info[1].mem_alloc_type = src2_mem_alloc_type;
155 pge2dinfo->dst_info.mem_alloc_type = dst_mem_alloc_type;
156}
157
158static void print_usage(void)
159{
160 int i;
161 printf ("Usage: ge2d_feature_test [options]\n\n");
162 printf ("Options:\n\n");
163 printf (" --op <0:fillrect, 1:blend, 2:strechblit, 3:blit> ge2d operation case.\n");
164 printf (" --size <WxH> define src1/src2/dst size.\n");
165 printf (" --src1_memtype <0: ion, 1: dmabuf> define memory alloc type.\n");
166 printf (" --src2_memtype <0: ion, 1: dmabuf> define memory alloc type.\n");
167 printf (" --dst_memtype <0: ion, 1: dmabuf> define memory alloc type.\n");
Cao Jian65331472019-11-01 21:01:49 +0800168 printf (" --src1_format <num> define src1 format.\n");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800169 printf (" --src2_format <num> define src2 format.\n");
170 printf (" --dst_format <num> define dst format.\n");
Cao Jian65331472019-11-01 21:01:49 +0800171 printf (" --src1_size <WxH> define src1 size.\n");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800172 printf (" --src2_size <WxH> define src2 size.\n");
173 printf (" --dst_size <WxH> define dst size.\n");
Cao Jian65331472019-11-01 21:01:49 +0800174 printf (" --src1_file <name> define src1 file.\n");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800175 printf (" --src2_file <name> define src2 file.\n");
176 printf (" --dst_file <name> define dst file.\n");
Cao Jian65331472019-11-01 21:01:49 +0800177 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 +0800178 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 +0800179 printf (" --src1_rect <x_y_w_h> define src1 rect.\n");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800180 printf (" --src2_rect <x_y_w_h> define src2 rect.\n");
181 printf (" --dst_rect <x_y_w_h> define dst rect.\n");
182 printf (" --bo1 <layer_mode_num> define src1_layer_mode.\n");
183 printf (" --bo2 <layer_mode_num> define src2_layer_mode.\n");
184 printf (" --gb1 <gb1_alpha> define src1 global alpha.\n");
185 printf (" --gb2 <gb2_alpha> define src2 global alpha.\n");
186 printf (" --strechblit <x0_y0_w_h-x1_y1_w1_h1> define strechblit info.\n");
187 printf (" --fillrect <color_x_y_w_h> define fillrect info, color in rgba format.\n");
Cao Jian65331472019-11-01 21:01:49 +0800188 printf (" --src1_planenumber <num> define src1 plane number.\n");
189 printf (" --src2_planenumber <num> define src2 plane number.\n");
190 printf (" --dst_planenumber <num> define dst plane number.\n");
191 printf (" --n <num> process num times for performance test.\n");
Cao Jiane3ff29d2020-12-15 16:40:50 +0800192 printf (" --p <num> multi-thread process, num of threads\n");
Cao Jian53a15142019-08-16 13:58:17 +0800193 printf (" --p_n <num> num of process for every thread.\n");
Cao Jian2b1d6972020-09-11 16:55:49 +0800194 printf (" --s <num> separate steps. 0: invoke ge2d_process 1: invoke aml_ge2d_attach_dma_fd/ge2d_config/ge2d_execute/aml_ge2d_detach_dma_fd.\n");
Cao Jiane3ff29d2020-12-15 16:40:50 +0800195 printf (" or aml_ge2d_attach_dma_fd/aml_ge2d_process/aml_ge2d_detach_dma_fd\n");
Cao Jianb3f2fce2020-11-16 19:39:13 +0800196 printf (" --r <num> rotation option, 0/1/2/3/4/5 for 0/90/180/270/H-mirror/V-mirror.\n");
Cao Jiane3ff29d2020-12-15 16:40:50 +0800197 printf (" --dst_rpt_times <num> dst repeat x times, 0:disable 2/4/8:repeat times.\n");
198 printf (" --dst_signed_mode <num> dst signed mode, 0:disable 1:enable.\n");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800199 printf (" --help Print usage information.\n");
200 printf ("\n");
201}
202
203static int parse_command_line(int argc, char *argv[])
204{
205 int i;
206 /* parse command line */
207 for (i = 1; i < argc; i++) {
208 if (strncmp (argv[i], "--", 2) == 0) {
209 if (strcmp (argv[i] + 2, "help") == 0) {
210 print_usage();
211 return ge2d_fail;
212 }
213 else if (strcmp (argv[i] + 2, "op") == 0 && ++i < argc &&
214 sscanf (argv[i], "%d", &OP) == 1) {
215 continue;
216 }
217 else if (strcmp (argv[i] + 2, "src1_memtype") == 0 && ++i < argc &&
218 sscanf (argv[i], "%d", &src1_mem_alloc_type) == 1) {
219 continue;
220 }
221 else if (strcmp (argv[i] + 2, "src2_memtype") == 0 && ++i < argc &&
222 sscanf (argv[i], "%d", &src2_mem_alloc_type) == 1) {
223 continue;
224 }
225 else if (strcmp (argv[i] + 2, "dst_memtype") == 0 && ++i < argc &&
226 sscanf (argv[i], "%d", &dst_mem_alloc_type) == 1) {
227 continue;
228 }
229 else if (strcmp (argv[i] + 2, "bo1") == 0 && ++i < argc &&
230 sscanf (argv[i], "%d", &src1_layer_mode) == 1) {
231 continue;
232 }
233 else if (strcmp (argv[i] + 2, "bo2") == 0 && ++i < argc &&
234 sscanf (argv[i], "%d", &src2_layer_mode) == 1) {
235 continue;
236 }
237 else if (strcmp (argv[i] + 2, "gb1") == 0 && ++i < argc &&
238 sscanf (argv[i], "%d", &gb1_alpha) == 1) {
239 continue;
240 }
241 else if (strcmp (argv[i] + 2, "gb2") == 0 && ++i < argc &&
242 sscanf (argv[i], "%d", &gb2_alpha) == 1) {
243 continue;
244 }
245 else if (strcmp (argv[i] + 2, "src1_format") == 0 && ++i < argc &&
246 sscanf (argv[i], "%d", &SRC1_PIXFORMAT) == 1) {
247 continue;
248 }
249 else if (strcmp (argv[i] + 2, "src2_format") == 0 && ++i < argc &&
250 sscanf (argv[i], "%d", &SRC2_PIXFORMAT) == 1) {
251 continue;
252 }
253 else if (strcmp (argv[i] + 2, "dst_format") == 0 && ++i < argc &&
254 sscanf (argv[i], "%d", &DST_PIXFORMAT) == 1) {
255 continue;
256 }
257 else if (strcmp (argv[i] + 2, "size") == 0 && ++i < argc &&
258 sscanf (argv[i], "%dx%d", &SX_SRC1, &SY_SRC1) == 2) {
259 SX_SRC2 = SX_DST = SX_SRC1;
260 SY_SRC2 = SY_DST = SY_SRC1;
261 continue;
262 }
263 else if (strcmp (argv[i] + 2, "dst_size") == 0 && ++i < argc &&
264 sscanf (argv[i], "%dx%d", &SX_DST, &SY_DST) == 2) {
265 continue;
266 }
267 else if (strcmp (argv[i] + 2, "src1_size") == 0 && ++i < argc &&
268 sscanf (argv[i], "%dx%d", &SX_SRC1, &SY_SRC1) == 2) {
269 continue;
270 }
271 else if (strcmp (argv[i] + 2, "src2_size") == 0 && ++i < argc &&
272 sscanf (argv[i], "%dx%d", &SX_SRC2, &SY_SRC2) == 2) {
273 continue;
274 }
275 else if (strcmp (argv[i] + 2, "src1_rect") == 0 && ++i < argc &&
276 sscanf (argv[i], "%d_%d_%d_%d",
277 &src1_rect_x, &src1_rect_y, &src1_rect_w, &src1_rect_h) == 4) {
278 continue;
279 }
280 else if (strcmp (argv[i] + 2, "src2_rect") == 0 && ++i < argc &&
281 sscanf (argv[i], "%d_%d_%d_%d",
282 &src2_rect_x, &src2_rect_y, &src2_rect_w, &src2_rect_h) == 4) {
283 continue;
284 }
285 else if (strcmp (argv[i] + 2, "dst_rect") == 0 && ++i < argc &&
286 sscanf (argv[i], "%d_%d_%d_%d",
287 &dst_rect_x, &dst_rect_y, &dst_rect_w, &dst_rect_h) == 4) {
288 continue;
289 }
290 else if (strcmp (argv[i] + 2, "strechblit") == 0 && ++i < argc &&
291 sscanf (argv[i], "%d_%d_%d_%d-%d_%d_%d_%d",
292 &src1_rect_x, &src1_rect_y, &src1_rect_w, &src1_rect_h,
293 &dst_rect_x, &dst_rect_y, &dst_rect_w, &dst_rect_h) == 8) {
294 continue;
295 }
296 else if (strcmp (argv[i] + 2, "fillrect") == 0 && ++i < argc &&
297 sscanf (argv[i], "%x_%d_%d_%d_%d",
298 &rect_color, &dst_rect_x, &dst_rect_y, &dst_rect_w, &dst_rect_h) == 5) {
299 continue;
300 }
301 else if (strcmp (argv[i] + 2, "src1_file") == 0 && ++i < argc &&
Cao Jian65331472019-11-01 21:01:49 +0800302 sscanf (argv[i], "%s", SRC1_FILE_NAME) == 1) {
Jian Caob9fb3ed2019-04-16 16:51:27 +0800303 continue;
304 }
305 else if (strcmp (argv[i] + 2, "src2_file") == 0 && ++i < argc &&
Cao Jian65331472019-11-01 21:01:49 +0800306 sscanf (argv[i], "%s", SRC2_FILE_NAME) == 1) {
Jian Caob9fb3ed2019-04-16 16:51:27 +0800307 continue;
308 }
309 else if (strcmp (argv[i] + 2, "dst_file") == 0 && ++i < argc &&
Cao Jian65331472019-11-01 21:01:49 +0800310 sscanf (argv[i], "%s", DST_FILE_NAME) == 1) {
Jian Caob9fb3ed2019-04-16 16:51:27 +0800311 dst_canvas_alloc = 1;
312 continue;
313 }
314 else if (strcmp (argv[i] + 2, "src1_canvas_alloc") == 0 && ++i < argc &&
315 sscanf (argv[i], "%d", &src1_canvas_alloc) == 1) {
316 continue;
317 }
318 else if (strcmp (argv[i] + 2, "src2_canvas_alloc") == 0 && ++i < argc &&
319 sscanf (argv[i], "%d", &src2_canvas_alloc) == 1) {
320 continue;
321 }
Cao Jian65331472019-11-01 21:01:49 +0800322 else if (strcmp (argv[i] + 2, "src1_planenumber") == 0 && ++i < argc &&
323 sscanf (argv[i], "%d", &src1_plane_number) == 1) {
324 continue;
325 }
326 else if (strcmp (argv[i] + 2, "src2_planenumber") == 0 && ++i < argc &&
327 sscanf (argv[i], "%d", &src2_plane_number) == 1) {
328 continue;
329 }
330 else if (strcmp (argv[i] + 2, "dst_planenumber") == 0 && ++i < argc &&
331 sscanf (argv[i], "%d", &dst_plane_number) == 1) {
332 continue;
333 }
Cao Jiane80b1392019-08-07 20:59:47 +0800334 else if (strcmp (argv[i] + 2, "n") == 0 && ++i < argc &&
335 sscanf (argv[i], "%d", &num_process) == 1) {
336 continue;
337 }
Cao Jian53a15142019-08-16 13:58:17 +0800338 else if (strcmp (argv[i] + 2, "p") == 0 && ++i < argc &&
339 sscanf (argv[i], "%d", &num_thread) == 1) {
340 continue;
341 }
Cao Jianb3f2fce2020-11-16 19:39:13 +0800342 else if (strcmp (argv[i] + 2, "r") == 0 && ++i < argc &&
343 sscanf (argv[i], "%d", &rotation_option) == 1) {
344 continue;
345 }
Cao Jian53a15142019-08-16 13:58:17 +0800346 else if (strcmp (argv[i] + 2, "p_n") == 0 && ++i < argc &&
347 sscanf (argv[i], "%d", &num_process_per_thread) == 1) {
348 continue;
349 }
Cao Jian2b1d6972020-09-11 16:55:49 +0800350 else if (strcmp (argv[i] + 2, "s") == 0 && ++i < argc &&
351 sscanf (argv[i], "%d", &separate_step) == 1) {
352 continue;
353 }
Cao Jiane3ff29d2020-12-15 16:40:50 +0800354 else if (strcmp (argv[i] + 2, "dst_rpt_times") == 0 && ++i < argc &&
355 sscanf (argv[i], "%d", &dst_rpt_times) == 1) {
356 switch (dst_rpt_times) {
357 case 0: /* do nothing if dst_rpt_times is 0 */
358 break;
359 case 2:
360 DST_PIXFORMAT |= DST_REPEAT_2;
361 break;
362 case 4:
363 DST_PIXFORMAT |= DST_REPEAT_4;
364 break;
365 case 8:
366 DST_PIXFORMAT |= DST_REPEAT_8;
367 break;
368 default:
369 E_GE2D("dst_rpt_times should be 0/2/4/8\n");
370 break;
371 }
372 continue;
373 }
374 else if (strcmp (argv[i] + 2, "dst_signed_mode") == 0 && ++i < argc &&
375 sscanf (argv[i], "%d", &dst_signed_mode) == 1) {
376 switch (dst_signed_mode) {
377 case 0: /* do nothing if dst_signed_mode is 0 */
378 break;
379 case 1:
380 DST_PIXFORMAT |= DST_SIGN_MDOE;
381 break;
382 default:
383 E_GE2D("dst_signed_mode should be 0 or 1\n");
384 break;
385 }
386 continue;
387 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800388 }
389 }
390 return ge2d_success;
391}
392
Cao Jian65331472019-11-01 21:01:49 +0800393static int check_plane_number(int plane_number, int format)
394{
395 int ret = -1;
396 printf("plane_number=%d,format=%d\n", plane_number, format);
397 if (plane_number == 1) {
398 ret = 0;
399 } else if (plane_number == 2) {
400 if ((format == PIXEL_FORMAT_YCrCb_420_SP) ||
401 (format == PIXEL_FORMAT_YCbCr_420_SP_NV12) ||
402 (format == PIXEL_FORMAT_YCbCr_422_SP))
403 ret = 0;
404 } else if (plane_number == 3) {
405 if (format == PIXEL_FORMAT_YV12)
406 ret = 0;
407 }
408 return ret;
409}
Jian Caob9fb3ed2019-04-16 16:51:27 +0800410
Cao Jian53a15142019-08-16 13:58:17 +0800411static int aml_read_file_src1(aml_ge2d_t *amlge2d, const char* url)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800412{
413 int fd = -1;
414 int length = 0;
415 int read_num = 0;
Cao Jian65331472019-11-01 21:01:49 +0800416 int i;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800417
418 fd = open(url,O_RDONLY );
419 if (fd < 0) {
420 E_GE2D("read source file:%s open error\n",url);
421 return ge2d_fail;
422 }
Cao Jian65331472019-11-01 21:01:49 +0800423 for (i = 0; i < amlge2d->ge2dinfo.src_info[0].plane_number; i++) {
424 if (amlge2d->src_size[i] == 0) {
425 E_GE2D("src_size[i]=%d\n",amlge2d->src_size[i]);
426 close(fd);
427 return 0;
428 }
429 amlge2d->src_data[i] = (char*)malloc(amlge2d->src_size[i]);
430 if (!amlge2d->src_data[i]) {
431 E_GE2D("malloc for src_data failed\n");
432 close(fd);
433 return ge2d_fail;
434 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800435
Cao Jian65331472019-11-01 21:01:49 +0800436 read_num = read(fd,amlge2d->src_data[i],amlge2d->src_size[i]);
437 if (read_num <= 0) {
438 E_GE2D("read file read_num=%d error\n",read_num);
439 close(fd);
440 return ge2d_fail;
441 }
442
443 memcpy(amlge2d->ge2dinfo.src_info[0].vaddr[i], amlge2d->src_data[i], amlge2d->src_size[i]);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800444 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800445 close(fd);
446 return ge2d_success;
447}
448
Cao Jian53a15142019-08-16 13:58:17 +0800449static int aml_read_file_src2(aml_ge2d_t *amlge2d, const char* url)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800450{
451 int fd = -1;
452 int length = 0;
453 int read_num = 0;
Cao Jian65331472019-11-01 21:01:49 +0800454 int i;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800455
456 fd = open(url,O_RDONLY );
457 if (fd < 0) {
458 E_GE2D("read source file:%s open error\n",url);
459 return ge2d_fail;
460 }
Cao Jian65331472019-11-01 21:01:49 +0800461 for (i = 0; i < amlge2d->ge2dinfo.src_info[1].plane_number; i++) {
462 if (amlge2d->src2_size[i] == 0) {
463 E_GE2D("src2_size[i]=%d\n",amlge2d->src2_size[i]);
464 close(fd);
465 return 0;
466 }
467 amlge2d->src2_data[i] = (char*)malloc(amlge2d->src2_size[i]);
468 if (!amlge2d->src2_data[i]) {
469 E_GE2D("malloc for src_data failed\n");
470 close(fd);
471 return ge2d_fail;
472 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800473
Cao Jian65331472019-11-01 21:01:49 +0800474 read_num = read(fd,amlge2d->src2_data[i],amlge2d->src2_size[i]);
475 if (read_num <= 0) {
476 E_GE2D("read file read_num=%d error\n",read_num);
477 close(fd);
478 return ge2d_fail;
479 }
480
481 memcpy(amlge2d->ge2dinfo.src_info[1].vaddr[i], amlge2d->src2_data[i], amlge2d->src2_size[i]);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800482 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800483 close(fd);
484 return ge2d_success;
485}
486
Cao Jian53a15142019-08-16 13:58:17 +0800487static int aml_write_file(aml_ge2d_t *amlge2d, const char* url)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800488{
489 int fd = -1;
490 int length = 0;
491 int write_num = 0;
492 unsigned int *value;
Cao Jian65331472019-11-01 21:01:49 +0800493 int i;
494
Cao Jian53a15142019-08-16 13:58:17 +0800495 if ((GE2D_CANVAS_OSD0 == amlge2d->ge2dinfo.dst_info.memtype)
496 || (GE2D_CANVAS_OSD1 == amlge2d->ge2dinfo.dst_info.memtype))
Jian Caob9fb3ed2019-04-16 16:51:27 +0800497 return 0;
498
499 fd = open(url,O_RDWR | O_CREAT,0660);
500 if (fd < 0) {
501 E_GE2D("write file:%s open error\n",url);
502 return ge2d_fail;
503 }
Cao Jian65331472019-11-01 21:01:49 +0800504 for (i = 0; i < amlge2d->ge2dinfo.dst_info.plane_number; i++) {
505 if (amlge2d->dst_size[i] == 0) {
506 E_GE2D("dst_size[%d]=%d\n",i, amlge2d->dst_size[i]);
507 close(fd);
508 return 0;
509 }
510 amlge2d->dst_data[i] = (char*)malloc(amlge2d->dst_size[i]);
511 if (!amlge2d->dst_data[i]) {
512 E_GE2D("malloc for dst_data failed\n");
513 close(fd);
514 return ge2d_fail;
515 }
516 memcpy(amlge2d->dst_data[i], amlge2d->ge2dinfo.dst_info.vaddr[i], amlge2d->dst_size[i]);
517 printf("pixel: 0x%2x, 0x%2x,0x%2x,0x%2x, 0x%2x,0x%2x,0x%2x,0x%2x\n",
518 amlge2d->dst_data[i][0],
519 amlge2d->dst_data[i][1],
520 amlge2d->dst_data[i][2],
521 amlge2d->dst_data[i][3],
522 amlge2d->dst_data[i][4],
523 amlge2d->dst_data[i][5],
524 amlge2d->dst_data[i][6],
525 amlge2d->dst_data[i][7]);
526 write_num = write(fd,amlge2d->dst_data[i],amlge2d->dst_size[i]);
527 if (write_num <= 0) {
528 E_GE2D("write file write_num=%d error\n",write_num);
529 close(fd);
530 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800531 }
532 close(fd);
533 return ge2d_success;
534}
535
Cao Jian2b1d6972020-09-11 16:55:49 +0800536static int do_cmd(aml_ge2d_info_t *pge2dinfo)
537{
538 unsigned long stime;
539 int i, ret = -1;
540 int attach_flag = 0;
541
542 if (!pge2dinfo) {
543 printf("pge2dinfo is null\n");
544 return ge2d_fail;
545 }
546
547 if (separate_step) {
548 /* attach dma fd for src1/src2/dst */
549 switch (pge2dinfo->ge2d_op) {
550 case AML_GE2D_FILLRECTANGLE:
551 attach_flag = ATTACH_DST;
552 break;
553 case AML_GE2D_BLEND:
554 attach_flag = ATTACH_SRC | ATTACH_SRC2 | ATTACH_DST;
555 break;
556 case AML_GE2D_STRETCHBLIT:
557 case AML_GE2D_BLIT:
558 attach_flag = ATTACH_SRC | ATTACH_DST;
559 break;
560 default:
561 E_GE2D("%s, ge2d_op is invalid\n", __func__);
562 return ge2d_fail;
563 }
564
565 if (attach_flag | ATTACH_SRC) {
566 ret = aml_ge2d_attach_dma_fd(pge2dinfo, AML_GE2D_SRC);
567 if (ret < 0)
568 return ret;
569 }
570
571 if (attach_flag | ATTACH_SRC2) {
572 ret = aml_ge2d_attach_dma_fd(pge2dinfo, AML_GE2D_SRC2);
573 if (ret < 0)
574 return ret;
575 }
576
577 if (attach_flag | ATTACH_DST) {
578 ret = aml_ge2d_attach_dma_fd(pge2dinfo, AML_GE2D_DST);
579 if (ret < 0)
580 return ret;
581 }
582
583 /* config once or more times */
584 ret = aml_ge2d_config(pge2dinfo);
585 if (ret < 0)
586 return ret;
587
588 stime = myclock();
589 /* execute one or more times */
590 for (i = 0; i < num_process; i++) {
591 ret = aml_ge2d_execute(pge2dinfo);
592 if (ret < 0) {
593 printf("ge2d process failed, %s (%d)\n", __func__, __LINE__);
594 return ret;
595 }
596 }
597 /* detach dma fd for src1/src2/dst */
598 if (attach_flag | ATTACH_SRC)
599 aml_ge2d_detach_dma_fd(pge2dinfo, AML_GE2D_SRC);
600 if (attach_flag | ATTACH_SRC2)
601 aml_ge2d_detach_dma_fd(pge2dinfo, AML_GE2D_SRC2);
602 if (attach_flag | ATTACH_DST)
603 aml_ge2d_detach_dma_fd(pge2dinfo, AML_GE2D_DST);
604 } else {
605 stime = myclock();
606 for (i = 0; i < num_process; i++) {
607 ret = aml_ge2d_process(pge2dinfo);
608 if (ret < 0) {
609 printf("ge2d process failed, %s (%d)\n", __func__, __LINE__);
610 return ret;
611 }
612 }
613 }
614 printf("separate_step=%d time=%ld ms\n", separate_step, myclock() - stime);
615
616 return ret;
617}
618
Cao Jian53a15142019-08-16 13:58:17 +0800619static int do_fill_rectangle(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800620{
621 int ret = -1;
622 char code;
Cao Jiane80b1392019-08-07 20:59:47 +0800623 int i;
624 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +0800625 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800626
627 printf("do_fill_rectangle test case:\n");
628
629 pge2dinfo->color = rect_color;
630 pge2dinfo->dst_info.rect.x = dst_rect_x;
Cao Jian088facb2020-03-09 17:24:26 +0800631 pge2dinfo->dst_info.rect.y = dst_rect_y;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800632 pge2dinfo->dst_info.rect.w = dst_rect_w;
633 pge2dinfo->dst_info.rect.h = dst_rect_h;
Cao Jian2b1d6972020-09-11 16:55:49 +0800634 ret = do_cmd(pge2dinfo);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800635 #if 0
636 sleep(5);
637
638 printf("please enter any key do rotation test[90]\n");
639 code = getc(stdin);
640 pge2dinfo->dst_info.rotation = GE2D_ROTATION_180;
641 ret = aml_ge2d_process(pge2dinfo);
642 #endif
Cao Jian53a15142019-08-16 13:58:17 +0800643 if (ret < 0)
644 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800645 return ret;
646}
647
648
Cao Jian53a15142019-08-16 13:58:17 +0800649static int do_blend(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800650{
Cao Jian65331472019-11-01 21:01:49 +0800651 int ret = -1, i;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800652 char code = 0;
653 int shared_fd_bakup;
654 unsigned long offset_bakup = 0;
Cao Jiane80b1392019-08-07 20:59:47 +0800655 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +0800656 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
Cao Jiane80b1392019-08-07 20:59:47 +0800657
Jian Caob9fb3ed2019-04-16 16:51:27 +0800658 printf("do_blend test case:\n");
659
Cao Jian381fe962020-10-21 15:28:22 +0800660 if (pge2dinfo->cap_attr & SRC2_ALPHA) {
Jian Caob9fb3ed2019-04-16 16:51:27 +0800661 /* do blend src1 blend src2(dst) to dst */
662 printf("one step blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800663 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800664 if (ret < 0)
665 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +0800666 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800667 if (ret < 0)
668 return ge2d_fail;
669
670 pge2dinfo->src_info[0].rect.x = src1_rect_x;
671 pge2dinfo->src_info[0].rect.y = src1_rect_y;
672 pge2dinfo->src_info[0].rect.w = src1_rect_w;
673 pge2dinfo->src_info[0].rect.h = src1_rect_h;
674 pge2dinfo->src_info[0].fill_color_en = 0;
675
676 pge2dinfo->src_info[1].rect.x = src2_rect_x;
677 pge2dinfo->src_info[1].rect.y = src2_rect_y;
678 pge2dinfo->src_info[1].rect.w = src2_rect_w;
679 pge2dinfo->src_info[1].rect.h = src2_rect_h;
680 pge2dinfo->src_info[1].fill_color_en = 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800681
682 pge2dinfo->dst_info.rect.x = dst_rect_x;
683 pge2dinfo->dst_info.rect.y = dst_rect_y;
684 pge2dinfo->dst_info.rect.w = dst_rect_w;
685 pge2dinfo->dst_info.rect.h = dst_rect_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800686 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800687
688 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
689 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
690 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
691 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
Cao Jian2b1d6972020-09-11 16:55:49 +0800692
693 ret = do_cmd(pge2dinfo);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800694 } else {
695 if (((gb1_alpha != 0xff)
696 && (gb2_alpha != 0xff))){
697 printf("two steps blend,two plane alpha\n");
698
699 if (src2_layer_mode == LAYER_MODE_COVERAGE) {
700 printf("two steps blend,src2 LAYER_MODE_COVERAGE\n");
Cao Jian53a15142019-08-16 13:58:17 +0800701 ret = aml_read_file_src1(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800702 if (ret < 0)
703 return ge2d_fail;
704
705 /* both plane alpha, do 2 steps */
706 /* step 1: strechbilt */
707 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
708 /* src2 do strechbilt to dst */
709 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
710 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
711 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
712 pge2dinfo->src_info[0].rect.x = 0;
713 pge2dinfo->src_info[0].rect.y = 0;
714 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
715 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
716 pge2dinfo->src_info[0].fill_color_en = 0;
717
718 pge2dinfo->src_info[1].canvas_w = SX_DST;
719 pge2dinfo->src_info[1].canvas_h = SY_DST;
720 pge2dinfo->src_info[1].format = DST_PIXFORMAT;
721 pge2dinfo->src_info[1].rect.x = 0;
722 pge2dinfo->src_info[1].rect.y = 0;
723 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
724 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
725 pge2dinfo->src_info[1].fill_color_en = 1;
726 pge2dinfo->src_info[1].def_color = 0x00;
727
728 pge2dinfo->dst_info.canvas_w = SX_DST;
729 pge2dinfo->dst_info.canvas_h = SY_DST;
730 pge2dinfo->dst_info.format = DST_PIXFORMAT;
731 pge2dinfo->dst_info.rect.x = 0;
732 pge2dinfo->dst_info.rect.y = 0;
733 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
734 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800735 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800736
737 pge2dinfo->src_info[0].layer_mode = LAYER_MODE_COVERAGE;
738 pge2dinfo->src_info[1].layer_mode = LAYER_MODE_COVERAGE;
739 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
740 pge2dinfo->src_info[1].plane_alpha = 0xff;
741 ret = aml_ge2d_process(pge2dinfo);
Cao Jian53a15142019-08-16 13:58:17 +0800742 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800743 if (ret < 0)
744 return ge2d_fail;
745
746 /* step2: blend src1 blend src2(dst) to dst */
747 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
748
749 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
750 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
751 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
752 pge2dinfo->src_info[0].rect.x = 0;
753 pge2dinfo->src_info[0].rect.y = 0;
754 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
755 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
756 pge2dinfo->src_info[0].fill_color_en = 0;
757
758 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
759 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
760 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
761 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
762 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
763 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
764 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800765 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
766 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800767 pge2dinfo->src_info[1].fill_color_en = 0;
768
769 pge2dinfo->dst_info.canvas_w = SX_DST;
770 pge2dinfo->dst_info.canvas_h = SY_DST;
771 pge2dinfo->dst_info.format = DST_PIXFORMAT;
772 pge2dinfo->dst_info.rect.x = 0;
773 pge2dinfo->dst_info.rect.y = 0;
774 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
775 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800776 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800777
778 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
779 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
780 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
781 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
782 ret = aml_ge2d_process(pge2dinfo);
783 } else {
Cao Jian53a15142019-08-16 13:58:17 +0800784 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800785 if (ret < 0)
786 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +0800787 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800788 if (ret < 0)
789 return ge2d_fail;
790 printf("two step: strechbilt+blend\n");
791 /* both plane alpha, do 2 steps */
792 /* step 1: strechbilt */
793 pge2dinfo->ge2d_op = AML_GE2D_STRETCHBLIT;
794 /* src2 do strechbilt to dst */
795 pge2dinfo->src_info[0].canvas_w = SX_SRC2;
796 pge2dinfo->src_info[0].canvas_h = SY_SRC2;
797 pge2dinfo->src_info[0].format = SRC2_PIXFORMAT;
798 pge2dinfo->src_info[0].rect.x = 0;
799 pge2dinfo->src_info[0].rect.y = 0;
800 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
801 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
802
Cao Jian65331472019-11-01 21:01:49 +0800803 shared_fd_bakup = pge2dinfo->src_info[0].shared_fd[0];
804 offset_bakup = pge2dinfo->src_info[0].offset[0];
805 pge2dinfo->src_info[0].shared_fd[0] = pge2dinfo->src_info[1].shared_fd[0];
806 pge2dinfo->src_info[0].offset[0] = pge2dinfo->src_info[1].offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800807
808 pge2dinfo->src_info[0].layer_mode = src2_layer_mode;
809 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
810 pge2dinfo->dst_info.canvas_w = SX_DST;
811 pge2dinfo->dst_info.canvas_h = SY_DST;
812 pge2dinfo->dst_info.format = DST_PIXFORMAT;
813 pge2dinfo->dst_info.rect.x = 0;
814 pge2dinfo->dst_info.rect.y = 0;
815 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
816 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800817 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800818 ret = aml_ge2d_process(pge2dinfo);
819
820 /* step2: blend src1 blend src2(dst) to dst */
821 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
822
823 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
824 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
825 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
826 pge2dinfo->src_info[0].rect.x = 0;
827 pge2dinfo->src_info[0].rect.y = 0;
828 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
829 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jian65331472019-11-01 21:01:49 +0800830 pge2dinfo->src_info[0].shared_fd[0] = shared_fd_bakup;
831 pge2dinfo->src_info[0].offset[0] = offset_bakup;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800832 pge2dinfo->src_info[0].fill_color_en = 0;
833
834 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
835 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
836 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
837 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
838 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
839 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
840 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800841 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
842 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800843 pge2dinfo->src_info[1].fill_color_en = 0;
844
845 pge2dinfo->dst_info.canvas_w = SX_DST;
846 pge2dinfo->dst_info.canvas_h = SY_DST;
847 pge2dinfo->dst_info.format = DST_PIXFORMAT;
848 pge2dinfo->dst_info.rect.x = 0;
849 pge2dinfo->dst_info.rect.y = 0;
850 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
851 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800852 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800853
854 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
855 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
856 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
857 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
858 ret = aml_ge2d_process(pge2dinfo);
859 }
860 } else if (src2_layer_mode == LAYER_MODE_COVERAGE){
861 printf("two steps blend,src2 LAYER_MODE_COVERAGE: two blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800862 ret = aml_read_file_src1(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800863 if (ret < 0)
864 return ge2d_fail;
865 /* both plane alpha, do 2 steps */
866 /* step 1: strechbilt */
867 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
868 /* src2 do strechbilt to dst */
869 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
870 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
871 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
872 pge2dinfo->src_info[0].rect.x = 0;
873 pge2dinfo->src_info[0].rect.y = 0;
874 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
875 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
876 pge2dinfo->src_info[0].fill_color_en = 0;
877
878 pge2dinfo->src_info[1].canvas_w = SX_DST;
879 pge2dinfo->src_info[1].canvas_h = SY_DST;
880 pge2dinfo->src_info[1].format = DST_PIXFORMAT;
881 pge2dinfo->src_info[1].rect.x = 0;
882 pge2dinfo->src_info[1].rect.y = 0;
883 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
884 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
885 pge2dinfo->src_info[1].fill_color_en = 1;
886 pge2dinfo->src_info[1].def_color = 0x00;
887
888 pge2dinfo->dst_info.canvas_w = SX_DST;
889 pge2dinfo->dst_info.canvas_h = SY_DST;
890 pge2dinfo->dst_info.format = DST_PIXFORMAT;
891 pge2dinfo->dst_info.rect.x = 0;
892 pge2dinfo->dst_info.rect.y = 0;
893 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
894 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800895 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800896
897 pge2dinfo->src_info[0].layer_mode = LAYER_MODE_COVERAGE;
898 pge2dinfo->src_info[1].layer_mode = LAYER_MODE_COVERAGE;
899 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
900 pge2dinfo->src_info[1].plane_alpha = 0xff;
901 ret = aml_ge2d_process(pge2dinfo);
Cao Jian53a15142019-08-16 13:58:17 +0800902 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800903 if (ret < 0)
904 return ge2d_fail;
905 /* step2: blend src1 blend src2(dst) to dst */
906 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
907
908 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
909 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
910 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
911 pge2dinfo->src_info[0].rect.x = 0;
912 pge2dinfo->src_info[0].rect.y = 0;
913 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
914 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
915 pge2dinfo->src_info[0].fill_color_en = 0;
916
917 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
918 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
919 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
920 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
921 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
922 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
923 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800924 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
925 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800926 pge2dinfo->src_info[1].fill_color_en = 0;
927
928 pge2dinfo->dst_info.canvas_w = SX_DST;
929 pge2dinfo->dst_info.canvas_h = SY_DST;
930 pge2dinfo->dst_info.format = DST_PIXFORMAT;
931 pge2dinfo->dst_info.rect.x = 0;
932 pge2dinfo->dst_info.rect.y = 0;
933 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
934 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800935 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800936
937 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
938 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
939 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
940 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
941 ret = aml_ge2d_process(pge2dinfo);
942 } else if ((src2_layer_mode == LAYER_MODE_NON)
943 && (src1_layer_mode != LAYER_MODE_PREMULTIPLIED)){
944 printf("two steps blend,src2 LAYER_MODE_NON:strechbilt+blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800945 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800946 if (ret < 0)
947 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +0800948 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800949 if (ret < 0)
950 return ge2d_fail;
951 /* both plane alpha, do 2 steps */
952 /* step 1: strechbilt */
953 pge2dinfo->ge2d_op = AML_GE2D_STRETCHBLIT;
954 /* src2 do strechbilt to dst */
955 pge2dinfo->src_info[0].canvas_w = SX_SRC2;
956 pge2dinfo->src_info[0].canvas_h = SY_SRC2;
957 pge2dinfo->src_info[0].format = SRC2_PIXFORMAT;
958 pge2dinfo->src_info[0].rect.x = 0;
959 pge2dinfo->src_info[0].rect.y = 0;
960 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
961 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
962
Cao Jian65331472019-11-01 21:01:49 +0800963 shared_fd_bakup = pge2dinfo->src_info[0].shared_fd[0];
964 offset_bakup = pge2dinfo->src_info[0].offset[0];
965 pge2dinfo->src_info[0].shared_fd[0] = pge2dinfo->src_info[1].shared_fd[0];
966 pge2dinfo->src_info[0].offset[0] = pge2dinfo->src_info[1].offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800967 pge2dinfo->src_info[0].layer_mode = src2_layer_mode;
968 pge2dinfo->src_info[0].plane_alpha = 0xff;
969 pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888;
970
971 pge2dinfo->dst_info.canvas_w = SX_DST;
972 pge2dinfo->dst_info.canvas_h = SY_DST;
973 pge2dinfo->dst_info.format = DST_PIXFORMAT;
974 pge2dinfo->dst_info.rect.x = 0;
975 pge2dinfo->dst_info.rect.y = 0;
976 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
977 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800978 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800979 ret = aml_ge2d_process(pge2dinfo);
980
981 /* step2: blend src1 blend src2(dst) to dst */
982 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
983
984 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
985 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
986 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
987 pge2dinfo->src_info[0].rect.x = 0;
988 pge2dinfo->src_info[0].rect.y = 0;
989 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
990 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jian65331472019-11-01 21:01:49 +0800991 pge2dinfo->src_info[0].shared_fd[0] = shared_fd_bakup;
992 pge2dinfo->src_info[0].offset[0] = offset_bakup;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800993 pge2dinfo->src_info[0].fill_color_en = 0;
994
995 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
996 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
997 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
998 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
999 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
1000 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
1001 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +08001002 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
1003 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +08001004 pge2dinfo->src_info[1].fill_color_en = 0;
1005
1006 pge2dinfo->dst_info.canvas_w = SX_DST;
1007 pge2dinfo->dst_info.canvas_h = SY_DST;
1008 pge2dinfo->dst_info.format = DST_PIXFORMAT;
1009 pge2dinfo->dst_info.rect.x = 0;
1010 pge2dinfo->dst_info.rect.y = 0;
1011 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
1012 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +08001013 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001014 printf("two steps blend,src1_layer_mode=%d,src2_layer_mode=%d\n",src1_layer_mode,src2_layer_mode);
1015
1016 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1017 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
1018 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1019 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
1020 ret = aml_ge2d_process(pge2dinfo);
1021 } else {
1022 /* do blend src1 blend src2(dst) to dst */
1023 printf("one step blend\n");
Cao Jian53a15142019-08-16 13:58:17 +08001024 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001025 if (ret < 0)
1026 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +08001027 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001028 if (ret < 0)
1029 return ge2d_fail;
1030 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
1031 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
1032 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
1033 pge2dinfo->src_info[0].rect.x = 0;
1034 pge2dinfo->src_info[0].rect.y = 0;
1035 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
1036 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
1037 pge2dinfo->src_info[0].fill_color_en = 0;
1038
1039 pge2dinfo->src_info[1].canvas_w = SX_SRC2;
1040 pge2dinfo->src_info[1].canvas_h = SY_SRC2;
1041 pge2dinfo->src_info[1].format = SRC2_PIXFORMAT;
1042 pge2dinfo->src_info[1].rect.x = 0;
1043 pge2dinfo->src_info[1].rect.y = 0;
1044 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
1045 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
1046 pge2dinfo->src_info[1].fill_color_en = 0;
1047 if (src2_layer_mode == LAYER_MODE_NON)
1048 pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888;
1049 pge2dinfo->dst_info.canvas_w = SX_DST;
1050 pge2dinfo->dst_info.canvas_h = SY_DST;
1051 pge2dinfo->dst_info.format = DST_PIXFORMAT;
1052 pge2dinfo->dst_info.rect.x = 0;
1053 pge2dinfo->dst_info.rect.y = 0;
1054 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
1055 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +08001056 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001057
1058 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1059 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
1060 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1061 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
1062 ret = aml_ge2d_process(pge2dinfo);
1063 }
1064 }
Cao Jian53a15142019-08-16 13:58:17 +08001065 if (ret < 0)
1066 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001067 return ret;
1068}
1069
1070
Cao Jian53a15142019-08-16 13:58:17 +08001071static int do_strechblit(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +08001072{
1073 int ret = -1;
1074 char code = 0;
Cao Jiane80b1392019-08-07 20:59:47 +08001075 int i;
1076 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +08001077 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
1078
Jian Caob9fb3ed2019-04-16 16:51:27 +08001079 printf("do_strechblit test case:\n");
Cao Jian53a15142019-08-16 13:58:17 +08001080 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001081 if (ret < 0)
1082 return ge2d_fail;
1083
1084 pge2dinfo->src_info[0].rect.x = src1_rect_x;
1085 pge2dinfo->src_info[0].rect.y = src1_rect_y;
1086 pge2dinfo->src_info[0].rect.w = src1_rect_w;
1087 pge2dinfo->src_info[0].rect.h = src1_rect_h;
1088 pge2dinfo->dst_info.rect.x = dst_rect_x;
1089 pge2dinfo->dst_info.rect.y = dst_rect_y;
1090 pge2dinfo->dst_info.rect.w = dst_rect_w;
1091 pge2dinfo->dst_info.rect.h = dst_rect_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +08001092 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001093 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1094 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1095
Cao Jian2b1d6972020-09-11 16:55:49 +08001096 ret = do_cmd(pge2dinfo);
1097
Jian Caob9fb3ed2019-04-16 16:51:27 +08001098 #if 0
1099 sleep(5);
1100
1101 printf("please enter any key do rotation test[90]\n");
1102 code = getc(stdin);
1103 pge2dinfo->dst_info.rotation = GE2D_ROTATION_90;
1104 ret = aml_ge2d_process(pge2dinfo);
1105 #endif
Cao Jian53a15142019-08-16 13:58:17 +08001106 if (ret < 0)
1107 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001108 return ret;
1109
1110}
1111
Cao Jian53a15142019-08-16 13:58:17 +08001112static int do_blit(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +08001113{
1114 int ret = -1;
1115 char code = 0;
Cao Jiane80b1392019-08-07 20:59:47 +08001116 int i;
1117 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +08001118 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
1119
Jian Caob9fb3ed2019-04-16 16:51:27 +08001120 printf("do_blit test case:\n");
Cao Jian53a15142019-08-16 13:58:17 +08001121 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001122 if (ret < 0)
1123 return ge2d_fail;
1124
1125 pge2dinfo->src_info[0].rect.x = src1_rect_x;
1126 pge2dinfo->src_info[0].rect.y = src1_rect_y;
1127 pge2dinfo->src_info[0].rect.w = src1_rect_w;
1128 pge2dinfo->src_info[0].rect.h = src1_rect_h;
1129 pge2dinfo->dst_info.rect.x = dst_rect_x;
1130 pge2dinfo->dst_info.rect.y = dst_rect_y;
1131
Cao Jianb3f2fce2020-11-16 19:39:13 +08001132 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001133 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1134 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1135
Cao Jian2b1d6972020-09-11 16:55:49 +08001136 ret = do_cmd(pge2dinfo);
1137
Jian Caob9fb3ed2019-04-16 16:51:27 +08001138 #if 0
1139 sleep(5);
1140
1141 printf("please enter any key do rotation test[90]\n");
1142 code = getc(stdin);
1143 pge2dinfo->dst_info.rotation = GE2D_ROTATION_90;
1144 pge2dinfo->src_info[0].rect.x = 0;
1145 pge2dinfo->src_info[0].rect.y = 0;
1146 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
1147 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
1148 pge2dinfo->dst_info.rect.x = 0;
1149 pge2dinfo->dst_info.rect.y = 0;
1150
1151 ret = aml_ge2d_process(pge2dinfo);
1152 #endif
Cao Jian53a15142019-08-16 13:58:17 +08001153 if (ret < 0)
1154 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001155 return ret;
1156}
1157
Cao Jian53a15142019-08-16 13:58:17 +08001158void *main_run(void *arg)
Jian Caob9fb3ed2019-04-16 16:51:27 +08001159{
1160 int ret = -1;
Cao Jian65331472019-11-01 21:01:49 +08001161 int i = 0, run_time = 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +08001162 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +08001163 aml_ge2d_t amlge2d;
Cao Jian65331472019-11-01 21:01:49 +08001164 char dst_file_name[128] = {};
Jian Cao49c82bd2019-06-04 12:49:10 +08001165
Cao Jian65331472019-11-01 21:01:49 +08001166 for (run_time = 0; run_time < num_process_per_thread; run_time++) {
1167 printf("ThreadIdx -- %d, run time -- %d\n", *(int *)arg, run_time);
1168 memset(&amlge2d, 0, sizeof(aml_ge2d_t));
Cao Jian53a15142019-08-16 13:58:17 +08001169 memset(&(amlge2d.ge2dinfo.src_info[0]), 0, sizeof(buffer_info_t));
1170 memset(&(amlge2d.ge2dinfo.src_info[1]), 0, sizeof(buffer_info_t));
1171 memset(&(amlge2d.ge2dinfo.dst_info), 0, sizeof(buffer_info_t));
1172
Cao Jian2b1d6972020-09-11 16:55:49 +08001173 for (i = 0; i < GE2D_MAX_PLANE; i++) {
Cao Jian65331472019-11-01 21:01:49 +08001174 amlge2d.ge2dinfo.src_info[0].shared_fd[i] = -1;
1175 amlge2d.ge2dinfo.src_info[1].shared_fd[i] = -1;
1176 amlge2d.ge2dinfo.dst_info.shared_fd[i] = -1;
1177 }
Cao Jian53a15142019-08-16 13:58:17 +08001178 set_ge2dinfo(&amlge2d.ge2dinfo);
Cao Jian65331472019-11-01 21:01:49 +08001179 ret = check_plane_number(amlge2d.ge2dinfo.src_info[0].plane_number,
1180 amlge2d.ge2dinfo.src_info[0].format);
1181 if (ret < 0) {
1182 printf("Error src1 plane_number=[%d], format=%d\n",
1183 amlge2d.ge2dinfo.src_info[0].plane_number,
1184 amlge2d.ge2dinfo.src_info[0].format);
1185 return NULL;
1186 }
1187 ret = check_plane_number(amlge2d.ge2dinfo.src_info[1].plane_number,
1188 amlge2d.ge2dinfo.src_info[1].format);
1189 if (ret < 0) {
1190 printf("Error src2 plane_number=[%d],format=%d\n",
1191 amlge2d.ge2dinfo.src_info[1].plane_number,
1192 amlge2d.ge2dinfo.src_info[1].format);
1193 return NULL;
1194 }
1195 ret = check_plane_number(amlge2d.ge2dinfo.dst_info.plane_number,
1196 amlge2d.ge2dinfo.dst_info.format);
1197 if (ret < 0) {
1198 printf("Error dst plane_number=[%d],format=%d\n",
1199 amlge2d.ge2dinfo.dst_info.plane_number,
1200 amlge2d.ge2dinfo.dst_info.format);
1201 return NULL;
1202 }
Cao Jian53a15142019-08-16 13:58:17 +08001203
1204 ret = aml_ge2d_init(&amlge2d);
1205 if (ret < 0)
1206 return NULL;
1207
1208 ret = aml_ge2d_mem_alloc(&amlge2d);
1209 if (ret < 0)
1210 goto exit;
1211 #if 0
1212 /* if dma_buf and used fd alloc other driver */
1213 /* set dma buf fd */
1214 amlge2d.ge2dinfo.src_info[0].shared_fd = dma_fd;
1215 amlge2d.ge2dinfo.src_info[0].memtype = GE2D_CANVAS_ALLOC;
1216 #endif
1217
1218 switch (amlge2d.ge2dinfo.ge2d_op)
1219 {
1220 case AML_GE2D_FILLRECTANGLE:
1221 ret = do_fill_rectangle(&amlge2d);
1222 break;
1223 case AML_GE2D_BLEND:
1224 ret = do_blend(&amlge2d);
1225 break;
1226 case AML_GE2D_STRETCHBLIT:
1227 ret = do_strechblit(&amlge2d);
1228 break;
1229 case AML_GE2D_BLIT:
1230 ret = do_blit(&amlge2d);
1231 break;
1232 default:
1233 E_GE2D("not support ge2d op,exit test!\n");
1234 break;
1235 }
1236 if (ret < 0)
1237 goto exit;
1238
1239 if (amlge2d.ge2dinfo.dst_info.mem_alloc_type == AML_GE2D_MEM_ION)
1240 aml_ge2d_invalid_cache(&amlge2d.ge2dinfo);
Cao Jian65331472019-11-01 21:01:49 +08001241 sprintf(dst_file_name, "%s_thread%d_%d", DST_FILE_NAME, *(int *)arg, run_time);
1242 ret = aml_write_file(&amlge2d, dst_file_name);
Cao Jian53a15142019-08-16 13:58:17 +08001243 if (ret < 0)
1244 goto exit;
1245 exit:
Cao Jian65331472019-11-01 21:01:49 +08001246 for (i = 0; i < amlge2d.ge2dinfo.src_info[0].plane_number; i++) {
1247 if (amlge2d.src_data[i]) {
1248 free(amlge2d.src_data[i]);
1249 amlge2d.src_data[i] = NULL;
1250 }
Cao Jian53a15142019-08-16 13:58:17 +08001251 }
1252
Cao Jian65331472019-11-01 21:01:49 +08001253 for (i = 0; i < amlge2d.ge2dinfo.src_info[1].plane_number; i++) {
1254 if (amlge2d.src2_data[i]) {
1255 free(amlge2d.src2_data[i]);
1256 amlge2d.src2_data[i] = NULL;
1257 }
1258 }
1259
1260 for (i = 0; i < amlge2d.ge2dinfo.dst_info.plane_number; i++) {
1261 if (amlge2d.dst_data[i]) {
1262 free(amlge2d.dst_data[i]);
1263 amlge2d.dst_data[i] = NULL;
1264 }
1265 }
Cao Jian53a15142019-08-16 13:58:17 +08001266 aml_ge2d_mem_free(&amlge2d);
1267 aml_ge2d_exit(&amlge2d);
1268 }
1269 printf("ge2d feature_test exit!!!\n");
1270
1271 return NULL;
1272}
1273
1274int main(int argc, char **argv)
1275{
1276 int ret = -1, i;
1277 pthread_t thread[THREADS_MAX_NUM];
1278 int threadindex[THREADS_MAX_NUM];
1279
1280 if (num_thread > THREADS_MAX_NUM) {
1281 E_GE2D("num of thread greater than THREADS_MAX_NUM\n");
1282 return -1;
1283 }
1284 memset(&thread, 0, sizeof(thread));
1285
1286 ret = parse_command_line(argc, argv);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001287 if (ret == ge2d_fail)
1288 return ge2d_success;
1289
Cao Jian65331472019-11-01 21:01:49 +08001290 for (i = 0; i < num_thread; i++) {
Cao Jian53a15142019-08-16 13:58:17 +08001291 threadindex[i] = i;
Cao Jian65331472019-11-01 21:01:49 +08001292 ret = pthread_create(&(thread[i]), NULL, main_run, (void *)&threadindex[i]);
1293 if (ret != 0) {
Cao Jian53a15142019-08-16 13:58:17 +08001294 E_GE2D("integral thread %d creation failed!", i);
1295 return -1;
1296 }
1297 }
Cao Jian65331472019-11-01 21:01:49 +08001298 for (i = 0; i < num_thread; i++)
Cao Jian53a15142019-08-16 13:58:17 +08001299 pthread_join(thread[i], NULL);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001300
Cao Jian53a15142019-08-16 13:58:17 +08001301 return 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +08001302}