From: Yihan Zhu <yihan....@amd.com>

Viewport size excess surface size observed sometime with some timings or
resizing the MPO video window to cause MPO unsupported. Calculate final
viewport size first with a 100x100 dummy viewport to get the max TAP
support and then re-run final viewport calculation if TAP value changed.
Removed obsolete preliminary viewport calculation for TAP validation.

Reviewed-by: Dmytro Laktyushkin <dmytro.laktyush...@amd.com>
Signed-off-by: Yihan Zhu <yihan....@amd.com>
Signed-off-by: Rodrigo Siqueira <rodrigo.sique...@amd.com>
---
 .../gpu/drm/amd/display/dc/core/dc_resource.c | 49 +++++++++----------
 1 file changed, 23 insertions(+), 26 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
index c7599c40d4be..df513dbd32bd 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
@@ -765,25 +765,6 @@ static inline void get_vp_scan_direction(
                *flip_horz_scan_dir = !*flip_horz_scan_dir;
 }
 
-/*
- * This is a preliminary vp size calculation to allow us to check taps support.
- * The result is completely overridden afterwards.
- */
-static void calculate_viewport_size(struct pipe_ctx *pipe_ctx)
-{
-       struct scaler_data *data = &pipe_ctx->plane_res.scl_data;
-
-       data->viewport.width = 
dc_fixpt_ceil(dc_fixpt_mul_int(data->ratios.horz, data->recout.width));
-       data->viewport.height = 
dc_fixpt_ceil(dc_fixpt_mul_int(data->ratios.vert, data->recout.height));
-       data->viewport_c.width = 
dc_fixpt_ceil(dc_fixpt_mul_int(data->ratios.horz_c, data->recout.width));
-       data->viewport_c.height = 
dc_fixpt_ceil(dc_fixpt_mul_int(data->ratios.vert_c, data->recout.height));
-       if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_90 ||
-                       pipe_ctx->plane_state->rotation == ROTATION_ANGLE_270) {
-               swap(data->viewport.width, data->viewport.height);
-               swap(data->viewport_c.width, data->viewport_c.height);
-       }
-}
-
 static struct rect intersect_rec(const struct rect *r0, const struct rect *r1)
 {
        struct rect rec;
@@ -1468,6 +1449,7 @@ bool resource_build_scaling_params(struct pipe_ctx 
*pipe_ctx)
        const struct dc_plane_state *plane_state = pipe_ctx->plane_state;
        struct dc_crtc_timing *timing = &pipe_ctx->stream->timing;
        const struct rect odm_slice_src = 
resource_get_odm_slice_src_rect(pipe_ctx);
+       struct scaling_taps temp = {0};
        bool res = false;
 
        DC_LOGGER_INIT(pipe_ctx->stream->ctx->logger);
@@ -1525,8 +1507,6 @@ bool resource_build_scaling_params(struct pipe_ctx 
*pipe_ctx)
        calculate_recout(pipe_ctx);
        /* depends on pixel format */
        calculate_scaling_ratios(pipe_ctx);
-       /* depends on scaling ratios and recout, does not calculate offset yet 
*/
-       calculate_viewport_size(pipe_ctx);
 
        /*
         * LB calculations depend on vp size, h/v_active and scaling ratios
@@ -1547,6 +1527,24 @@ bool resource_build_scaling_params(struct pipe_ctx 
*pipe_ctx)
 
        pipe_ctx->plane_res.scl_data.lb_params.alpha_en = 
plane_state->per_pixel_alpha;
 
+       // get TAP value with 100x100 dummy data for max scaling qualify, 
override
+       // if a new scaling quality required
+       pipe_ctx->plane_res.scl_data.viewport.width = 100;
+       pipe_ctx->plane_res.scl_data.viewport.height = 100;
+       pipe_ctx->plane_res.scl_data.viewport_c.width = 100;
+       pipe_ctx->plane_res.scl_data.viewport_c.height = 100;
+       if (pipe_ctx->plane_res.xfm != NULL)
+               res = 
pipe_ctx->plane_res.xfm->funcs->transform_get_optimal_number_of_taps(
+                               pipe_ctx->plane_res.xfm, 
&pipe_ctx->plane_res.scl_data, &plane_state->scaling_quality);
+
+       if (pipe_ctx->plane_res.dpp != NULL)
+               res = 
pipe_ctx->plane_res.dpp->funcs->dpp_get_optimal_number_of_taps(
+                               pipe_ctx->plane_res.dpp, 
&pipe_ctx->plane_res.scl_data, &plane_state->scaling_quality);
+
+       temp = pipe_ctx->plane_res.scl_data.taps;
+
+       calculate_inits_and_viewports(pipe_ctx);
+
        if (pipe_ctx->plane_res.xfm != NULL)
                res = 
pipe_ctx->plane_res.xfm->funcs->transform_get_optimal_number_of_taps(
                                pipe_ctx->plane_res.xfm, 
&pipe_ctx->plane_res.scl_data, &plane_state->scaling_quality);
@@ -1573,11 +1571,10 @@ bool resource_build_scaling_params(struct pipe_ctx 
*pipe_ctx)
                                        &plane_state->scaling_quality);
        }
 
-       /*
-        * Depends on recout, scaling ratios, h_active and taps
-        * May need to re-check lb size after this in some obscure scenario
-        */
-       if (res)
+       if (res && (pipe_ctx->plane_res.scl_data.taps.v_taps != temp.v_taps ||
+               pipe_ctx->plane_res.scl_data.taps.h_taps != temp.h_taps ||
+               pipe_ctx->plane_res.scl_data.taps.v_taps_c != temp.v_taps_c ||
+               pipe_ctx->plane_res.scl_data.taps.h_taps_c != temp.h_taps_c))
                calculate_inits_and_viewports(pipe_ctx);
 
        /*
-- 
2.45.2

Reply via email to