xf86-video-intel: 2 commits - src/sna/sna_accel.c src/sna/sna_display.c src/sna/sna_dri2.c src/sna/sna_driver.c src/sna/sna.h src/sna/sna_present.c

Chris Wilson ickle at kemper.freedesktop.org
Wed Jan 21 06:38:22 PST 2015


 src/sna/sna.h         |    2 +-
 src/sna/sna_accel.c   |    1 +
 src/sna/sna_display.c |    6 +++++-
 src/sna/sna_dri2.c    |    7 +++++++
 src/sna/sna_driver.c  |    8 ++++++--
 src/sna/sna_present.c |    2 +-
 6 files changed, 21 insertions(+), 5 deletions(-)

New commits:
commit d16ac1f30bb12d4830f6ed05c161b1175e77b019
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jan 21 10:14:41 2015 +0000

    sna/dri2: Prefer to use normal selection criteria for CopyRegion on small GT
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c
index a1df00c..6b0520f 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -837,6 +837,12 @@ static void sna_dri2_select_mode(struct sna *sna, struct kgem_bo *dst, struct kg
 		return;
 	}
 
+	if (sna->render_state.gt < 2) {
+		DBG(("%s: small GT [%d], not forcing selection\n",
+		     __FUNCTION__, sna->render_state.gt));
+		return;
+	}
+
 	VG_CLEAR(busy);
 	busy.handle = src->handle;
 	if (drmIoctl(sna->kgem.fd, DRM_IOCTL_I915_GEM_BUSY, &busy))
commit b0f90a46111ada91f99e7babcc3dbba5780965b2
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jan 20 16:32:34 2015 +0000

    sna: Keep front_active consistent across DPMS events
    
    When disabling outputs with DPMS, make sure we update front_active for
    consistency.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index 0c66d17..74a03f3 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 fb18d58..d545877 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 5b45618..684256a 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 08d477e..a1df00c 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 5b47bc7..4921bea 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 81cf669..035a54b 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;
 	}


More information about the xorg-commit mailing list