drm/amd/display: calculate final viewport before TAP optimization
[ Upstream commit e982310c9ce074e428abc260dc3cba1b1ea62b78 ] 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.laktyushkin@amd.com> Signed-off-by: Yihan Zhu <Yihan.Zhu@amd.com> Signed-off-by: Rodrigo Siqueira <rodrigo.siqueira@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Stable-dep-of: c33a93201ca0 ("drm/amd/display: Ignore scalar validation failure if pipe is phantom") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
1117462773
commit
7c4fd0072a
@@ -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);
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user