nv50: fix buffer reuse issues
authorMarcin Slusarz <marcin.slusarz@gmail.com>
Tue, 19 Jun 2012 21:38:34 +0000 (23:38 +0200)
committerMarcin Slusarz <marcin.slusarz@gmail.com>
Wed, 20 Jun 2012 19:24:53 +0000 (21:24 +0200)
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.

src/gallium/drivers/nv50/nv50_shader_state.c
src/gallium/drivers/nv50/nv50_vbo.c

index 1ddcd3c67e79c3392c1968c39bae3686e75ffbf0..586eefe50da1518bd73573e304b7e3d80db6170f 100644 (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;
index 1875d4d60924c0c1269b47619129e07ec9bef2b8..6e81b7b2d34245121acf198473b0b6729f7f1448 100644 (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) {