OSDN Git Service

nouveau: Unreference pushbuf objects on channel destruction.
authorYounes Manton <younes.m@gmail.com>
Mon, 28 Dec 2009 23:00:09 +0000 (18:00 -0500)
committerYounes Manton <younes.m@gmail.com>
Mon, 28 Dec 2009 23:07:08 +0000 (18:07 -0500)
- unreference pushbuf objects on channel destruction

Based on Krzysztof Smiechowicz's patch.

nouveau/nouveau_channel.c
nouveau/nouveau_private.h
nouveau/nouveau_pushbuf.c

index 674c5c3..638aee3 100644 (file)
@@ -111,6 +111,7 @@ nouveau_channel_free(struct nouveau_channel **chan)
 
        FIRE_RING(&nvchan->base);
 
+       nouveau_pushbuf_fini(&nvchan->base);
        nouveau_bo_unmap(nvchan->notifier_bo);
        nouveau_bo_ref(NULL, &nvchan->notifier_bo);
 
index 784afc9..39758d1 100644 (file)
@@ -64,6 +64,8 @@ struct nouveau_pushbuf_priv {
 
 int
 nouveau_pushbuf_init(struct nouveau_channel *);
+void
+nouveau_pushbuf_fini(struct nouveau_channel *);
 
 struct nouveau_channel_priv {
        struct nouveau_channel base;
index b90e923..7da3a47 100644 (file)
@@ -80,13 +80,13 @@ nouveau_pushbuf_space(struct nouveau_channel *chan, unsigned min)
                nvpb->pushbuf = NULL;
        }
 
-       nvpb->size = min < PB_MIN_USER_DWORDS ? PB_MIN_USER_DWORDS : min;       
+       nvpb->size = min < PB_MIN_USER_DWORDS ? PB_MIN_USER_DWORDS : min;
        nvpb->pushbuf = malloc(sizeof(uint32_t) * nvpb->size);
 
        nvpb->base.channel = chan;
        nvpb->base.remaining = nvpb->size;
        nvpb->base.cur = nvpb->pushbuf;
-       
+
        return 0;
 }
 
@@ -165,11 +165,21 @@ nouveau_pushbuf_init(struct nouveau_channel *chan)
                               sizeof(struct drm_nouveau_gem_pushbuf_bo));
        nvpb->relocs = calloc(NOUVEAU_GEM_MAX_RELOCS,
                              sizeof(struct drm_nouveau_gem_pushbuf_reloc));
-       
+
        chan->pushbuf = &nvpb->base;
        return 0;
 }
 
+void
+nouveau_pushbuf_fini(struct nouveau_channel *chan)
+{
+       struct nouveau_channel_priv *nvchan = nouveau_channel(chan);
+       struct nouveau_pushbuf_priv *nvpb = &nvchan->pb;
+       nouveau_pushbuf_fini_call(chan);
+       free(nvpb->buffers);
+       free(nvpb->relocs);
+}
+
 int
 nouveau_pushbuf_flush(struct nouveau_channel *chan, unsigned min)
 {