nouveau: Unreference pushbuf objects on channel destruction.

- unreference pushbuf objects on channel destruction

Based on Krzysztof Smiechowicz's patch.
main
Younes Manton 2009-12-28 18:00:09 -05:00
parent cb1caaaa05
commit cd2e4ba9aa
3 changed files with 16 additions and 3 deletions

View File

@ -111,6 +111,7 @@ nouveau_channel_free(struct nouveau_channel **chan)
FIRE_RING(&nvchan->base); FIRE_RING(&nvchan->base);
nouveau_pushbuf_fini(&nvchan->base);
nouveau_bo_unmap(nvchan->notifier_bo); nouveau_bo_unmap(nvchan->notifier_bo);
nouveau_bo_ref(NULL, &nvchan->notifier_bo); nouveau_bo_ref(NULL, &nvchan->notifier_bo);

View File

@ -64,6 +64,8 @@ struct nouveau_pushbuf_priv {
int int
nouveau_pushbuf_init(struct nouveau_channel *); nouveau_pushbuf_init(struct nouveau_channel *);
void
nouveau_pushbuf_fini(struct nouveau_channel *);
struct nouveau_channel_priv { struct nouveau_channel_priv {
struct nouveau_channel base; struct nouveau_channel base;

View File

@ -80,13 +80,13 @@ nouveau_pushbuf_space(struct nouveau_channel *chan, unsigned min)
nvpb->pushbuf = NULL; 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->pushbuf = malloc(sizeof(uint32_t) * nvpb->size);
nvpb->base.channel = chan; nvpb->base.channel = chan;
nvpb->base.remaining = nvpb->size; nvpb->base.remaining = nvpb->size;
nvpb->base.cur = nvpb->pushbuf; nvpb->base.cur = nvpb->pushbuf;
return 0; return 0;
} }
@ -165,11 +165,21 @@ nouveau_pushbuf_init(struct nouveau_channel *chan)
sizeof(struct drm_nouveau_gem_pushbuf_bo)); sizeof(struct drm_nouveau_gem_pushbuf_bo));
nvpb->relocs = calloc(NOUVEAU_GEM_MAX_RELOCS, nvpb->relocs = calloc(NOUVEAU_GEM_MAX_RELOCS,
sizeof(struct drm_nouveau_gem_pushbuf_reloc)); sizeof(struct drm_nouveau_gem_pushbuf_reloc));
chan->pushbuf = &nvpb->base; chan->pushbuf = &nvpb->base;
return 0; 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 int
nouveau_pushbuf_flush(struct nouveau_channel *chan, unsigned min) nouveau_pushbuf_flush(struct nouveau_channel *chan, unsigned min)
{ {