.. | .. |
---|
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) { |
---|