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