xf86-video-intel: src/sna/sna_display.c

Chris Wilson ickle at kemper.freedesktop.org
Fri Dec 12 07:29:45 PST 2014


 src/sna/sna_display.c |   28 +++++++++++++++++++++++++---
 1 file changed, 25 insertions(+), 3 deletions(-)

New commits:
commit 01692b8cf229f45813cf3a1059577a779d71dfa8
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Dec 12 15:13:04 2014 +0000

    sna: Fix TearFree multi-monitor operation whilst wedged
    
    The crtc flip (for when the kernel can't do a pageflip) made the mistake
    of setting the shadow buffer to the scanout - nullifying the effect of
    the TearFree.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 90414c7..ef39ee4 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1549,6 +1549,8 @@ static void update_flush_interval(struct sna *sna)
 	xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn);
 	int i, max_vrefresh = 0;
 
+	DBG(("%s: front_active=%d\n", __FUNCTION__, sna->mode.front_active));
+
 	for (i = 0; i < sna->mode.num_real_crtc; i++) {
 		xf86CrtcPtr crtc = config->crtc[i];
 
@@ -2299,6 +2301,7 @@ retry: /* Attach per-crtc pixmap or direct */
 		sna_crtc_damage(crtc);
 	sna->mode.front_active += saved_bo == NULL;
 	sna->mode.dirty = true;
+	DBG(("%s: front_active=%d\n", __FUNCTION__, sna->mode.front_active));
 
 	return TRUE;
 
@@ -5573,6 +5576,8 @@ static bool sna_probe_initial_configuration(struct sna *sna)
 		crtc->desiredX = mode.x;
 		crtc->desiredY = mode.y;
 		crtc->desiredTransformPresent = FALSE;
+
+		sna_crtc->kmode = mode.mode;
 	}
 
 	/* Reconstruct outputs pointing to active CRTC */
@@ -5709,6 +5714,8 @@ static bool sna_probe_initial_configuration(struct sna *sna)
 	scrn->virtualX = width;
 	scrn->virtualY = height;
 
+	sna->mode.dirty = true;
+
 	xf86SetScrnInfoModes(sna->scrn);
 	DBG(("%s: SetScrnInfoModes = %p\n", __FUNCTION__, scrn->modes));
 	return scrn->modes != NULL;
@@ -5960,6 +5967,7 @@ sna_mode_disable(struct sna *sna)
 	sna_hide_cursors(sna->scrn);
 	for (i = 0; i < sna->mode.num_real_crtc; i++)
 		sna_crtc_disable(config->crtc[i]);
+	assert(sna->mode.front_active == 0);
 
 	sna_mode_wakeup(sna);
 	kgem_clean_scanout_cache(&sna->kgem);
@@ -5972,6 +5980,8 @@ sna_mode_enable(struct sna *sna)
 	xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn);
 	int i;
 
+	DBG(("%s\n", __FUNCTION__));
+
 	if (sna->flags & SNA_IS_HOSTED)
 		return;
 
@@ -5981,10 +5991,14 @@ sna_mode_enable(struct sna *sna)
 	for (i = 0; i < sna->mode.num_real_crtc; i++) {
 		xf86CrtcPtr crtc = config->crtc[i];
 
+		DBG(("%s: crtc[%d].enabled?=%d\n", __FUNCTION__, i, crtc->enabled));
 		assert(to_sna_crtc(crtc) != NULL);
 		if (!crtc->enabled)
 			continue;
 
+		if (crtc->mode.Clock == 0)
+			continue;
+
 		__sna_crtc_set_mode(crtc);
 	}
 
@@ -6622,7 +6636,7 @@ sna_crtc_redisplay__fallback(xf86CrtcPtr crtc, RegionPtr region, struct kgem_bo
 	int depth, error;
 	void *ptr;
 
-	DBG(("%s: compositing transformed damage boxes\n", __FUNCTION__));
+	DBG(("%s: compositing transformed damage boxes, target handle=%d\n", __FUNCTION__, bo->handle));
 
 	error = sna_render_format_for_depth(draw->depth);
 	depth = PIXMAN_FORMAT_DEPTH(error);
@@ -6991,6 +7005,11 @@ void sna_mode_redisplay(struct sna *sna)
 			if (RegionNotEmpty(&damage)) {
 				struct kgem_bo *bo = NULL;
 
+				DBG(("%s: fallback intersects pipe=%d [(%d, %d), (%d, %d)]\n",
+				     __FUNCTION__, sna_crtc->pipe,
+				     damage.extents.x1, damage.extents.y1,
+				     damage.extents.x2, damage.extents.y2));
+
 				if (sna->flags & SNA_TEAR_FREE) {
 					RegionRec new_damage;
 
@@ -7009,6 +7028,9 @@ void sna_mode_redisplay(struct sna *sna)
 								CREATE_SCANOUT);
 					} else
 						RegionUnion(&damage, &damage, &sna_crtc->client_damage);
+
+					DBG(("%s: TearFree fallback, shadow handle=%d, crtc handle=%d\n", __FUNCTION__, bo->handle, sna_crtc->bo->handle));
+
 					sna_crtc->client_damage = new_damage;
 				}
 
@@ -7035,9 +7057,9 @@ void sna_mode_redisplay(struct sna *sna)
 							sna_crtc->bo->active_scanout--;
 							kgem_bo_destroy(&sna->kgem, sna_crtc->bo);
 
-							sna_crtc->bo = kgem_bo_reference(bo);
+							sna_crtc->bo = bo;
 							sna_crtc->bo->active_scanout++;
-							sna_crtc->client_bo = kgem_bo_reference(bo);
+							sna_crtc->client_bo = NULL;
 						} else {
 							DBG(("%s: flip [fb=%d] on crtc %d [%d, pipe=%d] failed - %d\n",
 							     __FUNCTION__, arg.fb_id, i, sna_crtc->id, sna_crtc->pipe, errno));


More information about the xorg-commit mailing list