xf86-video-intel: 7 commits - src/sna/gen2_render.c src/sna/gen3_render.c src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c src/sna/kgem.c src/sna/kgem.h src/sna/sna_glyphs.c

Chris Wilson ickle at kemper.freedesktop.org
Sun Sep 25 02:01:13 PDT 2011


 src/sna/gen2_render.c |   26 +++++++++---------------
 src/sna/gen3_render.c |   26 +++++++++---------------
 src/sna/gen4_render.c |   24 +++++++---------------
 src/sna/gen5_render.c |   54 +++++++++++++++++++++++---------------------------
 src/sna/gen6_render.c |   24 +++++++---------------
 src/sna/gen7_render.c |   24 +++++++---------------
 src/sna/kgem.c        |   32 +++++++++++++++++++++--------
 src/sna/kgem.h        |   10 ++++++++-
 src/sna/sna_glyphs.c  |   16 ++++++++------
 9 files changed, 110 insertions(+), 126 deletions(-)

New commits:
commit 4fd46b8bb7e7a104a0afa0e5dee92993e043ef57
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Sep 25 10:02:02 2011 +0100

    sna/glyphs: Add glyphs directly onto a client temporary buffer
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_glyphs.c b/src/sna/sna_glyphs.c
index 0f0dc09..4db5baf 100644
--- a/src/sna/sna_glyphs.c
+++ b/src/sna/sna_glyphs.c
@@ -1139,7 +1139,7 @@ sna_glyphs(CARD8 op,
 
 	/* XXX discard the mask for non-overlapping glyphs? */
 
-	if (!mask) {
+	if (!mask || (op == PictOpAdd && dst->format == mask->format)) {
 		if (glyphs_to_dst(sna, op,
 				  src, dst,
 				  src_x, src_y,
commit 5154e281ed66334a8ff6342236c1203a1e4ac5a3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Sep 25 09:56:16 2011 +0100

    sna/glyph: Avoid useless attempt at GPU glyph rendering to a1 destinations
    
    The actual bug is a little involved as we don't damage the temporary
    glyph mask correctly presuming that we only hit GPU paths. However,
    should we fail to prepare the composite operation that paints the mask
    on to the destination, things fail horribly.
    
    One particular example is that wine like to create its own temporary a1
    buffer for the glyphs (which we render to via another temporary mask...)
    which triggers the delayed fallback and then sw compositing with a random
    buffer.
    
    Reported-by: Roman Jarosz <kedgedev at gmail.com>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=41165
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_glyphs.c b/src/sna/sna_glyphs.c
index e0ef313..0f0dc09 100644
--- a/src/sna/sna_glyphs.c
+++ b/src/sna/sna_glyphs.c
@@ -1121,6 +1121,11 @@ sna_glyphs(CARD8 op,
 		goto fallback;
 	}
 
+	if (!is_gpu(dst->pDrawable)) {
+		DBG(("%s: fallback -- no destination bo\n", __FUNCTION__));
+		goto fallback;
+	}
+
 	if (too_small(dst->pDrawable) && !picture_is_gpu(src)) {
 		DBG(("%s: fallback -- too small (%dx%d)\n",
 		     __FUNCTION__, dst->pDrawable->width, dst->pDrawable->height));
commit 46fedf0cf1a413381109c1de34619e84ad614b8a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Sep 25 09:38:43 2011 +0100

    sna/kgem: Check all operation bo in a single amalgamation
    
    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 981f6af..43a7cad 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1347,11 +1347,9 @@ gen2_render_composite(struct sna *sna,
 	tmp->boxes = gen2_render_composite_boxes;
 	tmp->done  = gen2_render_composite_done;
 
-	if (!kgem_check_bo(&sna->kgem, tmp->dst.bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, tmp->src.bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, tmp->mask.bo))
+	if (!kgem_check_bo(&sna->kgem,
+			   tmp->dst.bo, tmp->src.bo, tmp->mask.bo,
+			   NULL))
 		kgem_submit(&sna->kgem);
 
 	if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) {
@@ -1720,9 +1718,9 @@ gen2_render_composite_spans(struct sna *sna,
 	tmp->boxes = gen2_render_composite_spans_boxes;
 	tmp->done  = gen2_render_composite_spans_done;
 
-	if (!kgem_check_bo(&sna->kgem, tmp->base.dst.bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, tmp->base.src.bo))
+	if (!kgem_check_bo(&sna->kgem,
+			   tmp->base.dst.bo, tmp->base.src.bo,
+			   NULL))
 		kgem_submit(&sna->kgem);
 
 	gen2_emit_composite_spans_state(sna, tmp);
@@ -1876,7 +1874,7 @@ gen2_render_fill_boxes(struct sna *sna,
 	tmp.dst.bo = dst_bo;
 	tmp.floats_per_vertex = 2;
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	gen2_emit_fill_composite_state(sna, &tmp, pixel);
@@ -1995,7 +1993,7 @@ gen2_render_fill(struct sna *sna, uint8_t alu,
 	tmp->base.u.gen2.pixel =
 		sna_rgba_for_color(color, dst->drawable.depth);
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	tmp->blt  = gen2_render_fill_blt;
@@ -2119,9 +2117,7 @@ gen2_render_copy_boxes(struct sna *sna, uint8_t alu,
 					  box, n);
 	}
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, src_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	if (kgem_bo_is_dirty(src_bo))
@@ -2263,9 +2259,7 @@ gen2_render_copy(struct sna *sna, uint8_t alu,
 
 	tmp->base.floats_per_vertex = 4;
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, src_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	if (kgem_bo_is_dirty(src_bo))
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 2383e78..bac0353 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2338,11 +2338,9 @@ gen3_render_composite(struct sna *sna,
 	tmp->boxes = gen3_render_composite_boxes;
 	tmp->done  = gen3_render_composite_done;
 
-	if (!kgem_check_bo(&sna->kgem, tmp->dst.bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, tmp->src.bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, tmp->mask.bo))
+	if (!kgem_check_bo(&sna->kgem,
+			   tmp->dst.bo, tmp->src.bo, tmp->mask.bo,
+			   NULL))
 		kgem_submit(&sna->kgem);
 
 	if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) {
@@ -2743,9 +2741,9 @@ gen3_render_composite_spans(struct sna *sna,
 	tmp->boxes = gen3_render_composite_spans_boxes;
 	tmp->done  = gen3_render_composite_spans_done;
 
-	if (!kgem_check_bo(&sna->kgem, tmp->base.dst.bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, tmp->base.src.bo))
+	if (!kgem_check_bo(&sna->kgem,
+			   tmp->base.dst.bo, tmp->base.src.bo,
+			   NULL))
 		kgem_submit(&sna->kgem);
 
 	if (kgem_bo_is_dirty(tmp->base.src.bo)) {
@@ -3283,9 +3281,7 @@ gen3_render_copy_boxes(struct sna *sna, uint8_t alu,
 					  box, n);
 	}
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, src_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	if (kgem_bo_is_dirty(src_bo))
@@ -3433,9 +3429,7 @@ gen3_render_copy(struct sna *sna, uint8_t alu,
 	tmp->base.floats_per_vertex = 4;
 	tmp->base.mask.u.gen3.type = SHADER_NONE;
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, src_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	if (kgem_bo_is_dirty(src_bo))
@@ -3552,7 +3546,7 @@ gen3_render_fill_boxes(struct sna *sna,
 	tmp.src.u.gen3.type = op == PictOpClear ? SHADER_ZERO : SHADER_CONSTANT;
 	tmp.src.u.gen3.mode = pixel;
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	gen3_emit_composite_state(sna, &tmp);
@@ -3654,7 +3648,7 @@ gen3_render_fill(struct sna *sna, uint8_t alu,
 	tmp->base.src.u.gen3.mode =
 		sna_rgba_for_color(color, dst->drawable.depth);
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	tmp->blt  = gen3_render_fill_blt;
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 5d115a5..3c133be 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -1637,9 +1637,7 @@ gen4_render_video(struct sna *sna,
 	tmp.floats_per_vertex = 3;
 	tmp.u.gen4.ve_id = 1;
 
-	if (!kgem_check_bo(&sna->kgem, tmp.dst.bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, frame->bo))
+	if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	if (!kgem_bo_is_dirty(frame->bo))
@@ -2034,11 +2032,9 @@ gen4_render_composite(struct sna *sna,
 	tmp->boxes = gen4_render_composite_boxes;
 	tmp->done  = gen4_render_composite_done;
 
-	if (!kgem_check_bo(&sna->kgem, tmp->dst.bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, tmp->src.bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, tmp->mask.bo))
+	if (!kgem_check_bo(&sna->kgem,
+			   tmp->dst.bo, tmp->src.bo, tmp->mask.bo,
+			   NULL))
 		kgem_submit(&sna->kgem);
 
 	if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo))
@@ -2209,9 +2205,7 @@ gen4_render_copy_boxes(struct sna *sna, uint8_t alu,
 	tmp.u.gen4.wm_kernel = WM_KERNEL;
 	tmp.u.gen4.ve_id = 1;
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, src_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	if (kgem_bo_is_dirty(src_bo))
@@ -2309,9 +2303,7 @@ gen4_render_copy(struct sna *sna, uint8_t alu,
 	op->base.u.gen4.wm_kernel = WM_KERNEL;
 	op->base.u.gen4.ve_id = 1;
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, src_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	if (kgem_bo_is_dirty(src_bo))
@@ -2464,7 +2456,7 @@ gen4_render_fill_boxes(struct sna *sna,
 	tmp.u.gen4.wm_kernel = WM_KERNEL;
 	tmp.u.gen4.ve_id = 1;
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	gen4_fill_bind_surfaces(sna, &tmp);
@@ -2547,7 +2539,7 @@ gen4_render_fill(struct sna *sna, uint8_t alu,
 	op->base.u.gen4.wm_kernel = WM_KERNEL;
 	op->base.u.gen4.ve_id = 1;
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	gen4_fill_bind_surfaces(sna, &op->base);
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index a4b08d0..ad27d90 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -720,7 +720,7 @@ gen5_bind_bo(struct sna *sna,
 
 	DBG(("[%x] bind bo(handle=%d, addr=%d), format=%d, width=%d, height=%d, pitch=%d, tiling=%d -> %s\n",
 	     offset, bo->handle, ss[1],
-	    format, width, height, bo->pitch, bo->tiling,
+	     format, width, height, bo->pitch, bo->tiling,
 	     domains & 0xffff ? "render" : "sampler"));
 
 	return offset;
@@ -1664,9 +1664,7 @@ gen5_render_video(struct sna *sna,
 	tmp.is_affine = TRUE;
 	tmp.floats_per_vertex = 3;
 
-	if (!kgem_check_bo(&sna->kgem, tmp.dst.bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, frame->bo))
+	if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	if (!kgem_bo_is_dirty(frame->bo))
@@ -2045,11 +2043,8 @@ gen5_render_composite(struct sna *sna,
 	tmp->boxes = gen5_render_composite_boxes;
 	tmp->done  = gen5_render_composite_done;
 
-	if (!kgem_check_bo(&sna->kgem, tmp->dst.bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, tmp->src.bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, tmp->mask.bo))
+	if (!kgem_check_bo(&sna->kgem,
+			   tmp->dst.bo, tmp->src.bo, tmp->mask.bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo))
@@ -2159,9 +2154,7 @@ gen5_render_copy_boxes(struct sna *sna, uint8_t alu,
 	tmp.u.gen5.wm_kernel = WM_KERNEL;
 	tmp.u.gen5.ve_id = 1;
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, src_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	if (kgem_bo_is_dirty(src_bo))
@@ -2295,9 +2288,7 @@ gen5_render_copy(struct sna *sna, uint8_t alu,
 	op->base.u.gen5.wm_kernel = WM_KERNEL;
 	op->base.u.gen5.ve_id = 1;
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, src_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	if (kgem_bo_is_dirty(src_bo))
@@ -2368,17 +2359,17 @@ gen5_render_fill_boxes(struct sna *sna,
 	    dst->drawable.height > 8192 ||
 	    !gen5_check_dst_format(format)) {
 		uint8_t alu = GXcopy;
+		uint8_t _op = op;
 
-		if (op == PictOpClear) {
+		if (_op == PictOpClear) {
 			alu = GXclear;
-			pixel = 0;
-			op = PictOpSrc;
+			_op = PictOpSrc;
 		}
 
-		if (op == PictOpOver && color->alpha >= 0xff00)
-			op = PictOpSrc;
+		if (_op == PictOpOver && color->alpha >= 0xff00)
+			_op = PictOpSrc;
 
-		if (op == PictOpSrc &&
+		if (_op == PictOpSrc &&
 		    sna_get_pixel_from_rgba(&pixel,
 					    color->red,
 					    color->green,
@@ -2423,7 +2414,7 @@ gen5_render_fill_boxes(struct sna *sna,
 	tmp.u.gen5.wm_kernel = WM_KERNEL;
 	tmp.u.gen5.ve_id = 1;
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	gen5_fill_bind_surfaces(sna, &tmp);
@@ -2542,7 +2533,7 @@ gen5_render_fill(struct sna *sna, uint8_t alu,
 	op->base.u.gen5.wm_kernel = WM_KERNEL;
 	op->base.u.gen5.ve_id = 1;
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	gen5_fill_bind_surfaces(sna, &op->base);
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 91f5900..044704d 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -1838,9 +1838,7 @@ gen6_render_video(struct sna *sna,
 	tmp.u.gen6.nr_inputs = 1;
 	tmp.u.gen6.ve_id = 1;
 
-	if (!kgem_check_bo(&sna->kgem, tmp.dst.bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, frame->bo))
+	if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	if (kgem_bo_is_dirty(frame->bo))
@@ -2222,11 +2220,9 @@ gen6_render_composite(struct sna *sna,
 	tmp->boxes = gen6_render_composite_boxes;
 	tmp->done  = gen6_render_composite_done;
 
-	if (!kgem_check_bo(&sna->kgem, tmp->dst.bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, tmp->src.bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, tmp->mask.bo))
+	if (!kgem_check_bo(&sna->kgem,
+			   tmp->dst.bo, tmp->src.bo, tmp->mask.bo,
+			   NULL))
 		kgem_submit(&sna->kgem);
 
 	if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo))
@@ -2355,9 +2351,7 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu,
 	tmp.u.gen6.nr_inputs = 1;
 	tmp.u.gen6.ve_id = 1;
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, src_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	if (kgem_bo_is_dirty(src_bo))
@@ -2503,9 +2497,7 @@ gen6_render_copy(struct sna *sna, uint8_t alu,
 	op->base.u.gen6.nr_inputs = 1;
 	op->base.u.gen6.ve_id = 1;
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, src_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	if (kgem_bo_is_dirty(src_bo))
@@ -2642,7 +2634,7 @@ gen6_render_fill_boxes(struct sna *sna,
 	tmp.u.gen6.nr_inputs = 1;
 	tmp.u.gen6.ve_id = 1;
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	gen6_emit_fill_state(sna, &tmp);
@@ -2768,7 +2760,7 @@ gen6_render_fill(struct sna *sna, uint8_t alu,
 	op->base.u.gen6.nr_inputs = 1;
 	op->base.u.gen6.ve_id = 1;
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	gen6_emit_fill_state(sna, &op->base);
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 709b02e..a7bfc81 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -1970,9 +1970,7 @@ gen7_render_video(struct sna *sna,
 	tmp.u.gen7.nr_inputs = 1;
 	tmp.u.gen7.ve_id = 1;
 
-	if (!kgem_check_bo(&sna->kgem, tmp.dst.bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, frame->bo))
+	if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	if (kgem_bo_is_dirty(frame->bo))
@@ -2355,11 +2353,9 @@ gen7_render_composite(struct sna *sna,
 	tmp->boxes = gen7_render_composite_boxes;
 	tmp->done  = gen7_render_composite_done;
 
-	if (!kgem_check_bo(&sna->kgem, tmp->dst.bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, tmp->src.bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, tmp->mask.bo))
+	if (!kgem_check_bo(&sna->kgem,
+			   tmp->dst.bo, tmp->src.bo, tmp->mask.bo,
+			   NULL))
 		kgem_submit(&sna->kgem);
 
 	if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo))
@@ -2490,9 +2486,7 @@ gen7_render_copy_boxes(struct sna *sna, uint8_t alu,
 	tmp.u.gen7.nr_inputs = 1;
 	tmp.u.gen7.ve_id = 1;
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, src_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	if (kgem_bo_is_dirty(src_bo))
@@ -2640,9 +2634,7 @@ gen7_render_copy(struct sna *sna, uint8_t alu,
 	op->base.u.gen7.nr_inputs = 1;
 	op->base.u.gen7.ve_id = 1;
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
-		kgem_submit(&sna->kgem);
-	if (!kgem_check_bo(&sna->kgem, src_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	if (kgem_bo_is_dirty(src_bo))
@@ -2785,7 +2777,7 @@ gen7_render_fill_boxes(struct sna *sna,
 	tmp.u.gen7.nr_inputs = 1;
 	tmp.u.gen7.ve_id = 1;
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	gen7_emit_fill_state(sna, &tmp);
@@ -2912,7 +2904,7 @@ gen7_render_fill(struct sna *sna, uint8_t alu,
 	op->base.u.gen7.nr_inputs = 1;
 	op->base.u.gen7.ve_id = 1;
 
-	if (!kgem_check_bo(&sna->kgem, dst_bo))
+	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
 		kgem_submit(&sna->kgem);
 
 	gen7_emit_fill_state(sna, &op->base);
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index dcfcbbd..5037425 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1209,7 +1209,7 @@ search_linear_cache(struct kgem *kgem, unsigned int size, bool use_active)
 		     use_active ? "active" : "inactive"));
 		assert(bo->refcnt == 0);
 		assert(bo->reusable);
-		assert(use_active || !kgem_busy(kgem, bo->handle));
+		//assert(use_active || !kgem_busy(kgem, bo->handle));
 		return bo;
 	}
 
@@ -1562,21 +1562,30 @@ void __kgem_flush(struct kgem *kgem, struct kgem_bo *bo)
 	kgem_busy(kgem, bo->handle);
 }
 
-bool kgem_check_bo(struct kgem *kgem, struct kgem_bo *bo)
+bool kgem_check_bo(struct kgem *kgem, ...)
 {
-	if (bo == NULL)
-		return true;
-
-	if (bo->exec)
-		return true;
+	va_list ap;
+	struct kgem_bo *bo;
+	int num_exec = 0;
+	int size = 0;
 
 	if (kgem->aperture > kgem->aperture_low)
 		return false;
 
-	if (bo->size + kgem->aperture > kgem->aperture_high)
+	va_start(ap, kgem);
+	while ((bo = va_arg(ap, struct kgem_bo *))) {
+		if (bo->exec)
+			continue;
+
+		size += bo->size;
+		num_exec++;
+	}
+	va_end(ap);
+
+	if (size + kgem->aperture > kgem->aperture_high)
 		return false;
 
-	if (kgem->nexec == KGEM_EXEC_SIZE(kgem))
+	if (kgem->nexec + num_exec >= KGEM_EXEC_SIZE(kgem))
 		return false;
 
 	return true;
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 6c8883c..8f0c838 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -271,7 +271,7 @@ static inline void kgem_advance_batch(struct kgem *kgem, int num_dwords)
 	kgem->nbatch += num_dwords;
 }
 
-bool kgem_check_bo(struct kgem *kgem, struct kgem_bo *bo);
+bool kgem_check_bo(struct kgem *kgem, ...) __attribute__((sentinel(NULL)));
 bool kgem_check_bo_fenced(struct kgem *kgem, ...) __attribute__((sentinel(NULL)));
 
 void _kgem_add_bo(struct kgem *kgem, struct kgem_bo *bo);
commit ccf6547a8f1b77ddf4e79bdefe2a0878c0e9b256
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Sep 24 23:16:57 2011 +0100

    sna: Paranoid debug flush after every op (as well as before)
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 072280d..6c8883c 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -228,6 +228,14 @@ static inline void kgem_set_mode(struct kgem *kgem, enum kgem_mode mode)
 
 static inline void _kgem_set_mode(struct kgem *kgem, enum kgem_mode mode)
 {
+#if DEBUG_FLUSH_CACHE
+	kgem_emit_flush(kgem);
+#endif
+
+#if DEBUG_FLUSH_BATCH
+	kgem_submit(kgem);
+#endif
+
 	if (kgem->nbatch)
 		kgem->mode = mode;
 }
commit 02337600345951c0ea629db11f0484403a260991
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Sep 24 23:03:52 2011 +0100

    sna/gen5: Debug option to disable state caching
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index b661a7e..a4b08d0 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -51,6 +51,9 @@
 #define NDEBUG 1
 #endif
 
+#define DBG_NO_STATE_CACHE 0
+#define DBG_NO_SURFACE_CACHE 0
+
 #define GEN5_GRF_BLOCKS(nreg)    ((nreg + 15) / 16 - 1)
 
 /* Set up a default static partitioning of the URB, which is supposed to
@@ -685,12 +688,12 @@ gen5_bind_bo(struct sna *sna,
 	offset *= sizeof(uint32_t);
 
 	if (is_dst) {
-		if (bo->dst_bound)
+		if (!DBG_NO_SURFACE_CACHE && bo->dst_bound)
 			return bo->dst_bound;
 
 		bo->dst_bound = offset;
 	} else {
-		if (bo->src_bound)
+		if (!DBG_NO_SURFACE_CACHE && bo->src_bound)
 			return bo->src_bound;
 
 		bo->src_bound = offset;
@@ -1260,7 +1263,8 @@ gen5_align_vertex(struct sna *sna, const struct sna_composite_op *op)
 static void
 gen5_emit_binding_table(struct sna *sna, uint16_t offset)
 {
-	if (sna->render_state.gen5.surface_table == offset)
+	if (!DBG_NO_STATE_CACHE &&
+	    sna->render_state.gen5.surface_table == offset)
 		return;
 
 	sna->render_state.gen5.surface_table = offset;
@@ -1295,7 +1299,7 @@ gen5_emit_pipelined_pointers(struct sna *sna,
 		  gen5_get_blend(blend, op->has_component_alpha, op->dst.format));
 
 	last = sna->render_state.gen5.last_pipelined_pointers;
-	if (last &&
+	if (!DBG_NO_STATE_CACHE && last &&
 	    sna->kgem.batch[offset + 1] == sna->kgem.batch[last + 1] &&
 	    sna->kgem.batch[offset + 3] == sna->kgem.batch[last + 3] &&
 	    sna->kgem.batch[offset + 4] == sna->kgem.batch[last + 4] &&
@@ -1315,7 +1319,8 @@ gen5_emit_drawing_rectangle(struct sna *sna, const struct sna_composite_op *op)
 	uint32_t limit = (op->dst.height - 1) << 16 | (op->dst.width - 1);
 	uint32_t offset = (uint16_t)op->dst.y << 16 | (uint16_t)op->dst.x;
 
-	if (sna->render_state.gen5.drawrect_limit == limit &&
+	if (!DBG_NO_STATE_CACHE &&
+	    sna->render_state.gen5.drawrect_limit == limit &&
 	    sna->render_state.gen5.drawrect_offset == offset)
 		return;
 	sna->render_state.gen5.drawrect_offset = offset;
@@ -1346,7 +1351,7 @@ gen5_emit_vertex_elements(struct sna *sna,
 	uint32_t src_format;
 	int id = op->u.gen5.ve_id;;
 
-	if (render->ve_id == id)
+	if (!DBG_NO_STATE_CACHE && render->ve_id == id)
 		return;
 
 	render->ve_id = id;
commit af4d3853ae8f834fbf2fc55fb2b397b3f7f17656
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Sep 24 19:26:46 2011 +0100

    sna/glyphs: Convert all sub-8bpp masks to a8
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_glyphs.c b/src/sna/sna_glyphs.c
index 709517f..e0ef313 100644
--- a/src/sna/sna_glyphs.c
+++ b/src/sna/sna_glyphs.c
@@ -721,13 +721,10 @@ glyphs_via_mask(struct sna *sna,
 	src_x += box.x1 - list->xOff;
 	src_y += box.y1 - list->yOff;
 
-	if (format->depth == 1) {
-		PictFormatPtr a8Format =
-			PictureMatchFormat(screen, 8, PICT_a8);
-		if (!a8Format)
+	if (format->depth < 8) {
+		format = PictureMatchFormat(screen, 8, PICT_a8);
+		if (!format)
 			return FALSE;
-
-		format = a8Format;
 	}
 
 	pixmap = screen->CreatePixmap(screen,
commit c79e90da71ae58cb3804f8abaf0541350e47eb14
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Sep 24 19:26:31 2011 +0100

    sna: Add a debug option to disable caching
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index b5c342d..dcfcbbd 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -67,6 +67,8 @@ static inline void list_replace(struct list *old,
 #define DBG_NO_RELAXED_FENCING 0
 #define DBG_DUMP 0
 
+#define NO_CACHE 0
+
 #if DEBUG_KGEM
 #undef DBG
 #define DBG(x) ErrorF x
@@ -542,6 +544,9 @@ static void __kgem_bo_destroy(struct kgem *kgem, struct kgem_bo *bo)
 
 	bo->src_bound = bo->dst_bound = 0;
 
+	if (NO_CACHE)
+		goto destroy;
+
 	if(!bo->reusable)
 		goto destroy;
 


More information about the xorg-commit mailing list