xf86-video-intel: 4 commits - src/sna/sna_accel.c src/sna/sna_damage.c src/sna/sna_render.c

Chris Wilson ickle at kemper.freedesktop.org
Thu Dec 29 06:22:55 PST 2011


 src/sna/sna_accel.c  |   42 ++++++++++++++++++++++++++++++++++++------
 src/sna/sna_damage.c |    8 ++++----
 src/sna/sna_render.c |    4 ++--
 3 files changed, 42 insertions(+), 12 deletions(-)

New commits:
commit 0dc5c0651cb691fb8811cdf3075b3d322f9d37f8
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Dec 29 13:49:23 2011 +0000

    sna: Tune disarming of the scanout flush timer
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index feb171f..ee8d7ea 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -9162,9 +9162,8 @@ static void _sna_accel_disarm_timer(struct sna *sna, int id) { }
 static bool sna_accel_flush(struct sna *sna)
 {
 	struct sna_pixmap *priv = sna_accel_scanout(sna);
-	bool nothing_to_do =
-		priv->cpu_damage == NULL && priv->gpu_bo->rq == NULL;
-	bool need_throttle = sna->kgem.busy;
+	bool nothing_to_do = priv->cpu_damage == NULL && sna->kgem.nbatch == 0;
+	bool need_throttle = priv->gpu_bo->rq;
 
 	DBG(("%s (time=%ld), nothing_to_do=%d, busy? %d\n",
 	     __FUNCTION__, (long)GetTimeInMillis(),
commit ccd895c61d9f409a36c70eaf02d7ab43cc6c03c2
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Dec 29 12:09:04 2011 +0000

    sna: Allow uploading inplace to a freshly created GPU bo
    
    If the operation is favoured to be performed using a WC upload, presume
    that we will use the uploaded pixmap on the GPU and so prefer to create
    a GPU buffer to hold the fresh data.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 04382e4..feb171f 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -802,6 +802,23 @@ region_subsumes_drawable(RegionPtr region, DrawablePtr drawable)
 		extents->y2 >= drawable->height;
 }
 
+static bool
+region_subsumes_gpu_damage(const RegionRec *region, struct sna_pixmap *priv)
+{
+	if (region->data)
+		return false;
+
+	if (priv->gpu_damage) {
+		const BoxRec *extents = &region->extents;
+		const BoxRec *damage = &priv->gpu_damage->extents;
+		if (extents->x2 < damage->x2 || extents->x1 > damage->x1 ||
+		    extents->y2 < damage->y2 || extents->y1 > damage->y1)
+			return false;
+	}
+
+	return true;
+}
+
 static bool sync_will_stall(struct kgem_bo *bo)
 {
 	return kgem_bo_is_busy(bo);
@@ -1715,6 +1732,10 @@ sna_put_image_upload_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 	     __FUNCTION__, nbox,
 	     box->x1, box->y1, box->x2, box->y2));
 
+	if (priv->gpu_bo == NULL &&
+	    !sna_pixmap_create_mappable_gpu(pixmap))
+		return FALSE;
+
 	assert(priv->gpu_bo);
 
 	if (gc->alu == GXcopy &&
@@ -1780,15 +1801,21 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 		goto blt;
 	}
 
+	if (!priv->pinned && priv->gpu_bo &&
+	    region_subsumes_gpu_damage(region, priv) &&
+	    kgem_bo_map_will_stall(&sna->kgem, priv->gpu_bo)) {
+		sna_damage_destroy(&priv->gpu_damage);
+		sna_pixmap_destroy_gpu_bo(sna, priv);
+	}
+
 	/* XXX performing the upload inplace is currently about 20x slower
 	 * for putimage10 on gen6 -- mostly due to slow page faulting in kernel.
 	 * So we try again with vma caching and only for pixmaps who will be
 	 * immediately flushed...
 	 */
 	if ((priv->flush ||
-	     (priv->gpu_bo &&
-	      region_inplace(sna, pixmap, region, priv) &&
-	      !kgem_bo_map_will_stall(&sna->kgem, priv->gpu_bo))) &&
+	     (region_inplace(sna, pixmap, region, priv) &&
+	      (priv->gpu_bo == NULL || !kgem_bo_map_will_stall(&sna->kgem, priv->gpu_bo)))) &&
 	    sna_put_image_upload_blt(drawable, gc, region,
 				     x, y, w, h, bits, stride)) {
 		if (region_subsumes_drawable(region, &pixmap->drawable)) {
commit f85a853455249fd782e907ce1d78d11f75362def
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Dec 29 11:59:57 2011 +0000

    sna: Only update the damage region as necesary for contains-box
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_damage.c b/src/sna/sna_damage.c
index 02c125a..f2a5a93 100644
--- a/src/sna/sna_damage.c
+++ b/src/sna/sna_damage.c
@@ -1112,11 +1112,11 @@ static int _sna_damage_contains_box(struct sna_damage *damage,
 	if (!sna_damage_maybe_contains_box(damage, box))
 		return PIXMAN_REGION_OUT;
 
-	if (damage->mode == DAMAGE_SUBTRACT)
-		__sna_damage_reduce(damage);
-
 	ret = pixman_region_contains_rectangle(&damage->region, (BoxPtr)box);
-	if (ret != PIXMAN_REGION_OUT || !damage->dirty)
+	if (!damage->dirty)
+		return ret;
+
+	if (damage->mode == DAMAGE_ADD && ret == PIXMAN_REGION_IN)
 		return ret;
 
 	__sna_damage_reduce(damage);
commit f53936407bd68f3d36ab525b4e0531fad58098e3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Dec 29 11:59:37 2011 +0000

    sna: Reset the source counter upon dirtying the shadow pixmap
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 9c04e1d..04382e4 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -783,6 +783,7 @@ done:
 			list_move(&priv->list, &sna->dirty_pixmaps);
 	}
 
+	priv->source_count = SOURCE_BIAS;
 	priv->gpu = false;
 	return true;
 }
@@ -1063,6 +1064,7 @@ done:
 	if (dx | dy)
 		RegionTranslate(region, -dx, -dy);
 
+	priv->source_count = SOURCE_BIAS;
 	priv->gpu = false;
 	return true;
 }
@@ -1867,6 +1869,7 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 	}
 	if (priv->flush)
 		list_move(&priv->list, &sna->dirty_pixmaps);
+	priv->source_count = SOURCE_BIAS;
 
 blt:
 	get_drawable_deltas(drawable, pixmap, &dx, &dy);
@@ -9204,6 +9207,7 @@ sna_pixmap_free_gpu(struct sna *sna, struct sna_pixmap *priv)
 		       pixmap->drawable.height);
 	sna_pixmap_destroy_gpu_bo(sna, priv);
 
+	priv->source_count = SOURCE_BIAS;
 	priv->gpu = false;
 	return true;
 }
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index c859244..e7c3df4 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -337,7 +337,7 @@ move_to_gpu(PixmapPtr pixmap, const BoxRec *box)
 	count = SOURCE_BIAS;
 	priv = sna_pixmap(pixmap);
 	if (priv)
-		count = ++priv->source_count;
+		count = priv->source_count++;
 
 	DBG(("%s: migrate box (%d, %d), (%d, %d)? source count=%d, fraction=%d/%d [%d]\n",
 	     __FUNCTION__,
@@ -346,7 +346,7 @@ move_to_gpu(PixmapPtr pixmap, const BoxRec *box)
 	     pixmap->drawable.width * pixmap->drawable.height,
 	     pixmap->drawable.width * pixmap->drawable.height / (w*h)));
 
-	return count*w*h >= pixmap->drawable.width * pixmap->drawable.height;
+	return count*w*h > pixmap->drawable.width * pixmap->drawable.height;
 }
 
 static Bool


More information about the xorg-commit mailing list