blob: dadd2765e13dc7ae073bb7dd5b4d4c9f808e7ec4 [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) {
jian.caoc323ed92021-07-08 19:19:34 +0800405 if (format == PIXEL_FORMAT_YV12 || format == PIXEL_FORMAT_YU12)
Cao Jian65331472019-11-01 21:01:49 +0800406 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 Jian3ad43572021-02-19 13:54:52 +0800634
Cao Jian2b1d6972020-09-11 16:55:49 +0800635 ret = do_cmd(pge2dinfo);
Cao Jian3ad43572021-02-19 13:54:52 +0800636
637 /* if ge2d as dmabuf exporter, use the below interface to invalid cache */
638 if (pge2dinfo->dst_info.mem_alloc_type == AML_GE2D_MEM_DMABUF)
639 aml_ge2d_sync_for_cpu(pge2dinfo);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800640 #if 0
641 sleep(5);
642
643 printf("please enter any key do rotation test[90]\n");
644 code = getc(stdin);
645 pge2dinfo->dst_info.rotation = GE2D_ROTATION_180;
646 ret = aml_ge2d_process(pge2dinfo);
647 #endif
Cao Jian53a15142019-08-16 13:58:17 +0800648 if (ret < 0)
649 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800650 return ret;
651}
652
653
Cao Jian53a15142019-08-16 13:58:17 +0800654static int do_blend(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800655{
Cao Jian65331472019-11-01 21:01:49 +0800656 int ret = -1, i;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800657 char code = 0;
658 int shared_fd_bakup;
659 unsigned long offset_bakup = 0;
Cao Jiane80b1392019-08-07 20:59:47 +0800660 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +0800661 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
Cao Jiane80b1392019-08-07 20:59:47 +0800662
Jian Caob9fb3ed2019-04-16 16:51:27 +0800663 printf("do_blend test case:\n");
664
Cao Jian381fe962020-10-21 15:28:22 +0800665 if (pge2dinfo->cap_attr & SRC2_ALPHA) {
Jian Caob9fb3ed2019-04-16 16:51:27 +0800666 /* do blend src1 blend src2(dst) to dst */
667 printf("one step blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800668 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800669 if (ret < 0)
670 return ge2d_fail;
yuhua.lind3e7cd62021-10-14 16:09:27 +0800671 if (amlge2d->ge2dinfo.src_info[0].mem_alloc_type == AML_GE2D_MEM_ION) {
672 ret = aml_ge2d_sync_cache(pge2dinfo, 0);
673 if (ret < 0)
674 return ge2d_fail;
675 }
676
Cao Jian53a15142019-08-16 13:58:17 +0800677 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800678 if (ret < 0)
679 return ge2d_fail;
yuhua.lind3e7cd62021-10-14 16:09:27 +0800680 if (amlge2d->ge2dinfo.src_info[1].mem_alloc_type == AML_GE2D_MEM_ION) {
681 ret = aml_ge2d_sync_cache(pge2dinfo, 1);
682 if (ret < 0)
683 return ge2d_fail;
684 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800685
686 pge2dinfo->src_info[0].rect.x = src1_rect_x;
687 pge2dinfo->src_info[0].rect.y = src1_rect_y;
688 pge2dinfo->src_info[0].rect.w = src1_rect_w;
689 pge2dinfo->src_info[0].rect.h = src1_rect_h;
690 pge2dinfo->src_info[0].fill_color_en = 0;
691
692 pge2dinfo->src_info[1].rect.x = src2_rect_x;
693 pge2dinfo->src_info[1].rect.y = src2_rect_y;
694 pge2dinfo->src_info[1].rect.w = src2_rect_w;
695 pge2dinfo->src_info[1].rect.h = src2_rect_h;
696 pge2dinfo->src_info[1].fill_color_en = 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800697
698 pge2dinfo->dst_info.rect.x = dst_rect_x;
699 pge2dinfo->dst_info.rect.y = dst_rect_y;
700 pge2dinfo->dst_info.rect.w = dst_rect_w;
701 pge2dinfo->dst_info.rect.h = dst_rect_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800702 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800703
704 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
705 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
706 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
707 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
Cao Jian2b1d6972020-09-11 16:55:49 +0800708
Cao Jian3ad43572021-02-19 13:54:52 +0800709 /* if ge2d as dmabuf exporter, use the below interface to sync cache */
710 if (pge2dinfo->src_info[0].mem_alloc_type == AML_GE2D_MEM_DMABUF)
711 aml_ge2d_sync_for_device(pge2dinfo, 0);
712 if (pge2dinfo->src_info[1].mem_alloc_type == AML_GE2D_MEM_DMABUF)
713 aml_ge2d_sync_for_device(pge2dinfo, 1);
714
715 ret = do_cmd(pge2dinfo);
716
717 /* if ge2d as dmabuf exporter, use the below interface to invalid cache */
718 if (pge2dinfo->dst_info.mem_alloc_type == AML_GE2D_MEM_DMABUF)
719 aml_ge2d_sync_for_cpu(pge2dinfo);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800720 } else {
721 if (((gb1_alpha != 0xff)
722 && (gb2_alpha != 0xff))){
723 printf("two steps blend,two plane alpha\n");
724
725 if (src2_layer_mode == LAYER_MODE_COVERAGE) {
726 printf("two steps blend,src2 LAYER_MODE_COVERAGE\n");
Cao Jian53a15142019-08-16 13:58:17 +0800727 ret = aml_read_file_src1(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800728 if (ret < 0)
729 return ge2d_fail;
730
731 /* both plane alpha, do 2 steps */
732 /* step 1: strechbilt */
733 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
734 /* src2 do strechbilt to dst */
735 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
736 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
737 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
738 pge2dinfo->src_info[0].rect.x = 0;
739 pge2dinfo->src_info[0].rect.y = 0;
740 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
741 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
742 pge2dinfo->src_info[0].fill_color_en = 0;
743
744 pge2dinfo->src_info[1].canvas_w = SX_DST;
745 pge2dinfo->src_info[1].canvas_h = SY_DST;
746 pge2dinfo->src_info[1].format = DST_PIXFORMAT;
747 pge2dinfo->src_info[1].rect.x = 0;
748 pge2dinfo->src_info[1].rect.y = 0;
749 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
750 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
751 pge2dinfo->src_info[1].fill_color_en = 1;
752 pge2dinfo->src_info[1].def_color = 0x00;
753
754 pge2dinfo->dst_info.canvas_w = SX_DST;
755 pge2dinfo->dst_info.canvas_h = SY_DST;
756 pge2dinfo->dst_info.format = DST_PIXFORMAT;
757 pge2dinfo->dst_info.rect.x = 0;
758 pge2dinfo->dst_info.rect.y = 0;
759 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
760 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800761 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800762
763 pge2dinfo->src_info[0].layer_mode = LAYER_MODE_COVERAGE;
764 pge2dinfo->src_info[1].layer_mode = LAYER_MODE_COVERAGE;
765 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
766 pge2dinfo->src_info[1].plane_alpha = 0xff;
767 ret = aml_ge2d_process(pge2dinfo);
Cao Jian53a15142019-08-16 13:58:17 +0800768 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800769 if (ret < 0)
770 return ge2d_fail;
771
772 /* step2: blend src1 blend src2(dst) to dst */
773 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
774
775 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
776 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
777 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
778 pge2dinfo->src_info[0].rect.x = 0;
779 pge2dinfo->src_info[0].rect.y = 0;
780 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
781 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
782 pge2dinfo->src_info[0].fill_color_en = 0;
783
784 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
785 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
786 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
787 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
788 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
789 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
790 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800791 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
792 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800793 pge2dinfo->src_info[1].fill_color_en = 0;
794
795 pge2dinfo->dst_info.canvas_w = SX_DST;
796 pge2dinfo->dst_info.canvas_h = SY_DST;
797 pge2dinfo->dst_info.format = DST_PIXFORMAT;
798 pge2dinfo->dst_info.rect.x = 0;
799 pge2dinfo->dst_info.rect.y = 0;
800 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
801 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800802 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800803
804 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
805 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
806 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
807 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
808 ret = aml_ge2d_process(pge2dinfo);
809 } else {
Cao Jian53a15142019-08-16 13:58:17 +0800810 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800811 if (ret < 0)
812 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +0800813 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800814 if (ret < 0)
815 return ge2d_fail;
816 printf("two step: strechbilt+blend\n");
817 /* both plane alpha, do 2 steps */
818 /* step 1: strechbilt */
819 pge2dinfo->ge2d_op = AML_GE2D_STRETCHBLIT;
820 /* src2 do strechbilt to dst */
821 pge2dinfo->src_info[0].canvas_w = SX_SRC2;
822 pge2dinfo->src_info[0].canvas_h = SY_SRC2;
823 pge2dinfo->src_info[0].format = SRC2_PIXFORMAT;
824 pge2dinfo->src_info[0].rect.x = 0;
825 pge2dinfo->src_info[0].rect.y = 0;
826 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
827 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
828
Cao Jian65331472019-11-01 21:01:49 +0800829 shared_fd_bakup = pge2dinfo->src_info[0].shared_fd[0];
830 offset_bakup = pge2dinfo->src_info[0].offset[0];
831 pge2dinfo->src_info[0].shared_fd[0] = pge2dinfo->src_info[1].shared_fd[0];
832 pge2dinfo->src_info[0].offset[0] = pge2dinfo->src_info[1].offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800833
834 pge2dinfo->src_info[0].layer_mode = src2_layer_mode;
835 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
836 pge2dinfo->dst_info.canvas_w = SX_DST;
837 pge2dinfo->dst_info.canvas_h = SY_DST;
838 pge2dinfo->dst_info.format = DST_PIXFORMAT;
839 pge2dinfo->dst_info.rect.x = 0;
840 pge2dinfo->dst_info.rect.y = 0;
841 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
842 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800843 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800844 ret = aml_ge2d_process(pge2dinfo);
845
846 /* step2: blend src1 blend src2(dst) to dst */
847 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
848
849 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
850 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
851 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
852 pge2dinfo->src_info[0].rect.x = 0;
853 pge2dinfo->src_info[0].rect.y = 0;
854 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
855 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jian65331472019-11-01 21:01:49 +0800856 pge2dinfo->src_info[0].shared_fd[0] = shared_fd_bakup;
857 pge2dinfo->src_info[0].offset[0] = offset_bakup;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800858 pge2dinfo->src_info[0].fill_color_en = 0;
859
860 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
861 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
862 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
863 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
864 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
865 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
866 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800867 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
868 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800869 pge2dinfo->src_info[1].fill_color_en = 0;
870
871 pge2dinfo->dst_info.canvas_w = SX_DST;
872 pge2dinfo->dst_info.canvas_h = SY_DST;
873 pge2dinfo->dst_info.format = DST_PIXFORMAT;
874 pge2dinfo->dst_info.rect.x = 0;
875 pge2dinfo->dst_info.rect.y = 0;
876 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
877 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800878 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800879
880 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
881 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
882 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
883 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
884 ret = aml_ge2d_process(pge2dinfo);
885 }
886 } else if (src2_layer_mode == LAYER_MODE_COVERAGE){
887 printf("two steps blend,src2 LAYER_MODE_COVERAGE: two blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800888 ret = aml_read_file_src1(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800889 if (ret < 0)
890 return ge2d_fail;
891 /* both plane alpha, do 2 steps */
892 /* step 1: strechbilt */
893 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
894 /* src2 do strechbilt to dst */
895 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
896 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
897 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
898 pge2dinfo->src_info[0].rect.x = 0;
899 pge2dinfo->src_info[0].rect.y = 0;
900 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
901 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
902 pge2dinfo->src_info[0].fill_color_en = 0;
903
904 pge2dinfo->src_info[1].canvas_w = SX_DST;
905 pge2dinfo->src_info[1].canvas_h = SY_DST;
906 pge2dinfo->src_info[1].format = DST_PIXFORMAT;
907 pge2dinfo->src_info[1].rect.x = 0;
908 pge2dinfo->src_info[1].rect.y = 0;
909 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
910 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
911 pge2dinfo->src_info[1].fill_color_en = 1;
912 pge2dinfo->src_info[1].def_color = 0x00;
913
914 pge2dinfo->dst_info.canvas_w = SX_DST;
915 pge2dinfo->dst_info.canvas_h = SY_DST;
916 pge2dinfo->dst_info.format = DST_PIXFORMAT;
917 pge2dinfo->dst_info.rect.x = 0;
918 pge2dinfo->dst_info.rect.y = 0;
919 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
920 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800921 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800922
923 pge2dinfo->src_info[0].layer_mode = LAYER_MODE_COVERAGE;
924 pge2dinfo->src_info[1].layer_mode = LAYER_MODE_COVERAGE;
925 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
926 pge2dinfo->src_info[1].plane_alpha = 0xff;
927 ret = aml_ge2d_process(pge2dinfo);
Cao Jian53a15142019-08-16 13:58:17 +0800928 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800929 if (ret < 0)
930 return ge2d_fail;
931 /* step2: blend src1 blend src2(dst) to dst */
932 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
933
934 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
935 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
936 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
937 pge2dinfo->src_info[0].rect.x = 0;
938 pge2dinfo->src_info[0].rect.y = 0;
939 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
940 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
941 pge2dinfo->src_info[0].fill_color_en = 0;
942
943 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
944 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
945 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
946 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
947 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
948 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
949 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800950 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
951 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800952 pge2dinfo->src_info[1].fill_color_en = 0;
953
954 pge2dinfo->dst_info.canvas_w = SX_DST;
955 pge2dinfo->dst_info.canvas_h = SY_DST;
956 pge2dinfo->dst_info.format = DST_PIXFORMAT;
957 pge2dinfo->dst_info.rect.x = 0;
958 pge2dinfo->dst_info.rect.y = 0;
959 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
960 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800961 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800962
963 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
964 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
965 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
966 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
967 ret = aml_ge2d_process(pge2dinfo);
968 } else if ((src2_layer_mode == LAYER_MODE_NON)
969 && (src1_layer_mode != LAYER_MODE_PREMULTIPLIED)){
970 printf("two steps blend,src2 LAYER_MODE_NON:strechbilt+blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800971 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800972 if (ret < 0)
973 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +0800974 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800975 if (ret < 0)
976 return ge2d_fail;
977 /* both plane alpha, do 2 steps */
978 /* step 1: strechbilt */
979 pge2dinfo->ge2d_op = AML_GE2D_STRETCHBLIT;
980 /* src2 do strechbilt to dst */
981 pge2dinfo->src_info[0].canvas_w = SX_SRC2;
982 pge2dinfo->src_info[0].canvas_h = SY_SRC2;
983 pge2dinfo->src_info[0].format = SRC2_PIXFORMAT;
984 pge2dinfo->src_info[0].rect.x = 0;
985 pge2dinfo->src_info[0].rect.y = 0;
986 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
987 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
988
Cao Jian65331472019-11-01 21:01:49 +0800989 shared_fd_bakup = pge2dinfo->src_info[0].shared_fd[0];
990 offset_bakup = pge2dinfo->src_info[0].offset[0];
991 pge2dinfo->src_info[0].shared_fd[0] = pge2dinfo->src_info[1].shared_fd[0];
992 pge2dinfo->src_info[0].offset[0] = pge2dinfo->src_info[1].offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800993 pge2dinfo->src_info[0].layer_mode = src2_layer_mode;
994 pge2dinfo->src_info[0].plane_alpha = 0xff;
995 pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888;
996
997 pge2dinfo->dst_info.canvas_w = SX_DST;
998 pge2dinfo->dst_info.canvas_h = SY_DST;
999 pge2dinfo->dst_info.format = DST_PIXFORMAT;
1000 pge2dinfo->dst_info.rect.x = 0;
1001 pge2dinfo->dst_info.rect.y = 0;
1002 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
1003 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +08001004 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001005 ret = aml_ge2d_process(pge2dinfo);
1006
1007 /* step2: blend src1 blend src2(dst) to dst */
1008 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
1009
1010 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
1011 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
1012 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
1013 pge2dinfo->src_info[0].rect.x = 0;
1014 pge2dinfo->src_info[0].rect.y = 0;
1015 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
1016 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jian65331472019-11-01 21:01:49 +08001017 pge2dinfo->src_info[0].shared_fd[0] = shared_fd_bakup;
1018 pge2dinfo->src_info[0].offset[0] = offset_bakup;
Jian Caob9fb3ed2019-04-16 16:51:27 +08001019 pge2dinfo->src_info[0].fill_color_en = 0;
1020
1021 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
1022 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
1023 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
1024 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
1025 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
1026 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
1027 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +08001028 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
1029 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +08001030 pge2dinfo->src_info[1].fill_color_en = 0;
1031
1032 pge2dinfo->dst_info.canvas_w = SX_DST;
1033 pge2dinfo->dst_info.canvas_h = SY_DST;
1034 pge2dinfo->dst_info.format = DST_PIXFORMAT;
1035 pge2dinfo->dst_info.rect.x = 0;
1036 pge2dinfo->dst_info.rect.y = 0;
1037 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
1038 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +08001039 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001040 printf("two steps blend,src1_layer_mode=%d,src2_layer_mode=%d\n",src1_layer_mode,src2_layer_mode);
1041
1042 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1043 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
1044 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1045 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
1046 ret = aml_ge2d_process(pge2dinfo);
1047 } else {
1048 /* do blend src1 blend src2(dst) to dst */
1049 printf("one step blend\n");
Cao Jian53a15142019-08-16 13:58:17 +08001050 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001051 if (ret < 0)
1052 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +08001053 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001054 if (ret < 0)
1055 return ge2d_fail;
1056 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
1057 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
1058 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
1059 pge2dinfo->src_info[0].rect.x = 0;
1060 pge2dinfo->src_info[0].rect.y = 0;
1061 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
1062 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
1063 pge2dinfo->src_info[0].fill_color_en = 0;
1064
1065 pge2dinfo->src_info[1].canvas_w = SX_SRC2;
1066 pge2dinfo->src_info[1].canvas_h = SY_SRC2;
1067 pge2dinfo->src_info[1].format = SRC2_PIXFORMAT;
1068 pge2dinfo->src_info[1].rect.x = 0;
1069 pge2dinfo->src_info[1].rect.y = 0;
1070 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
1071 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
1072 pge2dinfo->src_info[1].fill_color_en = 0;
1073 if (src2_layer_mode == LAYER_MODE_NON)
1074 pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888;
1075 pge2dinfo->dst_info.canvas_w = SX_DST;
1076 pge2dinfo->dst_info.canvas_h = SY_DST;
1077 pge2dinfo->dst_info.format = DST_PIXFORMAT;
1078 pge2dinfo->dst_info.rect.x = 0;
1079 pge2dinfo->dst_info.rect.y = 0;
1080 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
1081 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +08001082 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001083
1084 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1085 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
1086 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1087 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
1088 ret = aml_ge2d_process(pge2dinfo);
1089 }
1090 }
Cao Jian53a15142019-08-16 13:58:17 +08001091 if (ret < 0)
1092 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001093 return ret;
1094}
1095
1096
Cao Jian53a15142019-08-16 13:58:17 +08001097static int do_strechblit(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +08001098{
1099 int ret = -1;
1100 char code = 0;
Cao Jiane80b1392019-08-07 20:59:47 +08001101 int i;
1102 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +08001103 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
1104
Jian Caob9fb3ed2019-04-16 16:51:27 +08001105 printf("do_strechblit test case:\n");
Cao Jian53a15142019-08-16 13:58:17 +08001106 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001107 if (ret < 0)
1108 return ge2d_fail;
yuhua.lind3e7cd62021-10-14 16:09:27 +08001109 if (amlge2d->ge2dinfo.src_info[0].mem_alloc_type == AML_GE2D_MEM_ION) {
1110 ret = aml_ge2d_sync_cache(pge2dinfo, 0);
1111 if (ret < 0)
1112 return ge2d_fail;
1113 }
Jian Caob9fb3ed2019-04-16 16:51:27 +08001114
1115 pge2dinfo->src_info[0].rect.x = src1_rect_x;
1116 pge2dinfo->src_info[0].rect.y = src1_rect_y;
1117 pge2dinfo->src_info[0].rect.w = src1_rect_w;
1118 pge2dinfo->src_info[0].rect.h = src1_rect_h;
1119 pge2dinfo->dst_info.rect.x = dst_rect_x;
1120 pge2dinfo->dst_info.rect.y = dst_rect_y;
1121 pge2dinfo->dst_info.rect.w = dst_rect_w;
1122 pge2dinfo->dst_info.rect.h = dst_rect_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +08001123 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001124 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1125 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1126
Cao Jian3ad43572021-02-19 13:54:52 +08001127 /* if ge2d as dmabuf exporter, use the below interface to sync cache */
1128 if (pge2dinfo->src_info[0].mem_alloc_type == AML_GE2D_MEM_DMABUF)
1129 aml_ge2d_sync_for_device(pge2dinfo, 0);
1130 if (pge2dinfo->src_info[1].mem_alloc_type == AML_GE2D_MEM_DMABUF)
1131 aml_ge2d_sync_for_device(pge2dinfo, 1);
1132
Cao Jian2b1d6972020-09-11 16:55:49 +08001133 ret = do_cmd(pge2dinfo);
1134
Cao Jian3ad43572021-02-19 13:54:52 +08001135 /* if ge2d as dmabuf exporter, use the below interface to invalid cache */
1136 if (pge2dinfo->dst_info.mem_alloc_type == AML_GE2D_MEM_DMABUF)
1137 aml_ge2d_sync_for_cpu(pge2dinfo);
1138
Jian Caob9fb3ed2019-04-16 16:51:27 +08001139 #if 0
1140 sleep(5);
1141
1142 printf("please enter any key do rotation test[90]\n");
1143 code = getc(stdin);
1144 pge2dinfo->dst_info.rotation = GE2D_ROTATION_90;
1145 ret = aml_ge2d_process(pge2dinfo);
1146 #endif
Cao Jian53a15142019-08-16 13:58:17 +08001147 if (ret < 0)
1148 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001149 return ret;
1150
1151}
1152
Cao Jian53a15142019-08-16 13:58:17 +08001153static int do_blit(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +08001154{
1155 int ret = -1;
1156 char code = 0;
Cao Jiane80b1392019-08-07 20:59:47 +08001157 int i;
1158 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +08001159 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
1160
Jian Caob9fb3ed2019-04-16 16:51:27 +08001161 printf("do_blit test case:\n");
Cao Jian53a15142019-08-16 13:58:17 +08001162 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001163 if (ret < 0)
1164 return ge2d_fail;
yuhua.lind3e7cd62021-10-14 16:09:27 +08001165 if (amlge2d->ge2dinfo.src_info[0].mem_alloc_type == AML_GE2D_MEM_ION) {
1166 ret = aml_ge2d_sync_cache(pge2dinfo, 0);
1167 if (ret < 0)
1168 return ge2d_fail;
1169 }
Jian Caob9fb3ed2019-04-16 16:51:27 +08001170
1171 pge2dinfo->src_info[0].rect.x = src1_rect_x;
1172 pge2dinfo->src_info[0].rect.y = src1_rect_y;
1173 pge2dinfo->src_info[0].rect.w = src1_rect_w;
1174 pge2dinfo->src_info[0].rect.h = src1_rect_h;
1175 pge2dinfo->dst_info.rect.x = dst_rect_x;
1176 pge2dinfo->dst_info.rect.y = dst_rect_y;
1177
Cao Jianb3f2fce2020-11-16 19:39:13 +08001178 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001179 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1180 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1181
Cao Jian3ad43572021-02-19 13:54:52 +08001182 /* if ge2d as dmabuf exporter, use the below interface to sync cache */
1183 if (pge2dinfo->src_info[0].mem_alloc_type == AML_GE2D_MEM_DMABUF)
1184 aml_ge2d_sync_for_device(pge2dinfo, 0);
1185 if (pge2dinfo->src_info[1].mem_alloc_type == AML_GE2D_MEM_DMABUF)
1186 aml_ge2d_sync_for_device(pge2dinfo, 1);
1187
Cao Jian2b1d6972020-09-11 16:55:49 +08001188 ret = do_cmd(pge2dinfo);
1189
Cao Jian3ad43572021-02-19 13:54:52 +08001190 /* if ge2d as dmabuf exporter, use the below interface to invalid cache */
1191 if (pge2dinfo->dst_info.mem_alloc_type == AML_GE2D_MEM_DMABUF)
1192 aml_ge2d_sync_for_cpu(pge2dinfo);
1193
Jian Caob9fb3ed2019-04-16 16:51:27 +08001194 #if 0
1195 sleep(5);
1196
1197 printf("please enter any key do rotation test[90]\n");
1198 code = getc(stdin);
1199 pge2dinfo->dst_info.rotation = GE2D_ROTATION_90;
1200 pge2dinfo->src_info[0].rect.x = 0;
1201 pge2dinfo->src_info[0].rect.y = 0;
1202 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
1203 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
1204 pge2dinfo->dst_info.rect.x = 0;
1205 pge2dinfo->dst_info.rect.y = 0;
1206
1207 ret = aml_ge2d_process(pge2dinfo);
1208 #endif
Cao Jian53a15142019-08-16 13:58:17 +08001209 if (ret < 0)
1210 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001211 return ret;
1212}
1213
Cao Jian53a15142019-08-16 13:58:17 +08001214void *main_run(void *arg)
Jian Caob9fb3ed2019-04-16 16:51:27 +08001215{
1216 int ret = -1;
Cao Jian65331472019-11-01 21:01:49 +08001217 int i = 0, run_time = 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +08001218 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +08001219 aml_ge2d_t amlge2d;
Cao Jian65331472019-11-01 21:01:49 +08001220 char dst_file_name[128] = {};
Jian Cao49c82bd2019-06-04 12:49:10 +08001221
Cao Jian65331472019-11-01 21:01:49 +08001222 for (run_time = 0; run_time < num_process_per_thread; run_time++) {
1223 printf("ThreadIdx -- %d, run time -- %d\n", *(int *)arg, run_time);
1224 memset(&amlge2d, 0, sizeof(aml_ge2d_t));
Cao Jian53a15142019-08-16 13:58:17 +08001225 memset(&(amlge2d.ge2dinfo.src_info[0]), 0, sizeof(buffer_info_t));
1226 memset(&(amlge2d.ge2dinfo.src_info[1]), 0, sizeof(buffer_info_t));
1227 memset(&(amlge2d.ge2dinfo.dst_info), 0, sizeof(buffer_info_t));
1228
Cao Jian2b1d6972020-09-11 16:55:49 +08001229 for (i = 0; i < GE2D_MAX_PLANE; i++) {
Cao Jian65331472019-11-01 21:01:49 +08001230 amlge2d.ge2dinfo.src_info[0].shared_fd[i] = -1;
1231 amlge2d.ge2dinfo.src_info[1].shared_fd[i] = -1;
1232 amlge2d.ge2dinfo.dst_info.shared_fd[i] = -1;
1233 }
Cao Jian53a15142019-08-16 13:58:17 +08001234 set_ge2dinfo(&amlge2d.ge2dinfo);
Cao Jian65331472019-11-01 21:01:49 +08001235 ret = check_plane_number(amlge2d.ge2dinfo.src_info[0].plane_number,
1236 amlge2d.ge2dinfo.src_info[0].format);
1237 if (ret < 0) {
1238 printf("Error src1 plane_number=[%d], format=%d\n",
1239 amlge2d.ge2dinfo.src_info[0].plane_number,
1240 amlge2d.ge2dinfo.src_info[0].format);
1241 return NULL;
1242 }
1243 ret = check_plane_number(amlge2d.ge2dinfo.src_info[1].plane_number,
1244 amlge2d.ge2dinfo.src_info[1].format);
1245 if (ret < 0) {
1246 printf("Error src2 plane_number=[%d],format=%d\n",
1247 amlge2d.ge2dinfo.src_info[1].plane_number,
1248 amlge2d.ge2dinfo.src_info[1].format);
1249 return NULL;
1250 }
1251 ret = check_plane_number(amlge2d.ge2dinfo.dst_info.plane_number,
1252 amlge2d.ge2dinfo.dst_info.format);
1253 if (ret < 0) {
1254 printf("Error dst plane_number=[%d],format=%d\n",
1255 amlge2d.ge2dinfo.dst_info.plane_number,
1256 amlge2d.ge2dinfo.dst_info.format);
1257 return NULL;
1258 }
Cao Jian53a15142019-08-16 13:58:17 +08001259
1260 ret = aml_ge2d_init(&amlge2d);
1261 if (ret < 0)
1262 return NULL;
1263
1264 ret = aml_ge2d_mem_alloc(&amlge2d);
1265 if (ret < 0)
1266 goto exit;
1267 #if 0
1268 /* if dma_buf and used fd alloc other driver */
1269 /* set dma buf fd */
1270 amlge2d.ge2dinfo.src_info[0].shared_fd = dma_fd;
1271 amlge2d.ge2dinfo.src_info[0].memtype = GE2D_CANVAS_ALLOC;
1272 #endif
1273
1274 switch (amlge2d.ge2dinfo.ge2d_op)
1275 {
1276 case AML_GE2D_FILLRECTANGLE:
1277 ret = do_fill_rectangle(&amlge2d);
1278 break;
1279 case AML_GE2D_BLEND:
1280 ret = do_blend(&amlge2d);
1281 break;
1282 case AML_GE2D_STRETCHBLIT:
1283 ret = do_strechblit(&amlge2d);
1284 break;
1285 case AML_GE2D_BLIT:
1286 ret = do_blit(&amlge2d);
1287 break;
1288 default:
1289 E_GE2D("not support ge2d op,exit test!\n");
1290 break;
1291 }
1292 if (ret < 0)
1293 goto exit;
1294
1295 if (amlge2d.ge2dinfo.dst_info.mem_alloc_type == AML_GE2D_MEM_ION)
1296 aml_ge2d_invalid_cache(&amlge2d.ge2dinfo);
Cao Jian65331472019-11-01 21:01:49 +08001297 sprintf(dst_file_name, "%s_thread%d_%d", DST_FILE_NAME, *(int *)arg, run_time);
1298 ret = aml_write_file(&amlge2d, dst_file_name);
Cao Jian53a15142019-08-16 13:58:17 +08001299 if (ret < 0)
1300 goto exit;
1301 exit:
Cao Jian65331472019-11-01 21:01:49 +08001302 for (i = 0; i < amlge2d.ge2dinfo.src_info[0].plane_number; i++) {
1303 if (amlge2d.src_data[i]) {
1304 free(amlge2d.src_data[i]);
1305 amlge2d.src_data[i] = NULL;
1306 }
Cao Jian53a15142019-08-16 13:58:17 +08001307 }
1308
Cao Jian65331472019-11-01 21:01:49 +08001309 for (i = 0; i < amlge2d.ge2dinfo.src_info[1].plane_number; i++) {
1310 if (amlge2d.src2_data[i]) {
1311 free(amlge2d.src2_data[i]);
1312 amlge2d.src2_data[i] = NULL;
1313 }
1314 }
1315
1316 for (i = 0; i < amlge2d.ge2dinfo.dst_info.plane_number; i++) {
1317 if (amlge2d.dst_data[i]) {
1318 free(amlge2d.dst_data[i]);
1319 amlge2d.dst_data[i] = NULL;
1320 }
1321 }
Cao Jian53a15142019-08-16 13:58:17 +08001322 aml_ge2d_mem_free(&amlge2d);
1323 aml_ge2d_exit(&amlge2d);
1324 }
1325 printf("ge2d feature_test exit!!!\n");
1326
1327 return NULL;
1328}
1329
1330int main(int argc, char **argv)
1331{
1332 int ret = -1, i;
1333 pthread_t thread[THREADS_MAX_NUM];
1334 int threadindex[THREADS_MAX_NUM];
1335
1336 if (num_thread > THREADS_MAX_NUM) {
1337 E_GE2D("num of thread greater than THREADS_MAX_NUM\n");
1338 return -1;
1339 }
1340 memset(&thread, 0, sizeof(thread));
1341
1342 ret = parse_command_line(argc, argv);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001343 if (ret == ge2d_fail)
1344 return ge2d_success;
1345
Cao Jian65331472019-11-01 21:01:49 +08001346 for (i = 0; i < num_thread; i++) {
Cao Jian53a15142019-08-16 13:58:17 +08001347 threadindex[i] = i;
Cao Jian65331472019-11-01 21:01:49 +08001348 ret = pthread_create(&(thread[i]), NULL, main_run, (void *)&threadindex[i]);
1349 if (ret != 0) {
Cao Jian53a15142019-08-16 13:58:17 +08001350 E_GE2D("integral thread %d creation failed!", i);
1351 return -1;
1352 }
1353 }
Cao Jian65331472019-11-01 21:01:49 +08001354 for (i = 0; i < num_thread; i++)
Cao Jian53a15142019-08-16 13:58:17 +08001355 pthread_join(thread[i], NULL);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001356
Cao Jian53a15142019-08-16 13:58:17 +08001357 return 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +08001358}