xf86-video-intel: 2 commits - src/sna/kgem.c src/sna/sna_display.c

Chris Wilson ickle at kemper.freedesktop.org
Sun Oct 27 08:34:23 PDT 2013


 src/sna/kgem.c        |   22 +++++++++++-----------
 src/sna/sna_display.c |   40 ++++++++++++++++++++++++++++++++++++----
 2 files changed, 47 insertions(+), 15 deletions(-)

New commits:
commit 4e0a01a7a3cf0f473c7ffae9129069086bf2fbe2
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Oct 27 15:33:13 2013 +0000

    sna: Handle transient TearFree flip failures
    
    If we get a pageflip fail when trying to do a TearFree update, just
    fallback to a copy (before turning off the display for complete
    failure). The rare tearing copy should mar the user experience far less.
    
    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 3c39305..45d83f4 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -4495,13 +4495,26 @@ void sna_mode_redisplay(struct sna *sna)
 				arg.reserved = 0;
 
 				if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_PAGE_FLIP, &arg)) {
+					BoxRec box;
+
 					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));
 disable1:
-					xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR,
-						   "%s: page flipping failed, disabling CRTC:%d (pipe=%d)\n",
-						   __FUNCTION__, sna_crtc->id, sna_crtc->pipe);
-					sna_crtc_disable(crtc);
+					box.x1 = 0;
+					box.y1 = 0;
+					box.x2 = crtc->mode.HDisplay;
+					box.y2 = crtc->mode.VDisplay;
+
+					if (!sna->render.copy_boxes(sna, GXcopy,
+								    sna->front, bo, 0, 0,
+								    sna->front, sna_crtc->bo, 0, 0,
+								    &box, 1, COPY_LAST)) {
+						xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR,
+							   "%s: page flipping failed, disabling CRTC:%d (pipe=%d)\n",
+							   __FUNCTION__, sna_crtc->id, sna_crtc->pipe);
+						sna_crtc_disable(crtc);
+					}
+
 					continue;
 				}
 
@@ -4554,6 +4567,25 @@ disable1:
 				DBG(("%s: flip [fb=%d] on crtc %d [%d, pipe=%d] failed - %d\n",
 				     __FUNCTION__, arg.fb_id, i, crtc->id, crtc->pipe, errno));
 disable2:
+				if (sna->mode.shadow_flip == 0) {
+					BoxRec box;
+
+					box.x1 = 0;
+					box.y1 = 0;
+					box.x2 = sna->scrn->virtualX;
+					box.y2 = sna->scrn->virtualY;
+
+					if (sna->render.copy_boxes(sna, GXcopy,
+								    sna->front, new, 0, 0,
+								    sna->front, old, 0, 0,
+								    &box, 1, COPY_LAST)) {
+						kgem_submit(&sna->kgem);
+						RegionEmpty(region);
+					}
+
+					return;
+				}
+
 				xf86DrvMsg(sna->scrn->scrnIndex, X_ERROR,
 					   "%s: page flipping failed, disabling CRTC:%d (pipe=%d)\n",
 					   __FUNCTION__, crtc->id, crtc->pipe);
commit b480e1ec503534310d3875aef81ed191aeb93313
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 25 15:09:19 2013 +0100

    sna: Trim usuable fenced aperture by unfenced usage
    
    This will overcount buffers that both fenced and unfenced (likely most
    fenced buffers!) but is required to prevent ENOSPC due to alignment
    issues.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 38017dd..36190fa 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -4706,7 +4706,7 @@ bool kgem_check_bo(struct kgem *kgem, ...)
 	if (num_pages + kgem->aperture > kgem->aperture_high) {
 		DBG(("%s: final aperture usage (%d) is greater than high water mark (%d)\n",
 		     __FUNCTION__, num_pages + kgem->aperture, kgem->aperture_high));
-		return aperture_check(kgem, num_pages);
+		return aperture_check(kgem, num_pages + kgem->aperture);
 	}
 
 	return kgem_flush(kgem, flush);
@@ -4730,13 +4730,13 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo)
 			if (kgem->nfence >= kgem->fence_max)
 				return false;
 
-			if (3*kgem->aperture_fenced > kgem->aperture_mappable &&
+			if (3*kgem->aperture_fenced > (kgem->aperture_mappable - kgem->aperture) &&
 			    kgem_ring_is_idle(kgem, kgem->ring))
 				return false;
 
 			size = kgem->aperture_fenced;
 			size += kgem_bo_fenced_size(kgem, bo);
-			if (3*size > 2*kgem->aperture_mappable)
+			if (3*size > 2*(kgem->aperture_mappable - kgem->aperture))
 				return false;
 		}
 
@@ -4758,20 +4758,20 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo)
 		if (kgem->nfence >= kgem->fence_max)
 			return false;
 
-		if (3*kgem->aperture_fenced > kgem->aperture_mappable &&
+		if (3*kgem->aperture_fenced > (kgem->aperture_mappable - kgem->aperture) &&
 		    kgem_ring_is_idle(kgem, kgem->ring))
 			return false;
 
 		size = kgem->aperture_fenced;
 		size += kgem_bo_fenced_size(kgem, bo);
-		if (3*size > 2*kgem->aperture_mappable)
+		if (3*size > 2*(kgem->aperture_mappable - kgem->aperture))
 			return false;
 	}
 
-	if (kgem->aperture + num_pages(bo) > kgem->aperture_high) {
+	if (kgem->aperture + num_pages(bo) > kgem->aperture_high - kgem->aperture_fenced) {
 		DBG(("%s: final aperture usage (%d) is greater than high water mark (%d)\n",
 		     __FUNCTION__, num_pages(bo) + kgem->aperture, kgem->aperture_high));
-		return aperture_check(kgem, num_pages(bo));
+		return aperture_check(kgem, num_pages(bo) + kgem->aperture + kgem->aperture_fenced);
 	}
 
 	return kgem_flush(kgem, bo->flush);
@@ -4826,11 +4826,11 @@ bool kgem_check_many_bo_fenced(struct kgem *kgem, ...)
 		if (kgem->nfence + num_fence > kgem->fence_max)
 			return false;
 
-		if (3*kgem->aperture_fenced > kgem->aperture_mappable &&
+		if (3*kgem->aperture_fenced > (kgem->aperture_mappable - kgem->aperture) &&
 		    kgem_ring_is_idle(kgem, kgem->ring))
 			return false;
 
-		if (3*(fenced_size + kgem->aperture_fenced) > 2*kgem->aperture_mappable)
+		if (3*(fenced_size + kgem->aperture_fenced) > 2*(kgem->aperture_mappable - kgem->aperture))
 			return false;
 	}
 
@@ -4840,10 +4840,10 @@ bool kgem_check_many_bo_fenced(struct kgem *kgem, ...)
 	if (kgem->nexec + num_exec >= KGEM_EXEC_SIZE(kgem))
 		return false;
 
-	if (num_pages + kgem->aperture > kgem->aperture_high) {
+	if (num_pages + kgem->aperture > kgem->aperture_high - kgem->aperture_fenced) {
 		DBG(("%s: final aperture usage (%d) is greater than high water mark (%d)\n",
 		     __FUNCTION__, num_pages + kgem->aperture, kgem->aperture_high));
-		return aperture_check(kgem, num_pages);
+		return aperture_check(kgem, num_pages + kgem->aperture + kgem->aperture_fenced);
 	}
 
 	return kgem_flush(kgem, flush);


More information about the xorg-commit mailing list