mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-28 03:50:13 +01:00
nouveau: be more careful about freeing temporary transfer buffers
Deleting a buffer does not flush the command stream. Make sure that we wait for the copies to finish before deleting the temporary bo. Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Cc: mesa-stable@lists.freedesktop.org Tested-by: Marcin Ślusarz <marcin.slusarz@gmail.com>
This commit is contained in:
parent
4c5308bbf4
commit
d4e650b07b
5 changed files with 30 additions and 4 deletions
|
|
@ -231,3 +231,11 @@ nouveau_fence_next(struct nouveau_screen *screen)
|
|||
|
||||
nouveau_fence_new(screen, &screen->fence.current, false);
|
||||
}
|
||||
|
||||
void
|
||||
nouveau_fence_unref_bo(void *data)
|
||||
{
|
||||
struct nouveau_bo *bo = data;
|
||||
|
||||
nouveau_bo_ref(NULL, &bo);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,6 +37,9 @@ void nouveau_fence_next(struct nouveau_screen *);
|
|||
bool nouveau_fence_wait(struct nouveau_fence *);
|
||||
bool nouveau_fence_signalled(struct nouveau_fence *);
|
||||
|
||||
void nouveau_fence_unref_bo(void *data); /* generic unref bo callback */
|
||||
|
||||
|
||||
static inline void
|
||||
nouveau_fence_ref(struct nouveau_fence *fence, struct nouveau_fence **ref)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -339,10 +339,15 @@ nv30_miptree_transfer_unmap(struct pipe_context *pipe,
|
|||
struct nv30_context *nv30 = nv30_context(pipe);
|
||||
struct nv30_transfer *tx = nv30_transfer(ptx);
|
||||
|
||||
if (ptx->usage & PIPE_TRANSFER_WRITE)
|
||||
if (ptx->usage & PIPE_TRANSFER_WRITE) {
|
||||
nv30_transfer_rect(nv30, NEAREST, &tx->tmp, &tx->img);
|
||||
|
||||
nouveau_bo_ref(NULL, &tx->tmp.bo);
|
||||
/* Allow the copies above to finish executing before freeing the source */
|
||||
nouveau_fence_work(nv30->screen->base.fence.current,
|
||||
nouveau_fence_unref_bo, tx->tmp.bo);
|
||||
} else {
|
||||
nouveau_bo_ref(NULL, &tx->tmp.bo);
|
||||
}
|
||||
pipe_resource_reference(&ptx->resource, NULL);
|
||||
FREE(tx);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -365,9 +365,14 @@ nv50_miptree_transfer_unmap(struct pipe_context *pctx,
|
|||
tx->rect[0].base += mt->layer_stride;
|
||||
tx->rect[1].base += tx->nblocksy * tx->base.stride;
|
||||
}
|
||||
|
||||
/* Allow the copies above to finish executing before freeing the source */
|
||||
nouveau_fence_work(nv50->screen->base.fence.current,
|
||||
nouveau_fence_unref_bo, tx->rect[1].bo);
|
||||
} else {
|
||||
nouveau_bo_ref(NULL, &tx->rect[1].bo);
|
||||
}
|
||||
|
||||
nouveau_bo_ref(NULL, &tx->rect[1].bo);
|
||||
pipe_resource_reference(&transfer->resource, NULL);
|
||||
|
||||
FREE(tx);
|
||||
|
|
|
|||
|
|
@ -495,11 +495,16 @@ nvc0_miptree_transfer_unmap(struct pipe_context *pctx,
|
|||
tx->rect[1].base += tx->nblocksy * tx->base.stride;
|
||||
}
|
||||
NOUVEAU_DRV_STAT(&nvc0->screen->base, tex_transfers_wr, 1);
|
||||
|
||||
/* Allow the copies above to finish executing before freeing the source */
|
||||
nouveau_fence_work(nvc0->screen->base.fence.current,
|
||||
nouveau_fence_unref_bo, tx->rect[1].bo);
|
||||
} else {
|
||||
nouveau_bo_ref(NULL, &tx->rect[1].bo);
|
||||
}
|
||||
if (tx->base.usage & PIPE_TRANSFER_READ)
|
||||
NOUVEAU_DRV_STAT(&nvc0->screen->base, tex_transfers_rd, 1);
|
||||
|
||||
nouveau_bo_ref(NULL, &tx->rect[1].bo);
|
||||
pipe_resource_reference(&transfer->resource, NULL);
|
||||
|
||||
FREE(tx);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue