Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/amd/display: Do not bypass chroma scaling in 1:1 case

[Why]
When doing 2:1 downscaling on a YUV sub-sampled format, the chroma
scaling ratio is 1:1. Since chroma has cositing, it is needed to do
scaling on the chroma plane(s) and not to bypass chroma scaling.

[How]
Do not set the chroma taps to one when the chroma ratio is identity
and the input format is a sub-sampled YUV format.

Reviewed-by: Samson Tam <samson.tam@amd.com>
Signed-off-by: Navid Assadian <Navid.Assadian@amd.com>
Signed-off-by: Wayne Lin <wayne.lin@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Navid Assadian and committed by
Alex Deucher
a4d04bc9 ed8045a7

+15 -13
+15 -13
drivers/gpu/drm/amd/display/dc/sspl/dc_spl.c
··· 884 884 885 885 /* Calculate number of tap with adaptive scaling off */ 886 886 static void spl_get_taps_non_adaptive_scaler( 887 - struct spl_scratch *spl_scratch, const struct spl_taps *in_taps, bool always_scale) 887 + struct spl_scratch *spl_scratch, 888 + const struct spl_taps *in_taps, 889 + bool is_subsampled) 888 890 { 889 891 bool check_max_downscale = false; 890 892 ··· 947 945 SPL_ASSERT(check_max_downscale); 948 946 949 947 950 - if (IDENTITY_RATIO(spl_scratch->scl_data.ratios.horz) && !always_scale) 948 + if (IDENTITY_RATIO(spl_scratch->scl_data.ratios.horz)) 951 949 spl_scratch->scl_data.taps.h_taps = 1; 952 - if (IDENTITY_RATIO(spl_scratch->scl_data.ratios.vert) && !always_scale) 950 + if (IDENTITY_RATIO(spl_scratch->scl_data.ratios.vert)) 953 951 spl_scratch->scl_data.taps.v_taps = 1; 954 - if (IDENTITY_RATIO(spl_scratch->scl_data.ratios.horz_c) && !always_scale) 952 + if (IDENTITY_RATIO(spl_scratch->scl_data.ratios.horz_c) && !is_subsampled) 955 953 spl_scratch->scl_data.taps.h_taps_c = 1; 956 - if (IDENTITY_RATIO(spl_scratch->scl_data.ratios.vert_c) && !always_scale) 954 + if (IDENTITY_RATIO(spl_scratch->scl_data.ratios.vert_c) && !is_subsampled) 957 955 spl_scratch->scl_data.taps.v_taps_c = 1; 956 + 958 957 } 959 958 960 959 /* Calculate optimal number of taps */ ··· 968 965 unsigned int max_taps_y, max_taps_c; 969 966 unsigned int min_taps_y, min_taps_c; 970 967 enum lb_memory_config lb_config; 971 - bool skip_easf = false; 972 - bool always_scale = spl_in->basic_out.always_scale; 968 + bool skip_easf = false; 973 969 bool is_subsampled = spl_is_subsampled_format(spl_in->basic_in.format); 974 - 975 970 976 971 if (spl_scratch->scl_data.viewport.width > spl_scratch->scl_data.h_active && 977 972 max_downscale_src_width != 0 && 978 973 spl_scratch->scl_data.viewport.width > max_downscale_src_width) { 979 - spl_get_taps_non_adaptive_scaler(spl_scratch, in_taps, always_scale); 974 + spl_get_taps_non_adaptive_scaler(spl_scratch, in_taps, is_subsampled); 980 975 *enable_easf_v = false; 981 976 *enable_easf_h = false; 982 977 *enable_isharp = false; ··· 983 982 984 983 /* Disable adaptive scaler and sharpener when integer scaling is enabled */ 985 984 if (spl_in->scaling_quality.integer_scaling) { 986 - spl_get_taps_non_adaptive_scaler(spl_scratch, in_taps, always_scale); 985 + spl_get_taps_non_adaptive_scaler(spl_scratch, in_taps, is_subsampled); 987 986 *enable_easf_v = false; 988 987 *enable_easf_h = false; 989 988 *enable_isharp = false; ··· 998 997 * From programming guide: taps = min{ ceil(2*H_RATIO,1), 8} for downscaling 999 998 * taps = 4 for upscaling 1000 999 */ 1001 - if (skip_easf) 1002 - spl_get_taps_non_adaptive_scaler(spl_scratch, in_taps, always_scale); 1000 + if (skip_easf) { 1001 + spl_get_taps_non_adaptive_scaler(spl_scratch, in_taps, is_subsampled); 1002 + } 1003 1003 else { 1004 1004 if (spl_is_video_format(spl_in->basic_in.format)) { 1005 1005 spl_scratch->scl_data.taps.h_taps = 6; ··· 1126 1124 (IDENTITY_RATIO(spl_scratch->scl_data.ratios.vert))) { 1127 1125 spl_scratch->scl_data.taps.h_taps = 1; 1128 1126 spl_scratch->scl_data.taps.v_taps = 1; 1129 - 1130 1127 if (IDENTITY_RATIO(spl_scratch->scl_data.ratios.horz_c) && !is_subsampled) 1131 1128 spl_scratch->scl_data.taps.h_taps_c = 1; 1132 1129 ··· 1150 1149 if ((!*enable_easf_v) && !is_subsampled && 1151 1150 (IDENTITY_RATIO(spl_scratch->scl_data.ratios.vert_c))) 1152 1151 spl_scratch->scl_data.taps.v_taps_c = 1; 1152 + 1153 1153 } 1154 1154 } 1155 1155 return true;