summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2014-10-24 16:50:37 +0100
committerEric Anholt <[email protected]>2014-10-24 18:04:26 +0100
commit18ccda7b86b8f7ab7466265aefb3f3e773f4a757 (patch)
tree14cc17d5d92cdb83ce863e54709f2c5c13d023b4
parenta71c3b885a532016aa426b5bb753291cffe39a44 (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.c42
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;