diff --git a/src/sna/sna.h b/src/sna/sna.h index 0c66d17e..74a03f3c 100644 --- a/src/sna/sna.h +++ b/src/sna/sna.h @@ -285,8 +285,8 @@ struct sna { unsigned front_active; unsigned shadow_active; unsigned flip_active; + unsigned hidden; bool dirty; - bool hidden; int max_crtc_width, max_crtc_height; RegionRec shadow_region; diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index fb18d580..d5458772 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -17229,6 +17229,7 @@ static struct sna_pixmap *sna_accel_scanout(struct sna *sna) assert(sna->vblank_interval); assert(sna->front); + assert(!sna->mode.hidden); priv = sna_pixmap(sna->front); if (priv->gpu_bo == NULL) diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c index 5b45618c..684256aa 100644 --- a/src/sna/sna_display.c +++ b/src/sna/sna_display.c @@ -2315,7 +2315,10 @@ __sna_crtc_set_mode(xf86CrtcPtr crtc) uint32_t saved_offset; bool saved_transform; - DBG(("%s\n", __FUNCTION__)); + DBG(("%s: CRTC=%d, pipe=%d, hidden?=%d\n", __FUNCTION__, + sna_crtc->id, sna_crtc->pipe, sna->mode.hidden)); + if (sna->mode.hidden) + return TRUE; saved_bo = sna_crtc->bo; saved_transform = sna_crtc->transform; @@ -5318,6 +5321,7 @@ sna_page_flip(struct sna *sna, assert((sna->flags & SNA_TEAR_FREE) == 0); assert(sna->mode.flip_active == 0); assert(sna->mode.front_active); + assert(!sna->mode.hidden); assert(sna->scrn->vtSema); if ((sna->flags & (data ? SNA_HAS_FLIP : SNA_HAS_ASYNC_FLIP)) == 0) diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c index 08d477e5..a1df00c1 100644 --- a/src/sna/sna_dri2.c +++ b/src/sna/sna_dri2.c @@ -1566,6 +1566,7 @@ can_flip(struct sna * sna, } assert(sna->scrn->vtSema); + assert(!sna->mode.hidden); if ((sna->flags & (SNA_HAS_FLIP | SNA_HAS_ASYNC_FLIP)) == 0) { DBG(("%s: no, pageflips disabled\n", __FUNCTION__)); diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c index 5b47bc7c..4921beab 100644 --- a/src/sna/sna_driver.c +++ b/src/sna/sna_driver.c @@ -289,6 +289,7 @@ static Bool sna_create_screen_resources(ScreenPtr screen) static void sna_dpms_set(ScrnInfoPtr scrn, int mode, int flags) { xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); + struct sna *sna = to_sna(scrn); int i; DBG(("%s(mode=%d, flags=%d), vtSema=%d\n", @@ -310,8 +311,12 @@ static void sna_dpms_set(ScrnInfoPtr scrn, int mode, int flags) if (output->crtc != NULL) output->funcs->dpms(output, mode); } + sna->mode.hidden = sna->mode.front_active + 1; + sna->mode.front_active = 0; } else { /* Re-enable CRTC that have been forced off via other means */ + sna->mode.front_active = sna->mode.hidden - 1; + sna->mode.hidden = 0; for (i = 0; i < config->num_crtc; i++) { xf86CrtcPtr crtc = config->crtc[i]; if (crtc->enabled) @@ -326,8 +331,7 @@ static void sna_dpms_set(ScrnInfoPtr scrn, int mode, int flags) } sna_crtc_config_notify(xf86ScrnToScreen(scrn)); - to_sna(scrn)->mode.hidden = mode == DPMSModeOff; - DBG(("%s: hiding outputs? %d\n", __FUNCTION__, to_sna(scrn)->mode.hidden)); + DBG(("%s: hiding outputs? %d\n", __FUNCTION__, sna->mode.hidden)); } static Bool sna_save_screen(ScreenPtr screen, int mode) diff --git a/src/sna/sna_present.c b/src/sna/sna_present.c index 81cf669f..035a54b7 100644 --- a/src/sna/sna_present.c +++ b/src/sna/sna_present.c @@ -229,7 +229,7 @@ sna_present_check_flip(RRCrtcPtr crtc, return FALSE; } - if (sna->mode.hidden) { + if (!sna->mode.front_active) { DBG(("%s: DPMS off, no flips\n", __FUNCTION__)); return FALSE; }