[PATCH] drm/amd/display: Only enable cursor on pipes that need it

Harry Wentland hwentlan at amd.com
Thu Jan 30 18:51:37 UTC 2020


On 2020-01-30 1:29 p.m., Nicholas Kazlauskas wrote:
> [Why]
> In current code we're essentially drawing the cursor on every pipe
> that contains it. This only works when the planes have the same
> scaling for src to dest rect, otherwise we'll get "double cursor" where
> one cursor is incorrectly filtered and offset from the real position.
> 
> [How]
> Without dedicated cursor planes on DCN we require at least one pipe
> that matches the scaling of the current timing.
> 
> This is an optimization and workaround for the most common case where
> the top-most plane is not scaled but the bottom-most plane is scaled.
> 
> Whenever a pipe has a parent pipe in the blending tree whose recout
> fully contains the current pipe we can disable the pipe.
> 
> This only applies when the pipe is actually visible of course.
> 
> Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas at amd.com>

Reviewed-by: Harry Wentland <harry.wentland at amd.com>

Harry

> ---
>  .../amd/display/dc/dcn10/dcn10_hw_sequencer.c | 30 +++++++++++++++++++
>  1 file changed, 30 insertions(+)
> 
> diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
> index f2127afb37b2..1008ac8a0f2a 100644
> --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
> +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
> @@ -2911,6 +2911,33 @@ void dcn10_update_dchub(struct dce_hwseq *hws, struct dchub_init_data *dh_data)
>  	hubbub->funcs->update_dchub(hubbub, dh_data);
>  }
>  
> +static bool dcn10_can_pipe_disable_cursor(struct pipe_ctx *pipe_ctx)
> +{
> +	struct pipe_ctx *test_pipe;
> +	const struct rect *r1 = &pipe_ctx->plane_res.scl_data.recout, *r2;
> +	int r1_r = r1->x + r1->width, r1_b = r1->y + r1->height, r2_r, r2_b;
> +
> +	/**
> +	 * Disable the cursor if there's another pipe above this with a
> +	 * plane that contains this pipe's viewport to prevent double cursor
> +	 * and incorrect scaling artifacts.
> +	 */
> +	for (test_pipe = pipe_ctx->top_pipe; test_pipe;
> +	     test_pipe = test_pipe->top_pipe) {
> +		if (!test_pipe->plane_state->visible)
> +			continue;
> +
> +		r2 = &test_pipe->plane_res.scl_data.recout;
> +		r2_r = r2->x + r2->width;
> +		r2_b = r2->y + r2->height;
> +
> +		if (r1->x >= r2->x && r1->y >= r2->y && r1_r <= r2_r && r1_b <= r2_b)
> +			return true;
> +	}
> +
> +	return false;
> +}
> +
>  void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx)
>  {
>  	struct dc_cursor_position pos_cpy = pipe_ctx->stream->cursor_position;
> @@ -2956,6 +2983,9 @@ void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx)
>  			== PLN_ADDR_TYPE_VIDEO_PROGRESSIVE)
>  		pos_cpy.enable = false;
>  
> +	if (pos_cpy.enable && dcn10_can_pipe_disable_cursor(pipe_ctx))
> +		pos_cpy.enable = false;
> +
>  	// Swap axis and mirror horizontally
>  	if (param.rotation == ROTATION_ANGLE_90) {
>  		uint32_t temp_x = pos_cpy.x;
> 


More information about the amd-gfx mailing list