diff --git a/src/freedreno/drm/freedreno_bo.c b/src/freedreno/drm/freedreno_bo.c index 6b90c1e6dfe..631da7da9f9 100644 --- a/src/freedreno/drm/freedreno_bo.c +++ b/src/freedreno/drm/freedreno_bo.c @@ -141,9 +141,10 @@ bo_new(struct fd_device *dev, uint32_t size, uint32_t flags, struct fd_bo *bo = NULL; if (size < FD_BO_HEAP_BLOCK_SIZE) { - if ((flags == 0) && dev->default_heap) + uint32_t alloc_flags = flags & ~_FD_BO_HINTS; + if ((alloc_flags == 0) && dev->default_heap) bo = fd_bo_heap_alloc(dev->default_heap, size); - else if ((flags == RING_FLAGS) && dev->ring_heap) + else if ((alloc_flags == RING_FLAGS) && dev->ring_heap) bo = fd_bo_heap_alloc(dev->ring_heap, size); if (bo) return bo; diff --git a/src/freedreno/drm/freedreno_drmif.h b/src/freedreno/drm/freedreno_drmif.h index 30490b12c30..9f09e7f416e 100644 --- a/src/freedreno/drm/freedreno_drmif.h +++ b/src/freedreno/drm/freedreno_drmif.h @@ -147,6 +147,16 @@ int fd_fence_wait(struct fd_fence *f); /* internal bo flags: */ #define _FD_BO_NOSYNC BITSET_BIT(7) /* Avoid userspace fencing on control buffers */ +/* Additional flags hinting usage, only used for tracing. Buffers without + * one of these flags set will be presumed to be driver internal. + */ +#define FD_BO_HINT_BUFFER BITSET_BIT(8) +#define FD_BO_HINT_IMAGE BITSET_BIT(9) +#define _FD_BO_HINTS ( \ + FD_BO_HINT_BUFFER | \ + FD_BO_HINT_IMAGE | \ + 0) + /* * bo access flags: (keep aligned to MSM_PREP_x) */ diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c index b4a082f3cd0..f953451f7f6 100644 --- a/src/gallium/drivers/freedreno/freedreno_resource.c +++ b/src/gallium/drivers/freedreno/freedreno_resource.c @@ -207,6 +207,7 @@ realloc_bo(struct fd_resource *rsc, uint32_t size) struct pipe_resource *prsc = &rsc->b.b; struct fd_screen *screen = fd_screen(rsc->b.b.screen); uint32_t flags = + (prsc->target == PIPE_BUFFER) ? FD_BO_HINT_BUFFER : FD_BO_HINT_IMAGE | COND(rsc->layout.tile_mode, FD_BO_NOMAP) | COND((prsc->usage & PIPE_USAGE_STAGING) && (prsc->flags & PIPE_RESOURCE_FLAG_MAP_COHERENT),