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!
This commit is contained in:
Ben Skeggs 2009-02-22 15:38:59 +10:00
parent 487a55af78
commit e5e255a406
1 changed files with 13 additions and 13 deletions

View File

@ -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