diff options
author | Eric Anholt <[email protected]> | 2014-10-24 16:50:37 +0100 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2014-10-24 18:04:26 +0100 |
commit | 18ccda7b86b8f7ab7466265aefb3f3e773f4a757 (patch) | |
tree | 14cc17d5d92cdb83ce863e54709f2c5c13d023b4 | |
parent | a71c3b885a532016aa426b5bb753291cffe39a44 (diff) |
vc4: When asked to discard-map a whole resource, discard it.
This saves a bunch of extra flushes when texsubimaging a whole texture
that's been used for rendering, or subdataing a whole BO. In particular,
this massively reduces the runtime of piglit texture-packed-formats (when
the probes have been moved out of the inner loop).
-rw-r--r-- | src/gallium/drivers/vc4/vc4_resource.c | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/src/gallium/drivers/vc4/vc4_resource.c b/src/gallium/drivers/vc4/vc4_resource.c index 62667bf2586..b02e2899329 100644 --- a/src/gallium/drivers/vc4/vc4_resource.c +++ b/src/gallium/drivers/vc4/vc4_resource.c @@ -34,6 +34,20 @@ #include "vc4_tiling.h" static void +vc4_resource_bo_alloc(struct vc4_resource *rsc) +{ + struct pipe_resource *prsc = &rsc->base.b; + struct pipe_screen *pscreen = prsc->screen; + + vc4_bo_unreference(&rsc->bo); + rsc->bo = vc4_bo_alloc(vc4_screen(pscreen), + rsc->slices[0].offset + + rsc->slices[0].size + + rsc->cube_map_stride * (prsc->array_size - 1), + "resource"); +} + +static void vc4_resource_transfer_unmap(struct pipe_context *pctx, struct pipe_transfer *ptrans) { @@ -75,14 +89,19 @@ vc4_resource_transfer_map(struct pipe_context *pctx, char *buf; if (usage & PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE) { - uint32_t size = rsc->bo->size; - vc4_bo_unreference(&rsc->bo); - rsc->bo = vc4_bo_alloc(vc4->screen, size, "resource"); - } - - if (!(usage & PIPE_TRANSFER_UNSYNCHRONIZED)) { - if (vc4_cl_references_bo(pctx, rsc->bo)) - vc4_flush(pctx); + vc4_resource_bo_alloc(rsc); + } else if (!(usage & PIPE_TRANSFER_UNSYNCHRONIZED)) { + if (vc4_cl_references_bo(pctx, rsc->bo)) { + if ((usage & PIPE_TRANSFER_DISCARD_RANGE) && + prsc->last_level == 0 && + prsc->width0 == box->width && + prsc->height0 == box->height && + prsc->depth0 == box->depth) { + vc4_resource_bo_alloc(rsc); + } else { + vc4_flush(pctx); + } + } } if (usage & PIPE_TRANSFER_WRITE) @@ -324,12 +343,7 @@ vc4_resource_create(struct pipe_screen *pscreen, } vc4_setup_slices(rsc); - - rsc->bo = vc4_bo_alloc(vc4_screen(pscreen), - rsc->slices[0].offset + - rsc->slices[0].size + - rsc->cube_map_stride * (prsc->array_size - 1), - "resource"); + vc4_resource_bo_alloc(rsc); if (!rsc->bo) goto fail; |