iris: Promote DISCARD_RANGE to DISCARD_WHOLE_RESOURCE where possible
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 30 Sep 2022 00:38:53 +0000 (17:38 -0700)
committerMarge Bot <emma+marge@anholt.net>
Fri, 9 Dec 2022 21:46:03 +0000 (21:46 +0000)
This allows us to replace the backing storage for a buffer, which
means we'd have an idle buffer and thus could do an unsynchronized
mapping where we otherwise wouldn't.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19209>

src/gallium/drivers/iris/iris_resource.c

index 5546edf..c797ad0 100644 (file)
@@ -2383,6 +2383,16 @@ iris_transfer_map(struct pipe_context *ctx,
    if (res->base.is_user_ptr)
       usage |= PIPE_MAP_PERSISTENT;
 
+   /* Promote discarding a range to discarding the entire buffer where
+    * possible.  This may allow us to replace the backing storage entirely
+    * and let us do an unsynchronized map when we otherwise wouldn't.
+    */
+   if (resource->target == PIPE_BUFFER &&
+       (usage & PIPE_MAP_DISCARD_RANGE) &&
+       box->x == 0 && box->width == resource->width0) {
+      usage |= PIPE_MAP_DISCARD_WHOLE_RESOURCE;
+   }
+
    if (usage & PIPE_MAP_DISCARD_WHOLE_RESOURCE) {
       /* Replace the backing storage with a fresh buffer for non-async maps */
       if (!(usage & (PIPE_MAP_UNSYNCHRONIZED |