Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 1 | /* |
| 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() */ |
| 17 | #include "ge2d_port.h" |
| 18 | #include "ge2d_com.h" |
| 19 | #include "aml_ge2d.h" |
| 20 | #include "color_bar.h" |
| 21 | |
| 22 | static int SX_SRC1 = 640; |
| 23 | static int SY_SRC1 = 480; |
| 24 | static int SX_SRC2 = 640; |
| 25 | static int SY_SRC2 = 480; |
| 26 | static int SX_DST = 640; |
| 27 | static int SY_DST = 480; |
| 28 | |
| 29 | static int SRC1_PIXFORMAT = PIXEL_FORMAT_RGBA_8888; |
| 30 | static int SRC2_PIXFORMAT = PIXEL_FORMAT_RGBA_8888; |
| 31 | static int DST_PIXFORMAT = PIXEL_FORMAT_RGBA_8888; |
| 32 | |
| 33 | static int OP = AML_GE2D_BLIT; |
| 34 | static int src1_layer_mode = LAYER_MODE_PREMULTIPLIED; |
| 35 | static int src2_layer_mode = 0; |
| 36 | static int gb1_alpha = 0xff; |
| 37 | static int gb2_alpha = 0xff; |
| 38 | static aml_ge2d_t amlge2d; |
| 39 | #define TEST_NUM 3 |
| 40 | |
| 41 | static void set_ge2dinfo(aml_ge2d_info_t *pge2dinfo) |
| 42 | { |
| 43 | pge2dinfo->src_info[0].memtype = GE2D_CANVAS_ALLOC; |
| 44 | pge2dinfo->src_info[0].canvas_w = SX_SRC1; |
| 45 | pge2dinfo->src_info[0].canvas_h = SY_SRC1; |
| 46 | pge2dinfo->src_info[0].format = SRC1_PIXFORMAT; |
Cao Jian | f483536 | 2021-03-11 13:30:53 +0800 | [diff] [blame] | 47 | pge2dinfo->src_info[0].plane_number = 1; |
| 48 | |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 49 | pge2dinfo->src_info[1].memtype = GE2D_CANVAS_ALLOC; |
| 50 | pge2dinfo->src_info[1].canvas_w = SX_SRC2; |
| 51 | pge2dinfo->src_info[1].canvas_h = SY_SRC2; |
| 52 | pge2dinfo->src_info[1].format = SRC2_PIXFORMAT; |
Cao Jian | f483536 | 2021-03-11 13:30:53 +0800 | [diff] [blame] | 53 | pge2dinfo->src_info[1].plane_number = 1; |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 54 | |
| 55 | pge2dinfo->dst_info.memtype = GE2D_CANVAS_ALLOC; |
| 56 | pge2dinfo->dst_info.canvas_w = SX_DST; |
| 57 | pge2dinfo->dst_info.canvas_h = SY_DST; |
| 58 | pge2dinfo->dst_info.format = DST_PIXFORMAT; |
| 59 | pge2dinfo->dst_info.rotation = GE2D_ROTATION_0; |
Cao Jian | f483536 | 2021-03-11 13:30:53 +0800 | [diff] [blame] | 60 | pge2dinfo->dst_info.plane_number = 1; |
| 61 | |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 62 | pge2dinfo->offset = 0; |
| 63 | pge2dinfo->ge2d_op = OP; |
| 64 | pge2dinfo->blend_mode = BLEND_MODE_PREMULTIPLIED; |
| 65 | } |
| 66 | |
| 67 | static void print_usage(void) |
| 68 | { |
| 69 | int i; |
| 70 | printf ("Usage: ge2d_chip_check [options]\n\n"); |
| 71 | printf ("Options:\n\n"); |
| 72 | printf (" --help Print usage information.\n"); |
| 73 | printf ("\n"); |
| 74 | } |
| 75 | |
| 76 | static int parse_command_line(int argc, char *argv[]) |
| 77 | { |
| 78 | int i; |
| 79 | /* parse command line */ |
| 80 | for (i = 1; i < argc; i++) { |
| 81 | if (strncmp (argv[i], "--", 2) == 0) { |
| 82 | if (strcmp (argv[i] + 2, "help") == 0) { |
| 83 | print_usage(); |
| 84 | return ge2d_fail; |
| 85 | } else if (strcmp (argv[i] + 2, "bo1") == 0 && ++i < argc && |
| 86 | sscanf (argv[i], "%d", &src1_layer_mode) == 1) { |
| 87 | continue; |
| 88 | } else if (strcmp (argv[i] + 2, "bo2") == 0 && ++i < argc && |
| 89 | sscanf (argv[i], "%d", &src2_layer_mode) == 1) { |
| 90 | continue; |
| 91 | } else if (strcmp (argv[i] + 2, "gb1") == 0 && ++i < argc && |
| 92 | sscanf (argv[i], "%d", &gb1_alpha) == 1) { |
| 93 | continue; |
| 94 | } else if (strcmp (argv[i] + 2, "gb2") == 0 && ++i < argc && |
| 95 | sscanf (argv[i], "%d", &gb2_alpha) == 1) { |
| 96 | continue; |
| 97 | } |
| 98 | } |
| 99 | } |
| 100 | return ge2d_success; |
| 101 | } |
| 102 | |
Cao Jian | 53a1514 | 2019-08-16 13:58:17 +0800 | [diff] [blame] | 103 | static int compare_data(char *data1, char *data2, int size) |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 104 | { |
| 105 | int i = 0, err_hit = 0; |
| 106 | int thresh_hold = 1;//size * 5/100; |
| 107 | |
| 108 | if (!data1 || !data2 || !size) |
| 109 | return 0; |
| 110 | for (i=0; i< size; i++) { |
| 111 | if (*data1 != *data2) { |
| 112 | printf("data1=%x,data2=%x\n",*data1,*data2); |
| 113 | err_hit++; |
| 114 | } |
| 115 | data1++; |
| 116 | data2++; |
| 117 | if (err_hit > thresh_hold) { |
| 118 | printf("bad chip found,err_hit=%d\n",err_hit); |
| 119 | return -1; |
| 120 | } |
| 121 | } |
| 122 | return 0; |
| 123 | } |
| 124 | |
Cao Jian | 53a1514 | 2019-08-16 13:58:17 +0800 | [diff] [blame] | 125 | static int load_result_file(const char* url) |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 126 | { |
| 127 | int fd = -1; |
| 128 | int length = 0; |
| 129 | int read_num = 0; |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 130 | if (amlge2d.src_size[0] == 0) |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 131 | return 0; |
| 132 | |
| 133 | fd = open(url,O_RDONLY ); |
| 134 | if (fd < 0) { |
| 135 | E_GE2D("read source file:%s open error\n",url); |
| 136 | return ge2d_fail; |
| 137 | } |
| 138 | |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 139 | amlge2d.src_data[0] = (char*)malloc(amlge2d.src_size[0]); |
| 140 | if (!amlge2d.src_data[0]) { |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 141 | E_GE2D("malloc for src_data failed\n"); |
yuhua.lin | 34978d0 | 2021-12-07 11:03:56 +0800 | [diff] [blame] | 142 | close(fd); |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 143 | return ge2d_fail; |
| 144 | } |
| 145 | |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 146 | read_num = read(fd,amlge2d.src_data[0],amlge2d.src_size[0]); |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 147 | if (read_num <= 0) { |
| 148 | E_GE2D("read file read_num=%d error\n",read_num); |
yuhua.lin | 34978d0 | 2021-12-07 11:03:56 +0800 | [diff] [blame] | 149 | close(fd); |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 150 | return ge2d_fail; |
| 151 | } |
| 152 | |
| 153 | close(fd); |
| 154 | return ge2d_success; |
| 155 | } |
| 156 | |
| 157 | |
Cao Jian | 53a1514 | 2019-08-16 13:58:17 +0800 | [diff] [blame] | 158 | static int aml_read_file_src1(const char* url , aml_ge2d_info_t *pge2dinfo) |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 159 | { |
| 160 | int fd = -1; |
| 161 | int length = 0; |
| 162 | int read_num = 0; |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 163 | if (amlge2d.src_size[0] == 0) |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 164 | return 0; |
| 165 | |
| 166 | fd = open(url,O_RDONLY ); |
| 167 | if (fd < 0) { |
| 168 | E_GE2D("read source file:%s open error\n",url); |
| 169 | return ge2d_fail; |
| 170 | } |
| 171 | |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 172 | amlge2d.src_data[0] = (char*)malloc(amlge2d.src_size[0]); |
| 173 | if (!amlge2d.src_data[0]) { |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 174 | E_GE2D("malloc for src_data failed\n"); |
yuhua.lin | 34978d0 | 2021-12-07 11:03:56 +0800 | [diff] [blame] | 175 | close(fd); |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 176 | return ge2d_fail; |
| 177 | } |
| 178 | |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 179 | read_num = read(fd,amlge2d.src_data[0],amlge2d.src_size[0]); |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 180 | if (read_num <= 0) { |
| 181 | E_GE2D("read file read_num=%d error\n",read_num); |
yuhua.lin | 34978d0 | 2021-12-07 11:03:56 +0800 | [diff] [blame] | 182 | close(fd); |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 183 | return ge2d_fail; |
| 184 | } |
| 185 | |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 186 | memcpy(pge2dinfo->src_info[0].vaddr, amlge2d.src_data[0], amlge2d.src_size[0]); |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 187 | #if 0 |
| 188 | printf("pixel: 0x%2x, 0x%2x,0x%2x,0x%2x, 0x%2x,0x%2x,0x%2x,0x%2x\n", |
| 189 | pge2dinfo->src_info[0].vaddr[0], |
| 190 | pge2dinfo->src_info[0].vaddr[1], |
| 191 | pge2dinfo->src_info[0].vaddr[2], |
| 192 | pge2dinfo->src_info[0].vaddr[3], |
| 193 | pge2dinfo->src_info[0].vaddr[4], |
| 194 | pge2dinfo->src_info[0].vaddr[5], |
| 195 | pge2dinfo->src_info[0].vaddr[6], |
| 196 | pge2dinfo->src_info[0].vaddr[7]); |
| 197 | #endif |
| 198 | |
| 199 | close(fd); |
| 200 | return ge2d_success; |
| 201 | } |
| 202 | |
Cao Jian | 53a1514 | 2019-08-16 13:58:17 +0800 | [diff] [blame] | 203 | static int aml_read_file_src2(const char* url , aml_ge2d_info_t *pge2dinfo) |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 204 | { |
| 205 | int fd = -1; |
| 206 | int length = 0; |
| 207 | int read_num = 0; |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 208 | if (amlge2d.src2_size[0] == 0) |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 209 | return 0; |
| 210 | |
| 211 | fd = open(url,O_RDONLY ); |
| 212 | if (fd < 0) { |
| 213 | E_GE2D("read source file:%s open error\n",url); |
| 214 | return ge2d_fail; |
| 215 | } |
| 216 | |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 217 | amlge2d.src2_data[0] = (char*)malloc(amlge2d.src2_size[0]); |
| 218 | if (!amlge2d.src2_data[0]) { |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 219 | E_GE2D("malloc for src_data failed\n"); |
yuhua.lin | 34978d0 | 2021-12-07 11:03:56 +0800 | [diff] [blame] | 220 | close(fd); |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 221 | return ge2d_fail; |
| 222 | } |
| 223 | |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 224 | read_num = read(fd,amlge2d.src2_data[0],amlge2d.src2_size[0]); |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 225 | if (read_num <= 0) { |
| 226 | E_GE2D("read file read_num=%d error\n",read_num); |
yuhua.lin | 34978d0 | 2021-12-07 11:03:56 +0800 | [diff] [blame] | 227 | close(fd); |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 228 | return ge2d_fail; |
| 229 | } |
| 230 | |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 231 | memcpy(pge2dinfo->src_info[1].vaddr[0], amlge2d.src2_data[0], amlge2d.src2_size[0]); |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 232 | close(fd); |
| 233 | return ge2d_success; |
| 234 | } |
| 235 | |
| 236 | #ifdef DUMP_OUTPUT |
Cao Jian | 53a1514 | 2019-08-16 13:58:17 +0800 | [diff] [blame] | 237 | static int aml_write_file(const char* url , aml_ge2d_info_t *pge2dinfo) |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 238 | { |
| 239 | int fd = -1; |
| 240 | int length = 0; |
| 241 | int write_num = 0; |
| 242 | unsigned int *value; |
| 243 | |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 244 | if (amlge2d.dst_size[0] == 0) |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 245 | return 0; |
| 246 | if ((GE2D_CANVAS_OSD0 == pge2dinfo->dst_info.memtype) |
| 247 | || (GE2D_CANVAS_OSD1 == pge2dinfo->dst_info.memtype)) |
| 248 | return 0; |
| 249 | |
| 250 | fd = open(url,O_RDWR | O_CREAT,0660); |
| 251 | if (fd < 0) { |
| 252 | E_GE2D("write file:%s open error\n",url); |
| 253 | return ge2d_fail; |
| 254 | } |
| 255 | |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 256 | amlge2d.dst_data[0] = (char*)malloc(amlge2d.dst_size[0]); |
| 257 | if (!amlge2d.dst_data[0]) { |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 258 | E_GE2D("malloc for dst_data failed\n"); |
| 259 | return ge2d_fail; |
| 260 | } |
| 261 | |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 262 | memcpy(amlge2d.dst_data[0],pge2dinfo->dst_info.vaddr[0],amlge2d.dst_size[0]); |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 263 | |
| 264 | printf("dst pixel: 0x%2x, 0x%2x,0x%2x,0x%2x, 0x%2x,0x%2x,0x%2x,0x%2x\n", |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 265 | pge2dinfo->dst_info.vaddr[0][0], |
| 266 | pge2dinfo->dst_info.vaddr[0][1], |
| 267 | pge2dinfo->dst_info.vaddr[0][2], |
| 268 | pge2dinfo->dst_info.vaddr[0][3], |
| 269 | pge2dinfo->dst_info.vaddr[0][4], |
| 270 | pge2dinfo->dst_info.vaddr[0][5], |
| 271 | pge2dinfo->dst_info.vaddr[0][6], |
| 272 | pge2dinfo->dst_info.vaddr[0][7]); |
| 273 | write_num = write(fd,amlge2d.dst_data[0],amlge2d.dst_size[0]); |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 274 | if (write_num <= 0) { |
| 275 | E_GE2D("read file read_num=%d error\n",write_num); |
| 276 | } |
| 277 | close(fd); |
| 278 | return ge2d_success; |
| 279 | } |
| 280 | #endif |
| 281 | |
| 282 | static int do_strechblit_rotate(aml_ge2d_info_t *pge2dinfo) |
| 283 | { |
| 284 | int ret = -1; |
| 285 | char code = 0; |
| 286 | |
| 287 | pge2dinfo->src_info[0].memtype = GE2D_CANVAS_ALLOC; |
| 288 | pge2dinfo->dst_info.memtype = GE2D_CANVAS_ALLOC; |
| 289 | pge2dinfo->src_info[0].canvas_w = SX_SRC1; |
| 290 | pge2dinfo->src_info[0].canvas_h = SY_SRC1; |
| 291 | pge2dinfo->src_info[0].format = SRC1_PIXFORMAT; |
| 292 | pge2dinfo->dst_info.canvas_w = SX_DST; |
| 293 | pge2dinfo->dst_info.canvas_h = SY_DST; |
| 294 | pge2dinfo->dst_info.format = DST_PIXFORMAT; |
| 295 | |
| 296 | pge2dinfo->src_info[0].rect.x = 0; |
| 297 | pge2dinfo->src_info[0].rect.y = 0; |
| 298 | pge2dinfo->src_info[0].rect.w = SX_SRC1; |
| 299 | pge2dinfo->src_info[0].rect.h = SY_SRC1; |
| 300 | pge2dinfo->dst_info.rect.x = 0; |
| 301 | pge2dinfo->dst_info.rect.y = 0; |
| 302 | pge2dinfo->dst_info.rect.w = SX_DST; |
| 303 | pge2dinfo->dst_info.rect.h = SY_DST; |
| 304 | pge2dinfo->dst_info.rotation = GE2D_ROTATION_180; |
| 305 | pge2dinfo->src_info[0].layer_mode = src1_layer_mode; |
| 306 | pge2dinfo->src_info[0].plane_alpha = gb1_alpha; |
| 307 | |
| 308 | ret = aml_ge2d_process(pge2dinfo); |
| 309 | |
| 310 | return ret; |
| 311 | } |
| 312 | |
| 313 | static int do_blend(aml_ge2d_info_t *pge2dinfo) |
| 314 | { |
| 315 | int ret = -1; |
| 316 | char code = 0; |
| 317 | int shared_fd_bakup; |
| 318 | unsigned long offset_bakup = 0; |
| 319 | |
| 320 | pge2dinfo->src_info[0].memtype = GE2D_CANVAS_ALLOC; |
| 321 | pge2dinfo->src_info[1].memtype = GE2D_CANVAS_ALLOC; |
| 322 | pge2dinfo->dst_info.memtype = GE2D_CANVAS_ALLOC; |
| 323 | pge2dinfo->blend_mode = BLEND_MODE_PREMULTIPLIED; |
| 324 | /* do blend src1 blend src2(dst) to dst */ |
| 325 | |
| 326 | pge2dinfo->src_info[0].canvas_w = SX_SRC1; |
| 327 | pge2dinfo->src_info[0].canvas_h = SY_SRC1; |
| 328 | pge2dinfo->src_info[0].format = SRC1_PIXFORMAT; |
| 329 | pge2dinfo->src_info[0].rect.x = 0; |
| 330 | pge2dinfo->src_info[0].rect.y = 0; |
| 331 | pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w; |
| 332 | pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h; |
| 333 | pge2dinfo->src_info[0].fill_color_en = 0; |
| 334 | |
| 335 | pge2dinfo->src_info[1].canvas_w = SX_SRC2; |
| 336 | pge2dinfo->src_info[1].canvas_h = SY_SRC2; |
| 337 | pge2dinfo->src_info[1].format = SRC2_PIXFORMAT; |
| 338 | pge2dinfo->src_info[1].rect.x = 0; |
| 339 | pge2dinfo->src_info[1].rect.y = 0; |
| 340 | pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w; |
| 341 | pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h; |
| 342 | pge2dinfo->src_info[1].fill_color_en = 0; |
| 343 | if (src2_layer_mode == LAYER_MODE_NON) |
| 344 | pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888; |
| 345 | pge2dinfo->dst_info.canvas_w = SX_DST; |
| 346 | pge2dinfo->dst_info.canvas_h = SY_DST; |
| 347 | pge2dinfo->dst_info.format = DST_PIXFORMAT; |
| 348 | pge2dinfo->dst_info.rect.x = 0; |
| 349 | pge2dinfo->dst_info.rect.y = 0; |
| 350 | pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w; |
| 351 | pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h; |
| 352 | pge2dinfo->dst_info.rotation = GE2D_ROTATION_0; |
| 353 | |
| 354 | pge2dinfo->src_info[0].layer_mode = src1_layer_mode; |
| 355 | pge2dinfo->src_info[1].layer_mode = src2_layer_mode; |
| 356 | pge2dinfo->src_info[0].plane_alpha = gb1_alpha; |
| 357 | pge2dinfo->src_info[1].plane_alpha = gb2_alpha; |
| 358 | ret = aml_ge2d_process(pge2dinfo); |
| 359 | |
| 360 | return ret; |
| 361 | } |
| 362 | |
| 363 | static inline unsigned long myclock() |
| 364 | { |
| 365 | struct timeval tv; |
| 366 | |
| 367 | gettimeofday (&tv, NULL); |
| 368 | |
| 369 | return (tv.tv_sec * 1000 + tv.tv_usec / 1000); |
| 370 | } |
| 371 | |
| 372 | int aml_generate_src1(char *src, aml_ge2d_info_t *pge2dinfo) |
| 373 | { |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 374 | if (amlge2d.src_size[0] == 0) |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 375 | return 0; |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 376 | memcpy(pge2dinfo->src_info[0].vaddr[0], src, amlge2d.src_size[0]); |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 377 | return ge2d_success; |
| 378 | } |
| 379 | |
| 380 | int aml_generate_src2(int color, aml_ge2d_info_t *pge2dinfo) |
| 381 | { |
| 382 | int i = 0; |
| 383 | |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 384 | if (amlge2d.src2_size[0] == 0) |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 385 | return 0; |
| 386 | |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 387 | for (i=0; i<amlge2d.src2_size[0]; ) { |
| 388 | pge2dinfo->src_info[1].vaddr[0][i] = color & 0xff; |
| 389 | pge2dinfo->src_info[1].vaddr[0][i+1] = (color & 0xff00)>>8; |
| 390 | pge2dinfo->src_info[1].vaddr[0][i+2] = (color & 0xff0000)>>16; |
| 391 | pge2dinfo->src_info[1].vaddr[0][i+3] = (color & 0xff000000)>>24; |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 392 | i+=4; |
| 393 | } |
| 394 | return ge2d_success; |
| 395 | } |
| 396 | |
| 397 | int main(int argc, char **argv) |
| 398 | { |
| 399 | int ret = -1; |
| 400 | int i = 0, err_cnt = 0; |
| 401 | unsigned long stime,etime; |
| 402 | |
| 403 | memset(&amlge2d,0x0,sizeof(aml_ge2d_t)); |
| 404 | memset(&(amlge2d.ge2dinfo.src_info[0]), 0, sizeof(buffer_info_t)); |
| 405 | memset(&(amlge2d.ge2dinfo.src_info[1]), 0, sizeof(buffer_info_t)); |
| 406 | memset(&(amlge2d.ge2dinfo.dst_info), 0, sizeof(buffer_info_t)); |
| 407 | ret = parse_command_line(argc,argv); |
| 408 | if (ret == ge2d_fail) |
| 409 | return ge2d_success; |
| 410 | |
| 411 | set_ge2dinfo(&amlge2d.ge2dinfo); |
| 412 | |
| 413 | ret = aml_ge2d_init(&amlge2d); |
| 414 | if (ret < 0) |
| 415 | return ge2d_fail; |
| 416 | |
| 417 | ret = aml_ge2d_mem_alloc(&amlge2d); |
| 418 | if (ret < 0) |
| 419 | goto exit; |
| 420 | |
| 421 | printf("Start GE2D chip check...\n"); |
| 422 | stime = myclock(); |
| 423 | |
| 424 | for (i = 0; i < TEST_NUM; i++) { |
| 425 | /* strechblit + rotate */ |
| 426 | aml_generate_src1((char *)color_bar_code,&amlge2d.ge2dinfo); |
| 427 | amlge2d.ge2dinfo.ge2d_op = AML_GE2D_STRETCHBLIT; |
| 428 | ret = do_strechblit_rotate(&amlge2d.ge2dinfo); |
| 429 | if (ret < 0) { |
| 430 | printf("do_strechblit_rotate err\n"); |
| 431 | } |
| 432 | ret = aml_ge2d_invalid_cache(&amlge2d.ge2dinfo); |
| 433 | if (ret < 0) { |
| 434 | printf("aml_ge2d_invalid_cache err\n"); |
| 435 | } |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 436 | ret = compare_data((char *)color_bar_rotate, amlge2d.ge2dinfo.dst_info.vaddr[0], amlge2d.dst_size[0]); |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 437 | if (ret < 0) { |
| 438 | err_cnt++; |
| 439 | printf("GE2D: strechbilt + rotate 180 [FAILED]\n"); |
| 440 | #ifdef DUMP_OUTPUT |
| 441 | ret = aml_write_file("stretchblit_rotate_err.raw", &amlge2d.ge2dinfo); |
| 442 | if (ret < 0) |
| 443 | printf("stretchblit+rotate dump err\n"); |
| 444 | #endif |
| 445 | } |
| 446 | |
| 447 | /* blend */ |
| 448 | aml_generate_src1((char *)color_bar_rotate,&amlge2d.ge2dinfo); |
| 449 | aml_generate_src2(0x40000000,&amlge2d.ge2dinfo); |
| 450 | amlge2d.ge2dinfo.ge2d_op = AML_GE2D_BLEND; |
| 451 | ret = do_blend(&amlge2d.ge2dinfo); |
| 452 | if (ret < 0) { |
| 453 | printf("do_blend err\n"); |
| 454 | } |
| 455 | ret = aml_ge2d_invalid_cache(&amlge2d.ge2dinfo); |
| 456 | if (ret < 0) { |
| 457 | printf("aml_ge2d_invalid_cache err\n"); |
| 458 | } |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 459 | ret = compare_data((char *)color_bar_blend, amlge2d.ge2dinfo.dst_info.vaddr[0], amlge2d.dst_size[0]); |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 460 | if (ret < 0) { |
| 461 | err_cnt++; |
| 462 | printf("GE2D: blend [FAILED]\n"); |
| 463 | #ifdef DUMP_OUTPUT |
| 464 | ret = aml_write_file("stretchblit_rotate_err.raw", &amlge2d.ge2dinfo); |
| 465 | if (ret < 0) |
| 466 | printf("stretchblit+rotate dump err\n"); |
| 467 | #endif |
| 468 | } |
| 469 | } |
| 470 | etime = myclock(); |
| 471 | D_GE2D("used time %d ms\n",etime - stime); |
| 472 | |
| 473 | if (err_cnt >= TEST_NUM) |
| 474 | printf("===ge2d_slt_test:failed===\n"); |
| 475 | else |
| 476 | printf("===ge2d_slt_test:pass===\n"); |
| 477 | |
| 478 | exit: |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 479 | if (amlge2d.src_data[0]) { |
| 480 | free(amlge2d.src_data[0]); |
| 481 | amlge2d.src_data[0] = NULL; |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 482 | } |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 483 | if (amlge2d.src2_data[0]) { |
| 484 | free(amlge2d.src2_data[0]); |
| 485 | amlge2d.src2_data[0] = NULL; |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 486 | } |
Cao Jian | 6533147 | 2019-11-01 21:01:49 +0800 | [diff] [blame] | 487 | if (amlge2d.dst_data[0]) { |
| 488 | free(amlge2d.dst_data[0]); |
| 489 | amlge2d.dst_data[0] = NULL; |
Cao Jian | aea2cc0 | 2019-07-11 15:22:42 +0800 | [diff] [blame] | 490 | } |
| 491 | aml_ge2d_mem_free(&amlge2d); |
| 492 | aml_ge2d_exit(&amlge2d); |
| 493 | return ge2d_success; |
| 494 | } |