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:
parent
7e63b613a5
commit
19fd04f5ea
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue