2017-09-22 11:31 GMT+02:00 Lucas Stach <[email protected]>: > Currently we are blitting the whole resource when the RS is used to > de-/tile a resource. This can be very inefficient for large resources > where the transfer is only changing a small part of the resource > (happens a lot with glTexSubImage2D). > > Optimize this by only blitting the tile aligned subregion of the > resource, which the transfer is going to change. > > Signed-off-by: Lucas Stach <[email protected]>
Reviewed-by: Christian Gmeiner <[email protected]> > --- > src/gallium/drivers/etnaviv/etnaviv_transfer.c | 29 > ++++++++++++++++++++++---- > 1 file changed, 25 insertions(+), 4 deletions(-) > > diff --git a/src/gallium/drivers/etnaviv/etnaviv_transfer.c > b/src/gallium/drivers/etnaviv/etnaviv_transfer.c > index 6c1edd483541..ee5cda5e8ec2 100644 > --- a/src/gallium/drivers/etnaviv/etnaviv_transfer.c > +++ b/src/gallium/drivers/etnaviv/etnaviv_transfer.c > @@ -28,6 +28,7 @@ > #include "etnaviv_clear_blit.h" > #include "etnaviv_context.h" > #include "etnaviv_debug.h" > +#include "etnaviv_screen.h" > > #include "pipe/p_defines.h" > #include "pipe/p_format.h" > @@ -84,8 +85,7 @@ etna_transfer_unmap(struct pipe_context *pctx, struct > pipe_transfer *ptrans) > /* We have a temporary resource due to either tile status or > * tiling format. Write back the updated buffer contents. > * FIXME: we need to invalidate the tile status. */ > - etna_copy_resource(pctx, ptrans->resource, trans->rsc, > ptrans->level, > - trans->rsc->last_level); > + etna_copy_resource_box(pctx, ptrans->resource, trans->rsc, > ptrans->level, &ptrans->box); > } else if (trans->staging) { > /* map buffer object */ > struct etna_resource_level *res_level = &rsc->levels[ptrans->level]; > @@ -212,9 +212,30 @@ etna_transfer_map(struct pipe_context *pctx, struct > pipe_resource *prsc, > return NULL; > } > > + /* Need to align the transfer region to satisfy RS restrictions, as we > + * really want to hit the RS blit path here. > + */ > + unsigned w_align, h_align; > + > + if (rsc->layout & ETNA_LAYOUT_BIT_SUPER) { > + w_align = h_align = 64; > + } else { > + w_align = ETNA_RS_WIDTH_MASK + 1; > + h_align = ETNA_RS_HEIGHT_MASK + 1; > + } > + h_align *= ctx->screen->specs.pixel_pipes; > + > + ptrans->box.width += ptrans->box.x & (w_align - 1); > + ptrans->box.x = ptrans->box.x & ~(w_align - 1); > + ptrans->box.width = align(ptrans->box.width, (ETNA_RS_WIDTH_MASK + 1)); > + ptrans->box.height += ptrans->box.y & (h_align - 1); > + ptrans->box.y = ptrans->box.y & ~(h_align - 1); > + ptrans->box.height = align(ptrans->box.height, > + (ETNA_RS_HEIGHT_MASK + 1) * > + ctx->screen->specs.pixel_pipes); > + > if (!(usage & PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE)) > - etna_copy_resource(pctx, trans->rsc, prsc, level, > - trans->rsc->last_level); > + etna_copy_resource_box(pctx, trans->rsc, prsc, level, &ptrans->box); > > /* Switch to using the temporary resource instead */ > rsc = etna_resource(trans->rsc); > -- > 2.11.0 > > _______________________________________________ > etnaviv mailing list > [email protected] > https://lists.freedesktop.org/mailman/listinfo/etnaviv greets -- Christian Gmeiner, MSc https://christian-gmeiner.info _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
