summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/vc4
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/vc4')
-rw-r--r--src/gallium/drivers/vc4/vc4_bufmgr.h3
-rw-r--r--src/gallium/drivers/vc4/vc4_resource.c13
2 files changed, 12 insertions, 4 deletions
diff --git a/src/gallium/drivers/vc4/vc4_bufmgr.h b/src/gallium/drivers/vc4/vc4_bufmgr.h
index 14bfa2466df..00ea149bd5f 100644
--- a/src/gallium/drivers/vc4/vc4_bufmgr.h
+++ b/src/gallium/drivers/vc4/vc4_bufmgr.h
@@ -70,6 +70,9 @@ vc4_bo_reference(struct vc4_bo *bo)
static inline void
vc4_bo_unreference(struct vc4_bo **bo)
{
+ if (!*bo)
+ return;
+
if (pipe_reference(&(*bo)->reference, NULL))
vc4_bo_free(*bo);
*bo = NULL;
diff --git a/src/gallium/drivers/vc4/vc4_resource.c b/src/gallium/drivers/vc4/vc4_resource.c
index 98c8f89fdec..a71ae5bab13 100644
--- a/src/gallium/drivers/vc4/vc4_resource.c
+++ b/src/gallium/drivers/vc4/vc4_resource.c
@@ -73,15 +73,20 @@ vc4_resource_transfer_map(struct pipe_context *pctx,
enum pipe_format format = prsc->format;
char *buf;
- vc4_flush_for_bo(pctx, rsc->bo);
+ 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))
+ vc4_flush_for_bo(pctx, rsc->bo);
trans = util_slab_alloc(&vc4->transfer_pool);
if (!trans)
return NULL;
- /* XXX: Handle DISCARD_WHOLE_RESOURCE, DONTBLOCK, UNSYNCHRONIZED,
- * DISCARD_WHOLE_RESOURCE, PERSISTENT, COHERENT.
- */
+ /* XXX: Handle DONTBLOCK, DISCARD_RANGE, PERSISTENT, COHERENT. */
/* util_slab_alloc() doesn't zero: */
memset(trans, 0, sizeof(*trans));