OSDN Git Service

drm/amd/display: Make sure DSC slice height is divisible by 2 for 4:2:0 color format
authorNikola Cornij <nikola.cornij@amd.com>
Thu, 28 Mar 2019 21:40:18 +0000 (17:40 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Sat, 22 Jun 2019 14:34:09 +0000 (09:34 -0500)
[why] DSC spec requires this

Signed-off-by: Nikola Cornij <nikola.cornij@amd.com>
Reviewed-by: Wenjing Liu <Wenjing.Liu@amd.com>
Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c

index c649f62..6357325 100644 (file)
@@ -658,14 +658,23 @@ static bool setup_dsc_config(
        dsc_cfg->num_slices_h = num_slices_h;
        slice_width = pic_width / num_slices_h;
 
-       // Vertical number of slices: start from policy and pick the first one that height is divisible by
+       // Vertical number of slices: start from policy and pick the first one that height is divisible by.
+       // For 4:2:0 make sure the slice height is divisible by 2 as well.
        pic_height = timing->v_addressable + timing->v_border_top + timing->v_border_bottom;
        num_slices_v = dsc_policy.num_slices_v;
        if (num_slices_v < 1)
                num_slices_v = 1;
 
-       while (num_slices_v >= 1 && (pic_height % num_slices_v != 0))
+       while (num_slices_v >= 1) {
+               if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR420) {
+                       int slice_height = pic_height / num_slices_v;
+                       if (pic_height % num_slices_v == 0 && slice_height % 2 == 0)
+                               break;
+               } else if (pic_height % num_slices_v == 0)
+                       break;
+
                num_slices_v--;
+       }
 
        dsc_cfg->num_slices_v = num_slices_v;