]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amd/display: fix YUV video color corruption in DCN401
authorSamson Tam <samson.tam@amd.com>
Wed, 15 May 2024 21:32:29 +0000 (17:32 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 5 Jun 2024 15:25:14 +0000 (11:25 -0400)
[Why]
Missing check causes sequence error which results in chroma
 filter coefficients not being updated in certain modes
 when we display YUV video in fullscreen.  This results in
 color corruption in video

[How]
Add back chroma_coef_mode check in dscl_set_scl_filter
 so that filter coefficients are calculated and updated when
 we have YUV surface

Reviewed-by: Alvin Lee <alvin.lee2@amd.com>
Acked-by: Zaeem Mohamed <zaeem.mohamed@amd.com>
Signed-off-by: Samson Tam <samson.tam@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dpp/dcn401/dcn401_dpp_dscl.c

index 6cb3fa4b585ce16ec92c43a8702cca86011d44eb..505929800426d240b367e1994bfcc74d45b3080e 100644 (file)
@@ -297,17 +297,21 @@ static void dpp401_dscl_set_scl_filter(
        if ((dpp->base.ctx->dc->config.use_spl) && (!dpp->base.ctx->dc->debug.disable_spl)) {
                filter_h = scl_data->dscl_prog_data.filter_h;
                filter_v = scl_data->dscl_prog_data.filter_v;
-               filter_h_c = scl_data->dscl_prog_data.filter_h_c;
-               filter_v_c = scl_data->dscl_prog_data.filter_v_c;
+               if (chroma_coef_mode) {
+                       filter_h_c = scl_data->dscl_prog_data.filter_h_c;
+                       filter_v_c = scl_data->dscl_prog_data.filter_v_c;
+               }
        } else {
                filter_h = dpp401_dscl_get_filter_coeffs_64p(
                        scl_data->taps.h_taps, scl_data->ratios.horz);
                filter_v = dpp401_dscl_get_filter_coeffs_64p(
                        scl_data->taps.v_taps, scl_data->ratios.vert);
-               filter_h_c = dpp401_dscl_get_filter_coeffs_64p(
-                       scl_data->taps.h_taps_c, scl_data->ratios.horz_c);
-               filter_v_c = dpp401_dscl_get_filter_coeffs_64p(
-                       scl_data->taps.v_taps_c, scl_data->ratios.vert_c);
+               if (chroma_coef_mode) {
+                       filter_h_c = dpp401_dscl_get_filter_coeffs_64p(
+                               scl_data->taps.h_taps_c, scl_data->ratios.horz_c);
+                       filter_v_c = dpp401_dscl_get_filter_coeffs_64p(
+                               scl_data->taps.v_taps_c, scl_data->ratios.vert_c);
+               }
        }
 
        h_2tap_hardcode_coef_en = scl_data->taps.h_taps < 3