diff --git a/src/gallium/drivers/panfrost/pan_resource.c b/src/gallium/drivers/panfrost/pan_resource.c index a2992253a2b..ac171ca13dc 100644 --- a/src/gallium/drivers/panfrost/pan_resource.c +++ b/src/gallium/drivers/panfrost/pan_resource.c @@ -936,6 +936,17 @@ panfrost_store_tiled_images(struct panfrost_transfer *transfer, } } +static bool +panfrost_box_covers_resource(const struct pipe_resource *resource, + const struct pipe_box *box) +{ + return resource->last_level == 0 && + resource->width0 == box->width && + resource->height0 == box->height && + resource->depth0 == box->depth && + resource->array_size == 1; +} + static void * panfrost_ptr_map(struct pipe_context *pctx, struct pipe_resource *resource, @@ -1005,6 +1016,18 @@ panfrost_ptr_map(struct pipe_context *pctx, if (dev->debug & (PAN_DBG_TRACE | PAN_DBG_SYNC)) pandecode_inject_mmap(bo->ptr.gpu, bo->ptr.cpu, bo->size, NULL); + /* Upgrade DISCARD_RANGE to WHOLE_RESOURCE if the whole resource is + * being mapped. + */ + if ((usage & PIPE_MAP_DISCARD_RANGE) && + !(usage & PIPE_MAP_UNSYNCHRONIZED) && + !(resource->flags & PIPE_RESOURCE_FLAG_MAP_PERSISTENT) && + panfrost_box_covers_resource(resource, box) && + !(rsrc->image.data.bo->flags & PAN_BO_SHARED)) { + + usage |= PIPE_MAP_DISCARD_WHOLE_RESOURCE; + } + bool create_new_bo = usage & PIPE_MAP_DISCARD_WHOLE_RESOURCE; bool copy_resource = false; @@ -1025,7 +1048,7 @@ panfrost_ptr_map(struct pipe_context *pctx, panfrost_bo_wait(bo, INT64_MAX, false); create_new_bo = true; - copy_resource = true; + copy_resource = !panfrost_box_covers_resource(resource, box); } if (create_new_bo) {