From 4d5aab66c052795c7f0381a3dfc7293c9a41e441 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 21 Dec 2017 18:54:39 -0800 Subject: [PATCH] xfree86: Disable cursor whenever turning off CRTC during modeset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This makes sure the CRTC's cursor is hidden before we hand the CRTC over to some other application. Signed-off-by: Keith Packard Reviewed-by: Michel Dänzer Reviewed-by: Alex Deucher --- hw/xfree86/modes/xf86Crtc.c | 16 ++++++++++++---- hw/xfree86/modes/xf86Crtc.h | 6 ++++++ hw/xfree86/modes/xf86Cursors.c | 2 +- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index 1a401af4b..80a009e08 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -2651,6 +2651,14 @@ xf86InitialConfiguration(ScrnInfoPtr scrn, Bool canGrow) return success; } +/* Turn a CRTC off, using the DPMS function and disabling the cursor */ +static void +xf86DisableCrtc(xf86CrtcPtr crtc) +{ + crtc->funcs->dpms(crtc, DPMSModeOff); + xf86_crtc_hide_cursor(crtc); +} + /* * Check the CRTC we're going to map each output to vs. it's current * CRTC. If they don't match, we have to disable the output and the CRTC @@ -2706,9 +2714,9 @@ xf86PrepareCrtcs(ScrnInfoPtr scrn) * we need to disable it */ if (desired_outputs != current_outputs || !desired_outputs) - (*crtc->funcs->dpms) (crtc, DPMSModeOff); + xf86DisableCrtc(crtc); #else - (*crtc->funcs->dpms) (crtc, DPMSModeOff); + xf86DisableCrtc(crtc); #endif } } @@ -3004,7 +3012,7 @@ xf86DisableUnusedFunctions(ScrnInfoPtr pScrn) xf86CrtcPtr crtc = xf86_config->crtc[c]; if (!crtc->enabled) { - crtc->funcs->dpms(crtc, DPMSModeOff); + xf86DisableCrtc(crtc); memset(&crtc->mode, 0, sizeof(crtc->mode)); xf86RotateDestroy(crtc); crtc->active = FALSE; @@ -3455,7 +3463,7 @@ xf86DetachAllCrtc(ScrnInfoPtr scrn) RRCrtcDetachScanoutPixmap(crtc->randr_crtc); /* dpms off */ - (*crtc->funcs->dpms) (crtc, DPMSModeOff); + xf86DisableCrtc(crtc); /* force a reset the next time its used */ crtc->randr_crtc->mode = NULL; crtc->mode.HDisplay = 0; diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h index 215eb2a04..e6ae9cc4d 100644 --- a/hw/xfree86/modes/xf86Crtc.h +++ b/hw/xfree86/modes/xf86Crtc.h @@ -998,6 +998,12 @@ static _X_INLINE _X_DEPRECATED void xf86_reload_cursors(ScreenPtr screen) {} extern _X_EXPORT Bool xf86_show_cursors(ScrnInfoPtr scrn); +/** + * Called by the driver to turn a single crtc's cursor off + */ +extern _X_EXPORT void +xf86_crtc_hide_cursor(xf86CrtcPtr crtc); + /** * Called by the driver to turn cursors off */ diff --git a/hw/xfree86/modes/xf86Cursors.c b/hw/xfree86/modes/xf86Cursors.c index 26969efb2..ae2137d80 100644 --- a/hw/xfree86/modes/xf86Cursors.c +++ b/hw/xfree86/modes/xf86Cursors.c @@ -320,7 +320,7 @@ xf86_set_cursor_colors(ScrnInfoPtr scrn, int bg, int fg) } } -static void +void xf86_crtc_hide_cursor(xf86CrtcPtr crtc) { if (crtc->cursor_shown) {