[PATCH v4 09/13] modesetting: Suspend and resume flipping with DPMS
Alex Goins
agoins at nvidia.com
Fri Mar 4 02:47:54 UTC 2016
DPMS would prevent page flip / vblank events from being raised, freezing
the screen until PRIME flipping was reinitialized. To handle DPMS cleanly,
suspend PRIME page flipping when DPMS mode is not on, and resume it when
DPMS mode is on.
v1: Initial commit
v2: Moved flipping_active check from previous commit to here
v3: Unchanged
v4: Unchanged
Signed-off-by: Alex Goins <agoins at nvidia.com>
---
hw/xfree86/drivers/modesetting/drmmode_display.c | 37 ++++++++++++++++++++----
hw/xfree86/drivers/modesetting/drmmode_display.h | 1 +
2 files changed, 32 insertions(+), 6 deletions(-)
diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c
index 63e803b..955ecfa 100644
--- a/hw/xfree86/drivers/modesetting/drmmode_display.c
+++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
@@ -370,19 +370,34 @@ drmmode_SharedPixmapFlip(PixmapPtr frontTarget, xf86CrtcPtr crtc,
static Bool
drmmode_InitSharedPixmapFlipping(xf86CrtcPtr crtc, drmmode_ptr drmmode)
{
+ Bool ret;
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
if (!drmmode_crtc->enable_flipping)
return FALSE;
- return drmmode_SharedPixmapPresent(crtc->randr_crtc->scanout_pixmap_back,
- crtc, drmmode);
+ if (drmmode_crtc->flipping_active)
+ return TRUE;
+
+ ret = drmmode_SharedPixmapPresent(crtc->randr_crtc->scanout_pixmap_back,
+ crtc, drmmode);
+
+ if (ret)
+ drmmode_crtc->flipping_active = TRUE;
+
+ return ret;
}
static void
drmmode_FiniSharedPixmapFlipping(xf86CrtcPtr crtc, drmmode_ptr drmmode)
{
uint32_t seq;
+ drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
+
+ if (!drmmode_crtc->flipping_active)
+ return;
+
+ drmmode_crtc->flipping_active = FALSE;
/* Abort page flip event handler on scanout_pixmap */
seq = msGetPixmapPriv(drmmode, crtc->randr_crtc->scanout_pixmap)->flip_seq;
@@ -1303,12 +1318,22 @@ drmmode_output_dpms(xf86OutputPtr output, int mode)
drmModeConnectorSetProperty(drmmode->fd, koutput->connector_id,
drmmode_output->dpms_enum_id, mode);
- if (mode == DPMSModeOn && crtc) {
+ if (crtc) {
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
- if (drmmode_crtc->need_modeset)
- drmmode_set_mode_major(crtc, &crtc->mode, crtc->rotation,
- crtc->x, crtc->y);
+
+ if (mode == DPMSModeOn) {
+ if (drmmode_crtc->need_modeset)
+ drmmode_set_mode_major(crtc, &crtc->mode, crtc->rotation,
+ crtc->x, crtc->y);
+
+ if (drmmode_crtc->enable_flipping)
+ drmmode_InitSharedPixmapFlipping(crtc, drmmode_crtc->drmmode);
+ } else {
+ if (drmmode_crtc->enable_flipping)
+ drmmode_FiniSharedPixmapFlipping(crtc, drmmode_crtc->drmmode);
+ }
}
+
return;
}
diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.h b/hw/xfree86/drivers/modesetting/drmmode_display.h
index 2ae6387..6b2b8bd 100644
--- a/hw/xfree86/drivers/modesetting/drmmode_display.h
+++ b/hw/xfree86/drivers/modesetting/drmmode_display.h
@@ -116,6 +116,7 @@ typedef struct {
Bool need_modeset;
Bool enable_flipping;
+ Bool flipping_active;
} drmmode_crtc_private_rec, *drmmode_crtc_private_ptr;
typedef struct {
--
1.9.1
More information about the xorg-devel
mailing list