xf86-video-intel: 2 commits - src/sna/kgem.h src/sna/sna_accel.c src/sna/sna_blt.c

Chris Wilson ickle at kemper.freedesktop.org
Sat Jul 6 08:03:33 PDT 2013


 src/sna/kgem.h      |    5 +++++
 src/sna/sna_accel.c |    6 ------
 src/sna/sna_blt.c   |   47 ++++++++++++++++++++++++++---------------------
 3 files changed, 31 insertions(+), 27 deletions(-)

New commits:
commit 5aaab9ea0310d48bb1a1ca20308d1c9721a9de3f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Jul 6 15:10:22 2013 +0100

    sna: Relax assertion that the source of the cloned pixmap cannot be mapped
    
    I was being overzealous at the time of making the COW and trying to be
    sure that we would never write through a mapping. Then I started to
    allow clones to be mapped (for reads) and missed relaxing this assertion.
    
    Reported-by: Jiri Slaby <jirislaby at gmail.com>
    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 010f6e4..da1ca40 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1729,13 +1729,7 @@ sna_pixmap_make_cow(struct sna *sna,
 
 		src_priv->cow = MAKE_COW_OWNER(cow);
 		list_init(&src_priv->cow_list);
-
-		if (src_priv->mapped) {
-			src_priv->pixmap->devPrivate.ptr = NULL;
-			src_priv->mapped = false;
-		}
 	}
-	assert(!src_priv->mapped);
 
 	if (cow == COW(dst_priv->cow)) {
 		assert(dst_priv->gpu_bo == cow->bo);
commit 8751c0f5ad202850bdd56dbb4eedb211c023cf23
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jul 5 17:55:10 2013 +0100

    sna: Flush blt copies if no operations pending
    
    More work to try and keep the GPU busy.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 73ac951..044dbba 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -319,6 +319,11 @@ static inline bool kgem_is_idle(struct kgem *kgem)
 	return kgem_ring_is_idle(kgem, kgem->ring);
 }
 
+static inline bool __kgem_ring_empty(struct kgem *kgem)
+{
+	return list_is_empty(&kgem->requests[kgem->ring == KGEM_BLT]);
+}
+
 void _kgem_submit(struct kgem *kgem);
 static inline void kgem_submit(struct kgem *kgem)
 {
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 8b10707..54cf4f8 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -85,7 +85,8 @@ static const uint8_t fill_ROP[] = {
 static void nop_done(struct sna *sna, const struct sna_composite_op *op)
 {
 	assert(sna->kgem.nbatch <= KGEM_BATCH_SIZE(&sna->kgem));
-	(void)sna;
+	if (sna->kgem.nreloc && __kgem_ring_empty(&sna->kgem))
+		_kgem_submit(&sna->kgem);
 	(void)op;
 }
 
@@ -93,6 +94,12 @@ static void gen6_blt_copy_done(struct sna *sna, const struct sna_composite_op *o
 {
 	struct kgem *kgem = &sna->kgem;
 
+	assert(kgem->nbatch <= KGEM_BATCH_SIZE(kgem));
+	if (kgem->nreloc && __kgem_ring_empty(kgem)) {
+		_kgem_submit(kgem);
+		return;
+	}
+
 	if (kgem_check_batch(kgem, 3)) {
 		uint32_t *b = kgem->batch + kgem->nbatch;
 		b[0] = XY_SETUP_CLIP;
@@ -2293,6 +2300,12 @@ static void convert_done(struct sna *sna, const struct sna_composite_op *op)
 {
 	struct kgem *kgem = &sna->kgem;
 
+	assert(kgem->nbatch <= KGEM_BATCH_SIZE(kgem));
+	if (kgem->nreloc && __kgem_ring_empty(kgem)) {
+		_kgem_submit(kgem);
+		return;
+	}
+
 	if (kgem->gen >= 060 && op->src.bo == op->dst.bo && kgem_check_batch(kgem, 3)) {
 		uint32_t *b = kgem->batch + kgem->nbatch;
 		b[0] = XY_SETUP_CLIP;
@@ -2459,11 +2472,6 @@ fastcall static void sna_blt_fill_op_boxes(struct sna *sna,
 	_sna_blt_fill_boxes(sna, &op->base.u.blt, box, nbox);
 }
 
-static void sna_blt_fill_op_done(struct sna *sna,
-				 const struct sna_fill_op *fill)
-{
-}
-
 bool sna_blt_fill(struct sna *sna, uint8_t alu,
 		  struct kgem_bo *bo, int bpp,
 		  uint32_t pixel,
@@ -2488,7 +2496,8 @@ bool sna_blt_fill(struct sna *sna, uint8_t alu,
 	fill->blt   = sna_blt_fill_op_blt;
 	fill->box   = sna_blt_fill_op_box;
 	fill->boxes = sna_blt_fill_op_boxes;
-	fill->done  = sna_blt_fill_op_done;
+	fill->done  =
+		(void (*)(struct sna *, const struct sna_fill_op *))nop_done;
 	return true;
 }
 
@@ -2504,17 +2513,6 @@ static void sna_blt_copy_op_blt(struct sna *sna,
 			 dst_x, dst_y);
 }
 
-static void sna_blt_copy_op_done(struct sna *sna,
-				 const struct sna_copy_op *op)
-{
-}
-
-static void gen6_blt_copy_op_done(struct sna *sna,
-				  const struct sna_copy_op *op)
-{
-	gen6_blt_copy_done(sna, &op->base);
-}
-
 bool sna_blt_copy(struct sna *sna, uint8_t alu,
 		  struct kgem_bo *src,
 		  struct kgem_bo *dst,
@@ -2538,9 +2536,11 @@ bool sna_blt_copy(struct sna *sna, uint8_t alu,
 
 	op->blt  = sna_blt_copy_op_blt;
 	if (sna->kgem.gen >= 060 && src == dst)
-		op->done = gen6_blt_copy_op_done;
+		op->done = (void (*)(struct sna *, const struct sna_copy_op *))
+			    gen6_blt_copy_done;
 	else
-		op->done = sna_blt_copy_op_done;
+		op->done = (void (*)(struct sna *, const struct sna_copy_op *))
+			    nop_done;
 	return true;
 }
 
@@ -2792,6 +2792,9 @@ bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu,
 		}
 	} while (nbox);
 
+	if (kgem->nreloc && __kgem_ring_empty(kgem))
+		_kgem_submit(kgem);
+
 	return true;
 }
 
@@ -2978,7 +2981,9 @@ bool sna_blt_copy_boxes(struct sna *sna, uint8_t alu,
 		} while (1);
 	}
 
-	if (kgem->gen >= 060 && kgem_check_batch(kgem, 3)) {
+	if (kgem->nreloc && __kgem_ring_empty(kgem)) {
+		_kgem_submit(kgem);
+	} else if (kgem->gen >= 060 && kgem_check_batch(kgem, 3)) {
 		uint32_t *b = kgem->batch + kgem->nbatch;
 		b[0] = XY_SETUP_CLIP;
 		b[1] = b[2] = 0;


More information about the xorg-commit mailing list