[PATCH] drm/amd/display: dual cursors are seen if scaling is enabled
Harry Wentland
harry.wentland at amd.com
Mon Mar 29 17:33:39 UTC 2021
On 2021-03-29 3:54 a.m., Louis Li wrote:
> [Why]
> This issue is found when scaling is not equal to one from src to dest.
> When issue happens, there are offsets in both axis x and y between
> two cursors. Users cannot control APP under such a condition.
>
What's the use case? I don't think we support two cursors on a screen.
Does this pass IGT cursor tests?
Nick, I thought we don't allow cursor on anything but the top, unscaled
pipe.
Harry
> [How]
> For dual cursors, cursor should be disabled if there is a visible pipe
> on top of the current pipe at the current cursor position.
> For offsets between two cursors, need translate cursor position from
> stream space to plane space with scaling into consideration.
>
> Tested-by: Louis Li <Ching-shih.Li at amd.com>
> Signed-off-by: Louis Li <Ching-shih.Li at amd.com>
> Change-Id: Ic19e4f3b9225736f037f5ade10b68e8afe5f9ab7
> ---
> .../amd/display/dc/dcn10/dcn10_hw_sequencer.c | 40 ++++++++++++++-----
> 1 file changed, 30 insertions(+), 10 deletions(-)
>
> 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 83212ea40077..1ce5e58e3a9e 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
> @@ -2999,6 +2999,10 @@ static bool dcn10_can_pipe_disable_cursor(struct pipe_ctx *pipe_ctx)
> 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;
>
> + struct dc_cursor_position pos_cpy = pipe_ctx->stream->cursor_position;
> + int cp_x = pos_cpy.x;
> + int cp_y = pos_cpy.y;
> +
> /**
> * Disable the cursor if there's another pipe above this with a
> * plane that contains this pipe's viewport to prevent double cursor
> @@ -3013,7 +3017,8 @@ static bool dcn10_can_pipe_disable_cursor(struct pipe_ctx *pipe_ctx)
> 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)
> + if ((cp_x >= r1->x && cp_y >= r1->y && cp_x <= r1_r && cp_y <= r1_b)
> + && (cp_x >= r2->x && cp_y >= r2->y && cp_x <= r2_r && cp_y <= r2_b))
> return true;
> }
>
> @@ -3034,15 +3039,30 @@ static void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx)
> .rotation = pipe_ctx->plane_state->rotation,
> .mirror = pipe_ctx->plane_state->horizontal_mirror
> };
> - uint32_t x_plane = pipe_ctx->plane_state->dst_rect.x;
> - uint32_t y_plane = pipe_ctx->plane_state->dst_rect.y;
> - uint32_t x_offset = min(x_plane, pos_cpy.x);
> - uint32_t y_offset = min(y_plane, pos_cpy.y);
> -
> - pos_cpy.x -= x_offset;
> - pos_cpy.y -= y_offset;
> - pos_cpy.x_hotspot += (x_plane - x_offset);
> - pos_cpy.y_hotspot += (y_plane - y_offset);
> +
> + int x_plane = pipe_ctx->plane_state->dst_rect.x;
> + int y_plane = pipe_ctx->plane_state->dst_rect.y;
> + int x_pos = pos_cpy.x;
> + int y_pos = pos_cpy.y;
> +
> + // translate cursor from stream space to plane space
> + x_pos = (x_pos - x_plane) * pipe_ctx->plane_state->src_rect.width /
> + pipe_ctx->plane_state->dst_rect.width;
> + y_pos = (y_pos - y_plane) * pipe_ctx->plane_state->src_rect.height /
> + pipe_ctx->plane_state->dst_rect.height;
> +
> + if (x_pos < 0) {
> + pos_cpy.x_hotspot -= x_pos;
> + x_pos = 0;
> + }
> +
> + if (y_pos < 0) {
> + pos_cpy.y_hotspot -= y_pos;
> + y_pos = 0;
> + }
> +
> + pos_cpy.x = (uint32_t)x_pos;
> + pos_cpy.y = (uint32_t)y_pos;
>
> if (pipe_ctx->plane_state->address.type
> == PLN_ADDR_TYPE_VIDEO_PROGRESSIVE)
>
More information about the amd-gfx
mailing list