nv50: delay uploads until transfer object is destroyed
authorBen Skeggs <bskeggs@redhat.com>
Sun, 22 Feb 2009 05:38:59 +0000 (15:38 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Sun, 22 Feb 2009 05:47:15 +0000 (15:47 +1000)
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

index b025e5df0c53e8ebb180d332c46b32cdc45ea7a2..a00c999510d153786ac1a319a610162a42f91156 100644 (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