summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2017-08-02 20:42:07 -0700
committerKeith Packard <keithp@keithp.com>2017-10-10 17:54:32 -0700
commit7673b34e038cb38d78ba27e4df8b881b317c46e8 (patch)
treef02489f950b4c3f3853d8b7dcf3e4fdd0ce5e7c6
parent8cb8b65b108e85739757bc5d1372ae8c221db616 (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.c16
-rw-r--r--hw/xfree86/modes/xf86Crtc.h6
-rw-r--r--hw/xfree86/modes/xf86Cursors.c2
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) {