xf86-video-intel: 2 commits - src/sna/gen2_render.c src/sna/gen3_render.c src/sna/gen4_render.c src/sna/gen4_vertex.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c src/sna/gen8_render.c src/sna/gen8_vertex.c

Chris Wilson ickle at kemper.freedesktop.org
Fri Jan 24 06:23:28 PST 2014


 src/sna/gen2_render.c |   54 ++++++++++++++++++++++++--------------------------
 src/sna/gen3_render.c |   45 ++++++++++++++++++++---------------------
 src/sna/gen4_render.c |   14 +++++++++---
 src/sna/gen4_vertex.c |    2 -
 src/sna/gen5_render.c |   14 +++++++++---
 src/sna/gen6_render.c |   14 +++++++++---
 src/sna/gen7_render.c |   14 +++++++++---
 src/sna/gen8_render.c |   14 +++++++++---
 src/sna/gen8_vertex.c |    2 -
 9 files changed, 100 insertions(+), 73 deletions(-)

New commits:
commit 294180b3bf78f2c0ae2f1197e1c0819d99009356
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jan 24 14:21:44 2014 +0000

    sna/gen3+: Allow for spill when aligning vertices
    
    We need to flush the batch if we run out of space aligning our vertex
    buffer - but the test must anticipate the space required for the new
    alignment.
    
    Reported-by: Arkadiusz Miskiewicz
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 941b633..5601f4c 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -3137,7 +3137,7 @@ gen3_align_vertex(struct sna *sna,
 	if ((int)sna->render.vertex_size - vertex_index * op->floats_per_vertex < 2*op->floats_per_rect) {
 		DBG(("%s: flushing vertex buffer: new index=%d, max=%d\n",
 		     __FUNCTION__, vertex_index, sna->render.vertex_size / op->floats_per_vertex));
-		if (gen3_vertex_finish(sna) < op->floats_per_vertex)
+		if (gen3_vertex_finish(sna) < 2*op->floats_per_vertex)
 			kgem_submit(&sna->kgem);
 
 		vertex_index = (sna->render.vertex_used + op->floats_per_vertex - 1) / op->floats_per_vertex;
diff --git a/src/sna/gen4_vertex.c b/src/sna/gen4_vertex.c
index 38f4cf3..4b3496c 100644
--- a/src/sna/gen4_vertex.c
+++ b/src/sna/gen4_vertex.c
@@ -48,7 +48,7 @@ void gen4_vertex_align(struct sna *sna, const struct sna_composite_op *op)
 	if ((int)sna->render.vertex_size - vertex_index * op->floats_per_vertex < 2*op->floats_per_rect) {
 		DBG(("%s: flushing vertex buffer: new index=%d, max=%d\n",
 		     __FUNCTION__, vertex_index, sna->render.vertex_size / op->floats_per_vertex));
-		if (gen4_vertex_finish(sna) < op->floats_per_rect) {
+		if (gen4_vertex_finish(sna) < 2*op->floats_per_rect) {
 			kgem_submit(&sna->kgem);
 			_kgem_set_mode(&sna->kgem, KGEM_RENDER);
 		}
diff --git a/src/sna/gen8_vertex.c b/src/sna/gen8_vertex.c
index dfa4cce..c66d864 100644
--- a/src/sna/gen8_vertex.c
+++ b/src/sna/gen8_vertex.c
@@ -44,7 +44,7 @@ void gen8_vertex_align(struct sna *sna, const struct sna_composite_op *op)
 	if ((int)sna->render.vertex_size - vertex_index * op->floats_per_vertex < 2*op->floats_per_rect) {
 		DBG(("%s: flushing vertex buffer: new index=%d, max=%d\n",
 		     __FUNCTION__, vertex_index, sna->render.vertex_size / op->floats_per_vertex));
-		if (gen8_vertex_finish(sna) < op->floats_per_rect) {
+		if (gen8_vertex_finish(sna) < 2*op->floats_per_rect) {
 			kgem_submit(&sna->kgem);
 			_kgem_set_mode(&sna->kgem, KGEM_RENDER);
 		}
commit 4385724dc49dd090e0a5956e287f80b92ebd70e8
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jan 24 11:29:26 2014 +0000

    sna/gen2+: Inspect composite flags to discard unneeded CPU damage
    
    We can now check whether the Composite operation will require existing
    CPU damage and if not discard it.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c
index 0cb7207..da7049c 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1570,9 +1570,11 @@ static bool
 gen2_composite_set_target(struct sna *sna,
 			  struct sna_composite_op *op,
 			  PicturePtr dst,
-			  int x, int y, int w, int h)
+			  int x, int y, int w, int h,
+			  bool partial)
 {
 	BoxRec box;
+	unsigned hint;
 
 	op->dst.pixmap = get_drawable_pixmap(dst->pDrawable);
 	op->dst.format = dst->format;
@@ -1587,9 +1589,14 @@ gen2_composite_set_target(struct sna *sna,
 	} else
 		sna_render_picture_extents(dst, &box);
 
-	op->dst.bo = sna_drawable_use_bo (dst->pDrawable,
-					  PREFER_GPU | FORCE_GPU | RENDER_GPU,
-					  &box, &op->damage);
+	hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+	if (!partial) {
+		hint |= IGNORE_CPU;
+		if (w == op->dst.width && h == op->dst.height)
+			hint |= REPLACES;
+	}
+
+	op->dst.bo = sna_drawable_use_bo(dst->pDrawable, hint, &box, &op->damage);
 	if (op->dst.bo == NULL)
 		return false;
 
@@ -1607,6 +1614,12 @@ gen2_composite_set_target(struct sna *sna,
 	     op->damage ? *op->damage : (void *)-1));
 
 	assert(op->dst.bo->proxy == NULL);
+
+	if (((too_large(op->dst.width, op->dst.height) ||
+	      op->dst.bo->pitch > MAX_3D_PITCH)) &&
+	    !sna_render_composite_redirect(sna, op, x, y, w, h, partial))
+		return false;
+
 	return true;
 }
 
@@ -1856,24 +1869,17 @@ gen2_render_composite(struct sna *sna,
 					    width,  height,
 					    tmp);
 
+	tmp->op = op;
+	sna_render_composite_redirect_init(tmp);
+
 	if (!gen2_composite_set_target(sna, tmp, dst,
-				       dst_x, dst_y, width, height)) {
+				       dst_x, dst_y, width, height,
+				       flags & COMPOSITE_PARTIAL || op > PictOpSrc || dst->pCompositeClip->data != NULL)) {
 		DBG(("%s: unable to set render target\n",
 		     __FUNCTION__));
 		goto fallback;
 	}
 
-	tmp->op = op;
-
-	sna_render_composite_redirect_init(tmp);
-	if (too_large(tmp->dst.width, tmp->dst.height) ||
-	    tmp->dst.bo->pitch > MAX_3D_PITCH) {
-		if (!sna_render_composite_redirect(sna, tmp,
-						   dst_x, dst_y, width, height,
-						   op > PictOpSrc || dst->pCompositeClip->data != NULL))
-			goto fallback;
-	}
-
 	switch (gen2_composite_picture(sna, src, &tmp->src,
 				       src_x, src_y,
 				       width, height,
@@ -2531,24 +2537,16 @@ gen2_render_composite_spans(struct sna *sna,
 						  width, height, flags, tmp);
 	}
 
+	tmp->base.op = op;
+	sna_render_composite_redirect_init(&tmp->base);
 	if (!gen2_composite_set_target(sna, &tmp->base, dst,
-				       dst_x, dst_y, width, height)) {
+				       dst_x, dst_y, width, height,
+				       true)) {
 		DBG(("%s: unable to set render target\n",
 		     __FUNCTION__));
 		return false;
 	}
 
-	tmp->base.op = op;
-
-	sna_render_composite_redirect_init(&tmp->base);
-	if (too_large(tmp->base.dst.width, tmp->base.dst.height) ||
-	    tmp->base.dst.bo->pitch > MAX_3D_PITCH) {
-		if (!sna_render_composite_redirect(sna, &tmp->base,
-						   dst_x, dst_y, width, height,
-						   true))
-			return false;
-	}
-
 	switch (gen2_composite_picture(sna, src, &tmp->base.src,
 				       src_x, src_y,
 				       width, height,
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 0079bad..941b633 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -3151,9 +3151,11 @@ static bool
 gen3_composite_set_target(struct sna *sna,
 			  struct sna_composite_op *op,
 			  PicturePtr dst,
-			  int x, int y, int w, int h)
+			  int x, int y, int w, int h,
+			  bool partial)
 {
 	BoxRec box;
+	unsigned hint;
 
 	op->dst.pixmap = get_drawable_pixmap(dst->pDrawable);
 	op->dst.format = dst->format;
@@ -3168,9 +3170,14 @@ gen3_composite_set_target(struct sna *sna,
 	} else
 		sna_render_picture_extents(dst, &box);
 
-	op->dst.bo = sna_drawable_use_bo(dst->pDrawable,
-					 PREFER_GPU | FORCE_GPU | RENDER_GPU,
-					 &box, &op->damage);
+	hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+	if (!partial) {
+		hint |= IGNORE_CPU;
+		if (w == op->dst.width && h == op->dst.height)
+			hint |= REPLACES;
+	}
+
+	op->dst.bo = sna_drawable_use_bo(dst->pDrawable, hint, &box, &op->damage);
 	if (op->dst.bo == NULL)
 		return false;
 
@@ -3196,6 +3203,12 @@ gen3_composite_set_target(struct sna *sna,
 	     op->damage ? *op->damage : (void *)-1));
 
 	assert(op->dst.bo->proxy == NULL);
+
+	if ((too_large(op->dst.width, op->dst.height) ||
+	     !gen3_check_pitch_3d(op->dst.bo)) &&
+	    !sna_render_composite_redirect(sna, op, x, y, w, h, partial))
+		return false;
+
 	return true;
 }
 
@@ -3489,7 +3502,8 @@ gen3_render_composite(struct sna *sna,
 					    tmp);
 
 	if (!gen3_composite_set_target(sna, tmp, dst,
-				       dst_x, dst_y, width, height)) {
+				       dst_x, dst_y, width, height,
+				       flags & COMPOSITE_PARTIAL || op > PictOpSrc || dst->pCompositeClip->data)) {
 		DBG(("%s: unable to set render target\n",
 		     __FUNCTION__));
 		goto fallback;
@@ -3497,14 +3511,6 @@ gen3_render_composite(struct sna *sna,
 
 	tmp->op = op;
 	tmp->rb_reversed = gen3_dst_rb_reversed(tmp->dst.format);
-	if (too_large(tmp->dst.width, tmp->dst.height) ||
-	    !gen3_check_pitch_3d(tmp->dst.bo)) {
-		if (!sna_render_composite_redirect(sna, tmp,
-						   dst_x, dst_y, width, height,
-						   op > PictOpSrc || dst->pCompositeClip->data))
-			goto fallback;
-	}
-
 	tmp->u.gen3.num_constants = 0;
 	tmp->src.u.gen3.type = SHADER_TEXTURE;
 	tmp->src.is_affine = true;
@@ -4848,7 +4854,8 @@ gen3_render_composite_spans(struct sna *sna,
 	}
 
 	if (!gen3_composite_set_target(sna, &tmp->base, dst,
-				       dst_x, dst_y, width, height)) {
+				       dst_x, dst_y, width, height,
+				       true)) {
 		DBG(("%s: unable to set render target\n",
 		     __FUNCTION__));
 		return false;
@@ -4856,14 +4863,6 @@ gen3_render_composite_spans(struct sna *sna,
 
 	tmp->base.op = op;
 	tmp->base.rb_reversed = gen3_dst_rb_reversed(tmp->base.dst.format);
-	if (too_large(tmp->base.dst.width, tmp->base.dst.height) ||
-	    !gen3_check_pitch_3d(tmp->base.dst.bo)) {
-		if (!sna_render_composite_redirect(sna, &tmp->base,
-						   dst_x, dst_y, width, height,
-						   true))
-			return false;
-	}
-
 	tmp->base.src.u.gen3.type = SHADER_TEXTURE;
 	tmp->base.src.is_affine = true;
 	DBG(("%s: preparing source\n", __FUNCTION__));
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 1a559f0..4f4a4c8 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -1635,6 +1635,7 @@ gen4_composite_set_target(struct sna *sna,
 			  bool partial)
 {
 	BoxRec box;
+	unsigned hint;
 
 	op->dst.pixmap = get_drawable_pixmap(dst->pDrawable);
 	op->dst.width  = op->dst.pixmap->drawable.width;
@@ -1648,9 +1649,14 @@ gen4_composite_set_target(struct sna *sna,
 	} else
 		sna_render_picture_extents(dst, &box);
 
-	op->dst.bo = sna_drawable_use_bo (dst->pDrawable,
-					  PREFER_GPU | FORCE_GPU | RENDER_GPU,
-					  &box, &op->damage);
+	hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+	if (!partial) {
+		hint |= IGNORE_CPU;
+		if (w == op->dst.width && h == op->dst.height)
+			hint |= REPLACES;
+	}
+
+	op->dst.bo = sna_drawable_use_bo(dst->pDrawable, hint, &box, &op->damage);
 	if (op->dst.bo == NULL)
 		return false;
 
@@ -1924,7 +1930,7 @@ gen4_render_composite(struct sna *sna,
 
 	if (!gen4_composite_set_target(sna, tmp, dst,
 				       dst_x, dst_y, width, height,
-				       op > PictOpSrc || dst->pCompositeClip->data)) {
+				       flags & COMPOSITE_PARTIAL || op > PictOpSrc || dst->pCompositeClip->data)) {
 		DBG(("%s: failed to set composite target\n", __FUNCTION__));
 		goto fallback;
 	}
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 23b0c14..3396acd 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -1571,6 +1571,7 @@ gen5_composite_set_target(struct sna *sna,
 			  bool partial)
 {
 	BoxRec box;
+	unsigned hint;
 
 	op->dst.pixmap = get_drawable_pixmap(dst->pDrawable);
 	op->dst.width  = op->dst.pixmap->drawable.width;
@@ -1584,9 +1585,14 @@ gen5_composite_set_target(struct sna *sna,
 	} else
 		sna_render_picture_extents(dst, &box);
 
-	op->dst.bo = sna_drawable_use_bo (dst->pDrawable,
-					  PREFER_GPU | FORCE_GPU | RENDER_GPU,
-					  &box, &op->damage);
+	hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+	if (!partial) {
+		hint |= IGNORE_CPU;
+		if (w == op->dst.width && h == op->dst.height)
+			hint |= REPLACES;
+	}
+
+	op->dst.bo = sna_drawable_use_bo(dst->pDrawable, hint, &box, &op->damage);
 	if (op->dst.bo == NULL)
 		return false;
 
@@ -1863,7 +1869,7 @@ gen5_render_composite(struct sna *sna,
 
 	if (!gen5_composite_set_target(sna, tmp, dst,
 				       dst_x, dst_y, width, height,
-				       op > PictOpSrc || dst->pCompositeClip->data)) {
+				       flags & COMPOSITE_PARTIAL || op > PictOpSrc || dst->pCompositeClip->data)) {
 		DBG(("%s: failed to set composite target\n", __FUNCTION__));
 		goto fallback;
 	}
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index d0e202f..a117bf8 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -1828,6 +1828,7 @@ gen6_composite_set_target(struct sna *sna,
 			  bool partial)
 {
 	BoxRec box;
+	unsigned int hint;
 
 	op->dst.pixmap = get_drawable_pixmap(dst->pDrawable);
 	op->dst.format = dst->format;
@@ -1842,9 +1843,14 @@ gen6_composite_set_target(struct sna *sna,
 	} else
 		sna_render_picture_extents(dst, &box);
 
-	op->dst.bo = sna_drawable_use_bo(dst->pDrawable,
-					 PREFER_GPU | FORCE_GPU | RENDER_GPU,
-					 &box, &op->damage);
+	hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+	if (!partial) {
+		hint |= IGNORE_CPU;
+		if (w == op->dst.width && h == op->dst.height)
+			hint |= REPLACES;
+	}
+
+	op->dst.bo = sna_drawable_use_bo(dst->pDrawable, hint, &box, &op->damage);
 	if (op->dst.bo == NULL)
 		return false;
 
@@ -2159,7 +2165,7 @@ gen6_render_composite(struct sna *sna,
 	tmp->op = op;
 	if (!gen6_composite_set_target(sna, tmp, dst,
 				       dst_x, dst_y, width, height,
-				       op > PictOpSrc || dst->pCompositeClip->data))
+				       flags & COMPOSITE_PARTIAL || op > PictOpSrc || dst->pCompositeClip->data))
 		goto fallback;
 
 	switch (gen6_composite_picture(sna, src, &tmp->src,
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 1ea7392..eec6d65 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2108,6 +2108,7 @@ gen7_composite_set_target(struct sna *sna,
 			  bool partial)
 {
 	BoxRec box;
+	unsigned int hint;
 
 	op->dst.pixmap = get_drawable_pixmap(dst->pDrawable);
 	op->dst.format = dst->format;
@@ -2123,9 +2124,14 @@ gen7_composite_set_target(struct sna *sna,
 	} else
 		sna_render_picture_extents(dst, &box);
 
-	op->dst.bo = sna_drawable_use_bo(dst->pDrawable,
-					 PREFER_GPU | FORCE_GPU | RENDER_GPU,
-					 &box, &op->damage);
+	hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+	if (!partial) {
+		hint |= IGNORE_CPU;
+		if (w == op->dst.width && h == op->dst.height)
+			hint |= REPLACES;
+	}
+
+	op->dst.bo = sna_drawable_use_bo(dst->pDrawable, hint, &box, &op->damage);
 	if (op->dst.bo == NULL)
 		return false;
 
@@ -2440,7 +2446,7 @@ gen7_render_composite(struct sna *sna,
 	tmp->op = op;
 	if (!gen7_composite_set_target(sna, tmp, dst,
 				       dst_x, dst_y, width, height,
-				       op > PictOpSrc || dst->pCompositeClip->data))
+				       flags & COMPOSITE_PARTIAL || op > PictOpSrc || dst->pCompositeClip->data))
 		goto fallback;
 
 	switch (gen7_composite_picture(sna, src, &tmp->src,
diff --git a/src/sna/gen8_render.c b/src/sna/gen8_render.c
index 13e1662..fcc37ab 100644
--- a/src/sna/gen8_render.c
+++ b/src/sna/gen8_render.c
@@ -1859,6 +1859,7 @@ gen8_composite_set_target(struct sna *sna,
 			  bool partial)
 {
 	BoxRec box;
+	unsigned int hint;
 
 	op->dst.pixmap = get_drawable_pixmap(dst->pDrawable);
 	op->dst.format = dst->format;
@@ -1874,9 +1875,14 @@ gen8_composite_set_target(struct sna *sna,
 	} else
 		sna_render_picture_extents(dst, &box);
 
-	op->dst.bo = sna_drawable_use_bo(dst->pDrawable,
-					 PREFER_GPU | FORCE_GPU | RENDER_GPU,
-					 &box, &op->damage);
+	hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+	if (!partial) {
+		hint |= IGNORE_CPU;
+		if (w == op->dst.width && h == op->dst.height)
+			hint |= REPLACES;
+	}
+
+	op->dst.bo = sna_drawable_use_bo(dst->pDrawable, hint, &box, &op->damage);
 	if (op->dst.bo == NULL)
 		return false;
 
@@ -2191,7 +2197,7 @@ gen8_render_composite(struct sna *sna,
 	tmp->op = op;
 	if (!gen8_composite_set_target(sna, tmp, dst,
 				       dst_x, dst_y, width, height,
-				       op > PictOpSrc || dst->pCompositeClip->data))
+				       flags & COMPOSITE_PARTIAL || op > PictOpSrc || dst->pCompositeClip->data))
 		goto fallback;
 
 	switch (gen8_composite_picture(sna, src, &tmp->src,


More information about the xorg-commit mailing list