diff options
author | Keith Packard <keithp@keithp.com> | 2017-08-02 20:42:07 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2017-10-10 17:54:32 -0700 |
commit | 7673b34e038cb38d78ba27e4df8b881b317c46e8 (patch) | |
tree | f02489f950b4c3f3853d8b7dcf3e4fdd0ce5e7c6 | |
parent | 8cb8b65b108e85739757bc5d1372ae8c221db616 (diff) |
xfree86: Disable cursor whenever turning off CRTC during modeset
This makes sure the CRTC's cursor is hidden before we hand the CRTC
over to some other application.
Signed-off-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | hw/xfree86/modes/xf86Crtc.c | 16 | ||||
-rw-r--r-- | hw/xfree86/modes/xf86Crtc.h | 6 | ||||
-rw-r--r-- | 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 @@ -999,6 +999,12 @@ 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 */ extern _X_EXPORT void 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) { |