blob: 96eb5d943d1ca3dbccf36f6b0d002aa0d1f12919 [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);
yuhua.lin34978d02021-12-07 11:03:56 +0800530 return ge2d_fail;
Cao Jian65331472019-11-01 21:01:49 +0800531 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800532 }
533 close(fd);
534 return ge2d_success;
535}
536
Cao Jian2b1d6972020-09-11 16:55:49 +0800537static int do_cmd(aml_ge2d_info_t *pge2dinfo)
538{
539 unsigned long stime;
540 int i, ret = -1;
541 int attach_flag = 0;
542
543 if (!pge2dinfo) {
544 printf("pge2dinfo is null\n");
545 return ge2d_fail;
546 }
547
548 if (separate_step) {
549 /* attach dma fd for src1/src2/dst */
550 switch (pge2dinfo->ge2d_op) {
551 case AML_GE2D_FILLRECTANGLE:
552 attach_flag = ATTACH_DST;
553 break;
554 case AML_GE2D_BLEND:
555 attach_flag = ATTACH_SRC | ATTACH_SRC2 | ATTACH_DST;
556 break;
557 case AML_GE2D_STRETCHBLIT:
558 case AML_GE2D_BLIT:
559 attach_flag = ATTACH_SRC | ATTACH_DST;
560 break;
561 default:
562 E_GE2D("%s, ge2d_op is invalid\n", __func__);
563 return ge2d_fail;
564 }
565
yuhua.lin34978d02021-12-07 11:03:56 +0800566 if (attach_flag & ATTACH_SRC) {
Cao Jian2b1d6972020-09-11 16:55:49 +0800567 ret = aml_ge2d_attach_dma_fd(pge2dinfo, AML_GE2D_SRC);
568 if (ret < 0)
569 return ret;
570 }
571
yuhua.lin34978d02021-12-07 11:03:56 +0800572 if (attach_flag & ATTACH_SRC2) {
Cao Jian2b1d6972020-09-11 16:55:49 +0800573 ret = aml_ge2d_attach_dma_fd(pge2dinfo, AML_GE2D_SRC2);
574 if (ret < 0)
575 return ret;
576 }
577
yuhua.lin34978d02021-12-07 11:03:56 +0800578 if (attach_flag & ATTACH_DST) {
Cao Jian2b1d6972020-09-11 16:55:49 +0800579 ret = aml_ge2d_attach_dma_fd(pge2dinfo, AML_GE2D_DST);
580 if (ret < 0)
581 return ret;
582 }
583
584 /* config once or more times */
585 ret = aml_ge2d_config(pge2dinfo);
586 if (ret < 0)
587 return ret;
588
589 stime = myclock();
590 /* execute one or more times */
591 for (i = 0; i < num_process; i++) {
592 ret = aml_ge2d_execute(pge2dinfo);
593 if (ret < 0) {
594 printf("ge2d process failed, %s (%d)\n", __func__, __LINE__);
595 return ret;
596 }
597 }
598 /* detach dma fd for src1/src2/dst */
yuhua.lin34978d02021-12-07 11:03:56 +0800599 if (attach_flag & ATTACH_SRC)
Cao Jian2b1d6972020-09-11 16:55:49 +0800600 aml_ge2d_detach_dma_fd(pge2dinfo, AML_GE2D_SRC);
yuhua.lin34978d02021-12-07 11:03:56 +0800601 if (attach_flag & ATTACH_SRC2)
Cao Jian2b1d6972020-09-11 16:55:49 +0800602 aml_ge2d_detach_dma_fd(pge2dinfo, AML_GE2D_SRC2);
yuhua.lin34978d02021-12-07 11:03:56 +0800603 if (attach_flag & ATTACH_DST)
Cao Jian2b1d6972020-09-11 16:55:49 +0800604 aml_ge2d_detach_dma_fd(pge2dinfo, AML_GE2D_DST);
605 } else {
606 stime = myclock();
607 for (i = 0; i < num_process; i++) {
608 ret = aml_ge2d_process(pge2dinfo);
609 if (ret < 0) {
610 printf("ge2d process failed, %s (%d)\n", __func__, __LINE__);
611 return ret;
612 }
613 }
614 }
615 printf("separate_step=%d time=%ld ms\n", separate_step, myclock() - stime);
616
617 return ret;
618}
619
Cao Jian53a15142019-08-16 13:58:17 +0800620static int do_fill_rectangle(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800621{
622 int ret = -1;
623 char code;
Cao Jiane80b1392019-08-07 20:59:47 +0800624 int i;
625 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +0800626 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800627
628 printf("do_fill_rectangle test case:\n");
629
630 pge2dinfo->color = rect_color;
631 pge2dinfo->dst_info.rect.x = dst_rect_x;
Cao Jian088facb2020-03-09 17:24:26 +0800632 pge2dinfo->dst_info.rect.y = dst_rect_y;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800633 pge2dinfo->dst_info.rect.w = dst_rect_w;
634 pge2dinfo->dst_info.rect.h = dst_rect_h;
Cao Jian3ad43572021-02-19 13:54:52 +0800635
Cao Jian2b1d6972020-09-11 16:55:49 +0800636 ret = do_cmd(pge2dinfo);
Cao Jian3ad43572021-02-19 13:54:52 +0800637
638 /* if ge2d as dmabuf exporter, use the below interface to invalid cache */
639 if (pge2dinfo->dst_info.mem_alloc_type == AML_GE2D_MEM_DMABUF)
640 aml_ge2d_sync_for_cpu(pge2dinfo);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800641 #if 0
642 sleep(5);
643
644 printf("please enter any key do rotation test[90]\n");
645 code = getc(stdin);
646 pge2dinfo->dst_info.rotation = GE2D_ROTATION_180;
647 ret = aml_ge2d_process(pge2dinfo);
648 #endif
Cao Jian53a15142019-08-16 13:58:17 +0800649 if (ret < 0)
650 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800651 return ret;
652}
653
654
Cao Jian53a15142019-08-16 13:58:17 +0800655static int do_blend(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800656{
Cao Jian65331472019-11-01 21:01:49 +0800657 int ret = -1, i;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800658 char code = 0;
659 int shared_fd_bakup;
660 unsigned long offset_bakup = 0;
Cao Jiane80b1392019-08-07 20:59:47 +0800661 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +0800662 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
Cao Jiane80b1392019-08-07 20:59:47 +0800663
Jian Caob9fb3ed2019-04-16 16:51:27 +0800664 printf("do_blend test case:\n");
665
Cao Jian381fe962020-10-21 15:28:22 +0800666 if (pge2dinfo->cap_attr & SRC2_ALPHA) {
Jian Caob9fb3ed2019-04-16 16:51:27 +0800667 /* do blend src1 blend src2(dst) to dst */
668 printf("one step blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800669 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800670 if (ret < 0)
671 return ge2d_fail;
yuhua.lind3e7cd62021-10-14 16:09:27 +0800672 if (amlge2d->ge2dinfo.src_info[0].mem_alloc_type == AML_GE2D_MEM_ION) {
673 ret = aml_ge2d_sync_cache(pge2dinfo, 0);
674 if (ret < 0)
675 return ge2d_fail;
676 }
677
Cao Jian53a15142019-08-16 13:58:17 +0800678 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800679 if (ret < 0)
680 return ge2d_fail;
yuhua.lind3e7cd62021-10-14 16:09:27 +0800681 if (amlge2d->ge2dinfo.src_info[1].mem_alloc_type == AML_GE2D_MEM_ION) {
682 ret = aml_ge2d_sync_cache(pge2dinfo, 1);
683 if (ret < 0)
684 return ge2d_fail;
685 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800686
687 pge2dinfo->src_info[0].rect.x = src1_rect_x;
688 pge2dinfo->src_info[0].rect.y = src1_rect_y;
689 pge2dinfo->src_info[0].rect.w = src1_rect_w;
690 pge2dinfo->src_info[0].rect.h = src1_rect_h;
691 pge2dinfo->src_info[0].fill_color_en = 0;
692
693 pge2dinfo->src_info[1].rect.x = src2_rect_x;
694 pge2dinfo->src_info[1].rect.y = src2_rect_y;
695 pge2dinfo->src_info[1].rect.w = src2_rect_w;
696 pge2dinfo->src_info[1].rect.h = src2_rect_h;
697 pge2dinfo->src_info[1].fill_color_en = 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800698
699 pge2dinfo->dst_info.rect.x = dst_rect_x;
700 pge2dinfo->dst_info.rect.y = dst_rect_y;
701 pge2dinfo->dst_info.rect.w = dst_rect_w;
702 pge2dinfo->dst_info.rect.h = dst_rect_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800703 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800704
705 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
706 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
707 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
708 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
Cao Jian2b1d6972020-09-11 16:55:49 +0800709
Cao Jian3ad43572021-02-19 13:54:52 +0800710 /* if ge2d as dmabuf exporter, use the below interface to sync cache */
711 if (pge2dinfo->src_info[0].mem_alloc_type == AML_GE2D_MEM_DMABUF)
712 aml_ge2d_sync_for_device(pge2dinfo, 0);
713 if (pge2dinfo->src_info[1].mem_alloc_type == AML_GE2D_MEM_DMABUF)
714 aml_ge2d_sync_for_device(pge2dinfo, 1);
715
716 ret = do_cmd(pge2dinfo);
717
718 /* if ge2d as dmabuf exporter, use the below interface to invalid cache */
719 if (pge2dinfo->dst_info.mem_alloc_type == AML_GE2D_MEM_DMABUF)
720 aml_ge2d_sync_for_cpu(pge2dinfo);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800721 } else {
722 if (((gb1_alpha != 0xff)
723 && (gb2_alpha != 0xff))){
724 printf("two steps blend,two plane alpha\n");
725
726 if (src2_layer_mode == LAYER_MODE_COVERAGE) {
727 printf("two steps blend,src2 LAYER_MODE_COVERAGE\n");
Cao Jian53a15142019-08-16 13:58:17 +0800728 ret = aml_read_file_src1(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800729 if (ret < 0)
730 return ge2d_fail;
731
732 /* both plane alpha, do 2 steps */
733 /* step 1: strechbilt */
734 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
735 /* src2 do strechbilt to dst */
736 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
737 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
738 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
739 pge2dinfo->src_info[0].rect.x = 0;
740 pge2dinfo->src_info[0].rect.y = 0;
741 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
742 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
743 pge2dinfo->src_info[0].fill_color_en = 0;
744
745 pge2dinfo->src_info[1].canvas_w = SX_DST;
746 pge2dinfo->src_info[1].canvas_h = SY_DST;
747 pge2dinfo->src_info[1].format = DST_PIXFORMAT;
748 pge2dinfo->src_info[1].rect.x = 0;
749 pge2dinfo->src_info[1].rect.y = 0;
750 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
751 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
752 pge2dinfo->src_info[1].fill_color_en = 1;
753 pge2dinfo->src_info[1].def_color = 0x00;
754
755 pge2dinfo->dst_info.canvas_w = SX_DST;
756 pge2dinfo->dst_info.canvas_h = SY_DST;
757 pge2dinfo->dst_info.format = DST_PIXFORMAT;
758 pge2dinfo->dst_info.rect.x = 0;
759 pge2dinfo->dst_info.rect.y = 0;
760 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
761 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800762 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800763
764 pge2dinfo->src_info[0].layer_mode = LAYER_MODE_COVERAGE;
765 pge2dinfo->src_info[1].layer_mode = LAYER_MODE_COVERAGE;
766 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
767 pge2dinfo->src_info[1].plane_alpha = 0xff;
768 ret = aml_ge2d_process(pge2dinfo);
Cao Jian53a15142019-08-16 13:58:17 +0800769 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800770 if (ret < 0)
771 return ge2d_fail;
772
773 /* step2: blend src1 blend src2(dst) to dst */
774 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
775
776 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
777 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
778 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
779 pge2dinfo->src_info[0].rect.x = 0;
780 pge2dinfo->src_info[0].rect.y = 0;
781 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
782 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
783 pge2dinfo->src_info[0].fill_color_en = 0;
784
785 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
786 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
787 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
788 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
789 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
790 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
791 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800792 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
793 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800794 pge2dinfo->src_info[1].fill_color_en = 0;
795
796 pge2dinfo->dst_info.canvas_w = SX_DST;
797 pge2dinfo->dst_info.canvas_h = SY_DST;
798 pge2dinfo->dst_info.format = DST_PIXFORMAT;
799 pge2dinfo->dst_info.rect.x = 0;
800 pge2dinfo->dst_info.rect.y = 0;
801 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
802 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800803 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800804
805 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
806 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
807 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
808 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
809 ret = aml_ge2d_process(pge2dinfo);
810 } else {
Cao Jian53a15142019-08-16 13:58:17 +0800811 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800812 if (ret < 0)
813 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +0800814 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800815 if (ret < 0)
816 return ge2d_fail;
817 printf("two step: strechbilt+blend\n");
818 /* both plane alpha, do 2 steps */
819 /* step 1: strechbilt */
820 pge2dinfo->ge2d_op = AML_GE2D_STRETCHBLIT;
821 /* src2 do strechbilt to dst */
822 pge2dinfo->src_info[0].canvas_w = SX_SRC2;
823 pge2dinfo->src_info[0].canvas_h = SY_SRC2;
824 pge2dinfo->src_info[0].format = SRC2_PIXFORMAT;
825 pge2dinfo->src_info[0].rect.x = 0;
826 pge2dinfo->src_info[0].rect.y = 0;
827 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
828 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
829
Cao Jian65331472019-11-01 21:01:49 +0800830 shared_fd_bakup = pge2dinfo->src_info[0].shared_fd[0];
831 offset_bakup = pge2dinfo->src_info[0].offset[0];
832 pge2dinfo->src_info[0].shared_fd[0] = pge2dinfo->src_info[1].shared_fd[0];
833 pge2dinfo->src_info[0].offset[0] = pge2dinfo->src_info[1].offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800834
835 pge2dinfo->src_info[0].layer_mode = src2_layer_mode;
836 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
837 pge2dinfo->dst_info.canvas_w = SX_DST;
838 pge2dinfo->dst_info.canvas_h = SY_DST;
839 pge2dinfo->dst_info.format = DST_PIXFORMAT;
840 pge2dinfo->dst_info.rect.x = 0;
841 pge2dinfo->dst_info.rect.y = 0;
842 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
843 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800844 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800845 ret = aml_ge2d_process(pge2dinfo);
846
847 /* step2: blend src1 blend src2(dst) to dst */
848 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
849
850 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
851 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
852 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
853 pge2dinfo->src_info[0].rect.x = 0;
854 pge2dinfo->src_info[0].rect.y = 0;
855 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
856 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jian65331472019-11-01 21:01:49 +0800857 pge2dinfo->src_info[0].shared_fd[0] = shared_fd_bakup;
858 pge2dinfo->src_info[0].offset[0] = offset_bakup;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800859 pge2dinfo->src_info[0].fill_color_en = 0;
860
861 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
862 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
863 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
864 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
865 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
866 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
867 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800868 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
869 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800870 pge2dinfo->src_info[1].fill_color_en = 0;
871
872 pge2dinfo->dst_info.canvas_w = SX_DST;
873 pge2dinfo->dst_info.canvas_h = SY_DST;
874 pge2dinfo->dst_info.format = DST_PIXFORMAT;
875 pge2dinfo->dst_info.rect.x = 0;
876 pge2dinfo->dst_info.rect.y = 0;
877 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
878 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800879 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800880
881 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
882 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
883 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
884 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
885 ret = aml_ge2d_process(pge2dinfo);
886 }
887 } else if (src2_layer_mode == LAYER_MODE_COVERAGE){
888 printf("two steps blend,src2 LAYER_MODE_COVERAGE: two blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800889 ret = aml_read_file_src1(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800890 if (ret < 0)
891 return ge2d_fail;
892 /* both plane alpha, do 2 steps */
893 /* step 1: strechbilt */
894 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
895 /* src2 do strechbilt to dst */
896 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
897 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
898 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
899 pge2dinfo->src_info[0].rect.x = 0;
900 pge2dinfo->src_info[0].rect.y = 0;
901 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
902 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
903 pge2dinfo->src_info[0].fill_color_en = 0;
904
905 pge2dinfo->src_info[1].canvas_w = SX_DST;
906 pge2dinfo->src_info[1].canvas_h = SY_DST;
907 pge2dinfo->src_info[1].format = DST_PIXFORMAT;
908 pge2dinfo->src_info[1].rect.x = 0;
909 pge2dinfo->src_info[1].rect.y = 0;
910 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
911 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
912 pge2dinfo->src_info[1].fill_color_en = 1;
913 pge2dinfo->src_info[1].def_color = 0x00;
914
915 pge2dinfo->dst_info.canvas_w = SX_DST;
916 pge2dinfo->dst_info.canvas_h = SY_DST;
917 pge2dinfo->dst_info.format = DST_PIXFORMAT;
918 pge2dinfo->dst_info.rect.x = 0;
919 pge2dinfo->dst_info.rect.y = 0;
920 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
921 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800922 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800923
924 pge2dinfo->src_info[0].layer_mode = LAYER_MODE_COVERAGE;
925 pge2dinfo->src_info[1].layer_mode = LAYER_MODE_COVERAGE;
926 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
927 pge2dinfo->src_info[1].plane_alpha = 0xff;
928 ret = aml_ge2d_process(pge2dinfo);
Cao Jian53a15142019-08-16 13:58:17 +0800929 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800930 if (ret < 0)
931 return ge2d_fail;
932 /* step2: blend src1 blend src2(dst) to dst */
933 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
934
935 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
936 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
937 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
938 pge2dinfo->src_info[0].rect.x = 0;
939 pge2dinfo->src_info[0].rect.y = 0;
940 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
941 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
942 pge2dinfo->src_info[0].fill_color_en = 0;
943
944 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
945 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
946 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
947 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
948 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
949 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
950 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800951 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
952 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800953 pge2dinfo->src_info[1].fill_color_en = 0;
954
955 pge2dinfo->dst_info.canvas_w = SX_DST;
956 pge2dinfo->dst_info.canvas_h = SY_DST;
957 pge2dinfo->dst_info.format = DST_PIXFORMAT;
958 pge2dinfo->dst_info.rect.x = 0;
959 pge2dinfo->dst_info.rect.y = 0;
960 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
961 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800962 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800963
964 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
965 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
966 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
967 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
968 ret = aml_ge2d_process(pge2dinfo);
969 } else if ((src2_layer_mode == LAYER_MODE_NON)
970 && (src1_layer_mode != LAYER_MODE_PREMULTIPLIED)){
971 printf("two steps blend,src2 LAYER_MODE_NON:strechbilt+blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800972 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800973 if (ret < 0)
974 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +0800975 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800976 if (ret < 0)
977 return ge2d_fail;
978 /* both plane alpha, do 2 steps */
979 /* step 1: strechbilt */
980 pge2dinfo->ge2d_op = AML_GE2D_STRETCHBLIT;
981 /* src2 do strechbilt to dst */
982 pge2dinfo->src_info[0].canvas_w = SX_SRC2;
983 pge2dinfo->src_info[0].canvas_h = SY_SRC2;
984 pge2dinfo->src_info[0].format = SRC2_PIXFORMAT;
985 pge2dinfo->src_info[0].rect.x = 0;
986 pge2dinfo->src_info[0].rect.y = 0;
987 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
988 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
989
Cao Jian65331472019-11-01 21:01:49 +0800990 shared_fd_bakup = pge2dinfo->src_info[0].shared_fd[0];
991 offset_bakup = pge2dinfo->src_info[0].offset[0];
992 pge2dinfo->src_info[0].shared_fd[0] = pge2dinfo->src_info[1].shared_fd[0];
993 pge2dinfo->src_info[0].offset[0] = pge2dinfo->src_info[1].offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800994 pge2dinfo->src_info[0].layer_mode = src2_layer_mode;
995 pge2dinfo->src_info[0].plane_alpha = 0xff;
996 pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888;
997
998 pge2dinfo->dst_info.canvas_w = SX_DST;
999 pge2dinfo->dst_info.canvas_h = SY_DST;
1000 pge2dinfo->dst_info.format = DST_PIXFORMAT;
1001 pge2dinfo->dst_info.rect.x = 0;
1002 pge2dinfo->dst_info.rect.y = 0;
1003 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
1004 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +08001005 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001006 ret = aml_ge2d_process(pge2dinfo);
1007
1008 /* step2: blend src1 blend src2(dst) to dst */
1009 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
1010
1011 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
1012 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
1013 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
1014 pge2dinfo->src_info[0].rect.x = 0;
1015 pge2dinfo->src_info[0].rect.y = 0;
1016 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
1017 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jian65331472019-11-01 21:01:49 +08001018 pge2dinfo->src_info[0].shared_fd[0] = shared_fd_bakup;
1019 pge2dinfo->src_info[0].offset[0] = offset_bakup;
Jian Caob9fb3ed2019-04-16 16:51:27 +08001020 pge2dinfo->src_info[0].fill_color_en = 0;
1021
1022 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
1023 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
1024 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
1025 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
1026 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
1027 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
1028 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +08001029 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
1030 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +08001031 pge2dinfo->src_info[1].fill_color_en = 0;
1032
1033 pge2dinfo->dst_info.canvas_w = SX_DST;
1034 pge2dinfo->dst_info.canvas_h = SY_DST;
1035 pge2dinfo->dst_info.format = DST_PIXFORMAT;
1036 pge2dinfo->dst_info.rect.x = 0;
1037 pge2dinfo->dst_info.rect.y = 0;
1038 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
1039 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +08001040 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001041 printf("two steps blend,src1_layer_mode=%d,src2_layer_mode=%d\n",src1_layer_mode,src2_layer_mode);
1042
1043 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1044 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
1045 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1046 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
1047 ret = aml_ge2d_process(pge2dinfo);
1048 } else {
1049 /* do blend src1 blend src2(dst) to dst */
1050 printf("one step blend\n");
Cao Jian53a15142019-08-16 13:58:17 +08001051 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001052 if (ret < 0)
1053 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +08001054 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001055 if (ret < 0)
1056 return ge2d_fail;
1057 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
1058 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
1059 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
1060 pge2dinfo->src_info[0].rect.x = 0;
1061 pge2dinfo->src_info[0].rect.y = 0;
1062 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
1063 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
1064 pge2dinfo->src_info[0].fill_color_en = 0;
1065
1066 pge2dinfo->src_info[1].canvas_w = SX_SRC2;
1067 pge2dinfo->src_info[1].canvas_h = SY_SRC2;
1068 pge2dinfo->src_info[1].format = SRC2_PIXFORMAT;
1069 pge2dinfo->src_info[1].rect.x = 0;
1070 pge2dinfo->src_info[1].rect.y = 0;
1071 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
1072 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
1073 pge2dinfo->src_info[1].fill_color_en = 0;
1074 if (src2_layer_mode == LAYER_MODE_NON)
1075 pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888;
1076 pge2dinfo->dst_info.canvas_w = SX_DST;
1077 pge2dinfo->dst_info.canvas_h = SY_DST;
1078 pge2dinfo->dst_info.format = DST_PIXFORMAT;
1079 pge2dinfo->dst_info.rect.x = 0;
1080 pge2dinfo->dst_info.rect.y = 0;
1081 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
1082 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +08001083 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001084
1085 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1086 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
1087 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1088 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
1089 ret = aml_ge2d_process(pge2dinfo);
1090 }
1091 }
Cao Jian53a15142019-08-16 13:58:17 +08001092 if (ret < 0)
1093 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001094 return ret;
1095}
1096
1097
Cao Jian53a15142019-08-16 13:58:17 +08001098static int do_strechblit(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +08001099{
1100 int ret = -1;
1101 char code = 0;
Cao Jiane80b1392019-08-07 20:59:47 +08001102 int i;
1103 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +08001104 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
1105
Jian Caob9fb3ed2019-04-16 16:51:27 +08001106 printf("do_strechblit test case:\n");
Cao Jian53a15142019-08-16 13:58:17 +08001107 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001108 if (ret < 0)
1109 return ge2d_fail;
yuhua.lind3e7cd62021-10-14 16:09:27 +08001110 if (amlge2d->ge2dinfo.src_info[0].mem_alloc_type == AML_GE2D_MEM_ION) {
1111 ret = aml_ge2d_sync_cache(pge2dinfo, 0);
1112 if (ret < 0)
1113 return ge2d_fail;
1114 }
Jian Caob9fb3ed2019-04-16 16:51:27 +08001115
1116 pge2dinfo->src_info[0].rect.x = src1_rect_x;
1117 pge2dinfo->src_info[0].rect.y = src1_rect_y;
1118 pge2dinfo->src_info[0].rect.w = src1_rect_w;
1119 pge2dinfo->src_info[0].rect.h = src1_rect_h;
1120 pge2dinfo->dst_info.rect.x = dst_rect_x;
1121 pge2dinfo->dst_info.rect.y = dst_rect_y;
1122 pge2dinfo->dst_info.rect.w = dst_rect_w;
1123 pge2dinfo->dst_info.rect.h = dst_rect_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +08001124 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001125 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1126 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1127
Cao Jian3ad43572021-02-19 13:54:52 +08001128 /* if ge2d as dmabuf exporter, use the below interface to sync cache */
1129 if (pge2dinfo->src_info[0].mem_alloc_type == AML_GE2D_MEM_DMABUF)
1130 aml_ge2d_sync_for_device(pge2dinfo, 0);
1131 if (pge2dinfo->src_info[1].mem_alloc_type == AML_GE2D_MEM_DMABUF)
1132 aml_ge2d_sync_for_device(pge2dinfo, 1);
1133
Cao Jian2b1d6972020-09-11 16:55:49 +08001134 ret = do_cmd(pge2dinfo);
1135
Cao Jian3ad43572021-02-19 13:54:52 +08001136 /* if ge2d as dmabuf exporter, use the below interface to invalid cache */
1137 if (pge2dinfo->dst_info.mem_alloc_type == AML_GE2D_MEM_DMABUF)
1138 aml_ge2d_sync_for_cpu(pge2dinfo);
1139
Jian Caob9fb3ed2019-04-16 16:51:27 +08001140 #if 0
1141 sleep(5);
1142
1143 printf("please enter any key do rotation test[90]\n");
1144 code = getc(stdin);
1145 pge2dinfo->dst_info.rotation = GE2D_ROTATION_90;
1146 ret = aml_ge2d_process(pge2dinfo);
1147 #endif
Cao Jian53a15142019-08-16 13:58:17 +08001148 if (ret < 0)
1149 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001150 return ret;
1151
1152}
1153
Cao Jian53a15142019-08-16 13:58:17 +08001154static int do_blit(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +08001155{
1156 int ret = -1;
1157 char code = 0;
Cao Jiane80b1392019-08-07 20:59:47 +08001158 int i;
1159 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +08001160 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
1161
Jian Caob9fb3ed2019-04-16 16:51:27 +08001162 printf("do_blit test case:\n");
Cao Jian53a15142019-08-16 13:58:17 +08001163 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001164 if (ret < 0)
1165 return ge2d_fail;
yuhua.lind3e7cd62021-10-14 16:09:27 +08001166 if (amlge2d->ge2dinfo.src_info[0].mem_alloc_type == AML_GE2D_MEM_ION) {
1167 ret = aml_ge2d_sync_cache(pge2dinfo, 0);
1168 if (ret < 0)
1169 return ge2d_fail;
1170 }
Jian Caob9fb3ed2019-04-16 16:51:27 +08001171
1172 pge2dinfo->src_info[0].rect.x = src1_rect_x;
1173 pge2dinfo->src_info[0].rect.y = src1_rect_y;
1174 pge2dinfo->src_info[0].rect.w = src1_rect_w;
1175 pge2dinfo->src_info[0].rect.h = src1_rect_h;
1176 pge2dinfo->dst_info.rect.x = dst_rect_x;
1177 pge2dinfo->dst_info.rect.y = dst_rect_y;
1178
Cao Jianb3f2fce2020-11-16 19:39:13 +08001179 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001180 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1181 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1182
Cao Jian3ad43572021-02-19 13:54:52 +08001183 /* if ge2d as dmabuf exporter, use the below interface to sync cache */
1184 if (pge2dinfo->src_info[0].mem_alloc_type == AML_GE2D_MEM_DMABUF)
1185 aml_ge2d_sync_for_device(pge2dinfo, 0);
1186 if (pge2dinfo->src_info[1].mem_alloc_type == AML_GE2D_MEM_DMABUF)
1187 aml_ge2d_sync_for_device(pge2dinfo, 1);
1188
Cao Jian2b1d6972020-09-11 16:55:49 +08001189 ret = do_cmd(pge2dinfo);
1190
Cao Jian3ad43572021-02-19 13:54:52 +08001191 /* if ge2d as dmabuf exporter, use the below interface to invalid cache */
1192 if (pge2dinfo->dst_info.mem_alloc_type == AML_GE2D_MEM_DMABUF)
1193 aml_ge2d_sync_for_cpu(pge2dinfo);
1194
Jian Caob9fb3ed2019-04-16 16:51:27 +08001195 #if 0
1196 sleep(5);
1197
1198 printf("please enter any key do rotation test[90]\n");
1199 code = getc(stdin);
1200 pge2dinfo->dst_info.rotation = GE2D_ROTATION_90;
1201 pge2dinfo->src_info[0].rect.x = 0;
1202 pge2dinfo->src_info[0].rect.y = 0;
1203 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
1204 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
1205 pge2dinfo->dst_info.rect.x = 0;
1206 pge2dinfo->dst_info.rect.y = 0;
1207
1208 ret = aml_ge2d_process(pge2dinfo);
1209 #endif
Cao Jian53a15142019-08-16 13:58:17 +08001210 if (ret < 0)
1211 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001212 return ret;
1213}
1214
Cao Jian53a15142019-08-16 13:58:17 +08001215void *main_run(void *arg)
Jian Caob9fb3ed2019-04-16 16:51:27 +08001216{
1217 int ret = -1;
Cao Jian65331472019-11-01 21:01:49 +08001218 int i = 0, run_time = 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +08001219 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +08001220 aml_ge2d_t amlge2d;
Cao Jian65331472019-11-01 21:01:49 +08001221 char dst_file_name[128] = {};
Jian Cao49c82bd2019-06-04 12:49:10 +08001222
Cao Jian65331472019-11-01 21:01:49 +08001223 for (run_time = 0; run_time < num_process_per_thread; run_time++) {
1224 printf("ThreadIdx -- %d, run time -- %d\n", *(int *)arg, run_time);
1225 memset(&amlge2d, 0, sizeof(aml_ge2d_t));
Cao Jian53a15142019-08-16 13:58:17 +08001226 memset(&(amlge2d.ge2dinfo.src_info[0]), 0, sizeof(buffer_info_t));
1227 memset(&(amlge2d.ge2dinfo.src_info[1]), 0, sizeof(buffer_info_t));
1228 memset(&(amlge2d.ge2dinfo.dst_info), 0, sizeof(buffer_info_t));
1229
Cao Jian2b1d6972020-09-11 16:55:49 +08001230 for (i = 0; i < GE2D_MAX_PLANE; i++) {
Cao Jian65331472019-11-01 21:01:49 +08001231 amlge2d.ge2dinfo.src_info[0].shared_fd[i] = -1;
1232 amlge2d.ge2dinfo.src_info[1].shared_fd[i] = -1;
1233 amlge2d.ge2dinfo.dst_info.shared_fd[i] = -1;
1234 }
Cao Jian53a15142019-08-16 13:58:17 +08001235 set_ge2dinfo(&amlge2d.ge2dinfo);
Cao Jian65331472019-11-01 21:01:49 +08001236 ret = check_plane_number(amlge2d.ge2dinfo.src_info[0].plane_number,
1237 amlge2d.ge2dinfo.src_info[0].format);
1238 if (ret < 0) {
1239 printf("Error src1 plane_number=[%d], format=%d\n",
1240 amlge2d.ge2dinfo.src_info[0].plane_number,
1241 amlge2d.ge2dinfo.src_info[0].format);
1242 return NULL;
1243 }
1244 ret = check_plane_number(amlge2d.ge2dinfo.src_info[1].plane_number,
1245 amlge2d.ge2dinfo.src_info[1].format);
1246 if (ret < 0) {
1247 printf("Error src2 plane_number=[%d],format=%d\n",
1248 amlge2d.ge2dinfo.src_info[1].plane_number,
1249 amlge2d.ge2dinfo.src_info[1].format);
1250 return NULL;
1251 }
1252 ret = check_plane_number(amlge2d.ge2dinfo.dst_info.plane_number,
1253 amlge2d.ge2dinfo.dst_info.format);
1254 if (ret < 0) {
1255 printf("Error dst plane_number=[%d],format=%d\n",
1256 amlge2d.ge2dinfo.dst_info.plane_number,
1257 amlge2d.ge2dinfo.dst_info.format);
1258 return NULL;
1259 }
Cao Jian53a15142019-08-16 13:58:17 +08001260
1261 ret = aml_ge2d_init(&amlge2d);
1262 if (ret < 0)
1263 return NULL;
1264
1265 ret = aml_ge2d_mem_alloc(&amlge2d);
1266 if (ret < 0)
1267 goto exit;
1268 #if 0
1269 /* if dma_buf and used fd alloc other driver */
1270 /* set dma buf fd */
1271 amlge2d.ge2dinfo.src_info[0].shared_fd = dma_fd;
1272 amlge2d.ge2dinfo.src_info[0].memtype = GE2D_CANVAS_ALLOC;
1273 #endif
1274
1275 switch (amlge2d.ge2dinfo.ge2d_op)
1276 {
1277 case AML_GE2D_FILLRECTANGLE:
1278 ret = do_fill_rectangle(&amlge2d);
1279 break;
1280 case AML_GE2D_BLEND:
1281 ret = do_blend(&amlge2d);
1282 break;
1283 case AML_GE2D_STRETCHBLIT:
1284 ret = do_strechblit(&amlge2d);
1285 break;
1286 case AML_GE2D_BLIT:
1287 ret = do_blit(&amlge2d);
1288 break;
1289 default:
1290 E_GE2D("not support ge2d op,exit test!\n");
1291 break;
1292 }
1293 if (ret < 0)
1294 goto exit;
1295
1296 if (amlge2d.ge2dinfo.dst_info.mem_alloc_type == AML_GE2D_MEM_ION)
1297 aml_ge2d_invalid_cache(&amlge2d.ge2dinfo);
Cao Jian65331472019-11-01 21:01:49 +08001298 sprintf(dst_file_name, "%s_thread%d_%d", DST_FILE_NAME, *(int *)arg, run_time);
1299 ret = aml_write_file(&amlge2d, dst_file_name);
Cao Jian53a15142019-08-16 13:58:17 +08001300 if (ret < 0)
yuhua.lin34978d02021-12-07 11:03:56 +08001301 E_GE2D("failed write file\n");
Cao Jian53a15142019-08-16 13:58:17 +08001302 exit:
Cao Jian65331472019-11-01 21:01:49 +08001303 for (i = 0; i < amlge2d.ge2dinfo.src_info[0].plane_number; i++) {
1304 if (amlge2d.src_data[i]) {
1305 free(amlge2d.src_data[i]);
1306 amlge2d.src_data[i] = NULL;
1307 }
Cao Jian53a15142019-08-16 13:58:17 +08001308 }
1309
Cao Jian65331472019-11-01 21:01:49 +08001310 for (i = 0; i < amlge2d.ge2dinfo.src_info[1].plane_number; i++) {
1311 if (amlge2d.src2_data[i]) {
1312 free(amlge2d.src2_data[i]);
1313 amlge2d.src2_data[i] = NULL;
1314 }
1315 }
1316
1317 for (i = 0; i < amlge2d.ge2dinfo.dst_info.plane_number; i++) {
1318 if (amlge2d.dst_data[i]) {
1319 free(amlge2d.dst_data[i]);
1320 amlge2d.dst_data[i] = NULL;
1321 }
1322 }
Cao Jian53a15142019-08-16 13:58:17 +08001323 aml_ge2d_mem_free(&amlge2d);
1324 aml_ge2d_exit(&amlge2d);
1325 }
1326 printf("ge2d feature_test exit!!!\n");
1327
1328 return NULL;
1329}
1330
1331int main(int argc, char **argv)
1332{
1333 int ret = -1, i;
1334 pthread_t thread[THREADS_MAX_NUM];
1335 int threadindex[THREADS_MAX_NUM];
1336
1337 if (num_thread > THREADS_MAX_NUM) {
1338 E_GE2D("num of thread greater than THREADS_MAX_NUM\n");
1339 return -1;
1340 }
1341 memset(&thread, 0, sizeof(thread));
1342
1343 ret = parse_command_line(argc, argv);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001344 if (ret == ge2d_fail)
1345 return ge2d_success;
1346
Cao Jian65331472019-11-01 21:01:49 +08001347 for (i = 0; i < num_thread; i++) {
Cao Jian53a15142019-08-16 13:58:17 +08001348 threadindex[i] = i;
Cao Jian65331472019-11-01 21:01:49 +08001349 ret = pthread_create(&(thread[i]), NULL, main_run, (void *)&threadindex[i]);
1350 if (ret != 0) {
Cao Jian53a15142019-08-16 13:58:17 +08001351 E_GE2D("integral thread %d creation failed!", i);
1352 return -1;
1353 }
1354 }
Cao Jian65331472019-11-01 21:01:49 +08001355 for (i = 0; i < num_thread; i++)
Cao Jian53a15142019-08-16 13:58:17 +08001356 pthread_join(thread[i], NULL);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001357
Cao Jian53a15142019-08-16 13:58:17 +08001358 return 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +08001359}