xf86-video-intel: 2 commits - src/sna/gen2_render.c src/sna/gen3_render.c src/sna/gen6_render.c src/sna/kgem.c src/sna/sna_render.h

Chris Wilson ickle at kemper.freedesktop.org
Mon Jan 16 05:39:21 PST 2012


 src/sna/gen2_render.c |   13 +++++++++++--
 src/sna/gen3_render.c |   13 ++++++++++---
 src/sna/gen6_render.c |   18 +++++++++---------
 src/sna/kgem.c        |    3 ++-
 src/sna/sna_render.h  |    1 -
 5 files changed, 32 insertions(+), 16 deletions(-)

New commits:
commit 8b2bb666662305ab88aad8198ad69b1c98407d75
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jan 16 13:35:05 2012 +0000

    sna/gen6: Restore the non-pipelined op after every WM binding table update
    
    The hw wants it as demonstrated by the '>' in KDE's menus. Why is it
    always KDE that demonstrates coherency problems...
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index dd88013..0801e04 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -708,11 +708,11 @@ gen6_emit_wm(struct sna *sna, unsigned int kernel, int nr_surfaces, int nr_input
 	OUT_BATCH(0);
 }
 
-static void
+static bool
 gen6_emit_binding_table(struct sna *sna, uint16_t offset)
 {
 	if (sna->render_state.gen6.surface_table == offset)
-		return;
+		return false;
 
 	/* Binding table pointers */
 	OUT_BATCH(GEN6_3DSTATE_BINDING_TABLE_POINTERS |
@@ -724,6 +724,7 @@ gen6_emit_binding_table(struct sna *sna, uint16_t offset)
 	OUT_BATCH(offset*4);
 
 	sna->render_state.gen6.surface_table = offset;
+	return true;
 }
 
 static void
@@ -734,8 +735,6 @@ gen6_emit_drawing_rectangle(struct sna *sna,
 	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;
 
-	force |= sna->render_state.gen6.target != op->dst.bo->handle;
-
 	if (!force &&
 	    sna->render_state.gen6.drawrect_limit == limit &&
 	    sna->render_state.gen6.drawrect_offset == offset)
@@ -743,7 +742,6 @@ gen6_emit_drawing_rectangle(struct sna *sna,
 
 	sna->render_state.gen6.drawrect_offset = offset;
 	sna->render_state.gen6.drawrect_limit = limit;
-	sna->render_state.gen6.target = op->dst.bo->handle;
 
 	OUT_BATCH(GEN6_3DSTATE_DRAWING_RECTANGLE | (4 - 2));
 	OUT_BATCH(0);
@@ -864,8 +862,11 @@ gen6_emit_state(struct sna *sna,
 		     op->u.gen6.nr_inputs);
 	gen6_emit_vertex_elements(sna, op);
 
-	/* XXX updating the binding table requires a non-pipelined cmd? */
-	gen6_emit_binding_table(sna, wm_binding_table);
+	/* XXX updating the binding table requires a non-pipelined cmd?
+	 * The '>' in KDE menus suggest that every binding table update
+	 * requires a subsequent non-pipelined op, or maybe a pipelined flush?
+	 */
+	need_flush |= gen6_emit_binding_table(sna, wm_binding_table);
 	gen6_emit_drawing_rectangle(sna, op, need_flush & !flushed);
 }
 
@@ -3901,7 +3902,6 @@ static void gen6_render_reset(struct sna *sna)
 	sna->render_state.gen6.samplers = -1;
 	sna->render_state.gen6.blend = -1;
 	sna->render_state.gen6.kernel = -1;
-	sna->render_state.gen6.target = -1;
 	sna->render_state.gen6.drawrect_offset = -1;
 	sna->render_state.gen6.drawrect_limit = -1;
 	sna->render_state.gen6.surface_table = -1;
diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h
index 04543de..4346196 100644
--- a/src/sna/sna_render.h
+++ b/src/sna/sna_render.h
@@ -391,7 +391,6 @@ struct gen6_render_state {
 	uint32_t blend;
 	uint32_t samplers;
 	uint32_t kernel;
-	uint32_t target;
 
 	uint16_t num_sf_outputs;
 	uint16_t vb_id;
commit a11b22d172898ebfc657339a9ca56102ae92592f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jan 16 13:06:58 2012 +0000

    sna/gen[23]: Remark the destination bo as dirty after flushing
    
    One of the side-effects of emitting the composite state is that it
    tags the destination surface as dirty as a result of the *forthcoming*
    operation. So emitting the flush after emitting the composite state
    clears that tag, so we need to restore it for future coherency.
    
    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 e5e5884..0775b76 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1657,6 +1657,8 @@ gen2_render_composite(struct sna *sna,
 		      int16_t width,  int16_t height,
 		      struct sna_composite_op *tmp)
 {
+	bool need_flush;
+
 	DBG(("%s()\n", __FUNCTION__));
 
 	if (op >= ARRAY_SIZE(gen2_blend_op)) {
@@ -1808,8 +1810,10 @@ gen2_render_composite(struct sna *sna,
 			   NULL))
 		kgem_submit(&sna->kgem);
 
+	need_flush =
+		kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo);
 	gen2_emit_composite_state(sna, tmp);
-	if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) {
+	if (need_flush) {
 		if (tmp->src.bo == tmp->dst.bo || tmp->mask.bo == tmp->dst.bo) {
 			kgem_emit_flush(&sna->kgem);
 		} else {
@@ -1819,6 +1823,7 @@ gen2_render_composite(struct sna *sna,
 			kgem_clear_dirty(&sna->kgem);
 		}
 		assert(sna->kgem.mode == KGEM_RENDER);
+		kgem_bo_mark_dirty(tmp->dst.bo);
 	}
 	return TRUE;
 
@@ -2154,6 +2159,8 @@ gen2_render_composite_spans(struct sna *sna,
 			    unsigned flags,
 			    struct sna_composite_spans_op *tmp)
 {
+	bool need_flush;
+
 	DBG(("%s(src=(%d, %d), dst=(%d, %d), size=(%d, %d))\n", __FUNCTION__,
 	     src_x, src_y, dst_x, dst_y, width, height));
 
@@ -2229,8 +2236,9 @@ gen2_render_composite_spans(struct sna *sna,
 			   NULL))
 		kgem_submit(&sna->kgem);
 
+	need_flush = tmp->base.src.bo;
 	gen2_emit_composite_spans_state(sna, tmp);
-	if (kgem_bo_is_dirty(tmp->base.src.bo)) {
+	if (need_flush) {
 		if (tmp->base.src.bo == tmp->base.dst.bo) {
 			kgem_emit_flush(&sna->kgem);
 		} else {
@@ -2240,6 +2248,7 @@ gen2_render_composite_spans(struct sna *sna,
 			kgem_clear_dirty(&sna->kgem);
 		}
 		assert(sna->kgem.mode == KGEM_RENDER);
+		kgem_bo_mark_dirty(tmp->base.dst.bo);
 	}
 	return TRUE;
 
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index b131b89..ffcfff6 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2560,6 +2560,8 @@ gen3_render_composite(struct sna *sna,
 		      int16_t width,  int16_t height,
 		      struct sna_composite_op *tmp)
 {
+	bool need_flush;
+
 	DBG(("%s()\n", __FUNCTION__));
 
 	if (op >= ARRAY_SIZE(gen3_blend_op)) {
@@ -2800,8 +2802,10 @@ gen3_render_composite(struct sna *sna,
 			   NULL))
 		kgem_submit(&sna->kgem);
 
+	need_flush =
+		kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo);
 	gen3_emit_composite_state(sna, tmp);
-	if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) {
+	if (need_flush) {
 		if (tmp->src.bo == tmp->dst.bo || tmp->mask.bo == tmp->dst.bo) {
 			kgem_emit_flush(&sna->kgem);
 		} else {
@@ -2811,6 +2815,7 @@ gen3_render_composite(struct sna *sna,
 			kgem_clear_dirty(&sna->kgem);
 		}
 		assert(sna->kgem.mode == KGEM_RENDER);
+		kgem_bo_mark_dirty(tmp->dst.bo);
 	}
 
 	gen3_align_vertex(sna, tmp);
@@ -3136,7 +3141,7 @@ gen3_render_composite_spans(struct sna *sna,
 			    unsigned flags,
 			    struct sna_composite_spans_op *tmp)
 {
-	bool no_offset;
+	bool no_offset, need_flush;
 
 	DBG(("%s(src=(%d, %d), dst=(%d, %d), size=(%d, %d))\n", __FUNCTION__,
 	     src_x, src_y, dst_x, dst_y, width, height));
@@ -3241,8 +3246,9 @@ gen3_render_composite_spans(struct sna *sna,
 			   NULL))
 		kgem_submit(&sna->kgem);
 
+	need_flush = kgem_bo_is_dirty(tmp->base.src.bo);
 	gen3_emit_composite_state(sna, &tmp->base);
-	if (kgem_bo_is_dirty(tmp->base.src.bo)) {
+	if (need_flush) {
 		if (tmp->base.src.bo == tmp->base.dst.bo) {
 			kgem_emit_flush(&sna->kgem);
 		} else {
@@ -3252,6 +3258,7 @@ gen3_render_composite_spans(struct sna *sna,
 			kgem_clear_dirty(&sna->kgem);
 		}
 		assert(sna->kgem.mode == KGEM_RENDER);
+		kgem_bo_mark_dirty(tmp->base.dst.bo);
 	}
 
 	gen3_align_vertex(sna, &tmp->base);
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 39e036b..dd88013 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -1663,7 +1663,7 @@ static void gen6_emit_composite_state(struct sna *sna,
 				     FALSE);
 	}
 
-	if (sna->kgem.surface == offset&&
+	if (sna->kgem.surface == offset &&
 	    *(uint64_t *)(sna->kgem.batch + sna->render_state.gen6.surface_table) == *(uint64_t*)binding_table &&
 	    (op->mask.bo == NULL ||
 	     sna->kgem.batch[sna->render_state.gen6.surface_table+2] == binding_table[2])) {
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index d119ae3..9169dd7 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -2884,9 +2884,10 @@ struct kgem_bo *kgem_create_proxy(struct kgem_bo *target,
 {
 	struct kgem_bo *bo;
 
-	assert(target->proxy == NULL);
 	DBG(("%s: target handle=%d, offset=%d, length=%d, io=%d\n",
 	     __FUNCTION__, target->handle, offset, length, target->io));
+	assert(target->proxy == NULL);
+	assert(target->tiling == I915_TILING_NONE);
 
 	bo = __kgem_bo_alloc(target->handle, length);
 	if (bo == NULL)


More information about the xorg-commit mailing list