xf86-video-intel: 3 commits - 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/sna_accel.c src/sna/sna_glyphs.c

Chris Wilson ickle at kemper.freedesktop.org
Wed Feb 22 01:17:49 PST 2012


 src/sna/gen3_render.c |   15 ++++++---------
 src/sna/gen4_render.c |   12 ++++++------
 src/sna/gen5_render.c |   15 ++++++---------
 src/sna/gen6_render.c |   15 ++++++---------
 src/sna/gen7_render.c |   15 ++++++---------
 src/sna/sna_accel.c   |   11 +++++++++--
 src/sna/sna_glyphs.c  |    4 ----
 7 files changed, 39 insertions(+), 48 deletions(-)

New commits:
commit b02f866d67d60538368619849f2acda4c1706476
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Feb 22 09:15:25 2012 +0000

    sna: Ensure we restore the shadow pixels before uploading CPU data
    
    Reported-by: Joe Nahmias <joe at nahmias.net>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=46425
    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 9447cf7..8fa59a6 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1618,8 +1618,12 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, BoxPtr box, unsigned int flags)
 
 	if (sna_damage_is_all(&priv->gpu_damage,
 			      pixmap->drawable.width,
-			      pixmap->drawable.height))
+			      pixmap->drawable.height)) {
+		sna_damage_destroy(&priv->cpu_damage);
+		priv->undamaged = false;
+		list_del(&priv->list);
 		goto done;
+	}
 
 	if (priv->gpu_bo == NULL) {
 		unsigned flags;
@@ -1659,10 +1663,13 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, BoxPtr box, unsigned int flags)
 	}
 
 	if (priv->mapped) {
+		pixmap->devPrivate.ptr = NULL;
+		priv->mapped = false;
+	}
+	if (pixmap->devPrivate.ptr == NULL) {
 		assert(priv->stride);
 		pixmap->devPrivate.ptr = priv->ptr;
 		pixmap->devKind = priv->stride;
-		priv->mapped = false;
 	}
 	assert(pixmap->devPrivate.ptr != NULL);
 
commit be5df7b5ab487a1282c96dda92f3799e35cd19af
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Feb 21 23:27:33 2012 +0000

    sna/gen5: Remove CA glyph workaround
    
    The root cause has been found and destroyed, so the w/a is now
    redundant.
    
    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 91273c9..2733a1a 100644
--- a/src/sna/sna_glyphs.c
+++ b/src/sna/sna_glyphs.c
@@ -1248,10 +1248,6 @@ sna_glyphs(CARD8 op,
 	_mask = mask;
 	/* XXX discard the mask for non-overlapping glyphs? */
 
-	/* XXX more shader breakage?: CA to dst is fubar on ilk */
-	if (sna->kgem.gen == 50 && !_mask)
-		_mask = list[0].format;
-
 	if (!_mask ||
 	    (((nlist == 1 && list->len == 1) || op == PictOpAdd) &&
 	     dst->format == (_mask->depth << 24 | _mask->format))) {
commit 6038cede83e7f360428b4625d288411794f9d052
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Feb 21 21:26:29 2012 +0000

    sna/gen3+: Re-emit composite state after flushing CA vertices
    
    Reported-by: Clemens Eisserer <linuxhippy at gmail.com>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=42891
    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 189653d..3c3de12 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -1566,8 +1566,7 @@ static void gen3_vertex_flush(struct sna *sna)
 	sna->render_state.gen3.vertex_offset = 0;
 }
 
-static int gen3_vertex_finish(struct sna *sna,
-			      const struct sna_composite_op *op)
+static int gen3_vertex_finish(struct sna *sna)
 {
 	struct kgem_bo *bo;
 
@@ -1575,11 +1574,6 @@ static int gen3_vertex_finish(struct sna *sna,
 
 	bo = sna->render.vbo;
 	if (bo) {
-		if (sna->render_state.gen3.vertex_offset) {
-			gen3_vertex_flush(sna);
-			gen3_magic_ca_pass(sna, op);
-		}
-
 		DBG(("%s: reloc = %d\n", __FUNCTION__,
 		     sna->render.vertex_reloc[0]));
 
@@ -1722,7 +1716,10 @@ static int gen3_get_rectangles__flush(struct sna *sna,
 	if (sna->kgem.nreloc > KGEM_RELOC_SIZE(&sna->kgem) - 1)
 		return 0;
 
-	return gen3_vertex_finish(sna, op);
+	if (op->need_magic_ca_pass && sna->render.vbo)
+		return 0;
+
+	return gen3_vertex_finish(sna);
 }
 
 inline static int gen3_get_rectangles(struct sna *sna,
@@ -2318,7 +2315,7 @@ gen3_align_vertex(struct sna *sna,
 {
 	if (op->floats_per_vertex != sna->render_state.gen3.last_floats_per_vertex) {
 		if (sna->render.vertex_size - sna->render.vertex_used < 2*op->floats_per_rect)
-			gen3_vertex_finish(sna, op);
+			gen3_vertex_finish(sna);
 
 		DBG(("aligning vertex: was %d, now %d floats per vertex, %d->%d\n",
 		     sna->render_state.gen3.last_floats_per_vertex,
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 24de833..c9f10a8 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -364,8 +364,7 @@ static void gen4_vertex_flush(struct sna *sna,
 	gen4_magic_ca_pass(sna, op);
 }
 
-static int gen4_vertex_finish(struct sna *sna,
-			      const struct sna_composite_op *op)
+static int gen4_vertex_finish(struct sna *sna)
 {
 	struct kgem_bo *bo;
 	unsigned int i;
@@ -376,8 +375,6 @@ static int gen4_vertex_finish(struct sna *sna,
 
 	bo = sna->render.vbo;
 	if (bo) {
-		gen4_vertex_flush(sna, op);
-
 		for (i = 0; i < ARRAY_SIZE(sna->render.vertex_reloc); i++) {
 			if (sna->render.vertex_reloc[i]) {
 				DBG(("%s: reloc[%d] = %d\n", __FUNCTION__,
@@ -1154,7 +1151,10 @@ static int gen4_get_rectangles__flush(struct sna *sna,
 	if (sna->kgem.nreloc > KGEM_RELOC_SIZE(&sna->kgem) - 1)
 		return 0;
 
-	return gen4_vertex_finish(sna, op);
+	if (op->need_magic_ca_pass && sna->render.vbo)
+		return 0;
+
+	return gen4_vertex_finish(sna);
 }
 
 inline static int gen4_get_rectangles(struct sna *sna,
@@ -1306,7 +1306,7 @@ gen4_align_vertex(struct sna *sna, const struct sna_composite_op *op)
 {
 	if (op->floats_per_vertex != sna->render_state.gen4.floats_per_vertex) {
 		if (sna->render.vertex_size - sna->render.vertex_used < 6*op->floats_per_vertex)
-			gen4_vertex_finish(sna, op);
+			gen4_vertex_finish(sna);
 
 		DBG(("aligning vertex: was %d, now %d floats per vertex, %d->%d\n",
 		     sna->render_state.gen4.floats_per_vertex,
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index d4b6313..251eb39 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -347,8 +347,7 @@ static void gen5_vertex_flush(struct sna *sna)
 	sna->render_state.gen5.vertex_offset = 0;
 }
 
-static int gen5_vertex_finish(struct sna *sna,
-			      const struct sna_composite_op *op)
+static int gen5_vertex_finish(struct sna *sna)
 {
 	struct kgem_bo *bo;
 	unsigned int i;
@@ -359,11 +358,6 @@ static int gen5_vertex_finish(struct sna *sna,
 
 	bo = sna->render.vbo;
 	if (bo) {
-		if (sna->render_state.gen5.vertex_offset) {
-			gen5_vertex_flush(sna);
-			gen5_magic_ca_pass(sna, op);
-		}
-
 		for (i = 0; i < ARRAY_SIZE(sna->render.vertex_reloc); i++) {
 			if (sna->render.vertex_reloc[i]) {
 				DBG(("%s: reloc[%d] = %d\n", __FUNCTION__,
@@ -1157,7 +1151,10 @@ static int gen5_get_rectangles__flush(struct sna *sna,
 	if (sna->kgem.nreloc > KGEM_RELOC_SIZE(&sna->kgem) - 2)
 		return 0;
 
-	return gen5_vertex_finish(sna, op);
+	if (op->need_magic_ca_pass && sna->render.vbo)
+		return 0;
+
+	return gen5_vertex_finish(sna);
 }
 
 inline static int gen5_get_rectangles(struct sna *sna,
@@ -1312,7 +1309,7 @@ gen5_align_vertex(struct sna *sna, const struct sna_composite_op *op)
 {
 	if (op->floats_per_vertex != sna->render_state.gen5.floats_per_vertex) {
 		if (sna->render.vertex_size - sna->render.vertex_used < 2*op->floats_per_rect)
-			gen5_vertex_finish(sna, op);
+			gen5_vertex_finish(sna);
 
 		DBG(("aligning vertex: was %d, now %d floats per vertex, %d->%d\n",
 		     sna->render_state.gen5.floats_per_vertex,
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 56a0f4a..e2c78e1 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -919,8 +919,7 @@ static void gen6_vertex_flush(struct sna *sna)
 	sna->render_state.gen6.vertex_offset = 0;
 }
 
-static int gen6_vertex_finish(struct sna *sna,
-			      const struct sna_composite_op *op)
+static int gen6_vertex_finish(struct sna *sna)
 {
 	struct kgem_bo *bo;
 	unsigned int i;
@@ -933,11 +932,6 @@ static int gen6_vertex_finish(struct sna *sna,
 
 	bo = sna->render.vbo;
 	if (bo) {
-		if (sna->render_state.gen6.vertex_offset) {
-			gen6_vertex_flush(sna);
-			gen6_magic_ca_pass(sna, op);
-		}
-
 		for (i = 0; i < ARRAY_SIZE(sna->render.vertex_reloc); i++) {
 			if (sna->render.vertex_reloc[i]) {
 				DBG(("%s: reloc[%d] = %d\n", __FUNCTION__,
@@ -1625,7 +1619,10 @@ static int gen6_get_rectangles__flush(struct sna *sna,
 	if (sna->kgem.nreloc > KGEM_RELOC_SIZE(&sna->kgem) - 2)
 		return 0;
 
-	return gen6_vertex_finish(sna, op);
+	if (op->need_magic_ca_pass && sna->render.vbo)
+		return 0;
+
+	return gen6_vertex_finish(sna);
 }
 
 inline static int gen6_get_rectangles(struct sna *sna,
@@ -1751,7 +1748,7 @@ gen6_align_vertex(struct sna *sna, const struct sna_composite_op *op)
 	if (op->floats_per_vertex != sna->render_state.gen6.floats_per_vertex) {
 		if (sna->render.vertex_size - sna->render.vertex_used < 2*op->floats_per_rect)
 			/* XXX propagate failure */
-			gen6_vertex_finish(sna, op);
+			gen6_vertex_finish(sna);
 
 		DBG(("aligning vertex: was %d, now %d floats per vertex, %d->%d\n",
 		     sna->render_state.gen6.floats_per_vertex,
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index fce19fe..faeedf0 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -1022,8 +1022,7 @@ static void gen7_vertex_flush(struct sna *sna)
 	sna->render_state.gen7.vertex_offset = 0;
 }
 
-static int gen7_vertex_finish(struct sna *sna,
-			      const struct sna_composite_op *op)
+static int gen7_vertex_finish(struct sna *sna)
 {
 	struct kgem_bo *bo;
 	unsigned int i;
@@ -1034,11 +1033,6 @@ static int gen7_vertex_finish(struct sna *sna,
 
 	bo = sna->render.vbo;
 	if (bo) {
-		if (sna->render_state.gen7.vertex_offset) {
-			gen7_vertex_flush(sna);
-			gen7_magic_ca_pass(sna, op);
-		}
-
 		for (i = 0; i < ARRAY_SIZE(sna->render.vertex_reloc); i++) {
 			if (sna->render.vertex_reloc[i]) {
 				DBG(("%s: reloc[%d] = %d\n", __FUNCTION__,
@@ -1659,7 +1653,10 @@ static int gen7_get_rectangles__flush(struct sna *sna,
 	if (sna->kgem.nreloc > KGEM_RELOC_SIZE(&sna->kgem) - 2)
 		return 0;
 
-	return gen7_vertex_finish(sna, op);
+	if (op->need_magic_ca_pass && sna->render.vbo)
+		return 0;
+
+	return gen7_vertex_finish(sna);
 }
 
 inline static int gen7_get_rectangles(struct sna *sna,
@@ -1780,7 +1777,7 @@ gen7_align_vertex(struct sna *sna, const struct sna_composite_op *op)
 {
 	if (op->floats_per_vertex != sna->render_state.gen7.floats_per_vertex) {
 		if (sna->render.vertex_size - sna->render.vertex_used < 2*op->floats_per_rect)
-			gen7_vertex_finish(sna, op);
+			gen7_vertex_finish(sna);
 
 		DBG(("aligning vertex: was %d, now %d floats per vertex, %d->%d\n",
 		     sna->render_state.gen7.floats_per_vertex,


More information about the xorg-commit mailing list