| .. | .. |
|---|
| 46 | 46 | static int vehicle_dump_cif; |
|---|
| 47 | 47 | static int vehicle_dump_rga; |
|---|
| 48 | 48 | static int vehicle_dump_vop; |
|---|
| 49 | | -static bool nv12_display = true; |
|---|
| 50 | 49 | |
|---|
| 51 | 50 | enum force_value { |
|---|
| 52 | 51 | FORCE_WIDTH = 1920, |
|---|
| .. | .. |
|---|
| 326 | 325 | if (inited) |
|---|
| 327 | 326 | return 0; |
|---|
| 328 | 327 | |
|---|
| 328 | + VEHICLE_INFO("%s: v_cfg->rotate_mirror(0x%x)\n", __func__, v_cfg->rotate_mirror); |
|---|
| 329 | + |
|---|
| 329 | 330 | // if (FORCE_ROTATION == RGA_TRANSFORM_ROT_270 || FORCE_ROTATION == RGA_TRANSFORM_ROT_90) { |
|---|
| 330 | | - if (v_cfg->rotate_mirror == 0x01 || v_cfg->rotate_mirror == 0x04) { |
|---|
| 331 | + if ((v_cfg->rotate_mirror & RGA_TRANSFORM_ROT_MASK) == 0x01 || |
|---|
| 332 | + (v_cfg->rotate_mirror & RGA_TRANSFORM_ROT_MASK) == 0x04) { |
|---|
| 331 | 333 | w = FORCE_WIDTH; |
|---|
| 332 | 334 | h = ALIGN(FORCE_HEIGHT, 64); |
|---|
| 333 | 335 | s = ALIGN(FORCE_HEIGHT, 64); |
|---|
| .. | .. |
|---|
| 387 | 389 | // f = HAL_PIXEL_FORMAT_RGBX_8888; |
|---|
| 388 | 390 | // if (FORCE_ROTATION == RGA_TRANSFORM_ROT_270 || |
|---|
| 389 | 391 | // FORCE_ROTATION == RGA_TRANSFORM_ROT_90) |
|---|
| 390 | | - if (v_cfg->rotate_mirror == 0x01 || v_cfg->rotate_mirror == 0x04) |
|---|
| 392 | + if ((v_cfg->rotate_mirror & RGA_TRANSFORM_ROT_MASK) == 0x01 || |
|---|
| 393 | + (v_cfg->rotate_mirror & RGA_TRANSFORM_ROT_MASK) == 0x04) |
|---|
| 391 | 394 | ret = rk_flinger_alloc_buffer(flg, buffer, h, w, s, f); |
|---|
| 392 | 395 | else |
|---|
| 393 | 396 | ret = rk_flinger_alloc_buffer(flg, buffer, w, h, s, f); |
|---|
| .. | .. |
|---|
| 528 | 531 | src_rect = &buffer->src; |
|---|
| 529 | 532 | dst_rect = &buffer->dst; |
|---|
| 530 | 533 | |
|---|
| 531 | | - switch (buffer->rotation) { |
|---|
| 534 | + switch (buffer->rotation & RGA_TRANSFORM_ROT_MASK) { |
|---|
| 532 | 535 | case RGA_TRANSFORM_ROT_90: |
|---|
| 533 | 536 | case RGA_TRANSFORM_ROT_270: |
|---|
| 534 | 537 | dst_rect->x = src_rect->x; |
|---|
| .. | .. |
|---|
| 662 | 665 | rga_request.rotate_mode = 0; |
|---|
| 663 | 666 | rga_request.sina = 0; |
|---|
| 664 | 667 | rga_request.cosa = 0; |
|---|
| 665 | | - rga_request.yuv2rgb_mode = 0x1 << 0; // limit range |
|---|
| 668 | + |
|---|
| 669 | + rga_request.yuv2rgb_mode = 0x0 << 0; // yuvtoyuv config 0 |
|---|
| 670 | + /* yuv to rgb color space transform if need */ |
|---|
| 671 | + //rga_request.yuv2rgb_mode = 0x1 << 0; // limit range |
|---|
| 666 | 672 | //rga_request.yuv2rgb_mode = 0x2 << 0; // full range |
|---|
| 667 | 673 | |
|---|
| 668 | 674 | rga_request.src.act_w = src_buffer->src.w; |
|---|
| .. | .. |
|---|
| 685 | 691 | rga_request.dst.yrgb_addr = dst_buffer->fd; |
|---|
| 686 | 692 | rga_request.dst.uv_addr = 0; |
|---|
| 687 | 693 | rga_request.dst.v_addr = 0; |
|---|
| 688 | | - rga_request.dst.format = RGA_FORMAT_RGBX_8888; |
|---|
| 694 | + rga_request.dst.format = RGA_FORMAT_YCrCb_420_SP; |
|---|
| 689 | 695 | |
|---|
| 690 | 696 | rga_request.scale_mode = 1; |
|---|
| 691 | 697 | |
|---|
| .. | .. |
|---|
| 834 | 840 | rga_request.rotate_mode = 0; |
|---|
| 835 | 841 | rga_request.sina = 0; |
|---|
| 836 | 842 | rga_request.cosa = 0; |
|---|
| 837 | | - rga_request.dst.vir_w = ALIGN(ds, 64); |
|---|
| 843 | + rga_request.dst.vir_w = ds; |
|---|
| 838 | 844 | rga_request.dst.vir_h = dh; |
|---|
| 839 | 845 | rga_request.dst.act_w = dw; |
|---|
| 840 | 846 | rga_request.dst.act_h = dh; |
|---|
| .. | .. |
|---|
| 843 | 849 | break; |
|---|
| 844 | 850 | case RGA_TRANSFORM_FLIP_H:/*x mirror*/ |
|---|
| 845 | 851 | rga_request.rotate_mode = 2; |
|---|
| 846 | | - rga_request.dst.vir_w = ALIGN(ds, 64); |
|---|
| 852 | + rga_request.dst.vir_w = ds; |
|---|
| 847 | 853 | rga_request.dst.vir_h = dh; |
|---|
| 848 | 854 | rga_request.dst.act_w = dw; |
|---|
| 849 | 855 | rga_request.dst.act_h = dh; |
|---|
| .. | .. |
|---|
| 852 | 858 | break; |
|---|
| 853 | 859 | case RGA_TRANSFORM_FLIP_V:/*y mirror*/ |
|---|
| 854 | 860 | rga_request.rotate_mode = 3; |
|---|
| 855 | | - rga_request.dst.vir_w = ALIGN(ds, 64); |
|---|
| 861 | + rga_request.dst.vir_w = ds; |
|---|
| 856 | 862 | rga_request.dst.vir_h = dh; |
|---|
| 857 | 863 | rga_request.dst.act_w = dw; |
|---|
| 858 | 864 | rga_request.dst.act_h = dh; |
|---|
| .. | .. |
|---|
| 863 | 869 | rga_request.rotate_mode = 1; |
|---|
| 864 | 870 | rga_request.sina = 65536; |
|---|
| 865 | 871 | rga_request.cosa = 0; |
|---|
| 866 | | - rga_request.dst.vir_w = ALIGN(ds, 64); |
|---|
| 872 | + rga_request.dst.vir_w = ds; |
|---|
| 867 | 873 | rga_request.dst.vir_h = dh; |
|---|
| 868 | 874 | rga_request.dst.act_w = dh; |
|---|
| 869 | 875 | rga_request.dst.act_h = dw; |
|---|
| .. | .. |
|---|
| 874 | 880 | rga_request.rotate_mode = 1; |
|---|
| 875 | 881 | rga_request.sina = 0; |
|---|
| 876 | 882 | rga_request.cosa = -65536; |
|---|
| 877 | | - rga_request.dst.vir_w = ALIGN(ds, 64); |
|---|
| 883 | + rga_request.dst.vir_w = ds; |
|---|
| 878 | 884 | rga_request.dst.vir_h = dh; |
|---|
| 879 | 885 | rga_request.dst.act_w = dw; |
|---|
| 880 | 886 | rga_request.dst.act_h = dh; |
|---|
| .. | .. |
|---|
| 885 | 891 | rga_request.rotate_mode = 1; |
|---|
| 886 | 892 | rga_request.sina = -65536; |
|---|
| 887 | 893 | rga_request.cosa = 0; |
|---|
| 888 | | - rga_request.dst.vir_w = ALIGN(ds, 64); |
|---|
| 894 | + rga_request.dst.vir_w = ds; |
|---|
| 889 | 895 | rga_request.dst.vir_h = dh; |
|---|
| 890 | 896 | rga_request.dst.act_w = dh; |
|---|
| 891 | 897 | rga_request.dst.act_h = dw; |
|---|
| .. | .. |
|---|
| 896 | 902 | rga_request.rotate_mode = 0; |
|---|
| 897 | 903 | rga_request.sina = 0; |
|---|
| 898 | 904 | rga_request.cosa = 0; |
|---|
| 899 | | - rga_request.dst.vir_w = ALIGN(ds, 64); |
|---|
| 905 | + rga_request.dst.vir_w = ds; |
|---|
| 900 | 906 | rga_request.dst.vir_h = dh; |
|---|
| 901 | 907 | rga_request.dst.act_w = dw; |
|---|
| 902 | 908 | rga_request.dst.act_h = dh; |
|---|
| .. | .. |
|---|
| 952 | 958 | |
|---|
| 953 | 959 | static int rk_flinger_rga_render(struct flinger *flinger, |
|---|
| 954 | 960 | struct graphic_buffer *src_buffer, |
|---|
| 955 | | - struct graphic_buffer *dst_buffer) |
|---|
| 961 | + struct graphic_buffer *dst_buffer, |
|---|
| 962 | + struct graphic_buffer *tmp_buffer) |
|---|
| 956 | 963 | { |
|---|
| 964 | + int rotation; |
|---|
| 965 | + |
|---|
| 957 | 966 | if (!flinger || !src_buffer || !dst_buffer) |
|---|
| 958 | 967 | return -EINVAL; |
|---|
| 959 | 968 | |
|---|
| 960 | 969 | if (dst_buffer && dst_buffer->rel_fence) |
|---|
| 961 | 970 | dst_buffer->rel_fence = NULL; |
|---|
| 962 | 971 | |
|---|
| 963 | | - rk_flinger_rga_blit(flinger, src_buffer, dst_buffer); |
|---|
| 964 | | - rk_flinger_fill_buffer_rects(dst_buffer, &src_buffer->dst, |
|---|
| 965 | | - &src_buffer->dst); |
|---|
| 966 | | - dst_buffer->src.f = src_buffer->dst.f; |
|---|
| 972 | + if ((src_buffer->rotation & RGA_TRANSFORM_ROT_MASK) && |
|---|
| 973 | + (src_buffer->rotation & RGA_TRANSFORM_FLIP_MASK)) { |
|---|
| 967 | 974 | |
|---|
| 975 | + rotation = flinger->v_cfg.rotate_mirror; |
|---|
| 976 | + /* 1. rotate */ |
|---|
| 977 | + src_buffer->rotation = rotation & RGA_TRANSFORM_ROT_MASK; |
|---|
| 978 | + rk_flinger_rga_blit(flinger, src_buffer, tmp_buffer); |
|---|
| 979 | + rk_flinger_fill_buffer_rects(tmp_buffer, &src_buffer->dst, |
|---|
| 980 | + &src_buffer->dst); |
|---|
| 981 | + tmp_buffer->src.f = src_buffer->dst.f; |
|---|
| 982 | + tmp_buffer->rotation = rotation & RGA_TRANSFORM_FLIP_MASK; |
|---|
| 983 | + /* 2. mirror */ |
|---|
| 984 | + rk_flinger_rga_blit(flinger, tmp_buffer, dst_buffer); |
|---|
| 985 | + rk_flinger_fill_buffer_rects(dst_buffer, &tmp_buffer->dst, |
|---|
| 986 | + &tmp_buffer->dst); |
|---|
| 987 | + dst_buffer->src.f = src_buffer->dst.f; |
|---|
| 988 | + |
|---|
| 989 | + src_buffer->rotation = rotation; |
|---|
| 990 | + } else { |
|---|
| 991 | + rk_flinger_rga_blit(flinger, src_buffer, dst_buffer); |
|---|
| 992 | + rk_flinger_fill_buffer_rects(dst_buffer, &src_buffer->dst, |
|---|
| 993 | + &src_buffer->dst); |
|---|
| 994 | + dst_buffer->src.f = src_buffer->dst.f; |
|---|
| 995 | + } |
|---|
| 968 | 996 | /* save rga out buffer */ |
|---|
| 969 | 997 | if (vehicle_dump_rga) { |
|---|
| 970 | 998 | struct file *filep = NULL; |
|---|
| .. | .. |
|---|
| 1074 | 1102 | rockchip_drm_direct_show_commit(flinger->drm_dev, &commit_info); |
|---|
| 1075 | 1103 | } |
|---|
| 1076 | 1104 | |
|---|
| 1105 | +static int drop_frames_number; |
|---|
| 1077 | 1106 | static int rk_flinger_vop_show(struct flinger *flinger, |
|---|
| 1078 | 1107 | struct graphic_buffer *buffer) |
|---|
| 1079 | 1108 | { |
|---|
| .. | .. |
|---|
| 1082 | 1111 | |
|---|
| 1083 | 1112 | VEHICLE_DG("flinger vop show buffer wxh(%zux%zu)\n", |
|---|
| 1084 | 1113 | buffer->src.w, buffer->src.h); |
|---|
| 1114 | + if (drop_frames_number > 0) { |
|---|
| 1115 | + VEHICLE_INFO("%s discard the frame num(%d)!\n", __func__, drop_frames_number); |
|---|
| 1116 | + drop_frames_number--; |
|---|
| 1117 | + return 0; |
|---|
| 1118 | + } |
|---|
| 1119 | + |
|---|
| 1085 | 1120 | if (!flinger->running) |
|---|
| 1086 | 1121 | return 0; |
|---|
| 1087 | 1122 | |
|---|
| .. | .. |
|---|
| 1160 | 1195 | FORCE_XOFFSET, FORCE_YOFFSET, |
|---|
| 1161 | 1196 | v_cfg->width, v_cfg->height, |
|---|
| 1162 | 1197 | v_cfg->width, FORCE_FORMAT); |
|---|
| 1163 | | - rk_flinger_set_buffer_rotation(buffer, FORCE_ROTATION); |
|---|
| 1198 | + rk_flinger_set_buffer_rotation(buffer, v_cfg->rotate_mirror); |
|---|
| 1164 | 1199 | rk_flinger_cacultae_dst_rect_by_rotation(buffer); |
|---|
| 1165 | 1200 | buffer->dst.f = buffer->src.f; |
|---|
| 1201 | + VEHICLE_INFO("buffer[%d]->rotation(%d).\n", |
|---|
| 1202 | + i, buffer->rotation); |
|---|
| 1166 | 1203 | } |
|---|
| 1167 | 1204 | } |
|---|
| 1168 | 1205 | } |
|---|
| .. | .. |
|---|
| 1294 | 1331 | VEHICLE_DG("it is ypbpr signal\n"); |
|---|
| 1295 | 1332 | iep_buffer = &(flg->target_buffer[NUM_TARGET_BUFFERS - 1]); |
|---|
| 1296 | 1333 | iep_buffer->state = ACQUIRE; |
|---|
| 1297 | | - //scaler by rga for rgbx8888/rgb888/rgb565 display |
|---|
| 1298 | | - if (!nv12_display) { |
|---|
| 1299 | | - rk_flinger_rga_render(flg, src_buffer, iep_buffer); |
|---|
| 1300 | | - src_buffer->state = FREE; |
|---|
| 1301 | | - rk_flinger_rga_scaler(flg, iep_buffer, dst_buffer); |
|---|
| 1302 | | - iep_buffer->state = FREE; |
|---|
| 1303 | | - rk_flinger_vop_show(flg, dst_buffer); |
|---|
| 1304 | | - } else { |
|---|
| 1305 | | - rk_flinger_rga_render(flg, src_buffer, dst_buffer); |
|---|
| 1306 | | - src_buffer->state = FREE; |
|---|
| 1307 | | - rk_flinger_vop_show(flg, dst_buffer); |
|---|
| 1308 | | - // rk_flinger_vop_show(flg, src_buffer); |
|---|
| 1309 | | - } |
|---|
| 1310 | | - |
|---|
| 1334 | + //scaler by rga to force widthxheight display |
|---|
| 1335 | + rk_flinger_rga_render(flg, src_buffer, iep_buffer, dst_buffer); |
|---|
| 1336 | + src_buffer->state = FREE; |
|---|
| 1337 | + rk_flinger_rga_scaler(flg, iep_buffer, dst_buffer); |
|---|
| 1338 | + iep_buffer->state = FREE; |
|---|
| 1339 | + rk_flinger_vop_show(flg, dst_buffer); |
|---|
| 1311 | 1340 | for (i = 0; i < NUM_TARGET_BUFFERS; i++) { |
|---|
| 1312 | 1341 | buffer = &(flinger->target_buffer[i]); |
|---|
| 1313 | 1342 | if (buffer->state == DISPLAY) |
|---|
| .. | .. |
|---|
| 1318 | 1347 | } else { |
|---|
| 1319 | 1348 | // cvbs |
|---|
| 1320 | 1349 | VEHICLE_DG("it is a cvbs signal\n"); |
|---|
| 1321 | | - rk_flinger_rga_render(flg, src_buffer, dst_buffer); |
|---|
| 1350 | + rk_flinger_rga_render(flg, src_buffer, dst_buffer, iep_buffer); |
|---|
| 1322 | 1351 | src_buffer->state = FREE; |
|---|
| 1323 | 1352 | rk_flinger_iep_deinterlace(flg, dst_buffer, iep_buffer); |
|---|
| 1324 | 1353 | dst_buffer->state = FREE; |
|---|
| .. | .. |
|---|
| 1384 | 1413 | |
|---|
| 1385 | 1414 | static bool vehicle_rotation_param_check(struct vehicle_cfg *v_cfg) |
|---|
| 1386 | 1415 | { |
|---|
| 1387 | | - switch (v_cfg->rotate_mirror) { |
|---|
| 1416 | + switch (v_cfg->rotate_mirror & RGA_TRANSFORM_ROT_MASK) { |
|---|
| 1388 | 1417 | case RGA_TRANSFORM_ROT_90: |
|---|
| 1389 | 1418 | case RGA_TRANSFORM_ROT_270: |
|---|
| 1390 | 1419 | case RGA_TRANSFORM_ROT_0: |
|---|
| 1391 | 1420 | case RGA_TRANSFORM_ROT_180: |
|---|
| 1421 | + return true; |
|---|
| 1422 | + default: |
|---|
| 1423 | + VEHICLE_INFO("invalid rotate-mirror param %d\n", |
|---|
| 1424 | + v_cfg->rotate_mirror); |
|---|
| 1425 | + v_cfg->rotate_mirror = v_cfg->rotate_mirror & RGA_TRANSFORM_FLIP_MASK; |
|---|
| 1426 | + return false; |
|---|
| 1427 | + } |
|---|
| 1428 | + |
|---|
| 1429 | + switch (v_cfg->rotate_mirror & RGA_TRANSFORM_FLIP_MASK) { |
|---|
| 1392 | 1430 | case RGA_TRANSFORM_FLIP_H: |
|---|
| 1393 | 1431 | case RGA_TRANSFORM_FLIP_V: |
|---|
| 1394 | 1432 | return true; |
|---|
| 1395 | 1433 | default: |
|---|
| 1396 | 1434 | VEHICLE_INFO("invalid rotate-mirror param %d\n", |
|---|
| 1397 | 1435 | v_cfg->rotate_mirror); |
|---|
| 1398 | | - v_cfg->rotate_mirror = 0; |
|---|
| 1436 | + v_cfg->rotate_mirror = v_cfg->rotate_mirror & RGA_TRANSFORM_ROT_MASK; |
|---|
| 1399 | 1437 | return false; |
|---|
| 1400 | 1438 | } |
|---|
| 1401 | 1439 | } |
|---|
| .. | .. |
|---|
| 1450 | 1488 | flg->cvbs_field_count = 0; |
|---|
| 1451 | 1489 | memcpy(&flg->v_cfg, v_cfg, sizeof(struct vehicle_cfg)); |
|---|
| 1452 | 1490 | flg->running = true; |
|---|
| 1491 | + drop_frames_number = v_cfg->drop_frames; |
|---|
| 1453 | 1492 | |
|---|
| 1454 | 1493 | return 0; |
|---|
| 1455 | 1494 | } |
|---|
| .. | .. |
|---|
| 1475 | 1514 | int i; |
|---|
| 1476 | 1515 | |
|---|
| 1477 | 1516 | src_buffer = NULL; |
|---|
| 1478 | | - found = last_src_index + 1; |
|---|
| 1479 | 1517 | for (i = 1; i < NUM_SOURCE_BUFFERS; i++) { |
|---|
| 1480 | | - found = (found + i) % NUM_SOURCE_BUFFERS; |
|---|
| 1518 | + found = (last_src_index + i) % NUM_SOURCE_BUFFERS; |
|---|
| 1481 | 1519 | VEHICLE_DG("%s,flg->source_buffer[%d].state(%d)", |
|---|
| 1482 | 1520 | __func__, found, flg->source_buffer[found].state); |
|---|
| 1483 | 1521 | if (flg->source_buffer[found].state == FREE) { |
|---|