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

Chris Wilson ickle at kemper.freedesktop.org
Fri Sep 12 08:58:16 PDT 2014


 src/sna/kgem.c        |    5 ++++-
 src/sna/sna_accel.c   |    6 +++---
 src/sna/sna_display.c |   43 +++++++++++++++++++++++++------------------
 src/sna/sna_render.c  |    8 ++++----
 4 files changed, 36 insertions(+), 26 deletions(-)

New commits:
commit a5a51b55ec07e03c87a9916eca6d023ccaf7d00b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Sep 12 14:31:22 2014 +0100

    sna: Mark the CRTC as disabled when hiding the plane
    
    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 f227acb..df6d384 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1479,24 +1479,8 @@ static void sna_crtc_disable_shadow(struct sna *sna, struct sna_crtc *crtc)
 }
 
 static void
-sna_crtc_disable(xf86CrtcPtr crtc)
+__sna_crtc_disable(struct sna *sna, struct sna_crtc *sna_crtc)
 {
-	struct sna *sna = to_sna(crtc->scrn);
-	struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
-	struct drm_mode_crtc arg;
-
-	if (sna_crtc == NULL)
-		return;
-
-	DBG(("%s: disabling crtc [%d, pipe=%d]\n", __FUNCTION__,
-	     sna_crtc->id, sna_crtc->pipe));
-
-	sna_crtc_force_outputs_off(crtc);
-
-	memset(&arg, 0, sizeof(arg));
-	arg.crtc_id = sna_crtc->id;
-	(void)drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_SETCRTC, &arg);
-
 	sna_crtc->mode_serial++;
 
 	sna_crtc_disable_cursor(sna, sna_crtc);
@@ -1517,10 +1501,32 @@ sna_crtc_disable(xf86CrtcPtr crtc)
 
 	sna_crtc->transform = false;
 
-	assert(sna_crtc->dpms_mode == DPMSModeOff);
 	assert(!sna_crtc->shadow);
 }
 
+static void
+sna_crtc_disable(xf86CrtcPtr crtc)
+{
+	struct sna *sna = to_sna(crtc->scrn);
+	struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
+	struct drm_mode_crtc arg;
+
+	if (sna_crtc == NULL)
+		return;
+
+	DBG(("%s: disabling crtc [%d, pipe=%d]\n", __FUNCTION__,
+	     sna_crtc->id, sna_crtc->pipe));
+
+	sna_crtc_force_outputs_off(crtc);
+	assert(sna_crtc->dpms_mode == DPMSModeOff);
+
+	memset(&arg, 0, sizeof(arg));
+	arg.crtc_id = sna_crtc->id;
+	(void)drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_SETCRTC, &arg);
+
+	__sna_crtc_disable(sna, sna_crtc);
+}
+
 static void update_flush_interval(struct sna *sna)
 {
 	xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn);
@@ -6299,6 +6305,7 @@ sna_crtc_hide_planes(struct sna *sna, struct sna_crtc *crtc)
 	s.plane_id = crtc->sprite.id;
 	(void)drmIoctl(sna->kgem.fd, LOCAL_IOCTL_MODE_SETPLANE, &s);
 
+	__sna_crtc_disable(sna, crtc);
 	return true;
 }
 
commit 5ce4b344e497364b16a507b39b7637a00daa957a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Sep 12 14:29:12 2014 +0100

    sna: Avoid stalls when promoting to the GPU before an operation
    
    In particular, the promotion of an active snooped bo into an uncached
    linear GPU bo was being performed on a busy buffer and forcing a stall.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 66adae8..82ff619 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -5179,6 +5179,7 @@ struct kgem_bo *kgem_create_cpu_2d(struct kgem *kgem,
 		assert(bo->tiling == I915_TILING_NONE);
 		assert_tiling(kgem, bo);
 
+		assert(!__kgem_busy(kgem, bo->handle));
 		if (!gem_set_caching(kgem->fd, bo->handle, SNOOPED)) {
 			kgem_bo_destroy(kgem, bo);
 			return NULL;
@@ -6456,6 +6457,7 @@ create_snoopable_buffer(struct kgem *kgem, unsigned alloc)
 		assert(bo->base.refcnt == 1);
 		assert(bo->mmapped == MMAPPED_CPU);
 		assert(bo->need_io == false);
+		assert(!__kgem_busy(kgem, bo->base.handle));
 
 		if (!gem_set_caching(kgem->fd, bo->base.handle, SNOOPED))
 			goto free_caching;
@@ -7214,7 +7216,8 @@ bool kgem_bo_convert_to_gpu(struct kgem *kgem,
 			    struct kgem_bo *bo,
 			    unsigned flags)
 {
-	DBG(("%s: converting handle=%d from CPU to GPU, flags=%x\n", __FUNCTION__, bo->handle));
+	DBG(("%s: converting handle=%d from CPU to GPU, flags=%x, busy?=%d\n",
+	     __FUNCTION__, bo->handle, flags, __kgem_bo_is_busy(kgem, bo)));
 	assert(bo->tiling == I915_TILING_NONE);
 
 	if (kgem->has_llc)
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 33dc5a2..e5382a2 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -3664,7 +3664,7 @@ sna_drawable_use_bo(DrawablePtr drawable, unsigned flags, const BoxRec *box,
 		}
 
 create_gpu_bo:
-		move = MOVE_WRITE | MOVE_READ;
+		move = MOVE_WRITE | MOVE_READ | MOVE_ASYNC_HINT;
 		if (flags & FORCE_GPU)
 			move |= __MOVE_FORCE;
 		if (!sna_pixmap_move_to_gpu(pixmap, move))
@@ -3697,7 +3697,7 @@ create_gpu_bo:
 				if (flags & IGNORE_DAMAGE)
 					move = MOVE_WRITE;
 				else
-					move = MOVE_WRITE | MOVE_READ;
+					move = MOVE_WRITE | MOVE_READ | MOVE_ASYNC_HINT;
 
 				if (sna_pixmap_move_to_gpu(pixmap, move))
 					goto use_gpu_bo;
@@ -3905,7 +3905,7 @@ prefer_gpu_bo:
 					}
 				}
 
-				if (!sna_pixmap_move_to_gpu(pixmap, MOVE_WRITE | MOVE_READ | __MOVE_FORCE))
+				if (!sna_pixmap_move_to_gpu(pixmap, MOVE_WRITE | MOVE_READ | MOVE_ASYNC_HINT | __MOVE_FORCE))
 					return NULL;
 
 				sna_damage_all(&priv->gpu_damage, pixmap);
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index 0200102..71330c1 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -461,7 +461,7 @@ move_to_gpu(PixmapPtr pixmap, const BoxRec *box, bool blt)
 
 	if (DBG_FORCE_UPLOAD < 0) {
 		if (!sna_pixmap_force_to_gpu(pixmap,
-					     blt ? MOVE_READ : MOVE_SOURCE_HINT | MOVE_READ))
+					     blt ? MOVE_READ : MOVE_SOURCE_HINT | MOVE_ASYNC_HINT | MOVE_READ))
 			return NULL;
 
 		return priv->gpu_bo;
@@ -506,7 +506,7 @@ upload:
 			return NULL;
 	} else {
 		if (!sna_pixmap_move_to_gpu(pixmap,
-					    __MOVE_FORCE | MOVE_SOURCE_HINT | MOVE_READ))
+					    __MOVE_FORCE | MOVE_ASYNC_HINT | MOVE_SOURCE_HINT | MOVE_READ))
 			return NULL;
 	}
 
@@ -774,7 +774,7 @@ static int sna_render_picture_downsample(struct sna *sna,
 	priv = sna_pixmap(tmp);
 	assert(priv && priv->gpu_bo);
 
-	if (!sna_pixmap_move_to_gpu(pixmap, MOVE_SOURCE_HINT | MOVE_READ)) {
+	if (!sna_pixmap_move_to_gpu(pixmap, MOVE_ASYNC_HINT | MOVE_SOURCE_HINT | MOVE_READ)) {
 fixup:
 		DBG(("%s: unable to create GPU bo for target or temporary pixmaps\n",
 		     __FUNCTION__));
@@ -1037,7 +1037,7 @@ sna_render_picture_partial(struct sna *sna,
 		struct sna_pixmap *priv;
 
 		priv = sna_pixmap_force_to_gpu(pixmap,
-					       MOVE_READ | MOVE_SOURCE_HINT);
+					       MOVE_READ | MOVE_ASYNC_HINT | MOVE_SOURCE_HINT);
 		if (priv == NULL)
 			return false;
 


More information about the xorg-commit mailing list