[PATCH xf86-video-amdgpu] Rotate and reflect cursor hotspot position for drmModeSetCursor2
Deucher, Alexander
Alexander.Deucher at amd.com
Wed Oct 5 13:27:15 UTC 2016
> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces at lists.freedesktop.org] On Behalf
> Of Michel Dänzer
> Sent: Wednesday, October 05, 2016 4:49 AM
> To: amd-gfx at lists.freedesktop.org
> Subject: [PATCH xf86-video-amdgpu] 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.
>
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
Good catch!
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 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
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list