nouveau: refcount buffers on validate list.
authorBen Skeggs <skeggsb@gmail.com>
Tue, 25 Mar 2008 01:12:26 +0000 (12:12 +1100)
committerBen Skeggs <skeggsb@gmail.com>
Tue, 25 Mar 2008 01:12:26 +0000 (12:12 +1100)
src/gallium/winsys/dri/nouveau/nouveau_drmif.h
src/gallium/winsys/dri/nouveau/nouveau_pushbuf.c

index 1c9b5799f963224344b1555f6c1fd1bf7391026f..d5a0e25b573922cc901da0ad9d224903e86e8783 100644 (file)
@@ -108,7 +108,6 @@ nouveau_fence_flush(struct nouveau_channel *);
 
 struct nouveau_pushbuf_reloc {
        uint64_t next;
-       uint64_t handle;
        uint32_t *ptr;
        uint32_t flags;
        uint32_t data;
index a2b9321b15b240e0bf3982f65efd205e443d1468..2e3ac5492fc16e68000c077c55ec2005941c7e93 100644 (file)
@@ -157,11 +157,13 @@ nouveau_pushbuf_flush(struct nouveau_channel *chan, unsigned min)
 
                if (bo->offset == nouveau_bo(bo)->offset &&
                    bo->flags == nouveau_bo(bo)->flags) {
+
                        while ((r = ptr_to_pbrel(pbbo->relocs))) {
                                pbbo->relocs = r->next;
                                free(r);
                        }
 
+                       nouveau_bo_del(&bo);
                        nvpb->buffers = pbbo->next;
                        free(pbbo);
                        continue;
@@ -175,6 +177,7 @@ nouveau_pushbuf_flush(struct nouveau_channel *chan, unsigned min)
                        free(r);
                }
 
+               nouveau_bo_del(&bo);
                nvpb->buffers = pbbo->next;
                free(pbbo);
        }
@@ -202,6 +205,7 @@ nouveau_pushbuf_emit_buffer(struct nouveau_channel *chan, struct nouveau_bo *bo)
 {
        struct nouveau_pushbuf_priv *nvpb = nouveau_pushbuf(chan->pushbuf);
        struct nouveau_pushbuf_bo *pbbo = ptr_to_pbbo(nvpb->buffers);
+       struct nouveau_bo *ref = NULL;
 
        while (pbbo) {
                if (pbbo->handle == bo->handle)
@@ -214,7 +218,8 @@ nouveau_pushbuf_emit_buffer(struct nouveau_channel *chan, struct nouveau_bo *bo)
        nvpb->buffers = pbbo_to_ptr(pbbo);
        nvpb->nr_buffers++;
 
-       pbbo->handle = bo_to_ptr(bo);
+       nouveau_bo_ref(bo->device, bo->handle, &ref);
+       pbbo->handle = bo_to_ptr(ref);
        pbbo->flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_GART;
        pbbo->relocs = 0;
        pbbo->nr_relocs = 0;
@@ -244,7 +249,6 @@ nouveau_pushbuf_emit_reloc(struct nouveau_channel *chan, void *ptr,
        pbbo->flags |= (flags & NOUVEAU_BO_RDWR);
        pbbo->flags &= (flags | NOUVEAU_BO_RDWR);
 
-       r->handle = bo_to_ptr(r);
        r->ptr = ptr;
        r->flags = flags;
        r->data = data;