]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
drm/amd/display: allow chroma 1:1 scaling when sharpness is off
authorSamson Tam <Samson.Tam@amd.com>
Fri, 8 Nov 2024 00:05:03 +0000 (19:05 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 20 Nov 2024 14:41:16 +0000 (09:41 -0500)
[Why]
SPL code forces taps to 1 when ratio is 1:1 and sharpness is off
But for chroma 1:1, need taps > 1 to handle cositing

[How]
Do not force chroma taps to 1 when ratio is 1:1 for YUV420
Remove 420_CHROMA_BYPASS mode for scaler

Reviewed-by: Navid Assadian <navid.assadian@amd.com>
Signed-off-by: Samson Tam <Samson.Tam@amd.com>
Signed-off-by: Hamza Mahfooz <hamza.mahfooz@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/spl/dc_spl.c

index da477406a4b7a880b7029f69f59214277550ed03..73a65913cb12476b6ce4db3eb056858e998e0568 100644 (file)
@@ -739,14 +739,13 @@ static enum scl_mode spl_get_dscl_mode(const struct spl_in *spl_in,
                        return SCL_MODE_SCALING_444_RGB_ENABLE;
        }
 
-       /* Bypass YUV if at 1:1 with no ISHARP or if doing 2:1 YUV
-        *  downscale without EASF
+       /*
+        * Bypass YUV if Y is 1:1 with no ISHARP
+        * Do not bypass UV at 1:1 for cositing to be applied
         */
-       if ((!enable_isharp) && (!enable_easf)) {
+       if (!enable_isharp) {
                if (data->ratios.horz.value == one && data->ratios.vert.value == one)
                        return SCL_MODE_SCALING_420_LUMA_BYPASS;
-               if (data->ratios.horz_c.value == one && data->ratios.vert_c.value == one)
-                       return SCL_MODE_SCALING_420_CHROMA_BYPASS;
        }
 
        return SCL_MODE_SCALING_420_YCBCR_ENABLE;
@@ -933,6 +932,7 @@ static bool spl_get_optimal_number_of_taps(
        int min_taps_y, min_taps_c;
        enum lb_memory_config lb_config;
        bool skip_easf = false;
+       bool is_ycbcr = spl_dscl_is_video_format(spl_in->basic_in.format);
 
        if (spl_scratch->scl_data.viewport.width > spl_scratch->scl_data.h_active &&
                max_downscale_src_width != 0 &&
@@ -1074,10 +1074,9 @@ static bool spl_get_optimal_number_of_taps(
 
        /* Sharpener requires scaler to be enabled, including for 1:1
         * Check if ISHARP can be enabled
-        * If ISHARP is not enabled, for 1:1, set taps to 1 and disable
-        *  EASF
-        * For case of 2:1 YUV where chroma is 1:1, set taps to 1 if
-        *  EASF is not enabled
+        * If ISHARP is not enabled, set taps to 1 if ratio is 1:1
+        *  except for chroma taps.  Keep previous taps so it can
+        *  handle cositing
         */
 
        *enable_isharp = spl_get_isharp_en(spl_in, spl_scratch);
@@ -1087,20 +1086,28 @@ static bool spl_get_optimal_number_of_taps(
                        spl_scratch->scl_data.taps.h_taps = 1;
                        spl_scratch->scl_data.taps.v_taps = 1;
 
-                       if (IDENTITY_RATIO(spl_scratch->scl_data.ratios.horz_c))
+                       if (IDENTITY_RATIO(spl_scratch->scl_data.ratios.horz_c) && !is_ycbcr)
                                spl_scratch->scl_data.taps.h_taps_c = 1;
 
-                       if (IDENTITY_RATIO(spl_scratch->scl_data.ratios.vert_c))
+                       if (IDENTITY_RATIO(spl_scratch->scl_data.ratios.vert_c) && !is_ycbcr)
                                spl_scratch->scl_data.taps.v_taps_c = 1;
 
                        *enable_easf_v = false;
                        *enable_easf_h = false;
                } else {
                        if ((!*enable_easf_h) &&
+                               (IDENTITY_RATIO(spl_scratch->scl_data.ratios.horz)))
+                               spl_scratch->scl_data.taps.h_taps = 1;
+
+                       if ((!*enable_easf_v) &&
+                               (IDENTITY_RATIO(spl_scratch->scl_data.ratios.vert)))
+                               spl_scratch->scl_data.taps.v_taps = 1;
+
+                       if ((!*enable_easf_h) && !is_ycbcr &&
                                (IDENTITY_RATIO(spl_scratch->scl_data.ratios.horz_c)))
                                spl_scratch->scl_data.taps.h_taps_c = 1;
 
-                       if ((!*enable_easf_v) &&
+                       if ((!*enable_easf_v) && !is_ycbcr &&
                                (IDENTITY_RATIO(spl_scratch->scl_data.ratios.vert_c)))
                                spl_scratch->scl_data.taps.v_taps_c = 1;
                }
@@ -1111,8 +1118,7 @@ static bool spl_get_optimal_number_of_taps(
 static void spl_set_black_color_data(enum spl_pixel_format format,
                        struct scl_black_color *scl_black_color)
 {
-       bool ycbcr = format >= SPL_PIXEL_FORMAT_VIDEO_BEGIN
-                                       && format <= SPL_PIXEL_FORMAT_VIDEO_END;
+       bool ycbcr = spl_dscl_is_video_format(format);
        if (ycbcr)      {
                scl_black_color->offset_rgb_y = BLACK_OFFSET_RGB_Y;
                scl_black_color->offset_rgb_cbcr = BLACK_OFFSET_CBCR;