summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorBen Skeggs <[email protected]>2008-03-25 12:12:26 +1100
committerBen Skeggs <[email protected]>2008-03-25 12:12:26 +1100
commit601b018a9a6143c634239d5bb51616724c2e593d (patch)
tree742d2dbe1b12f1b18d95f2618e132d949ba26154 /src/gallium
parent5ce37d42b3268102caf8225be4ca18418bfab7c4 (diff)
nouveau: refcount buffers on validate list.
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/winsys/dri/nouveau/nouveau_drmif.h1
-rw-r--r--src/gallium/winsys/dri/nouveau/nouveau_pushbuf.c8
2 files changed, 6 insertions, 3 deletions
diff --git a/src/gallium/winsys/dri/nouveau/nouveau_drmif.h b/src/gallium/winsys/dri/nouveau/nouveau_drmif.h
index 1c9b5799f96..d5a0e25b573 100644
--- a/src/gallium/winsys/dri/nouveau/nouveau_drmif.h
+++ b/src/gallium/winsys/dri/nouveau/nouveau_drmif.h
@@ -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;
diff --git a/src/gallium/winsys/dri/nouveau/nouveau_pushbuf.c b/src/gallium/winsys/dri/nouveau/nouveau_pushbuf.c
index a2b9321b15b..2e3ac5492fc 100644
--- a/src/gallium/winsys/dri/nouveau/nouveau_pushbuf.c
+++ b/src/gallium/winsys/dri/nouveau/nouveau_pushbuf.c
@@ -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;