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:
parent
487a55af78
commit
e5e255a406
|
@ -162,11 +162,23 @@ nv50_transfer_del(struct pipe_screen *pscreen, struct pipe_transfer **pptx)
|
||||||
{
|
{
|
||||||
struct pipe_transfer *ptx = *pptx;
|
struct pipe_transfer *ptx = *pptx;
|
||||||
struct nv50_transfer *tx = (struct nv50_transfer *)ptx;
|
struct nv50_transfer *tx = (struct nv50_transfer *)ptx;
|
||||||
|
struct nv50_miptree *mt = nv50_miptree(ptx->texture);
|
||||||
|
|
||||||
*pptx = NULL;
|
*pptx = NULL;
|
||||||
if (--ptx->refcount)
|
if (--ptx->refcount)
|
||||||
return;
|
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_buffer_reference(pscreen, &tx->buffer, NULL);
|
||||||
pipe_texture_reference(&ptx->texture, NULL);
|
pipe_texture_reference(&ptx->texture, NULL);
|
||||||
FREE(ptx);
|
FREE(ptx);
|
||||||
|
@ -190,20 +202,8 @@ static void
|
||||||
nv50_transfer_unmap(struct pipe_screen *pscreen, struct pipe_transfer *ptx)
|
nv50_transfer_unmap(struct pipe_screen *pscreen, struct pipe_transfer *ptx)
|
||||||
{
|
{
|
||||||
struct nv50_transfer *tx = (struct nv50_transfer *)ptx;
|
struct nv50_transfer *tx = (struct nv50_transfer *)ptx;
|
||||||
struct nv50_miptree *mt = nv50_miptree(ptx->texture);
|
|
||||||
|
|
||||||
if (ptx->usage != PIPE_TRANSFER_READ) {
|
pipe_buffer_unmap(pscreen, tx->buffer);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
Loading…
Reference in New Issue