nv50: always emit dummy relocs for all still-referenced buffers
authorBen Skeggs <bskeggs@redhat.com>
Wed, 3 Mar 2010 04:55:54 +0000 (14:55 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Wed, 10 Mar 2010 06:29:59 +0000 (16:29 +1000)
src/gallium/drivers/nv50/nv50_state_validate.c

index b01a3d87de64b1a2c1550b276f923ff3bdc9afdf..12e427d38b3d44109e0ff0b48d615ca0ef0454af 100644 (file)
@@ -405,10 +405,10 @@ nv50_state_flush_notify(struct nouveau_channel *chan)
 }
 
 boolean
-nv50_state_validate(struct nv50_context *nv50, unsigned nr_dwords)
+nv50_state_validate(struct nv50_context *nv50, unsigned wait_dwords)
 {
        struct nouveau_channel *chan = nv50->screen->base.channel;
-       unsigned nr_relocs = 0;
+       unsigned nr_relocs = 128, nr_dwords = wait_dwords + 128;
        int ret, i;
 
        for (i = 0; i < validate_list_len; i++) {
@@ -460,6 +460,12 @@ nv50_state_validate(struct nv50_context *nv50, unsigned nr_dwords)
                so_emit(chan, nv50->state.hw[i]);
        }
 
+       /* Yes, really, we need to do this.  If a buffer that is referenced
+        * on the hardware isn't part of changed state above, without doing
+        * this the kernel is given no clue that the buffer is being used
+        * still.  This can cause all sorts of fun issues.
+        */
+       nv50_state_flush_notify(chan);
        return TRUE;
 }