diff options
author | Ilia Mirkin <[email protected]> | 2015-09-25 16:34:07 -0400 |
---|---|---|
committer | Ilia Mirkin <[email protected]> | 2015-09-28 17:28:54 -0400 |
commit | d4e650b07bc80075f0d088e7d85df9efa45e11bd (patch) | |
tree | 6b0d171131dfca4ea705397f66256e1069c1be49 /src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c | |
parent | 4c5308bbf4fa5c6ac274f6e1ab7c8846a2866976 (diff) |
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 <[email protected]>
Cc: [email protected]
Tested-by: Marcin Ĺšlusarz <[email protected]>
Diffstat (limited to 'src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c')
-rw-r--r-- | src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c b/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c index d4831bfd9d4..aaec60a5ac2 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c @@ -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); |