blob: c2004ed4f2851941500b41e668c25fbe078cfc00 [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;
yuhua.linaea90102022-01-11 18:59:43 +080070static int src1_endian = PIXEL_FORMAT_LITTLE_ENDIAN;
71static int src2_endian = PIXEL_FORMAT_LITTLE_ENDIAN;
72static int dst_endian = PIXEL_FORMAT_LITTLE_ENDIAN;
73static int clut8_count = 0;
74static int clut8_data[256] = {0};
75static char clut8_table_file[64] = "";
Cao Jian53a15142019-08-16 13:58:17 +080076
77#define THREADS_MAX_NUM (64)
Cao Jian2b1d6972020-09-11 16:55:49 +080078#define ATTACH_SRC (0x1)
79#define ATTACH_SRC2 (0x2)
80#define ATTACH_DST (0x4)
Cao Jiane80b1392019-08-07 20:59:47 +080081
Cao Jianb3f2fce2020-11-16 19:39:13 +080082static int ge2d_rotation(int rotation_option)
83{
84 switch (rotation_option) {
85 case 0:
86 return GE2D_ROTATION_0;
87 case 1:
88 return GE2D_ROTATION_90;
89 case 2:
90 return GE2D_ROTATION_180;
91 case 3:
92 return GE2D_ROTATION_270;
93 case 4:
94 return GE2D_MIRROR_X;
95 case 5:
96 return GE2D_MIRROR_Y;
97 default:
98 E_GE2D("wrong ge2d rotation option\n");
99 return 0;
100 }
101}
102
Cao Jiane80b1392019-08-07 20:59:47 +0800103static inline unsigned long myclock()
104{
Cao Jianb3f2fce2020-11-16 19:39:13 +0800105 struct timeval tv;
Cao Jiane80b1392019-08-07 20:59:47 +0800106
Cao Jianb3f2fce2020-11-16 19:39:13 +0800107 gettimeofday (&tv, NULL);
Cao Jiane80b1392019-08-07 20:59:47 +0800108
Cao Jianb3f2fce2020-11-16 19:39:13 +0800109 return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
Cao Jiane80b1392019-08-07 20:59:47 +0800110}
Jian Caob9fb3ed2019-04-16 16:51:27 +0800111
112static void set_ge2dinfo(aml_ge2d_info_t *pge2dinfo)
113{
114 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
115 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
116 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
Cao Jian65331472019-11-01 21:01:49 +0800117 pge2dinfo->src_info[0].plane_number = src1_plane_number;
yuhua.linaea90102022-01-11 18:59:43 +0800118 pge2dinfo->src_info[0].endain = src1_endian;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800119
120 pge2dinfo->src_info[1].canvas_w = SX_SRC2;
121 pge2dinfo->src_info[1].canvas_h = SY_SRC2;
122 pge2dinfo->src_info[1].format = SRC2_PIXFORMAT;
Cao Jian65331472019-11-01 21:01:49 +0800123 pge2dinfo->src_info[1].plane_number = src2_plane_number;
yuhua.linaea90102022-01-11 18:59:43 +0800124 pge2dinfo->src_info[1].endain = src2_endian;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800125
126 pge2dinfo->dst_info.canvas_w = SX_DST;
127 pge2dinfo->dst_info.canvas_h = SY_DST;
128 pge2dinfo->dst_info.format = DST_PIXFORMAT;
Cao Jian65331472019-11-01 21:01:49 +0800129 pge2dinfo->dst_info.plane_number = dst_plane_number;
yuhua.linaea90102022-01-11 18:59:43 +0800130 pge2dinfo->dst_info.endain = dst_endian;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800131 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800132 pge2dinfo->offset = 0;
133 pge2dinfo->ge2d_op = OP;
134 pge2dinfo->blend_mode = BLEND_MODE_PREMULTIPLIED;
135
136 switch (pge2dinfo->ge2d_op)
137 {
138 case AML_GE2D_FILLRECTANGLE:
139 pge2dinfo->src_info[0].memtype = GE2D_CANVAS_TYPE_INVALID;
140 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_BLIT:
144 case AML_GE2D_STRETCHBLIT:
145 /* if not need alloc, set to GE2D_CANVAS_TYPE_INVALID
146 * otherwise set to GE2D_CANVAS_ALLOC
147 */
Cao Jian2b1d6972020-09-11 16:55:49 +0800148 pge2dinfo->src_info[0].memtype = src1_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800149 pge2dinfo->src_info[1].memtype = GE2D_CANVAS_TYPE_INVALID;
150 pge2dinfo->dst_info.memtype = dst_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
151 break;
152 case AML_GE2D_BLEND:
Cao Jian2b1d6972020-09-11 16:55:49 +0800153 pge2dinfo->src_info[0].memtype = src1_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
154 pge2dinfo->src_info[1].memtype = src2_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800155 pge2dinfo->dst_info.memtype = dst_canvas_alloc == 1 ? GE2D_CANVAS_ALLOC : GE2D_CANVAS_OSD0;
156 break;
157 default:
158 E_GE2D("not support ge2d op,exit test!\n");
159 break;
160 }
161 /*set to AML_GE2D_MEM_DMABUF or AML_GE2D_MEM_ION*/
162 pge2dinfo->src_info[0].mem_alloc_type = src1_mem_alloc_type;
163 pge2dinfo->src_info[1].mem_alloc_type = src2_mem_alloc_type;
164 pge2dinfo->dst_info.mem_alloc_type = dst_mem_alloc_type;
165}
166
167static void print_usage(void)
168{
169 int i;
170 printf ("Usage: ge2d_feature_test [options]\n\n");
171 printf ("Options:\n\n");
172 printf (" --op <0:fillrect, 1:blend, 2:strechblit, 3:blit> ge2d operation case.\n");
173 printf (" --size <WxH> define src1/src2/dst size.\n");
174 printf (" --src1_memtype <0: ion, 1: dmabuf> define memory alloc type.\n");
175 printf (" --src2_memtype <0: ion, 1: dmabuf> define memory alloc type.\n");
176 printf (" --dst_memtype <0: ion, 1: dmabuf> define memory alloc type.\n");
Cao Jian65331472019-11-01 21:01:49 +0800177 printf (" --src1_format <num> define src1 format.\n");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800178 printf (" --src2_format <num> define src2 format.\n");
179 printf (" --dst_format <num> define dst format.\n");
Cao Jian65331472019-11-01 21:01:49 +0800180 printf (" --src1_size <WxH> define src1 size.\n");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800181 printf (" --src2_size <WxH> define src2 size.\n");
182 printf (" --dst_size <WxH> define dst size.\n");
Cao Jian65331472019-11-01 21:01:49 +0800183 printf (" --src1_file <name> define src1 file.\n");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800184 printf (" --src2_file <name> define src2 file.\n");
185 printf (" --dst_file <name> define dst file.\n");
Cao Jian65331472019-11-01 21:01:49 +0800186 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 +0800187 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 +0800188 printf (" --src1_rect <x_y_w_h> define src1 rect.\n");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800189 printf (" --src2_rect <x_y_w_h> define src2 rect.\n");
190 printf (" --dst_rect <x_y_w_h> define dst rect.\n");
191 printf (" --bo1 <layer_mode_num> define src1_layer_mode.\n");
192 printf (" --bo2 <layer_mode_num> define src2_layer_mode.\n");
193 printf (" --gb1 <gb1_alpha> define src1 global alpha.\n");
194 printf (" --gb2 <gb2_alpha> define src2 global alpha.\n");
195 printf (" --strechblit <x0_y0_w_h-x1_y1_w1_h1> define strechblit info.\n");
196 printf (" --fillrect <color_x_y_w_h> define fillrect info, color in rgba format.\n");
Cao Jian65331472019-11-01 21:01:49 +0800197 printf (" --src1_planenumber <num> define src1 plane number.\n");
198 printf (" --src2_planenumber <num> define src2 plane number.\n");
199 printf (" --dst_planenumber <num> define dst plane number.\n");
200 printf (" --n <num> process num times for performance test.\n");
Cao Jiane3ff29d2020-12-15 16:40:50 +0800201 printf (" --p <num> multi-thread process, num of threads\n");
Cao Jian53a15142019-08-16 13:58:17 +0800202 printf (" --p_n <num> num of process for every thread.\n");
Cao Jian2b1d6972020-09-11 16:55:49 +0800203 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 +0800204 printf (" or aml_ge2d_attach_dma_fd/aml_ge2d_process/aml_ge2d_detach_dma_fd\n");
Cao Jianb3f2fce2020-11-16 19:39:13 +0800205 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 +0800206 printf (" --dst_rpt_times <num> dst repeat x times, 0:disable 2/4/8:repeat times.\n");
207 printf (" --dst_signed_mode <num> dst signed mode, 0:disable 1:enable.\n");
yuhua.linaea90102022-01-11 18:59:43 +0800208 printf (" --src1_endian <num> src1 endian, 0:little_endian 1:big_endian.\n");
209 printf (" --src2_endian <num> src2 endian, 0:little_endian 1:big_endian.\n");
210 printf (" --dst_endian <num> dst endian, 0:little_endian 1:big_endian.\n");
211 printf (" --clut8_table_file <name> clut8 table, filename of clut8_data");
212 printf (" --clut8_count <num> clut8 count, count of clut8_data");
213 printf (" --clut8_data <nums> clut8 data, clut8_data");
Jian Caob9fb3ed2019-04-16 16:51:27 +0800214 printf (" --help Print usage information.\n");
215 printf ("\n");
216}
217
218static int parse_command_line(int argc, char *argv[])
219{
yuhua.linaea90102022-01-11 18:59:43 +0800220 int i, j = 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800221 /* parse command line */
222 for (i = 1; i < argc; i++) {
223 if (strncmp (argv[i], "--", 2) == 0) {
224 if (strcmp (argv[i] + 2, "help") == 0) {
225 print_usage();
226 return ge2d_fail;
227 }
228 else if (strcmp (argv[i] + 2, "op") == 0 && ++i < argc &&
229 sscanf (argv[i], "%d", &OP) == 1) {
230 continue;
231 }
232 else if (strcmp (argv[i] + 2, "src1_memtype") == 0 && ++i < argc &&
233 sscanf (argv[i], "%d", &src1_mem_alloc_type) == 1) {
234 continue;
235 }
236 else if (strcmp (argv[i] + 2, "src2_memtype") == 0 && ++i < argc &&
237 sscanf (argv[i], "%d", &src2_mem_alloc_type) == 1) {
238 continue;
239 }
240 else if (strcmp (argv[i] + 2, "dst_memtype") == 0 && ++i < argc &&
241 sscanf (argv[i], "%d", &dst_mem_alloc_type) == 1) {
242 continue;
243 }
244 else if (strcmp (argv[i] + 2, "bo1") == 0 && ++i < argc &&
245 sscanf (argv[i], "%d", &src1_layer_mode) == 1) {
246 continue;
247 }
248 else if (strcmp (argv[i] + 2, "bo2") == 0 && ++i < argc &&
249 sscanf (argv[i], "%d", &src2_layer_mode) == 1) {
250 continue;
251 }
252 else if (strcmp (argv[i] + 2, "gb1") == 0 && ++i < argc &&
253 sscanf (argv[i], "%d", &gb1_alpha) == 1) {
254 continue;
255 }
256 else if (strcmp (argv[i] + 2, "gb2") == 0 && ++i < argc &&
257 sscanf (argv[i], "%d", &gb2_alpha) == 1) {
258 continue;
259 }
260 else if (strcmp (argv[i] + 2, "src1_format") == 0 && ++i < argc &&
261 sscanf (argv[i], "%d", &SRC1_PIXFORMAT) == 1) {
262 continue;
263 }
264 else if (strcmp (argv[i] + 2, "src2_format") == 0 && ++i < argc &&
265 sscanf (argv[i], "%d", &SRC2_PIXFORMAT) == 1) {
266 continue;
267 }
268 else if (strcmp (argv[i] + 2, "dst_format") == 0 && ++i < argc &&
269 sscanf (argv[i], "%d", &DST_PIXFORMAT) == 1) {
270 continue;
271 }
272 else if (strcmp (argv[i] + 2, "size") == 0 && ++i < argc &&
273 sscanf (argv[i], "%dx%d", &SX_SRC1, &SY_SRC1) == 2) {
274 SX_SRC2 = SX_DST = SX_SRC1;
275 SY_SRC2 = SY_DST = SY_SRC1;
276 continue;
277 }
278 else if (strcmp (argv[i] + 2, "dst_size") == 0 && ++i < argc &&
279 sscanf (argv[i], "%dx%d", &SX_DST, &SY_DST) == 2) {
280 continue;
281 }
282 else if (strcmp (argv[i] + 2, "src1_size") == 0 && ++i < argc &&
283 sscanf (argv[i], "%dx%d", &SX_SRC1, &SY_SRC1) == 2) {
284 continue;
285 }
286 else if (strcmp (argv[i] + 2, "src2_size") == 0 && ++i < argc &&
287 sscanf (argv[i], "%dx%d", &SX_SRC2, &SY_SRC2) == 2) {
288 continue;
289 }
290 else if (strcmp (argv[i] + 2, "src1_rect") == 0 && ++i < argc &&
291 sscanf (argv[i], "%d_%d_%d_%d",
292 &src1_rect_x, &src1_rect_y, &src1_rect_w, &src1_rect_h) == 4) {
293 continue;
294 }
295 else if (strcmp (argv[i] + 2, "src2_rect") == 0 && ++i < argc &&
296 sscanf (argv[i], "%d_%d_%d_%d",
297 &src2_rect_x, &src2_rect_y, &src2_rect_w, &src2_rect_h) == 4) {
298 continue;
299 }
300 else if (strcmp (argv[i] + 2, "dst_rect") == 0 && ++i < argc &&
301 sscanf (argv[i], "%d_%d_%d_%d",
302 &dst_rect_x, &dst_rect_y, &dst_rect_w, &dst_rect_h) == 4) {
303 continue;
304 }
305 else if (strcmp (argv[i] + 2, "strechblit") == 0 && ++i < argc &&
306 sscanf (argv[i], "%d_%d_%d_%d-%d_%d_%d_%d",
307 &src1_rect_x, &src1_rect_y, &src1_rect_w, &src1_rect_h,
308 &dst_rect_x, &dst_rect_y, &dst_rect_w, &dst_rect_h) == 8) {
309 continue;
310 }
311 else if (strcmp (argv[i] + 2, "fillrect") == 0 && ++i < argc &&
312 sscanf (argv[i], "%x_%d_%d_%d_%d",
313 &rect_color, &dst_rect_x, &dst_rect_y, &dst_rect_w, &dst_rect_h) == 5) {
314 continue;
315 }
316 else if (strcmp (argv[i] + 2, "src1_file") == 0 && ++i < argc &&
Cao Jian65331472019-11-01 21:01:49 +0800317 sscanf (argv[i], "%s", SRC1_FILE_NAME) == 1) {
Jian Caob9fb3ed2019-04-16 16:51:27 +0800318 continue;
319 }
320 else if (strcmp (argv[i] + 2, "src2_file") == 0 && ++i < argc &&
Cao Jian65331472019-11-01 21:01:49 +0800321 sscanf (argv[i], "%s", SRC2_FILE_NAME) == 1) {
Jian Caob9fb3ed2019-04-16 16:51:27 +0800322 continue;
323 }
324 else if (strcmp (argv[i] + 2, "dst_file") == 0 && ++i < argc &&
Cao Jian65331472019-11-01 21:01:49 +0800325 sscanf (argv[i], "%s", DST_FILE_NAME) == 1) {
Jian Caob9fb3ed2019-04-16 16:51:27 +0800326 dst_canvas_alloc = 1;
327 continue;
328 }
329 else if (strcmp (argv[i] + 2, "src1_canvas_alloc") == 0 && ++i < argc &&
330 sscanf (argv[i], "%d", &src1_canvas_alloc) == 1) {
331 continue;
332 }
333 else if (strcmp (argv[i] + 2, "src2_canvas_alloc") == 0 && ++i < argc &&
334 sscanf (argv[i], "%d", &src2_canvas_alloc) == 1) {
335 continue;
336 }
Cao Jian65331472019-11-01 21:01:49 +0800337 else if (strcmp (argv[i] + 2, "src1_planenumber") == 0 && ++i < argc &&
338 sscanf (argv[i], "%d", &src1_plane_number) == 1) {
339 continue;
340 }
341 else if (strcmp (argv[i] + 2, "src2_planenumber") == 0 && ++i < argc &&
342 sscanf (argv[i], "%d", &src2_plane_number) == 1) {
343 continue;
344 }
345 else if (strcmp (argv[i] + 2, "dst_planenumber") == 0 && ++i < argc &&
346 sscanf (argv[i], "%d", &dst_plane_number) == 1) {
347 continue;
348 }
Cao Jiane80b1392019-08-07 20:59:47 +0800349 else if (strcmp (argv[i] + 2, "n") == 0 && ++i < argc &&
350 sscanf (argv[i], "%d", &num_process) == 1) {
351 continue;
352 }
Cao Jian53a15142019-08-16 13:58:17 +0800353 else if (strcmp (argv[i] + 2, "p") == 0 && ++i < argc &&
354 sscanf (argv[i], "%d", &num_thread) == 1) {
355 continue;
356 }
Cao Jianb3f2fce2020-11-16 19:39:13 +0800357 else if (strcmp (argv[i] + 2, "r") == 0 && ++i < argc &&
358 sscanf (argv[i], "%d", &rotation_option) == 1) {
359 continue;
360 }
Cao Jian53a15142019-08-16 13:58:17 +0800361 else if (strcmp (argv[i] + 2, "p_n") == 0 && ++i < argc &&
362 sscanf (argv[i], "%d", &num_process_per_thread) == 1) {
363 continue;
364 }
Cao Jian2b1d6972020-09-11 16:55:49 +0800365 else if (strcmp (argv[i] + 2, "s") == 0 && ++i < argc &&
366 sscanf (argv[i], "%d", &separate_step) == 1) {
367 continue;
368 }
Cao Jiane3ff29d2020-12-15 16:40:50 +0800369 else if (strcmp (argv[i] + 2, "dst_rpt_times") == 0 && ++i < argc &&
370 sscanf (argv[i], "%d", &dst_rpt_times) == 1) {
371 switch (dst_rpt_times) {
372 case 0: /* do nothing if dst_rpt_times is 0 */
373 break;
374 case 2:
375 DST_PIXFORMAT |= DST_REPEAT_2;
376 break;
377 case 4:
378 DST_PIXFORMAT |= DST_REPEAT_4;
379 break;
380 case 8:
381 DST_PIXFORMAT |= DST_REPEAT_8;
382 break;
383 default:
384 E_GE2D("dst_rpt_times should be 0/2/4/8\n");
385 break;
386 }
387 continue;
388 }
389 else if (strcmp (argv[i] + 2, "dst_signed_mode") == 0 && ++i < argc &&
390 sscanf (argv[i], "%d", &dst_signed_mode) == 1) {
391 switch (dst_signed_mode) {
392 case 0: /* do nothing if dst_signed_mode is 0 */
393 break;
394 case 1:
395 DST_PIXFORMAT |= DST_SIGN_MDOE;
396 break;
397 default:
398 E_GE2D("dst_signed_mode should be 0 or 1\n");
399 break;
400 }
401 continue;
402 }
yuhua.linaea90102022-01-11 18:59:43 +0800403 else if (strcmp (argv[i] + 2, "src1_endian") == 0 && ++i < argc &&
404 sscanf (argv[i], "%d", &src1_endian) == 1) {
405 continue;
406 }
407 else if (strcmp (argv[i] + 2, "src2_endian") == 0 && ++i < argc &&
408 sscanf (argv[i], "%d", &src2_endian) == 1) {
409 continue;
410 }
411 else if (strcmp (argv[i] + 2, "dst_endian") == 0 && ++i < argc &&
412 sscanf (argv[i], "%d", &dst_endian) == 1) {
413 continue;
414 }
415 else if (strcmp (argv[i] + 2, "clut8_table_file") == 0 && ++i < argc &&
416 sscanf (argv[i], "%s", clut8_table_file) == 1) {
417 continue;
418 }
419 else if (strcmp (argv[i] + 2, "clut8_count") == 0 && ++i < argc &&
420 sscanf (argv[i], "%d", &clut8_count) == 1) {
421 continue;
422 }
423 else if (strcmp (argv[i] + 2, "clut8_data") == 0 && ++i < argc) {
424 if (clut8_count == 0) {
425 printf("error clut8_count\n");
426 return ge2d_fail;
427 } else {
428 while (sscanf (argv[i], "%d", &clut8_data[j]) != EOF && j < clut8_count && ++i <argc)
429 j++;
430 }
431 continue;
432 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800433 }
434 }
yuhua.linaea90102022-01-11 18:59:43 +0800435
Jian Caob9fb3ed2019-04-16 16:51:27 +0800436 return ge2d_success;
437}
438
Cao Jian65331472019-11-01 21:01:49 +0800439static int check_plane_number(int plane_number, int format)
440{
441 int ret = -1;
442 printf("plane_number=%d,format=%d\n", plane_number, format);
443 if (plane_number == 1) {
444 ret = 0;
445 } else if (plane_number == 2) {
446 if ((format == PIXEL_FORMAT_YCrCb_420_SP) ||
447 (format == PIXEL_FORMAT_YCbCr_420_SP_NV12) ||
448 (format == PIXEL_FORMAT_YCbCr_422_SP))
449 ret = 0;
450 } else if (plane_number == 3) {
jian.caoc323ed92021-07-08 19:19:34 +0800451 if (format == PIXEL_FORMAT_YV12 || format == PIXEL_FORMAT_YU12)
Cao Jian65331472019-11-01 21:01:49 +0800452 ret = 0;
453 }
454 return ret;
455}
Jian Caob9fb3ed2019-04-16 16:51:27 +0800456
yuhua.linaea90102022-01-11 18:59:43 +0800457static int aml_read_file_clut(struct ge2d_clut8_t *clut8_table, const char* url)
458{
459 int count = 0;
460 FILE *fp;
461 fp = fopen(url, "r");
462 if (fp == NULL) {
463 E_GE2D("open clut8_data.txt fail\n");
464 return ge2d_fail;
465 }
466 while (fscanf(fp, "%u", &clut8_table->data[count]) != EOF)
467 count++;
468 fclose(fp);
469 if (count == 0 || count > 256) {
470 E_GE2D("clut8_data.txt context error\n");
471 return ge2d_fail;
472 }
473 clut8_table->count = count;
474 return ge2d_success;
475}
476
477
Cao Jian53a15142019-08-16 13:58:17 +0800478static int aml_read_file_src1(aml_ge2d_t *amlge2d, const char* url)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800479{
480 int fd = -1;
481 int length = 0;
482 int read_num = 0;
Cao Jian65331472019-11-01 21:01:49 +0800483 int i;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800484
485 fd = open(url,O_RDONLY );
486 if (fd < 0) {
487 E_GE2D("read source file:%s open error\n",url);
488 return ge2d_fail;
489 }
Cao Jian65331472019-11-01 21:01:49 +0800490 for (i = 0; i < amlge2d->ge2dinfo.src_info[0].plane_number; i++) {
491 if (amlge2d->src_size[i] == 0) {
492 E_GE2D("src_size[i]=%d\n",amlge2d->src_size[i]);
493 close(fd);
494 return 0;
495 }
496 amlge2d->src_data[i] = (char*)malloc(amlge2d->src_size[i]);
497 if (!amlge2d->src_data[i]) {
498 E_GE2D("malloc for src_data failed\n");
499 close(fd);
500 return ge2d_fail;
501 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800502
Cao Jian65331472019-11-01 21:01:49 +0800503 read_num = read(fd,amlge2d->src_data[i],amlge2d->src_size[i]);
504 if (read_num <= 0) {
505 E_GE2D("read file read_num=%d error\n",read_num);
506 close(fd);
507 return ge2d_fail;
508 }
509
510 memcpy(amlge2d->ge2dinfo.src_info[0].vaddr[i], amlge2d->src_data[i], amlge2d->src_size[i]);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800511 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800512 close(fd);
513 return ge2d_success;
514}
515
Cao Jian53a15142019-08-16 13:58:17 +0800516static int aml_read_file_src2(aml_ge2d_t *amlge2d, const char* url)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800517{
518 int fd = -1;
519 int length = 0;
520 int read_num = 0;
Cao Jian65331472019-11-01 21:01:49 +0800521 int i;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800522
523 fd = open(url,O_RDONLY );
524 if (fd < 0) {
525 E_GE2D("read source file:%s open error\n",url);
526 return ge2d_fail;
527 }
Cao Jian65331472019-11-01 21:01:49 +0800528 for (i = 0; i < amlge2d->ge2dinfo.src_info[1].plane_number; i++) {
529 if (amlge2d->src2_size[i] == 0) {
530 E_GE2D("src2_size[i]=%d\n",amlge2d->src2_size[i]);
531 close(fd);
532 return 0;
533 }
534 amlge2d->src2_data[i] = (char*)malloc(amlge2d->src2_size[i]);
535 if (!amlge2d->src2_data[i]) {
536 E_GE2D("malloc for src_data failed\n");
537 close(fd);
538 return ge2d_fail;
539 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800540
Cao Jian65331472019-11-01 21:01:49 +0800541 read_num = read(fd,amlge2d->src2_data[i],amlge2d->src2_size[i]);
542 if (read_num <= 0) {
543 E_GE2D("read file read_num=%d error\n",read_num);
544 close(fd);
545 return ge2d_fail;
546 }
547
548 memcpy(amlge2d->ge2dinfo.src_info[1].vaddr[i], amlge2d->src2_data[i], amlge2d->src2_size[i]);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800549 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800550 close(fd);
551 return ge2d_success;
552}
553
Cao Jian53a15142019-08-16 13:58:17 +0800554static int aml_write_file(aml_ge2d_t *amlge2d, const char* url)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800555{
556 int fd = -1;
557 int length = 0;
558 int write_num = 0;
559 unsigned int *value;
Cao Jian65331472019-11-01 21:01:49 +0800560 int i;
561
Cao Jian53a15142019-08-16 13:58:17 +0800562 if ((GE2D_CANVAS_OSD0 == amlge2d->ge2dinfo.dst_info.memtype)
563 || (GE2D_CANVAS_OSD1 == amlge2d->ge2dinfo.dst_info.memtype))
Jian Caob9fb3ed2019-04-16 16:51:27 +0800564 return 0;
565
566 fd = open(url,O_RDWR | O_CREAT,0660);
567 if (fd < 0) {
568 E_GE2D("write file:%s open error\n",url);
569 return ge2d_fail;
570 }
Cao Jian65331472019-11-01 21:01:49 +0800571 for (i = 0; i < amlge2d->ge2dinfo.dst_info.plane_number; i++) {
572 if (amlge2d->dst_size[i] == 0) {
573 E_GE2D("dst_size[%d]=%d\n",i, amlge2d->dst_size[i]);
574 close(fd);
575 return 0;
576 }
577 amlge2d->dst_data[i] = (char*)malloc(amlge2d->dst_size[i]);
578 if (!amlge2d->dst_data[i]) {
579 E_GE2D("malloc for dst_data failed\n");
580 close(fd);
581 return ge2d_fail;
582 }
583 memcpy(amlge2d->dst_data[i], amlge2d->ge2dinfo.dst_info.vaddr[i], amlge2d->dst_size[i]);
584 printf("pixel: 0x%2x, 0x%2x,0x%2x,0x%2x, 0x%2x,0x%2x,0x%2x,0x%2x\n",
585 amlge2d->dst_data[i][0],
586 amlge2d->dst_data[i][1],
587 amlge2d->dst_data[i][2],
588 amlge2d->dst_data[i][3],
589 amlge2d->dst_data[i][4],
590 amlge2d->dst_data[i][5],
591 amlge2d->dst_data[i][6],
592 amlge2d->dst_data[i][7]);
593 write_num = write(fd,amlge2d->dst_data[i],amlge2d->dst_size[i]);
594 if (write_num <= 0) {
595 E_GE2D("write file write_num=%d error\n",write_num);
596 close(fd);
yuhua.lin34978d02021-12-07 11:03:56 +0800597 return ge2d_fail;
Cao Jian65331472019-11-01 21:01:49 +0800598 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800599 }
600 close(fd);
601 return ge2d_success;
602}
603
Cao Jian2b1d6972020-09-11 16:55:49 +0800604static int do_cmd(aml_ge2d_info_t *pge2dinfo)
605{
606 unsigned long stime;
607 int i, ret = -1;
608 int attach_flag = 0;
609
610 if (!pge2dinfo) {
611 printf("pge2dinfo is null\n");
612 return ge2d_fail;
613 }
614
615 if (separate_step) {
616 /* attach dma fd for src1/src2/dst */
617 switch (pge2dinfo->ge2d_op) {
618 case AML_GE2D_FILLRECTANGLE:
619 attach_flag = ATTACH_DST;
620 break;
621 case AML_GE2D_BLEND:
622 attach_flag = ATTACH_SRC | ATTACH_SRC2 | ATTACH_DST;
623 break;
624 case AML_GE2D_STRETCHBLIT:
625 case AML_GE2D_BLIT:
626 attach_flag = ATTACH_SRC | ATTACH_DST;
627 break;
628 default:
629 E_GE2D("%s, ge2d_op is invalid\n", __func__);
630 return ge2d_fail;
631 }
632
yuhua.lin34978d02021-12-07 11:03:56 +0800633 if (attach_flag & ATTACH_SRC) {
Cao Jian2b1d6972020-09-11 16:55:49 +0800634 ret = aml_ge2d_attach_dma_fd(pge2dinfo, AML_GE2D_SRC);
635 if (ret < 0)
636 return ret;
637 }
638
yuhua.lin34978d02021-12-07 11:03:56 +0800639 if (attach_flag & ATTACH_SRC2) {
Cao Jian2b1d6972020-09-11 16:55:49 +0800640 ret = aml_ge2d_attach_dma_fd(pge2dinfo, AML_GE2D_SRC2);
641 if (ret < 0)
642 return ret;
643 }
644
yuhua.lin34978d02021-12-07 11:03:56 +0800645 if (attach_flag & ATTACH_DST) {
Cao Jian2b1d6972020-09-11 16:55:49 +0800646 ret = aml_ge2d_attach_dma_fd(pge2dinfo, AML_GE2D_DST);
647 if (ret < 0)
648 return ret;
649 }
650
651 /* config once or more times */
652 ret = aml_ge2d_config(pge2dinfo);
653 if (ret < 0)
654 return ret;
655
656 stime = myclock();
657 /* execute one or more times */
658 for (i = 0; i < num_process; i++) {
659 ret = aml_ge2d_execute(pge2dinfo);
660 if (ret < 0) {
661 printf("ge2d process failed, %s (%d)\n", __func__, __LINE__);
662 return ret;
663 }
664 }
665 /* detach dma fd for src1/src2/dst */
yuhua.lin34978d02021-12-07 11:03:56 +0800666 if (attach_flag & ATTACH_SRC)
Cao Jian2b1d6972020-09-11 16:55:49 +0800667 aml_ge2d_detach_dma_fd(pge2dinfo, AML_GE2D_SRC);
yuhua.lin34978d02021-12-07 11:03:56 +0800668 if (attach_flag & ATTACH_SRC2)
Cao Jian2b1d6972020-09-11 16:55:49 +0800669 aml_ge2d_detach_dma_fd(pge2dinfo, AML_GE2D_SRC2);
yuhua.lin34978d02021-12-07 11:03:56 +0800670 if (attach_flag & ATTACH_DST)
Cao Jian2b1d6972020-09-11 16:55:49 +0800671 aml_ge2d_detach_dma_fd(pge2dinfo, AML_GE2D_DST);
672 } else {
673 stime = myclock();
674 for (i = 0; i < num_process; i++) {
675 ret = aml_ge2d_process(pge2dinfo);
676 if (ret < 0) {
677 printf("ge2d process failed, %s (%d)\n", __func__, __LINE__);
678 return ret;
679 }
680 }
681 }
682 printf("separate_step=%d time=%ld ms\n", separate_step, myclock() - stime);
683
684 return ret;
685}
686
Cao Jian53a15142019-08-16 13:58:17 +0800687static int do_fill_rectangle(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800688{
689 int ret = -1;
690 char code;
Cao Jiane80b1392019-08-07 20:59:47 +0800691 int i;
692 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +0800693 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800694
695 printf("do_fill_rectangle test case:\n");
696
697 pge2dinfo->color = rect_color;
698 pge2dinfo->dst_info.rect.x = dst_rect_x;
Cao Jian088facb2020-03-09 17:24:26 +0800699 pge2dinfo->dst_info.rect.y = dst_rect_y;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800700 pge2dinfo->dst_info.rect.w = dst_rect_w;
701 pge2dinfo->dst_info.rect.h = dst_rect_h;
Cao Jian3ad43572021-02-19 13:54:52 +0800702
Cao Jian2b1d6972020-09-11 16:55:49 +0800703 ret = do_cmd(pge2dinfo);
Cao Jian3ad43572021-02-19 13:54:52 +0800704
705 /* if ge2d as dmabuf exporter, use the below interface to invalid cache */
706 if (pge2dinfo->dst_info.mem_alloc_type == AML_GE2D_MEM_DMABUF)
707 aml_ge2d_sync_for_cpu(pge2dinfo);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800708 #if 0
709 sleep(5);
710
711 printf("please enter any key do rotation test[90]\n");
712 code = getc(stdin);
713 pge2dinfo->dst_info.rotation = GE2D_ROTATION_180;
714 ret = aml_ge2d_process(pge2dinfo);
715 #endif
Cao Jian53a15142019-08-16 13:58:17 +0800716 if (ret < 0)
717 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800718 return ret;
719}
720
721
Cao Jian53a15142019-08-16 13:58:17 +0800722static int do_blend(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +0800723{
Cao Jian65331472019-11-01 21:01:49 +0800724 int ret = -1, i;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800725 char code = 0;
726 int shared_fd_bakup;
727 unsigned long offset_bakup = 0;
Cao Jiane80b1392019-08-07 20:59:47 +0800728 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +0800729 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
Cao Jiane80b1392019-08-07 20:59:47 +0800730
Jian Caob9fb3ed2019-04-16 16:51:27 +0800731 printf("do_blend test case:\n");
732
Cao Jian381fe962020-10-21 15:28:22 +0800733 if (pge2dinfo->cap_attr & SRC2_ALPHA) {
Jian Caob9fb3ed2019-04-16 16:51:27 +0800734 /* do blend src1 blend src2(dst) to dst */
735 printf("one step blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800736 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800737 if (ret < 0)
738 return ge2d_fail;
yuhua.lind3e7cd62021-10-14 16:09:27 +0800739 if (amlge2d->ge2dinfo.src_info[0].mem_alloc_type == AML_GE2D_MEM_ION) {
740 ret = aml_ge2d_sync_cache(pge2dinfo, 0);
741 if (ret < 0)
742 return ge2d_fail;
743 }
744
Cao Jian53a15142019-08-16 13:58:17 +0800745 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800746 if (ret < 0)
747 return ge2d_fail;
yuhua.lind3e7cd62021-10-14 16:09:27 +0800748 if (amlge2d->ge2dinfo.src_info[1].mem_alloc_type == AML_GE2D_MEM_ION) {
749 ret = aml_ge2d_sync_cache(pge2dinfo, 1);
750 if (ret < 0)
751 return ge2d_fail;
752 }
Jian Caob9fb3ed2019-04-16 16:51:27 +0800753
754 pge2dinfo->src_info[0].rect.x = src1_rect_x;
755 pge2dinfo->src_info[0].rect.y = src1_rect_y;
756 pge2dinfo->src_info[0].rect.w = src1_rect_w;
757 pge2dinfo->src_info[0].rect.h = src1_rect_h;
758 pge2dinfo->src_info[0].fill_color_en = 0;
759
760 pge2dinfo->src_info[1].rect.x = src2_rect_x;
761 pge2dinfo->src_info[1].rect.y = src2_rect_y;
762 pge2dinfo->src_info[1].rect.w = src2_rect_w;
763 pge2dinfo->src_info[1].rect.h = src2_rect_h;
764 pge2dinfo->src_info[1].fill_color_en = 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800765
766 pge2dinfo->dst_info.rect.x = dst_rect_x;
767 pge2dinfo->dst_info.rect.y = dst_rect_y;
768 pge2dinfo->dst_info.rect.w = dst_rect_w;
769 pge2dinfo->dst_info.rect.h = dst_rect_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800770 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800771
772 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
773 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
774 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
775 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
Cao Jian2b1d6972020-09-11 16:55:49 +0800776
Cao Jian3ad43572021-02-19 13:54:52 +0800777 /* if ge2d as dmabuf exporter, use the below interface to sync cache */
778 if (pge2dinfo->src_info[0].mem_alloc_type == AML_GE2D_MEM_DMABUF)
779 aml_ge2d_sync_for_device(pge2dinfo, 0);
780 if (pge2dinfo->src_info[1].mem_alloc_type == AML_GE2D_MEM_DMABUF)
781 aml_ge2d_sync_for_device(pge2dinfo, 1);
782
783 ret = do_cmd(pge2dinfo);
784
785 /* if ge2d as dmabuf exporter, use the below interface to invalid cache */
786 if (pge2dinfo->dst_info.mem_alloc_type == AML_GE2D_MEM_DMABUF)
787 aml_ge2d_sync_for_cpu(pge2dinfo);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800788 } else {
789 if (((gb1_alpha != 0xff)
790 && (gb2_alpha != 0xff))){
791 printf("two steps blend,two plane alpha\n");
792
793 if (src2_layer_mode == LAYER_MODE_COVERAGE) {
794 printf("two steps blend,src2 LAYER_MODE_COVERAGE\n");
Cao Jian53a15142019-08-16 13:58:17 +0800795 ret = aml_read_file_src1(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800796 if (ret < 0)
797 return ge2d_fail;
798
799 /* both plane alpha, do 2 steps */
800 /* step 1: strechbilt */
801 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
802 /* src2 do strechbilt to dst */
803 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
804 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
805 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
806 pge2dinfo->src_info[0].rect.x = 0;
807 pge2dinfo->src_info[0].rect.y = 0;
808 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
809 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
810 pge2dinfo->src_info[0].fill_color_en = 0;
811
812 pge2dinfo->src_info[1].canvas_w = SX_DST;
813 pge2dinfo->src_info[1].canvas_h = SY_DST;
814 pge2dinfo->src_info[1].format = DST_PIXFORMAT;
815 pge2dinfo->src_info[1].rect.x = 0;
816 pge2dinfo->src_info[1].rect.y = 0;
817 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
818 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
819 pge2dinfo->src_info[1].fill_color_en = 1;
820 pge2dinfo->src_info[1].def_color = 0x00;
821
822 pge2dinfo->dst_info.canvas_w = SX_DST;
823 pge2dinfo->dst_info.canvas_h = SY_DST;
824 pge2dinfo->dst_info.format = DST_PIXFORMAT;
825 pge2dinfo->dst_info.rect.x = 0;
826 pge2dinfo->dst_info.rect.y = 0;
827 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
828 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800829 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800830
831 pge2dinfo->src_info[0].layer_mode = LAYER_MODE_COVERAGE;
832 pge2dinfo->src_info[1].layer_mode = LAYER_MODE_COVERAGE;
833 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
834 pge2dinfo->src_info[1].plane_alpha = 0xff;
835 ret = aml_ge2d_process(pge2dinfo);
Cao Jian53a15142019-08-16 13:58:17 +0800836 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800837 if (ret < 0)
838 return ge2d_fail;
839
840 /* step2: blend src1 blend src2(dst) to dst */
841 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
842
843 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
844 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
845 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
846 pge2dinfo->src_info[0].rect.x = 0;
847 pge2dinfo->src_info[0].rect.y = 0;
848 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
849 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
850 pge2dinfo->src_info[0].fill_color_en = 0;
851
852 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
853 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
854 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
855 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
856 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
857 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
858 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800859 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
860 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800861 pge2dinfo->src_info[1].fill_color_en = 0;
862
863 pge2dinfo->dst_info.canvas_w = SX_DST;
864 pge2dinfo->dst_info.canvas_h = SY_DST;
865 pge2dinfo->dst_info.format = DST_PIXFORMAT;
866 pge2dinfo->dst_info.rect.x = 0;
867 pge2dinfo->dst_info.rect.y = 0;
868 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
869 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800870 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800871
872 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
873 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
874 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
875 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
876 ret = aml_ge2d_process(pge2dinfo);
877 } else {
Cao Jian53a15142019-08-16 13:58:17 +0800878 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800879 if (ret < 0)
880 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +0800881 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800882 if (ret < 0)
883 return ge2d_fail;
884 printf("two step: strechbilt+blend\n");
885 /* both plane alpha, do 2 steps */
886 /* step 1: strechbilt */
887 pge2dinfo->ge2d_op = AML_GE2D_STRETCHBLIT;
888 /* src2 do strechbilt to dst */
889 pge2dinfo->src_info[0].canvas_w = SX_SRC2;
890 pge2dinfo->src_info[0].canvas_h = SY_SRC2;
891 pge2dinfo->src_info[0].format = SRC2_PIXFORMAT;
892 pge2dinfo->src_info[0].rect.x = 0;
893 pge2dinfo->src_info[0].rect.y = 0;
894 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
895 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
896
Cao Jian65331472019-11-01 21:01:49 +0800897 shared_fd_bakup = pge2dinfo->src_info[0].shared_fd[0];
898 offset_bakup = pge2dinfo->src_info[0].offset[0];
899 pge2dinfo->src_info[0].shared_fd[0] = pge2dinfo->src_info[1].shared_fd[0];
900 pge2dinfo->src_info[0].offset[0] = pge2dinfo->src_info[1].offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800901
902 pge2dinfo->src_info[0].layer_mode = src2_layer_mode;
903 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
904 pge2dinfo->dst_info.canvas_w = SX_DST;
905 pge2dinfo->dst_info.canvas_h = SY_DST;
906 pge2dinfo->dst_info.format = DST_PIXFORMAT;
907 pge2dinfo->dst_info.rect.x = 0;
908 pge2dinfo->dst_info.rect.y = 0;
909 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
910 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800911 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800912 ret = aml_ge2d_process(pge2dinfo);
913
914 /* step2: blend src1 blend src2(dst) to dst */
915 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
916
917 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
918 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
919 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
920 pge2dinfo->src_info[0].rect.x = 0;
921 pge2dinfo->src_info[0].rect.y = 0;
922 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
923 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jian65331472019-11-01 21:01:49 +0800924 pge2dinfo->src_info[0].shared_fd[0] = shared_fd_bakup;
925 pge2dinfo->src_info[0].offset[0] = offset_bakup;
Jian Caob9fb3ed2019-04-16 16:51:27 +0800926 pge2dinfo->src_info[0].fill_color_en = 0;
927
928 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
929 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
930 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
931 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
932 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
933 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
934 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +0800935 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
936 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +0800937 pge2dinfo->src_info[1].fill_color_en = 0;
938
939 pge2dinfo->dst_info.canvas_w = SX_DST;
940 pge2dinfo->dst_info.canvas_h = SY_DST;
941 pge2dinfo->dst_info.format = DST_PIXFORMAT;
942 pge2dinfo->dst_info.rect.x = 0;
943 pge2dinfo->dst_info.rect.y = 0;
944 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
945 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800946 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800947
948 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
949 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
950 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
951 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
952 ret = aml_ge2d_process(pge2dinfo);
953 }
954 } else if (src2_layer_mode == LAYER_MODE_COVERAGE){
955 printf("two steps blend,src2 LAYER_MODE_COVERAGE: two blend\n");
Cao Jian53a15142019-08-16 13:58:17 +0800956 ret = aml_read_file_src1(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800957 if (ret < 0)
958 return ge2d_fail;
959 /* both plane alpha, do 2 steps */
960 /* step 1: strechbilt */
961 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
962 /* src2 do strechbilt to dst */
963 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
964 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
965 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
966 pge2dinfo->src_info[0].rect.x = 0;
967 pge2dinfo->src_info[0].rect.y = 0;
968 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
969 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
970 pge2dinfo->src_info[0].fill_color_en = 0;
971
972 pge2dinfo->src_info[1].canvas_w = SX_DST;
973 pge2dinfo->src_info[1].canvas_h = SY_DST;
974 pge2dinfo->src_info[1].format = DST_PIXFORMAT;
975 pge2dinfo->src_info[1].rect.x = 0;
976 pge2dinfo->src_info[1].rect.y = 0;
977 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
978 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
979 pge2dinfo->src_info[1].fill_color_en = 1;
980 pge2dinfo->src_info[1].def_color = 0x00;
981
982 pge2dinfo->dst_info.canvas_w = SX_DST;
983 pge2dinfo->dst_info.canvas_h = SY_DST;
984 pge2dinfo->dst_info.format = DST_PIXFORMAT;
985 pge2dinfo->dst_info.rect.x = 0;
986 pge2dinfo->dst_info.rect.y = 0;
987 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
988 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +0800989 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800990
991 pge2dinfo->src_info[0].layer_mode = LAYER_MODE_COVERAGE;
992 pge2dinfo->src_info[1].layer_mode = LAYER_MODE_COVERAGE;
993 pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
994 pge2dinfo->src_info[1].plane_alpha = 0xff;
995 ret = aml_ge2d_process(pge2dinfo);
Cao Jian53a15142019-08-16 13:58:17 +0800996 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +0800997 if (ret < 0)
998 return ge2d_fail;
999 /* step2: blend src1 blend src2(dst) to dst */
1000 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
1001
1002 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
1003 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
1004 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
1005 pge2dinfo->src_info[0].rect.x = 0;
1006 pge2dinfo->src_info[0].rect.y = 0;
1007 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
1008 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
1009 pge2dinfo->src_info[0].fill_color_en = 0;
1010
1011 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
1012 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
1013 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
1014 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
1015 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
1016 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
1017 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +08001018 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
1019 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +08001020 pge2dinfo->src_info[1].fill_color_en = 0;
1021
1022 pge2dinfo->dst_info.canvas_w = SX_DST;
1023 pge2dinfo->dst_info.canvas_h = SY_DST;
1024 pge2dinfo->dst_info.format = DST_PIXFORMAT;
1025 pge2dinfo->dst_info.rect.x = 0;
1026 pge2dinfo->dst_info.rect.y = 0;
1027 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
1028 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +08001029 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001030
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 if ((src2_layer_mode == LAYER_MODE_NON)
1037 && (src1_layer_mode != LAYER_MODE_PREMULTIPLIED)){
1038 printf("two steps blend,src2 LAYER_MODE_NON:strechbilt+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 /* both plane alpha, do 2 steps */
1046 /* step 1: strechbilt */
1047 pge2dinfo->ge2d_op = AML_GE2D_STRETCHBLIT;
1048 /* src2 do strechbilt to dst */
1049 pge2dinfo->src_info[0].canvas_w = SX_SRC2;
1050 pge2dinfo->src_info[0].canvas_h = SY_SRC2;
1051 pge2dinfo->src_info[0].format = SRC2_PIXFORMAT;
1052 pge2dinfo->src_info[0].rect.x = 0;
1053 pge2dinfo->src_info[0].rect.y = 0;
1054 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
1055 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
1056
Cao Jian65331472019-11-01 21:01:49 +08001057 shared_fd_bakup = pge2dinfo->src_info[0].shared_fd[0];
1058 offset_bakup = pge2dinfo->src_info[0].offset[0];
1059 pge2dinfo->src_info[0].shared_fd[0] = pge2dinfo->src_info[1].shared_fd[0];
1060 pge2dinfo->src_info[0].offset[0] = pge2dinfo->src_info[1].offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +08001061 pge2dinfo->src_info[0].layer_mode = src2_layer_mode;
1062 pge2dinfo->src_info[0].plane_alpha = 0xff;
1063 pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888;
1064
1065 pge2dinfo->dst_info.canvas_w = SX_DST;
1066 pge2dinfo->dst_info.canvas_h = SY_DST;
1067 pge2dinfo->dst_info.format = DST_PIXFORMAT;
1068 pge2dinfo->dst_info.rect.x = 0;
1069 pge2dinfo->dst_info.rect.y = 0;
1070 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
1071 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +08001072 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001073 ret = aml_ge2d_process(pge2dinfo);
1074
1075 /* step2: blend src1 blend src2(dst) to dst */
1076 pge2dinfo->ge2d_op = AML_GE2D_BLEND;
1077
1078 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
1079 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
1080 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
1081 pge2dinfo->src_info[0].rect.x = 0;
1082 pge2dinfo->src_info[0].rect.y = 0;
1083 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
1084 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jian65331472019-11-01 21:01:49 +08001085 pge2dinfo->src_info[0].shared_fd[0] = shared_fd_bakup;
1086 pge2dinfo->src_info[0].offset[0] = offset_bakup;
Jian Caob9fb3ed2019-04-16 16:51:27 +08001087 pge2dinfo->src_info[0].fill_color_en = 0;
1088
1089 pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w;
1090 pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h;
1091 pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format;
1092 pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x;
1093 pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y;
1094 pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w;
1095 pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h;
Cao Jian65331472019-11-01 21:01:49 +08001096 pge2dinfo->src_info[1].shared_fd[0] = pge2dinfo->dst_info.shared_fd[0];
1097 pge2dinfo->src_info[1].offset[0] = pge2dinfo->dst_info.offset[0];
Jian Caob9fb3ed2019-04-16 16:51:27 +08001098 pge2dinfo->src_info[1].fill_color_en = 0;
1099
1100 pge2dinfo->dst_info.canvas_w = SX_DST;
1101 pge2dinfo->dst_info.canvas_h = SY_DST;
1102 pge2dinfo->dst_info.format = DST_PIXFORMAT;
1103 pge2dinfo->dst_info.rect.x = 0;
1104 pge2dinfo->dst_info.rect.y = 0;
1105 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
1106 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_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 printf("two steps blend,src1_layer_mode=%d,src2_layer_mode=%d\n",src1_layer_mode,src2_layer_mode);
1109
1110 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1111 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
1112 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1113 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
1114 ret = aml_ge2d_process(pge2dinfo);
1115 } else {
1116 /* do blend src1 blend src2(dst) to dst */
1117 printf("one step blend\n");
Cao Jian53a15142019-08-16 13:58:17 +08001118 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001119 if (ret < 0)
1120 return ge2d_fail;
Cao Jian53a15142019-08-16 13:58:17 +08001121 ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001122 if (ret < 0)
1123 return ge2d_fail;
1124 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
1125 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
1126 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
1127 pge2dinfo->src_info[0].rect.x = 0;
1128 pge2dinfo->src_info[0].rect.y = 0;
1129 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
1130 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
1131 pge2dinfo->src_info[0].fill_color_en = 0;
1132
1133 pge2dinfo->src_info[1].canvas_w = SX_SRC2;
1134 pge2dinfo->src_info[1].canvas_h = SY_SRC2;
1135 pge2dinfo->src_info[1].format = SRC2_PIXFORMAT;
1136 pge2dinfo->src_info[1].rect.x = 0;
1137 pge2dinfo->src_info[1].rect.y = 0;
1138 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
1139 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
1140 pge2dinfo->src_info[1].fill_color_en = 0;
1141 if (src2_layer_mode == LAYER_MODE_NON)
1142 pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888;
1143 pge2dinfo->dst_info.canvas_w = SX_DST;
1144 pge2dinfo->dst_info.canvas_h = SY_DST;
1145 pge2dinfo->dst_info.format = DST_PIXFORMAT;
1146 pge2dinfo->dst_info.rect.x = 0;
1147 pge2dinfo->dst_info.rect.y = 0;
1148 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
1149 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +08001150 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001151
1152 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1153 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
1154 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1155 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
1156 ret = aml_ge2d_process(pge2dinfo);
1157 }
1158 }
Cao Jian53a15142019-08-16 13:58:17 +08001159 if (ret < 0)
1160 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001161 return ret;
1162}
1163
1164
Cao Jian53a15142019-08-16 13:58:17 +08001165static int do_strechblit(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +08001166{
1167 int ret = -1;
1168 char code = 0;
Cao Jiane80b1392019-08-07 20:59:47 +08001169 int i;
1170 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +08001171 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
1172
Jian Caob9fb3ed2019-04-16 16:51:27 +08001173 printf("do_strechblit test case:\n");
Cao Jian53a15142019-08-16 13:58:17 +08001174 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001175 if (ret < 0)
1176 return ge2d_fail;
yuhua.linaea90102022-01-11 18:59:43 +08001177
yuhua.lind3e7cd62021-10-14 16:09:27 +08001178 if (amlge2d->ge2dinfo.src_info[0].mem_alloc_type == AML_GE2D_MEM_ION) {
1179 ret = aml_ge2d_sync_cache(pge2dinfo, 0);
1180 if (ret < 0)
1181 return ge2d_fail;
1182 }
Jian Caob9fb3ed2019-04-16 16:51:27 +08001183
1184 pge2dinfo->src_info[0].rect.x = src1_rect_x;
1185 pge2dinfo->src_info[0].rect.y = src1_rect_y;
1186 pge2dinfo->src_info[0].rect.w = src1_rect_w;
1187 pge2dinfo->src_info[0].rect.h = src1_rect_h;
1188 pge2dinfo->dst_info.rect.x = dst_rect_x;
1189 pge2dinfo->dst_info.rect.y = dst_rect_y;
1190 pge2dinfo->dst_info.rect.w = dst_rect_w;
1191 pge2dinfo->dst_info.rect.h = dst_rect_h;
Cao Jianb3f2fce2020-11-16 19:39:13 +08001192 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001193 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1194 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1195
Cao Jian3ad43572021-02-19 13:54:52 +08001196 /* if ge2d as dmabuf exporter, use the below interface to sync cache */
1197 if (pge2dinfo->src_info[0].mem_alloc_type == AML_GE2D_MEM_DMABUF)
1198 aml_ge2d_sync_for_device(pge2dinfo, 0);
1199 if (pge2dinfo->src_info[1].mem_alloc_type == AML_GE2D_MEM_DMABUF)
1200 aml_ge2d_sync_for_device(pge2dinfo, 1);
1201
Cao Jian2b1d6972020-09-11 16:55:49 +08001202 ret = do_cmd(pge2dinfo);
1203
Cao Jian3ad43572021-02-19 13:54:52 +08001204 /* if ge2d as dmabuf exporter, use the below interface to invalid cache */
1205 if (pge2dinfo->dst_info.mem_alloc_type == AML_GE2D_MEM_DMABUF)
1206 aml_ge2d_sync_for_cpu(pge2dinfo);
1207
Jian Caob9fb3ed2019-04-16 16:51:27 +08001208 #if 0
1209 sleep(5);
1210
1211 printf("please enter any key do rotation test[90]\n");
1212 code = getc(stdin);
1213 pge2dinfo->dst_info.rotation = GE2D_ROTATION_90;
1214 ret = aml_ge2d_process(pge2dinfo);
1215 #endif
Cao Jian53a15142019-08-16 13:58:17 +08001216 if (ret < 0)
1217 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001218 return ret;
1219
1220}
1221
Cao Jian53a15142019-08-16 13:58:17 +08001222static int do_blit(aml_ge2d_t *amlge2d)
Jian Caob9fb3ed2019-04-16 16:51:27 +08001223{
1224 int ret = -1;
1225 char code = 0;
Cao Jiane80b1392019-08-07 20:59:47 +08001226 int i;
1227 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +08001228 aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
1229
Jian Caob9fb3ed2019-04-16 16:51:27 +08001230 printf("do_blit test case:\n");
Cao Jian53a15142019-08-16 13:58:17 +08001231 ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001232 if (ret < 0)
1233 return ge2d_fail;
yuhua.lind3e7cd62021-10-14 16:09:27 +08001234 if (amlge2d->ge2dinfo.src_info[0].mem_alloc_type == AML_GE2D_MEM_ION) {
1235 ret = aml_ge2d_sync_cache(pge2dinfo, 0);
1236 if (ret < 0)
1237 return ge2d_fail;
1238 }
Jian Caob9fb3ed2019-04-16 16:51:27 +08001239
1240 pge2dinfo->src_info[0].rect.x = src1_rect_x;
1241 pge2dinfo->src_info[0].rect.y = src1_rect_y;
1242 pge2dinfo->src_info[0].rect.w = src1_rect_w;
1243 pge2dinfo->src_info[0].rect.h = src1_rect_h;
1244 pge2dinfo->dst_info.rect.x = dst_rect_x;
1245 pge2dinfo->dst_info.rect.y = dst_rect_y;
1246
Cao Jianb3f2fce2020-11-16 19:39:13 +08001247 pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001248 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
1249 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
1250
Cao Jian3ad43572021-02-19 13:54:52 +08001251 /* if ge2d as dmabuf exporter, use the below interface to sync cache */
1252 if (pge2dinfo->src_info[0].mem_alloc_type == AML_GE2D_MEM_DMABUF)
1253 aml_ge2d_sync_for_device(pge2dinfo, 0);
1254 if (pge2dinfo->src_info[1].mem_alloc_type == AML_GE2D_MEM_DMABUF)
1255 aml_ge2d_sync_for_device(pge2dinfo, 1);
1256
Cao Jian2b1d6972020-09-11 16:55:49 +08001257 ret = do_cmd(pge2dinfo);
1258
Cao Jian3ad43572021-02-19 13:54:52 +08001259 /* if ge2d as dmabuf exporter, use the below interface to invalid cache */
1260 if (pge2dinfo->dst_info.mem_alloc_type == AML_GE2D_MEM_DMABUF)
1261 aml_ge2d_sync_for_cpu(pge2dinfo);
1262
Jian Caob9fb3ed2019-04-16 16:51:27 +08001263 #if 0
1264 sleep(5);
1265
1266 printf("please enter any key do rotation test[90]\n");
1267 code = getc(stdin);
1268 pge2dinfo->dst_info.rotation = GE2D_ROTATION_90;
1269 pge2dinfo->src_info[0].rect.x = 0;
1270 pge2dinfo->src_info[0].rect.y = 0;
1271 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
1272 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
1273 pge2dinfo->dst_info.rect.x = 0;
1274 pge2dinfo->dst_info.rect.y = 0;
1275
1276 ret = aml_ge2d_process(pge2dinfo);
1277 #endif
Cao Jian53a15142019-08-16 13:58:17 +08001278 if (ret < 0)
1279 printf("%s failed\n", __func__);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001280 return ret;
1281}
1282
Cao Jian53a15142019-08-16 13:58:17 +08001283void *main_run(void *arg)
Jian Caob9fb3ed2019-04-16 16:51:27 +08001284{
1285 int ret = -1;
Cao Jian65331472019-11-01 21:01:49 +08001286 int i = 0, run_time = 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +08001287 unsigned long stime;
Cao Jian53a15142019-08-16 13:58:17 +08001288 aml_ge2d_t amlge2d;
Cao Jian65331472019-11-01 21:01:49 +08001289 char dst_file_name[128] = {};
yuhua.linaea90102022-01-11 18:59:43 +08001290 struct ge2d_clut8_t *clut8_table = NULL;
Jian Cao49c82bd2019-06-04 12:49:10 +08001291
Cao Jian65331472019-11-01 21:01:49 +08001292 for (run_time = 0; run_time < num_process_per_thread; run_time++) {
1293 printf("ThreadIdx -- %d, run time -- %d\n", *(int *)arg, run_time);
1294 memset(&amlge2d, 0, sizeof(aml_ge2d_t));
Cao Jian53a15142019-08-16 13:58:17 +08001295 memset(&(amlge2d.ge2dinfo.src_info[0]), 0, sizeof(buffer_info_t));
1296 memset(&(amlge2d.ge2dinfo.src_info[1]), 0, sizeof(buffer_info_t));
1297 memset(&(amlge2d.ge2dinfo.dst_info), 0, sizeof(buffer_info_t));
1298
Cao Jian2b1d6972020-09-11 16:55:49 +08001299 for (i = 0; i < GE2D_MAX_PLANE; i++) {
Cao Jian65331472019-11-01 21:01:49 +08001300 amlge2d.ge2dinfo.src_info[0].shared_fd[i] = -1;
1301 amlge2d.ge2dinfo.src_info[1].shared_fd[i] = -1;
1302 amlge2d.ge2dinfo.dst_info.shared_fd[i] = -1;
1303 }
Cao Jian53a15142019-08-16 13:58:17 +08001304 set_ge2dinfo(&amlge2d.ge2dinfo);
Cao Jian65331472019-11-01 21:01:49 +08001305 ret = check_plane_number(amlge2d.ge2dinfo.src_info[0].plane_number,
1306 amlge2d.ge2dinfo.src_info[0].format);
1307 if (ret < 0) {
1308 printf("Error src1 plane_number=[%d], format=%d\n",
1309 amlge2d.ge2dinfo.src_info[0].plane_number,
1310 amlge2d.ge2dinfo.src_info[0].format);
1311 return NULL;
1312 }
1313 ret = check_plane_number(amlge2d.ge2dinfo.src_info[1].plane_number,
1314 amlge2d.ge2dinfo.src_info[1].format);
1315 if (ret < 0) {
1316 printf("Error src2 plane_number=[%d],format=%d\n",
1317 amlge2d.ge2dinfo.src_info[1].plane_number,
1318 amlge2d.ge2dinfo.src_info[1].format);
1319 return NULL;
1320 }
1321 ret = check_plane_number(amlge2d.ge2dinfo.dst_info.plane_number,
1322 amlge2d.ge2dinfo.dst_info.format);
1323 if (ret < 0) {
1324 printf("Error dst plane_number=[%d],format=%d\n",
1325 amlge2d.ge2dinfo.dst_info.plane_number,
1326 amlge2d.ge2dinfo.dst_info.format);
1327 return NULL;
1328 }
Cao Jian53a15142019-08-16 13:58:17 +08001329
1330 ret = aml_ge2d_init(&amlge2d);
1331 if (ret < 0)
1332 return NULL;
1333
1334 ret = aml_ge2d_mem_alloc(&amlge2d);
1335 if (ret < 0)
1336 goto exit;
yuhua.linaea90102022-01-11 18:59:43 +08001337
1338 if (strlen(clut8_table_file) != 0) {
1339 clut8_table = malloc(sizeof(struct ge2d_clut8_t));
1340 ret = aml_read_file_clut(clut8_table, clut8_table_file);
1341 if (ret < 0) {
1342 free(clut8_table);
1343 printf("Error read clut8_table_file\n");
1344 return NULL;
1345 }
1346 ret = ge2d_set_clut8_table(amlge2d.ge2dinfo.ge2d_fd, clut8_table);
1347 if (ret < 0) {
1348 free(clut8_table);
1349 printf("Error set clut8_table\n");
1350 return NULL;
1351 }
1352 free(clut8_table);
1353 } else if (clut8_count) {
1354 clut8_table = malloc(clut8_count * sizeof(unsigned int));
1355 memcpy(&clut8_table->data, &clut8_data, clut8_count * sizeof(unsigned int));
1356 clut8_table->count = clut8_count;
1357 ret = ge2d_set_clut8_table(amlge2d.ge2dinfo.ge2d_fd, clut8_table);
1358 if (ret < 0) {
1359 free(clut8_table);
1360 printf("Error set clut8_table\n");
1361 return NULL;
1362 }
1363 free(clut8_table);
1364 }
1365
Cao Jian53a15142019-08-16 13:58:17 +08001366 #if 0
1367 /* if dma_buf and used fd alloc other driver */
1368 /* set dma buf fd */
1369 amlge2d.ge2dinfo.src_info[0].shared_fd = dma_fd;
1370 amlge2d.ge2dinfo.src_info[0].memtype = GE2D_CANVAS_ALLOC;
1371 #endif
1372
1373 switch (amlge2d.ge2dinfo.ge2d_op)
1374 {
1375 case AML_GE2D_FILLRECTANGLE:
1376 ret = do_fill_rectangle(&amlge2d);
1377 break;
1378 case AML_GE2D_BLEND:
1379 ret = do_blend(&amlge2d);
1380 break;
1381 case AML_GE2D_STRETCHBLIT:
1382 ret = do_strechblit(&amlge2d);
1383 break;
1384 case AML_GE2D_BLIT:
1385 ret = do_blit(&amlge2d);
1386 break;
1387 default:
1388 E_GE2D("not support ge2d op,exit test!\n");
1389 break;
1390 }
1391 if (ret < 0)
1392 goto exit;
1393
1394 if (amlge2d.ge2dinfo.dst_info.mem_alloc_type == AML_GE2D_MEM_ION)
1395 aml_ge2d_invalid_cache(&amlge2d.ge2dinfo);
Cao Jian65331472019-11-01 21:01:49 +08001396 sprintf(dst_file_name, "%s_thread%d_%d", DST_FILE_NAME, *(int *)arg, run_time);
1397 ret = aml_write_file(&amlge2d, dst_file_name);
Cao Jian53a15142019-08-16 13:58:17 +08001398 if (ret < 0)
yuhua.lin34978d02021-12-07 11:03:56 +08001399 E_GE2D("failed write file\n");
Cao Jian53a15142019-08-16 13:58:17 +08001400 exit:
Cao Jian65331472019-11-01 21:01:49 +08001401 for (i = 0; i < amlge2d.ge2dinfo.src_info[0].plane_number; i++) {
1402 if (amlge2d.src_data[i]) {
1403 free(amlge2d.src_data[i]);
1404 amlge2d.src_data[i] = NULL;
1405 }
Cao Jian53a15142019-08-16 13:58:17 +08001406 }
1407
Cao Jian65331472019-11-01 21:01:49 +08001408 for (i = 0; i < amlge2d.ge2dinfo.src_info[1].plane_number; i++) {
1409 if (amlge2d.src2_data[i]) {
1410 free(amlge2d.src2_data[i]);
1411 amlge2d.src2_data[i] = NULL;
1412 }
1413 }
1414
1415 for (i = 0; i < amlge2d.ge2dinfo.dst_info.plane_number; i++) {
1416 if (amlge2d.dst_data[i]) {
1417 free(amlge2d.dst_data[i]);
1418 amlge2d.dst_data[i] = NULL;
1419 }
1420 }
Cao Jian53a15142019-08-16 13:58:17 +08001421 aml_ge2d_mem_free(&amlge2d);
1422 aml_ge2d_exit(&amlge2d);
1423 }
1424 printf("ge2d feature_test exit!!!\n");
1425
1426 return NULL;
1427}
1428
1429int main(int argc, char **argv)
1430{
1431 int ret = -1, i;
1432 pthread_t thread[THREADS_MAX_NUM];
1433 int threadindex[THREADS_MAX_NUM];
1434
1435 if (num_thread > THREADS_MAX_NUM) {
1436 E_GE2D("num of thread greater than THREADS_MAX_NUM\n");
1437 return -1;
1438 }
1439 memset(&thread, 0, sizeof(thread));
1440
1441 ret = parse_command_line(argc, argv);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001442 if (ret == ge2d_fail)
1443 return ge2d_success;
1444
Cao Jian65331472019-11-01 21:01:49 +08001445 for (i = 0; i < num_thread; i++) {
Cao Jian53a15142019-08-16 13:58:17 +08001446 threadindex[i] = i;
Cao Jian65331472019-11-01 21:01:49 +08001447 ret = pthread_create(&(thread[i]), NULL, main_run, (void *)&threadindex[i]);
1448 if (ret != 0) {
Cao Jian53a15142019-08-16 13:58:17 +08001449 E_GE2D("integral thread %d creation failed!", i);
1450 return -1;
1451 }
1452 }
Cao Jian65331472019-11-01 21:01:49 +08001453 for (i = 0; i < num_thread; i++)
Cao Jian53a15142019-08-16 13:58:17 +08001454 pthread_join(thread[i], NULL);
Jian Caob9fb3ed2019-04-16 16:51:27 +08001455
Cao Jian53a15142019-08-16 13:58:17 +08001456 return 0;
Jian Caob9fb3ed2019-04-16 16:51:27 +08001457}