[PATCH xserver] modesetting: Do not call drmModeSetCursor2() twice on every cursor change
Hans de Goede
hdegoede at redhat.com
Fri Sep 23 08:35:41 UTC 2016
Each xf86ScreenSetCursor() call calls:
xf86DriverLoadCursorARGB()
infoPtr->ShowCursor()
In succession, ending up in 2 drmModeSetCursor2() calls, with the second
effectively being a no-op. Keep track of having set the cursor already
in drmmode_load_cursor_argb_check() and unless hide() was called in
the mean time make drmmode_show_cursor() a no-op.
Signed-off-by: Hans de Goede <hdegoede at redhat.com>
---
Note this patch applies on top of Michael Thayer's
"modesetting: allow switching from software to hardware cursors (v4)"
series
---
hw/xfree86/drivers/modesetting/drmmode_display.c | 7 ++++++-
hw/xfree86/drivers/modesetting/drmmode_display.h | 1 +
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c
index 46e981b..23c1db1 100644
--- a/hw/xfree86/drivers/modesetting/drmmode_display.c
+++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
@@ -783,6 +783,8 @@ drmmode_set_cursor(xf86CrtcPtr crtc)
if (ret)
/* fallback to swcursor */
return FALSE;
+
+ drmmode_crtc->cursor_up = TRUE;
return TRUE;
}
@@ -817,6 +819,7 @@ drmmode_hide_cursor(xf86CrtcPtr crtc)
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
drmmode_ptr drmmode = drmmode_crtc->drmmode;
+ drmmode_crtc->cursor_up = FALSE;
drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, 0,
ms->cursor_width, ms->cursor_height);
}
@@ -825,7 +828,9 @@ static void
drmmode_show_cursor(xf86CrtcPtr crtc)
{
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
- drmmode_set_cursor(crtc);
+
+ if (!drmmode_crtc->cursor_up)
+ drmmode_set_cursor(crtc);
}
static void
diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.h b/hw/xfree86/drivers/modesetting/drmmode_display.h
index f979b99..f774250 100644
--- a/hw/xfree86/drivers/modesetting/drmmode_display.h
+++ b/hw/xfree86/drivers/modesetting/drmmode_display.h
@@ -91,6 +91,7 @@ typedef struct {
uint32_t vblank_pipe;
int dpms_mode;
struct dumb_bo *cursor_bo;
+ Bool cursor_up;
uint16_t lut_r[256], lut_g[256], lut_b[256];
drmmode_bo rotate_bo;
--
2.9.3
More information about the xorg-devel
mailing list