iris: don't create staging resources larger than half the aperture
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 27 Apr 2022 08:15:00 +0000 (01:15 -0700)
committerMarge Bot <emma+marge@anholt.net>
Wed, 31 Aug 2022 01:43:08 +0000 (01:43 +0000)
This is a port of crocus's f1c1fcfd (crocus: don't create staging
resources > half aperture).

I chose to use the whole aperture here rather than 3/4 of it, mostly
to avoid adding another legacy field for aperture stuff.  It's close
enough to work.

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/2104
Reviewed-by: Dave Airlie <airlied@redhat.com>
Tested-by: Mark Janes markjanes@swizzler.org
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18311>

src/gallium/drivers/iris/iris_resource.c

index 0204b1d..82edd9a 100644 (file)
@@ -1152,6 +1152,18 @@ iris_resource_create_with_modifiers(struct pipe_screen *pscreen,
    if (!isl_surf_created_successfully)
       goto fail;
 
+   /* Don't create staging surfaces that will use over half the aperture,
+    * since staging implies you are copying data to another resource that's
+    * at least as large, and then both wouldn't fit in the aperture.
+    *
+    * Skip this for discrete cards, as the destination buffer might be in
+    * device local memory while the staging buffer would be in system memory,
+    * so both would fit.
+    */
+   if (templ->usage == PIPE_USAGE_STAGING && !devinfo->has_local_mem &&
+       res->surf.size_B > devinfo->aperture_bytes / 2)
+      goto fail;
+
    if (!iris_resource_configure_aux(screen, res, false))
       goto fail;