nouveau: Unreference pushbuf objects on channel destruction.
- unreference pushbuf objects on channel destruction Based on Krzysztof Smiechowicz's patch.main
parent
cb1caaaa05
commit
cd2e4ba9aa
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue