[PATCH xf86-video-ati] Rotate and reflect cursor hotspot position for drmModeSetCursor2

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces at lists.freedesktop.org] On Behalf
> Of Michel Dänzer
> Sent: Thursday, October 06, 2016 5:58 AM
> To: amd-gfx at lists.freedesktop.org
> Subject: [PATCH xf86-video-ati] Rotate and reflect cursor hotspot position for
> drmModeSetCursor2
> 
> From: Michel Dänzer <michel.daenzer at amd.com>
> 
> We were always passing the hotspot position in the X screen coordinate
> space, but drmModeSetCursor2 needs it in the CRTC coordinate space. The
> wrong hotspot position would cause the kernel driver to adjust the
> HW cursor position incorrectly when the hotspot position changed.
> 
> (Ported from amdgpu commit d42773eb45baff5933730e26878a0b45fcf07b65)
> 
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>

Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  src/drmmode_display.c | 32 +++++++++++++++++++++++++++++++-
>  1 file changed, 31 insertions(+), 1 deletion(-)
> 
> diff --git a/src/drmmode_display.c b/src/drmmode_display.c
> index 1b1b3e6..3888e5c 100644
> --- a/src/drmmode_display.c
> +++ b/src/drmmode_display.c
> @@ -1047,12 +1047,42 @@ drmmode_show_cursor (xf86CrtcPtr crtc)
>  	if (use_set_cursor2) {
>  	    xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc-
> >scrn);
>  	    CursorPtr cursor = xf86_config->cursor;
> +	    int xhot = cursor->bits->xhot;
> +	    int yhot = cursor->bits->yhot;
>  	    int ret;
> 
> +	    if (crtc->rotation != RR_Rotate_0 &&
> +		crtc->rotation != (RR_Rotate_180 | RR_Reflect_X |
> +				   RR_Reflect_Y)) {
> +		int t;
> +
> +		/* Reflect & rotate hotspot position */
> +		if (crtc->rotation & RR_Reflect_X)
> +		    xhot = info->cursor_w - xhot - 1;
> +		if (crtc->rotation & RR_Reflect_Y)
> +		    yhot = info->cursor_h - yhot - 1;
> +
> +		switch (crtc->rotation & 0xf) {
> +		case RR_Rotate_90:
> +		    t = xhot;
> +		    xhot = yhot;
> +		    yhot = info->cursor_w - t - 1;
> +		    break;
> +		case RR_Rotate_180:
> +		    xhot = info->cursor_w - xhot - 1;
> +		    yhot = info->cursor_h - yhot - 1;
> +		    break;
> +		case RR_Rotate_270:
> +		    t = xhot;
> +		    xhot = info->cursor_h - yhot - 1;
> +		    yhot = t;
> +		}
> +	    }
> +
>  	    ret =
>  		drmModeSetCursor2(drmmode->fd, drmmode_crtc-
> >mode_crtc->crtc_id,
>  				  handle, info->cursor_w, info->cursor_h,
> -				  cursor->bits->xhot, cursor->bits->yhot);
> +				  xhot, yhot);
>  	    if (ret == -EINVAL)
>  		use_set_cursor2 = FALSE;
>  	    else
> --
> 2.9.3
> 
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux