[PATCH xf86-video-ati] Rotate and reflect cursor hotspot position for drmModeSetCursor2
Deucher, Alexander
Alexander.Deucher at amd.com
Thu Oct 6 13:11:59 UTC 2016
> -----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
More information about the amd-gfx
mailing list