From e5e255a4062bd96390a3eaa3c83aa40001b6de95 Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Sun, 22 Feb 2009 15:38:59 +1000 Subject: [PATCH] nv50: delay uploads until transfer object is destroyed It's possible a state tracker will map/unmap a transfer object many times. Delaying upload until the object is destroyed will prevent unnecessary uploads to the GPU. Also fixing a typo here, was unmapping the wrong buffer on transfer_unmap! --- src/gallium/drivers/nv50/nv50_transfer.c | 26 ++++++++++++------------ 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/gallium/drivers/nv50/nv50_transfer.c b/src/gallium/drivers/nv50/nv50_transfer.c index b025e5df0c5..a00c999510d 100644 --- a/src/gallium/drivers/nv50/nv50_transfer.c +++ b/src/gallium/drivers/nv50/nv50_transfer.c @@ -162,11 +162,23 @@ nv50_transfer_del(struct pipe_screen *pscreen, struct pipe_transfer **pptx) { struct pipe_transfer *ptx = *pptx; struct nv50_transfer *tx = (struct nv50_transfer *)ptx; + struct nv50_miptree *mt = nv50_miptree(ptx->texture); *pptx = NULL; if (--ptx->refcount) return; + if (ptx->usage != PIPE_TRANSFER_READ) { + nv50_transfer_rect_m2mf(pscreen, tx->buffer, tx->base.stride, + 0, 0, tx->base.width, tx->base.height, + mt->buffer, tx->level_pitch, + tx->level_x, tx->level_y, + tx->level_width, tx->level_height, + tx->base.block.size, tx->base.width, + tx->base.height, NOUVEAU_BO_GART, + NOUVEAU_BO_VRAM | NOUVEAU_BO_GART); + } + pipe_buffer_reference(pscreen, &tx->buffer, NULL); pipe_texture_reference(&ptx->texture, NULL); FREE(ptx); @@ -190,20 +202,8 @@ static void nv50_transfer_unmap(struct pipe_screen *pscreen, struct pipe_transfer *ptx) { struct nv50_transfer *tx = (struct nv50_transfer *)ptx; - struct nv50_miptree *mt = nv50_miptree(ptx->texture); - - if (ptx->usage != PIPE_TRANSFER_READ) { - nv50_transfer_rect_m2mf(pscreen, tx->buffer, tx->base.stride, - 0, 0, tx->base.width, tx->base.height, - mt->buffer, tx->level_pitch, - tx->level_x, tx->level_y, - tx->level_width, tx->level_height, - tx->base.block.size, tx->base.width, - tx->base.height, NOUVEAU_BO_GART, - NOUVEAU_BO_VRAM | NOUVEAU_BO_GART); - } - pipe_buffer_unmap(pscreen, mt->buffer); + pipe_buffer_unmap(pscreen, tx->buffer); } void -- 2.30.2