xf86-video-intel: 4 commits - 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/kgem.c

Chris Wilson ickle at kemper.freedesktop.org
Sun Jan 20 07:09:12 PST 2013


 src/sna/gen3_render.c |   38 +++++++++++++++++++++-----------------
 src/sna/gen4_render.c |    9 +++++++++
 src/sna/gen4_vertex.c |    4 +---
 src/sna/gen5_render.c |   10 ++++++++--
 src/sna/gen6_render.c |   10 ++++++++--
 src/sna/gen7_render.c |   10 ++++++++--
 src/sna/kgem.c        |   36 ++++++++++++++----------------------
 7 files changed, 69 insertions(+), 48 deletions(-)

New commits:
commit 650c9d5ce80afc1d4c8d9f77f6679f085fa4dc9d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Jan 20 14:58:42 2013 +0000

    sna/gen3+: Reset vertex relocation state after discarding the batch
    
    Fixes a regression from commit a6ecb6d31d8c543f38fca0be6b0ec82e59dcd8d2
    Author: Chris Wilson <chris at chris-wilson.co.uk>
    Date:   Wed Jan 16 09:14:40 2013 +0000
    
        sna: Discard the batch if we are discarding the only buffer in it
    
    as we may keep a stale relocation for the vertex buffer alive if we
    attempt to clear the bo using the render engine before discarding it.
    
    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 4403861..270bca5 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -1970,6 +1970,9 @@ gen3_render_reset(struct sna *sna)
 		     __FUNCTION__, sna->render.vbo->presumed_offset));
 		discard_vbo(sna);
 	}
+
+	sna->render.vertex_reloc[0] = 0;
+	sna->render.vertex_offset = 0;
 }
 
 static void
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index a27d3e4..e1f4528 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2789,6 +2789,10 @@ static void gen4_render_reset(struct sna *sna)
 		DBG(("%s: discarding unmappable vbo\n", __FUNCTION__));
 		discard_vbo(sna);
 	}
+
+	sna->render.vertex_offset = 0;
+	sna->render.nvertex_reloc = 0;
+	sna->render.vb_id = 0;
 }
 
 static void gen4_render_fini(struct sna *sna)
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 60ead0e..695ec33 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2916,6 +2916,10 @@ static void gen5_render_reset(struct sna *sna)
 		DBG(("%s: discarding unmappable vbo\n", __FUNCTION__));
 		discard_vbo(sna);
 	}
+
+	sna->render.vertex_offset = 0;
+	sna->render.nvertex_reloc = 0;
+	sna->render.vb_id = 0;
 }
 
 static void gen5_render_fini(struct sna *sna)
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 2cd1b84..82e9d42 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -3424,6 +3424,10 @@ static void gen6_render_reset(struct sna *sna)
 	sna->render_state.gen6.drawrect_offset = -1;
 	sna->render_state.gen6.drawrect_limit = -1;
 	sna->render_state.gen6.surface_table = -1;
+
+	sna->render.vertex_offset = 0;
+	sna->render.nvertex_reloc = 0;
+	sna->render.vb_id = 0;
 }
 
 static void gen6_render_fini(struct sna *sna)
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 79ca594..d8ad648 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -3505,6 +3505,10 @@ static void gen7_render_reset(struct sna *sna)
 	sna->render_state.gen7.drawrect_offset = -1;
 	sna->render_state.gen7.drawrect_limit = -1;
 	sna->render_state.gen7.surface_table = -1;
+
+	sna->render.vertex_offset = 0;
+	sna->render.nvertex_reloc = 0;
+	sna->render.vb_id = 0;
 }
 
 static void gen7_render_fini(struct sna *sna)
commit 492952e0d6362a046a666956afdf8f9bc0f2b7e7
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Jan 20 14:55:06 2013 +0000

    sna/gen3+: Handle flushing vbo for CA glyphs
    
    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 0040c42..4403861 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -1613,15 +1613,13 @@ static int gen3_vertex_finish(struct sna *sna)
 	DBG(("%s: used=%d/%d, vbo active? %d\n",
 	     __FUNCTION__, sna->render.vertex_used, sna->render.vertex_size,
 	     sna->render.vbo ? sna->render.vbo->handle : 0));
+	assert(sna->render.vertex_offset == 0);
 	assert(sna->render.vertex_used);
 	assert(sna->render.vertex_used <= sna->render.vertex_size);
 	assert(sna->render.vertex_reloc[0]);
 
 	bo = sna->render.vbo;
 	if (bo) {
-		if (sna->render.vertex_offset)
-			gen3_vertex_flush(sna);
-
 		DBG(("%s: reloc = %d\n", __FUNCTION__,
 		     sna->render.vertex_reloc[0]));
 
@@ -1785,8 +1783,10 @@ static int gen3_get_rectangles__flush(struct sna *sna,
 	if (!kgem_check_reloc_and_exec(&sna->kgem, 1))
 		return 0;
 
-	if (op->need_magic_ca_pass && sna->render.vbo)
-		return 0;
+	if (sna->render.vertex_offset) {
+		gen3_vertex_flush(sna);
+		gen3_magic_ca_pass(sna, op);
+	}
 
 	return gen3_vertex_finish(sna);
 }
@@ -1832,6 +1832,8 @@ flush:
 	}
 	_kgem_submit(&sna->kgem);
 	gen3_emit_composite_state(sna, op);
+	assert(sna->render.vertex_offset == 0);
+	assert(sna->render.vertex_reloc[0] == 0);
 	goto start;
 }
 
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 6b3f864..a27d3e4 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -613,6 +613,11 @@ static int gen4_get_rectangles__flush(struct sna *sna,
 	if (op->need_magic_ca_pass && sna->render.vbo)
 		return 0;
 
+	if (sna->render.vertex_offset) {
+		gen4_vertex_flush(sna);
+		gen4_magic_ca_pass(sna, op);
+	}
+
 	return gen4_vertex_finish(sna);
 }
 
diff --git a/src/sna/gen4_vertex.c b/src/sna/gen4_vertex.c
index 9891453..d34d0d8 100644
--- a/src/sna/gen4_vertex.c
+++ b/src/sna/gen4_vertex.c
@@ -55,6 +55,7 @@ int gen4_vertex_finish(struct sna *sna)
 
 	DBG(("%s: used=%d / %d\n", __FUNCTION__,
 	     sna->render.vertex_used, sna->render.vertex_size));
+	assert(sna->render.vertex_offset == 0);
 	assert(sna->render.vertex_used);
 	assert(sna->render.nvertex_reloc);
 
@@ -62,9 +63,6 @@ int gen4_vertex_finish(struct sna *sna)
 
 	bo = sna->render.vbo;
 	if (bo) {
-		if (sna->render.vertex_offset)
-			gen4_vertex_flush(sna);
-
 		for (i = 0; i < sna->render.nvertex_reloc; i++) {
 			DBG(("%s: reloc[%d] = %d\n", __FUNCTION__,
 			     i, sna->render.vertex_reloc[i]));
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index eec2f83..60ead0e 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -599,8 +599,10 @@ static int gen5_get_rectangles__flush(struct sna *sna,
 	if (!kgem_check_reloc_and_exec(&sna->kgem, 2))
 		return 0;
 
-	if (op->need_magic_ca_pass && sna->render.vbo)
-		return 0;
+	if (sna->render.vertex_offset) {
+		gen4_vertex_flush(sna);
+		gen5_magic_ca_pass(sna, op);
+	}
 
 	return gen4_vertex_finish(sna);
 }
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 7af59ae..2cd1b84 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -1145,8 +1145,10 @@ static int gen6_get_rectangles__flush(struct sna *sna,
 	if (!kgem_check_reloc_and_exec(&sna->kgem, 2))
 		return 0;
 
-	if (op->need_magic_ca_pass && sna->render.vbo)
-		return 0;
+	if (sna->render.vertex_offset) {
+		gen4_vertex_flush(sna);
+		gen6_magic_ca_pass(sna, op);
+	}
 
 	return gen4_vertex_finish(sna);
 }
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 5880e7a..79ca594 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -1272,8 +1272,10 @@ static int gen7_get_rectangles__flush(struct sna *sna,
 	if (!kgem_check_reloc_and_exec(&sna->kgem, 2))
 		return 0;
 
-	if (op->need_magic_ca_pass && sna->render.vbo)
-		return 0;
+	if (sna->render.vertex_offset) {
+		gen4_vertex_flush(sna);
+		gen7_magic_ca_pass(sna, op);
+	}
 
 	return gen4_vertex_finish(sna);
 }
commit b52c921204df6b2486717fcef05b4a1993aa1071
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Jan 20 14:02:07 2013 +0000

    sna: Adapt error detection and handling for invalid batchbuffers
    
    Allow the DDX to continue even if the kernel rejects our batchbuffers by
    disabling hw acceleration - just extends the existing hang detection to
    also handle the driver producing garbage.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 49815e7..a5a7a88 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -2648,33 +2648,23 @@ void _kgem_submit(struct kgem *kgem)
 					       DRM_IOCTL_I915_GEM_EXECBUFFER2,
 					       &execbuf);
 			}
-			if (ret == -1 && (errno == EIO || errno == EBUSY)) {
-				DBG(("%s: GPU hang detected\n", __FUNCTION__));
-				kgem_throttle(kgem);
-				ret = 0;
-			}
-
 			if (DEBUG_SYNC && ret == 0) {
 				struct drm_i915_gem_set_domain set_domain;
 
-				DBG(("%s: debug sync, starting\n", __FUNCTION__));
-
 				VG_CLEAR(set_domain);
 				set_domain.handle = handle;
 				set_domain.read_domains = I915_GEM_DOMAIN_GTT;
 				set_domain.write_domain = I915_GEM_DOMAIN_GTT;
 
 				ret = drmIoctl(kgem->fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, &set_domain);
-				if (ret == -1) {
-					DBG(("%s: sync: GPU hang detected\n", __FUNCTION__));
-					kgem_throttle(kgem);
-				}
-
-				DBG(("%s: debug sync, completed\n", __FUNCTION__));
 			}
+			if (ret == -1) {
+				DBG(("%s: GPU hang detected [%d]\n",
+				     __FUNCTION__, errno));
+				kgem_throttle(kgem);
+				kgem->wedged = true;
 
 #if !NDEBUG
-			if (ret < 0) {
 				ret = errno;
 				ErrorF("batch[%d/%d]: %d %d %d, nreloc=%d, nexec=%d, nfence=%d, aperture=%d: errno=%d\n",
 				       kgem->mode, kgem->ring, batch_end, kgem->nbatch, kgem->surface,
@@ -2710,15 +2700,17 @@ void _kgem_submit(struct kgem *kgem)
 					       (int)kgem->reloc[i].presumed_offset);
 				}
 
-				i = open("/tmp/batchbuffer", O_WRONLY | O_CREAT | O_APPEND, 0666);
-				if (i != -1) {
-					i = write(i, kgem->batch, batch_end*sizeof(uint32_t));
-					(void)i;
-				}
+				if (DEBUG_SYNC) {
+					int fd = open("/tmp/batchbuffer", O_WRONLY | O_CREAT | O_APPEND, 0666);
+					if (fd != -1) {
+						write(fd, kgem->batch, batch_end*sizeof(uint32_t));
+						close(fd);
+					}
 
-				FatalError("SNA: failed to submit batchbuffer, errno=%d\n", ret);
-			}
+					FatalError("SNA: failed to submit batchbuffer, errno=%d\n", ret);
+				}
 #endif
+			}
 		}
 
 		kgem_commit(kgem);
commit 8215a278f20d34819536edbda05a108a860fefb9
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Jan 20 12:36:07 2013 +0000

    sna/gen3: Always close the vertices for a batch, even if the vbo is empty
    
    In the case where we emit a no-op, we may not attempt to finish binding
    the vbo as it is considered empty. This leaves a stray relocation for
    the next batch, and also causes it to believe that it has a vbo bound
    already.
    
    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 42e4cdd..0040c42 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -1615,6 +1615,7 @@ static int gen3_vertex_finish(struct sna *sna)
 	     sna->render.vbo ? sna->render.vbo->handle : 0));
 	assert(sna->render.vertex_used);
 	assert(sna->render.vertex_used <= sna->render.vertex_size);
+	assert(sna->render.vertex_reloc[0]);
 
 	bo = sna->render.vbo;
 	if (bo) {
@@ -1664,14 +1665,13 @@ static void gen3_vertex_close(struct sna *sna)
 	unsigned int delta = 0;
 
 	assert(sna->render.vertex_offset == 0);
+	if (sna->render.vertex_reloc[0] == 0)
+		return;
 
 	DBG(("%s: used=%d/%d, vbo active? %d\n",
 	     __FUNCTION__, sna->render.vertex_used, sna->render.vertex_size,
 	     sna->render.vbo ? sna->render.vbo->handle : 0));
 
-	if (sna->render.vertex_used == 0)
-		return;
-
 	bo = sna->render.vbo;
 	if (bo) {
 		if (sna->render.vertex_size - sna->render.vertex_used < 64) {
@@ -1717,15 +1717,11 @@ static void gen3_vertex_close(struct sna *sna)
 		}
 	}
 
-	DBG(("%s: reloc = %d\n", __FUNCTION__,
-	     sna->render.vertex_reloc[0]));
-
-	if (sna->render.vertex_reloc[0]) {
-		sna->kgem.batch[sna->render.vertex_reloc[0]] =
-			kgem_add_reloc(&sna->kgem, sna->render.vertex_reloc[0],
-				       bo, I915_GEM_DOMAIN_VERTEX << 16, delta);
-		sna->render.vertex_reloc[0] = 0;
-	}
+	DBG(("%s: reloc = %d\n", __FUNCTION__, sna->render.vertex_reloc[0]));
+	sna->kgem.batch[sna->render.vertex_reloc[0]] =
+		kgem_add_reloc(&sna->kgem, sna->render.vertex_reloc[0],
+			       bo, I915_GEM_DOMAIN_VERTEX << 16, delta);
+	sna->render.vertex_reloc[0] = 0;
 
 	if (sna->render.vbo == NULL) {
 		DBG(("%s: resetting vbo\n", __FUNCTION__));
@@ -4647,6 +4643,9 @@ gen3_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo,
 static void gen3_render_flush(struct sna *sna)
 {
 	gen3_vertex_close(sna);
+
+	assert(sna->render.vertex_reloc[0] == 0);
+	assert(sna->render.vertex_offset == 0);
 }
 
 static void


More information about the xorg-commit mailing list