> -----Original Message-----
> From: amd-gfx [mailto:[email protected]] On Behalf
> Of Michel Dänzer
> Sent: Wednesday, October 05, 2016 4:49 AM
> To: [email protected]
> Subject: [PATCH xf86-video-amdgpu] Rotate and reflect cursor hotspot
> position for drmModeSetCursor2
> 
> From: Michel Dänzer <[email protected]>
> 
> 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.
> 
> Signed-off-by: Michel Dänzer <[email protected]>

Good catch!

Reviewed-by: Alex Deucher <[email protected]>

> ---
>  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 31aa1db..fb41975 100644
> --- a/src/drmmode_display.c
> +++ b/src/drmmode_display.c
> @@ -1008,13 +1008,43 @@ static void 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(pAMDGPUEnt->fd,
>                                       drmmode_crtc->mode_crtc->crtc_id,
>                                       bo_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
> [email protected]
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to