blob: cffe5da179f09597c29a207fe390ba42ec96e4ad [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;
Cao Jian53a15142019-08-16 13:58:17 +0800671 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800672 if (ret < 0)
673 return ge2d_fail;
674
675 pge2dinfo->src_info[0].rect.x = src1_rect_x;
676 pge2dinfo->src_info[0].rect.y = src1_rect_y;
677 pge2dinfo->src_info[0].rect.w = src1_rect_w;
678 pge2dinfo->src_info[0].rect.h = src1_rect_h;
679 pge2dinfo->src_info[0].fill_color_en = 0;
680
681 pge2dinfo->src_info[1].rect.x = src2_rect_x;
682 pge2dinfo->src_info[1].rect.y = src2_rect_y;
683 pge2dinfo->src_info[1].rect.w = src2_rect_w;
684 pge2dinfo->src_info[1].rect.h = src2_rect_h;
685 pge2dinfo->src_info[1].fill_color_en = 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800686
687 pge2dinfo->dst_info.rect.x = dst_rect_x;
688 pge2dinfo->dst_info.rect.y = dst_rect_y;
689 pge2dinfo->dst_info.rect.w = dst_rect_w;
690 pge2dinfo->dst_info.rect.h = dst_rect_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800691 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800692
693 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
694 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
695 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
696 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
Cao Jian2b1d6972020-09-11 16:55:49 +0800697
Cao Jian3ad43572021-02-19 13:54:52 +0800698 /* if ge2d as dmabuf exporter, use the below interface to sync cache */
699 if (pge2dinfo->src_info[0].mem_alloc_type == AML_GE2D_MEM_DMABUF)
700 aml_ge2d_sync_for_device(pge2dinfo, 0);
701 if (pge2dinfo->src_info[1].mem_alloc_type == AML_GE2D_MEM_DMABUF)
702 aml_ge2d_sync_for_device(pge2dinfo, 1);
703
704 ret = do_cmd(pge2dinfo);
705
706 /* if ge2d as dmabuf exporter, use the below interface to invalid cache */
707 if (pge2dinfo->dst_info.mem_alloc_type == AML_GE2D_MEM_DMABUF)
708 aml_ge2d_sync_for_cpu(pge2dinfo);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800709 } else {
710 if (((gb1_alpha != 0xff)
711 && (gb2_alpha != 0xff))){
712 printf("two steps blend,two plane alpha\n");
713
714 if (src2_layer_mode == LAYER_MODE_COVERAGE) {
715 printf("two steps blend,src2 LAYER_MODE_COVERAGE\n");
Cao Jian53a15142019-08-16 13:58:17 +0800716 ret = aml_read_file_src1(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800717 if (ret < 0)
718 return ge2d_fail;
719
720 /* both plane alpha, do 2 steps */
721 /* step 1: strechbilt */
722 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
723 /* src2 do strechbilt to dst */
724 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
725 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
726 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
727 pge2dinfo->src_info[0].rect.x = 0;
728 pge2dinfo->src_info[0].rect.y = 0;
729 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
730 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
731 pge2dinfo->src_info[0].fill_color_en = 0;
732
733 pge2dinfo->src_info[1].canvas_w = SX_DST;
734 pge2dinfo->src_info[1].canvas_h = SY_DST;
735 pge2dinfo->src_info[1].format = DST_PIXFORMAT;
736 pge2dinfo->src_info[1].rect.x = 0;
737 pge2dinfo->src_info[1].rect.y = 0;
738 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
739 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
740 pge2dinfo->src_info[1].fill_color_en = 1;
741 pge2dinfo->src_info[1].def_color = 0x00;
742
743 pge2dinfo->dst_info.canvas_w = SX_DST;
744 pge2dinfo->dst_info.canvas_h = SY_DST;
745 pge2dinfo->dst_info.format = DST_PIXFORMAT;
746 pge2dinfo->dst_info.rect.x = 0;
747 pge2dinfo->dst_info.rect.y = 0;
748 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
749 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800750 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800751
752 pge2dinfo->src_info[0].layer_mode = LAYER_MODE_COVERAGE;
753 pge2dinfo->src_info[1].layer_mode = LAYER_MODE_COVERAGE;
754 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
755 pge2dinfo->src_info[1].plane_alpha = 0xff;
756 ret = aml_ge2d_process(pge2dinfo);
Cao Jian53a15142019-08-16 13:58:17 +0800757 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800758 if (ret < 0)
759 return ge2d_fail;
760
761 /* step2: blend src1 blend src2(dst) to dst */
762 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
763
764 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
765 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
766 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
767 pge2dinfo->src_info[0].rect.x = 0;
768 pge2dinfo->src_info[0].rect.y = 0;
769 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
770 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
771 pge2dinfo->src_info[0].fill_color_en = 0;
772
773 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
774 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
775 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
776 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
777 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
778 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
779 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800780 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
781 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800782 pge2dinfo->src_info[1].fill_color_en = 0;
783
784 pge2dinfo->dst_info.canvas_w = SX_DST;
785 pge2dinfo->dst_info.canvas_h = SY_DST;
786 pge2dinfo->dst_info.format = DST_PIXFORMAT;
787 pge2dinfo->dst_info.rect.x = 0;
788 pge2dinfo->dst_info.rect.y = 0;
789 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
790 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800791 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800792
793 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
794 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
795 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
796 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
797 ret = aml_ge2d_process(pge2dinfo);
798 } else {
Cao Jian53a15142019-08-16 13:58:17 +0800799 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800800 if (ret < 0)
801 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +0800802 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800803 if (ret < 0)
804 return ge2d_fail;
805 printf("two step: strechbilt+blend\n");
806 /* both plane alpha, do 2 steps */
807 /* step 1: strechbilt */
808 pge2dinfo->ge2d_op = AML_GE2D_STRETCHBLIT;
809 /* src2 do strechbilt to dst */
810 pge2dinfo->src_info[0].canvas_w = SX_SRC2;
811 pge2dinfo->src_info[0].canvas_h = SY_SRC2;
812 pge2dinfo->src_info[0].format = SRC2_PIXFORMAT;
813 pge2dinfo->src_info[0].rect.x = 0;
814 pge2dinfo->src_info[0].rect.y = 0;
815 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
816 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
817
Cao Jian65331472019-11-01 21:01:49 +0800818 shared_fd_bakup = pge2dinfo->src_info[0].shared_fd[0];
819 offset_bakup = pge2dinfo->src_info[0].offset[0];
820 pge2dinfo->src_info[0].shared_fd[0] = pge2dinfo->src_info[1].shared_fd[0];
821 pge2dinfo->src_info[0].offset[0] = pge2dinfo->src_info[1].offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800822
823 pge2dinfo->src_info[0].layer_mode = src2_layer_mode;
824 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
825 pge2dinfo->dst_info.canvas_w = SX_DST;
826 pge2dinfo->dst_info.canvas_h = SY_DST;
827 pge2dinfo->dst_info.format = DST_PIXFORMAT;
828 pge2dinfo->dst_info.rect.x = 0;
829 pge2dinfo->dst_info.rect.y = 0;
830 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
831 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800832 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800833 ret = aml_ge2d_process(pge2dinfo);
834
835 /* step2: blend src1 blend src2(dst) to dst */
836 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
837
838 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
839 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
840 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
841 pge2dinfo->src_info[0].rect.x = 0;
842 pge2dinfo->src_info[0].rect.y = 0;
843 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
844 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jian65331472019-11-01 21:01:49 +0800845 pge2dinfo->src_info[0].shared_fd[0] = shared_fd_bakup;
846 pge2dinfo->src_info[0].offset[0] = offset_bakup;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800847 pge2dinfo->src_info[0].fill_color_en = 0;
848
849 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
850 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
851 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
852 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
853 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
854 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
855 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800856 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
857 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800858 pge2dinfo->src_info[1].fill_color_en = 0;
859
860 pge2dinfo->dst_info.canvas_w = SX_DST;
861 pge2dinfo->dst_info.canvas_h = SY_DST;
862 pge2dinfo->dst_info.format = DST_PIXFORMAT;
863 pge2dinfo->dst_info.rect.x = 0;
864 pge2dinfo->dst_info.rect.y = 0;
865 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
866 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800867 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800868
869 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
870 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
871 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
872 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
873 ret = aml_ge2d_process(pge2dinfo);
874 }
875 } else if (src2_layer_mode == LAYER_MODE_COVERAGE){
876 printf("two steps blend,src2 LAYER_MODE_COVERAGE: two blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800877 ret = aml_read_file_src1(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800878 if (ret < 0)
879 return ge2d_fail;
880 /* both plane alpha, do 2 steps */
881 /* step 1: strechbilt */
882 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
883 /* src2 do strechbilt to dst */
884 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
885 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
886 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
887 pge2dinfo->src_info[0].rect.x = 0;
888 pge2dinfo->src_info[0].rect.y = 0;
889 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
890 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
891 pge2dinfo->src_info[0].fill_color_en = 0;
892
893 pge2dinfo->src_info[1].canvas_w = SX_DST;
894 pge2dinfo->src_info[1].canvas_h = SY_DST;
895 pge2dinfo->src_info[1].format = DST_PIXFORMAT;
896 pge2dinfo->src_info[1].rect.x = 0;
897 pge2dinfo->src_info[1].rect.y = 0;
898 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
899 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
900 pge2dinfo->src_info[1].fill_color_en = 1;
901 pge2dinfo->src_info[1].def_color = 0x00;
902
903 pge2dinfo->dst_info.canvas_w = SX_DST;
904 pge2dinfo->dst_info.canvas_h = SY_DST;
905 pge2dinfo->dst_info.format = DST_PIXFORMAT;
906 pge2dinfo->dst_info.rect.x = 0;
907 pge2dinfo->dst_info.rect.y = 0;
908 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
909 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800910 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800911
912 pge2dinfo->src_info[0].layer_mode = LAYER_MODE_COVERAGE;
913 pge2dinfo->src_info[1].layer_mode = LAYER_MODE_COVERAGE;
914 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
915 pge2dinfo->src_info[1].plane_alpha = 0xff;
916 ret = aml_ge2d_process(pge2dinfo);
Cao Jian53a15142019-08-16 13:58:17 +0800917 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800918 if (ret < 0)
919 return ge2d_fail;
920 /* step2: blend src1 blend src2(dst) to dst */
921 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
922
923 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
924 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
925 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
926 pge2dinfo->src_info[0].rect.x = 0;
927 pge2dinfo->src_info[0].rect.y = 0;
928 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
929 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
930 pge2dinfo->src_info[0].fill_color_en = 0;
931
932 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
933 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
934 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
935 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
936 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
937 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
938 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800939 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
940 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800941 pge2dinfo->src_info[1].fill_color_en = 0;
942
943 pge2dinfo->dst_info.canvas_w = SX_DST;
944 pge2dinfo->dst_info.canvas_h = SY_DST;
945 pge2dinfo->dst_info.format = DST_PIXFORMAT;
946 pge2dinfo->dst_info.rect.x = 0;
947 pge2dinfo->dst_info.rect.y = 0;
948 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
949 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800950 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800951
952 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
953 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
954 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
955 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
956 ret = aml_ge2d_process(pge2dinfo);
957 } else if ((src2_layer_mode == LAYER_MODE_NON)
958 && (src1_layer_mode != LAYER_MODE_PREMULTIPLIED)){
959 printf("two steps blend,src2 LAYER_MODE_NON:strechbilt+blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800960 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800961 if (ret < 0)
962 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +0800963 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800964 if (ret < 0)
965 return ge2d_fail;
966 /* both plane alpha, do 2 steps */
967 /* step 1: strechbilt */
968 pge2dinfo->ge2d_op = AML_GE2D_STRETCHBLIT;
969 /* src2 do strechbilt to dst */
970 pge2dinfo->src_info[0].canvas_w = SX_SRC2;
971 pge2dinfo->src_info[0].canvas_h = SY_SRC2;
972 pge2dinfo->src_info[0].format = SRC2_PIXFORMAT;
973 pge2dinfo->src_info[0].rect.x = 0;
974 pge2dinfo->src_info[0].rect.y = 0;
975 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
976 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
977
Cao Jian65331472019-11-01 21:01:49 +0800978 shared_fd_bakup = pge2dinfo->src_info[0].shared_fd[0];
979 offset_bakup = pge2dinfo->src_info[0].offset[0];
980 pge2dinfo->src_info[0].shared_fd[0] = pge2dinfo->src_info[1].shared_fd[0];
981 pge2dinfo->src_info[0].offset[0] = pge2dinfo->src_info[1].offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800982 pge2dinfo->src_info[0].layer_mode = src2_layer_mode;
983 pge2dinfo->src_info[0].plane_alpha = 0xff;
984 pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888;
985
986 pge2dinfo->dst_info.canvas_w = SX_DST;
987 pge2dinfo->dst_info.canvas_h = SY_DST;
988 pge2dinfo->dst_info.format = DST_PIXFORMAT;
989 pge2dinfo->dst_info.rect.x = 0;
990 pge2dinfo->dst_info.rect.y = 0;
991 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
992 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800993 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800994 ret = aml_ge2d_process(pge2dinfo);
995
996 /* step2: blend src1 blend src2(dst) to dst */
997 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
998
999 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
1000 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
1001 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
1002 pge2dinfo->src_info[0].rect.x = 0;
1003 pge2dinfo->src_info[0].rect.y = 0;
1004 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
1005 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jian65331472019-11-01 21:01:49 +08001006 pge2dinfo->src_info[0].shared_fd[0] = shared_fd_bakup;
1007 pge2dinfo->src_info[0].offset[0] = offset_bakup;
Jian Caob9fb3ed2019-04-16 16:51:27 +08001008 pge2dinfo->src_info[0].fill_color_en = 0;
1009
1010 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
1011 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
1012 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
1013 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
1014 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
1015 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
1016 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +08001017 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
1018 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +08001019 pge2dinfo->src_info[1].fill_color_en = 0;
1020
1021 pge2dinfo->dst_info.canvas_w = SX_DST;
1022 pge2dinfo->dst_info.canvas_h = SY_DST;
1023 pge2dinfo->dst_info.format = DST_PIXFORMAT;
1024 pge2dinfo->dst_info.rect.x = 0;
1025 pge2dinfo->dst_info.rect.y = 0;
1026 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
1027 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +08001028 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001029 printf("two steps blend,src1_layer_mode=%d,src2_layer_mode=%d\n",src1_layer_mode,src2_layer_mode);
1030
1031 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1032 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
1033 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1034 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
1035 ret = aml_ge2d_process(pge2dinfo);
1036 } else {
1037 /* do blend src1 blend src2(dst) to dst */
1038 printf("one step blend\n");
Cao Jian53a15142019-08-16 13:58:17 +08001039 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001040 if (ret < 0)
1041 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +08001042 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001043 if (ret < 0)
1044 return ge2d_fail;
1045 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
1046 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
1047 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
1048 pge2dinfo->src_info[0].rect.x = 0;
1049 pge2dinfo->src_info[0].rect.y = 0;
1050 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
1051 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
1052 pge2dinfo->src_info[0].fill_color_en = 0;
1053
1054 pge2dinfo->src_info[1].canvas_w = SX_SRC2;
1055 pge2dinfo->src_info[1].canvas_h = SY_SRC2;
1056 pge2dinfo->src_info[1].format = SRC2_PIXFORMAT;
1057 pge2dinfo->src_info[1].rect.x = 0;
1058 pge2dinfo->src_info[1].rect.y = 0;
1059 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
1060 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
1061 pge2dinfo->src_info[1].fill_color_en = 0;
1062 if (src2_layer_mode == LAYER_MODE_NON)
1063 pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888;
1064 pge2dinfo->dst_info.canvas_w = SX_DST;
1065 pge2dinfo->dst_info.canvas_h = SY_DST;
1066 pge2dinfo->dst_info.format = DST_PIXFORMAT;
1067 pge2dinfo->dst_info.rect.x = 0;
1068 pge2dinfo->dst_info.rect.y = 0;
1069 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
1070 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +08001071 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001072
1073 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1074 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
1075 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1076 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
1077 ret = aml_ge2d_process(pge2dinfo);
1078 }
1079 }
Cao Jian53a15142019-08-16 13:58:17 +08001080 if (ret < 0)
1081 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001082 return ret;
1083}
1084
1085
Cao Jian53a15142019-08-16 13:58:17 +08001086static int do_strechblit(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +08001087{
1088 int ret = -1;
1089 char code = 0;
Cao Jiane80b1392019-08-07 20:59:47 +08001090 int i;
1091 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +08001092 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
1093
Jian Caob9fb3ed2019-04-16 16:51:27 +08001094 printf("do_strechblit test case:\n");
Cao Jian53a15142019-08-16 13:58:17 +08001095 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001096 if (ret < 0)
1097 return ge2d_fail;
1098
1099 pge2dinfo->src_info[0].rect.x = src1_rect_x;
1100 pge2dinfo->src_info[0].rect.y = src1_rect_y;
1101 pge2dinfo->src_info[0].rect.w = src1_rect_w;
1102 pge2dinfo->src_info[0].rect.h = src1_rect_h;
1103 pge2dinfo->dst_info.rect.x = dst_rect_x;
1104 pge2dinfo->dst_info.rect.y = dst_rect_y;
1105 pge2dinfo->dst_info.rect.w = dst_rect_w;
1106 pge2dinfo->dst_info.rect.h = dst_rect_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +08001107 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001108 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1109 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1110
Cao Jian3ad43572021-02-19 13:54:52 +08001111 /* if ge2d as dmabuf exporter, use the below interface to sync cache */
1112 if (pge2dinfo->src_info[0].mem_alloc_type == AML_GE2D_MEM_DMABUF)
1113 aml_ge2d_sync_for_device(pge2dinfo, 0);
1114 if (pge2dinfo->src_info[1].mem_alloc_type == AML_GE2D_MEM_DMABUF)
1115 aml_ge2d_sync_for_device(pge2dinfo, 1);
1116
Cao Jian2b1d6972020-09-11 16:55:49 +08001117 ret = do_cmd(pge2dinfo);
1118
Cao Jian3ad43572021-02-19 13:54:52 +08001119 /* if ge2d as dmabuf exporter, use the below interface to invalid cache */
1120 if (pge2dinfo->dst_info.mem_alloc_type == AML_GE2D_MEM_DMABUF)
1121 aml_ge2d_sync_for_cpu(pge2dinfo);
1122
Jian Caob9fb3ed2019-04-16 16:51:27 +08001123 #if 0
1124 sleep(5);
1125
1126 printf("please enter any key do rotation test[90]\n");
1127 code = getc(stdin);
1128 pge2dinfo->dst_info.rotation = GE2D_ROTATION_90;
1129 ret = aml_ge2d_process(pge2dinfo);
1130 #endif
Cao Jian53a15142019-08-16 13:58:17 +08001131 if (ret < 0)
1132 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001133 return ret;
1134
1135}
1136
Cao Jian53a15142019-08-16 13:58:17 +08001137static int do_blit(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +08001138{
1139 int ret = -1;
1140 char code = 0;
Cao Jiane80b1392019-08-07 20:59:47 +08001141 int i;
1142 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +08001143 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
1144
Jian Caob9fb3ed2019-04-16 16:51:27 +08001145 printf("do_blit test case:\n");
Cao Jian53a15142019-08-16 13:58:17 +08001146 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001147 if (ret < 0)
1148 return ge2d_fail;
1149
1150 pge2dinfo->src_info[0].rect.x = src1_rect_x;
1151 pge2dinfo->src_info[0].rect.y = src1_rect_y;
1152 pge2dinfo->src_info[0].rect.w = src1_rect_w;
1153 pge2dinfo->src_info[0].rect.h = src1_rect_h;
1154 pge2dinfo->dst_info.rect.x = dst_rect_x;
1155 pge2dinfo->dst_info.rect.y = dst_rect_y;
1156
Cao Jianb3f2fce2020-11-16 19:39:13 +08001157 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001158 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1159 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1160
Cao Jian3ad43572021-02-19 13:54:52 +08001161 /* if ge2d as dmabuf exporter, use the below interface to sync cache */
1162 if (pge2dinfo->src_info[0].mem_alloc_type == AML_GE2D_MEM_DMABUF)
1163 aml_ge2d_sync_for_device(pge2dinfo, 0);
1164 if (pge2dinfo->src_info[1].mem_alloc_type == AML_GE2D_MEM_DMABUF)
1165 aml_ge2d_sync_for_device(pge2dinfo, 1);
1166
Cao Jian2b1d6972020-09-11 16:55:49 +08001167 ret = do_cmd(pge2dinfo);
1168
Cao Jian3ad43572021-02-19 13:54:52 +08001169 /* if ge2d as dmabuf exporter, use the below interface to invalid cache */
1170 if (pge2dinfo->dst_info.mem_alloc_type == AML_GE2D_MEM_DMABUF)
1171 aml_ge2d_sync_for_cpu(pge2dinfo);
1172
Jian Caob9fb3ed2019-04-16 16:51:27 +08001173 #if 0
1174 sleep(5);
1175
1176 printf("please enter any key do rotation test[90]\n");
1177 code = getc(stdin);
1178 pge2dinfo->dst_info.rotation = GE2D_ROTATION_90;
1179 pge2dinfo->src_info[0].rect.x = 0;
1180 pge2dinfo->src_info[0].rect.y = 0;
1181 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
1182 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
1183 pge2dinfo->dst_info.rect.x = 0;
1184 pge2dinfo->dst_info.rect.y = 0;
1185
1186 ret = aml_ge2d_process(pge2dinfo);
1187 #endif
Cao Jian53a15142019-08-16 13:58:17 +08001188 if (ret < 0)
1189 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001190 return ret;
1191}
1192
Cao Jian53a15142019-08-16 13:58:17 +08001193void *main_run(void *arg)
Jian Caob9fb3ed2019-04-16 16:51:27 +08001194{
1195 int ret = -1;
Cao Jian65331472019-11-01 21:01:49 +08001196 int i = 0, run_time = 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +08001197 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +08001198 aml_ge2d_t amlge2d;
Cao Jian65331472019-11-01 21:01:49 +08001199 char dst_file_name[128] = {};
Jian Cao49c82bd2019-06-04 12:49:10 +08001200
Cao Jian65331472019-11-01 21:01:49 +08001201 for (run_time = 0; run_time < num_process_per_thread; run_time++) {
1202 printf("ThreadIdx -- %d, run time -- %d\n", *(int *)arg, run_time);
1203 memset(&amlge2d, 0, sizeof(aml_ge2d_t));
Cao Jian53a15142019-08-16 13:58:17 +08001204 memset(&(amlge2d.ge2dinfo.src_info[0]), 0, sizeof(buffer_info_t));
1205 memset(&(amlge2d.ge2dinfo.src_info[1]), 0, sizeof(buffer_info_t));
1206 memset(&(amlge2d.ge2dinfo.dst_info), 0, sizeof(buffer_info_t));
1207
Cao Jian2b1d6972020-09-11 16:55:49 +08001208 for (i = 0; i < GE2D_MAX_PLANE; i++) {
Cao Jian65331472019-11-01 21:01:49 +08001209 amlge2d.ge2dinfo.src_info[0].shared_fd[i] = -1;
1210 amlge2d.ge2dinfo.src_info[1].shared_fd[i] = -1;
1211 amlge2d.ge2dinfo.dst_info.shared_fd[i] = -1;
1212 }
Cao Jian53a15142019-08-16 13:58:17 +08001213 set_ge2dinfo(&amlge2d.ge2dinfo);
Cao Jian65331472019-11-01 21:01:49 +08001214 ret = check_plane_number(amlge2d.ge2dinfo.src_info[0].plane_number,
1215 amlge2d.ge2dinfo.src_info[0].format);
1216 if (ret < 0) {
1217 printf("Error src1 plane_number=[%d], format=%d\n",
1218 amlge2d.ge2dinfo.src_info[0].plane_number,
1219 amlge2d.ge2dinfo.src_info[0].format);
1220 return NULL;
1221 }
1222 ret = check_plane_number(amlge2d.ge2dinfo.src_info[1].plane_number,
1223 amlge2d.ge2dinfo.src_info[1].format);
1224 if (ret < 0) {
1225 printf("Error src2 plane_number=[%d],format=%d\n",
1226 amlge2d.ge2dinfo.src_info[1].plane_number,
1227 amlge2d.ge2dinfo.src_info[1].format);
1228 return NULL;
1229 }
1230 ret = check_plane_number(amlge2d.ge2dinfo.dst_info.plane_number,
1231 amlge2d.ge2dinfo.dst_info.format);
1232 if (ret < 0) {
1233 printf("Error dst plane_number=[%d],format=%d\n",
1234 amlge2d.ge2dinfo.dst_info.plane_number,
1235 amlge2d.ge2dinfo.dst_info.format);
1236 return NULL;
1237 }
Cao Jian53a15142019-08-16 13:58:17 +08001238
1239 ret = aml_ge2d_init(&amlge2d);
1240 if (ret < 0)
1241 return NULL;
1242
1243 ret = aml_ge2d_mem_alloc(&amlge2d);
1244 if (ret < 0)
1245 goto exit;
1246 #if 0
1247 /* if dma_buf and used fd alloc other driver */
1248 /* set dma buf fd */
1249 amlge2d.ge2dinfo.src_info[0].shared_fd = dma_fd;
1250 amlge2d.ge2dinfo.src_info[0].memtype = GE2D_CANVAS_ALLOC;
1251 #endif
1252
1253 switch (amlge2d.ge2dinfo.ge2d_op)
1254 {
1255 case AML_GE2D_FILLRECTANGLE:
1256 ret = do_fill_rectangle(&amlge2d);
1257 break;
1258 case AML_GE2D_BLEND:
1259 ret = do_blend(&amlge2d);
1260 break;
1261 case AML_GE2D_STRETCHBLIT:
1262 ret = do_strechblit(&amlge2d);
1263 break;
1264 case AML_GE2D_BLIT:
1265 ret = do_blit(&amlge2d);
1266 break;
1267 default:
1268 E_GE2D("not support ge2d op,exit test!\n");
1269 break;
1270 }
1271 if (ret < 0)
1272 goto exit;
1273
1274 if (amlge2d.ge2dinfo.dst_info.mem_alloc_type == AML_GE2D_MEM_ION)
1275 aml_ge2d_invalid_cache(&amlge2d.ge2dinfo);
Cao Jian65331472019-11-01 21:01:49 +08001276 sprintf(dst_file_name, "%s_thread%d_%d", DST_FILE_NAME, *(int *)arg, run_time);
1277 ret = aml_write_file(&amlge2d, dst_file_name);
Cao Jian53a15142019-08-16 13:58:17 +08001278 if (ret < 0)
1279 goto exit;
1280 exit:
Cao Jian65331472019-11-01 21:01:49 +08001281 for (i = 0; i < amlge2d.ge2dinfo.src_info[0].plane_number; i++) {
1282 if (amlge2d.src_data[i]) {
1283 free(amlge2d.src_data[i]);
1284 amlge2d.src_data[i] = NULL;
1285 }
Cao Jian53a15142019-08-16 13:58:17 +08001286 }
1287
Cao Jian65331472019-11-01 21:01:49 +08001288 for (i = 0; i < amlge2d.ge2dinfo.src_info[1].plane_number; i++) {
1289 if (amlge2d.src2_data[i]) {
1290 free(amlge2d.src2_data[i]);
1291 amlge2d.src2_data[i] = NULL;
1292 }
1293 }
1294
1295 for (i = 0; i < amlge2d.ge2dinfo.dst_info.plane_number; i++) {
1296 if (amlge2d.dst_data[i]) {
1297 free(amlge2d.dst_data[i]);
1298 amlge2d.dst_data[i] = NULL;
1299 }
1300 }
Cao Jian53a15142019-08-16 13:58:17 +08001301 aml_ge2d_mem_free(&amlge2d);
1302 aml_ge2d_exit(&amlge2d);
1303 }
1304 printf("ge2d feature_test exit!!!\n");
1305
1306 return NULL;
1307}
1308
1309int main(int argc, char **argv)
1310{
1311 int ret = -1, i;
1312 pthread_t thread[THREADS_MAX_NUM];
1313 int threadindex[THREADS_MAX_NUM];
1314
1315 if (num_thread > THREADS_MAX_NUM) {
1316 E_GE2D("num of thread greater than THREADS_MAX_NUM\n");
1317 return -1;
1318 }
1319 memset(&thread, 0, sizeof(thread));
1320
1321 ret = parse_command_line(argc, argv);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001322 if (ret == ge2d_fail)
1323 return ge2d_success;
1324
Cao Jian65331472019-11-01 21:01:49 +08001325 for (i = 0; i < num_thread; i++) {
Cao Jian53a15142019-08-16 13:58:17 +08001326 threadindex[i] = i;
Cao Jian65331472019-11-01 21:01:49 +08001327 ret = pthread_create(&(thread[i]), NULL, main_run, (void *)&threadindex[i]);
1328 if (ret != 0) {
Cao Jian53a15142019-08-16 13:58:17 +08001329 E_GE2D("integral thread %d creation failed!", i);
1330 return -1;
1331 }
1332 }
Cao Jian65331472019-11-01 21:01:49 +08001333 for (i = 0; i < num_thread; i++)
Cao Jian53a15142019-08-16 13:58:17 +08001334 pthread_join(thread[i], NULL);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001335
Cao Jian53a15142019-08-16 13:58:17 +08001336 return 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +08001337}