lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <bd4ec0cf-eb7b-4323-08f0-43f95ea75d64@amd.com>
Date:   Mon, 29 Mar 2021 13:33:39 -0400
From:   Harry Wentland <harry.wentland@....com>
To:     Louis Li <Ching-shih.Li@....com>
Cc:     ching-li@....com, Leo Li <sunpeng.li@....com>,
        Alex Deucher <alexander.deucher@....com>,
        Christian König <christian.koenig@....com>,
        "David (ChunMing) Zhou" <David1.Zhou@....com>,
        David Airlie <airlied@...ux.ie>,
        Daniel Vetter <daniel@...ll.ch>,
        Nicholas Kazlauskas <Nicholas.Kazlauskas@....com>,
        Ikshwaku Chauhan <ikshwaku.chauhan@....corp-partner.google.com>,
        Aric Cyr <aric.cyr@....com>, hersen wu <hersenxs.wu@....com>,
        Stéphane Marchesin <marcheu@...omium.org>,
        amd-gfx@...ts.freedesktop.org, dri-devel@...ts.freedesktop.org,
        linux-kernel@...r.kernel.org
Subject: Re: [PATCH] drm/amd/display: dual cursors are seen if scaling is
 enabled

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@....com>
> Signed-off-by: Louis Li <Ching-shih.Li@....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)
> 

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ