nv50: fix buffer reuse issues

1) We need to insert a barrier between consecutive transform feedback calls.
2) VBO cache needs to be flushed when TFB output is used as VBO draw input.

Fixes Piglit test EXT_transform_feedback/immediate-reuse.

Thanks to Christoph Bumiller for pointing out bugs in previous versions
of this patch.
This commit is contained in:
Marcin Slusarz 2012-06-19 23:38:34 +02:00
parent 7e63b613a5
commit 19fd04f5ea
2 changed files with 18 additions and 0 deletions

View File

@ -564,6 +564,12 @@ nv50_stream_output_validate(struct nv50_context *nv50)
return;
}
/* previous TFB needs to complete */
if (nv50->screen->base.class_3d < NVA0_3D_CLASS) {
BEGIN_NV04(push, SUBC_3D(NV50_GRAPH_SERIALIZE), 1);
PUSH_DATA (push, 0);
}
ctrl = so->ctrl;
if (nv50->screen->base.class_3d >= NVA0_3D_CLASS)
ctrl |= NVA0_3D_STRMOUT_BUFFERS_CTRL_LIMIT_MODE_OFFSET;

View File

@ -293,6 +293,18 @@ nv50_vertex_arrays_validate(struct nv50_context *nv50)
else
nv50->vbo_fifo = 0;
if (!nv50->vbo_fifo) {
/* if vertex buffer was written by GPU - flush VBO cache */
for (i = 0; i < nv50->num_vtxbufs; ++i) {
struct nv04_resource *buf = nv04_resource(nv50->vtxbuf[i].buffer);
if (buf && buf->status & NOUVEAU_BUFFER_STATUS_GPU_WRITING) {
buf->status &= ~NOUVEAU_BUFFER_STATUS_GPU_WRITING;
nv50->base.vbo_dirty = TRUE;
break;
}
}
}
/* update vertex format state */
BEGIN_NV04(push, NV50_3D(VERTEX_ARRAY_ATTRIB(0)), n);
if (nv50->vbo_fifo) {