summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichel Dänzer <michel.daenzer@amd.com>2016-10-06 18:52:37 +0900
committerMichel Dänzer <michel.daenzer@amd.com>2016-10-06 18:52:37 +0900
commit937398f6cd50db105d5e53ab553eb284d44121f4 (patch)
tree86c4052c14d649a31429037955dfcdc18fb52580
parent3fc839ff49f01c24eb94d5e1f0ab4065de47bc17 (diff)
Rotate and reflect cursor hotspot position for drmModeSetCursor2
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) Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--src/drmmode_display.c32
1 files changed, 31 insertions, 1 deletions
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 1b1b3e64..3888e5c7 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