[Mesa-dev] [PATCH 2/9] i965/miptree: Allocate a shadow_mt for an ASTC WA

Nanley Chery nanleychery at gmail.com
Wed Sep 26 23:31:04 UTC 2018


shadow_mt will hold a miptree with ASTC LDR void extent blocks that are
modified to workaround a sampler bug.
---
 src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 25 +++++++++++++++++++
 src/mesa/drivers/dri/i965/intel_mipmap_tree.h |  1 +
 2 files changed, 26 insertions(+)

diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
index 332c5d88f58..5e99b563102 100644
--- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
+++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
@@ -354,6 +354,19 @@ needs_separate_stencil(const struct brw_context *brw,
           intel_miptree_supports_hiz(brw, mt);
 }
 
+/* Determine if we may run into a problematic void-extent block for our sampler
+ * (see WA #0300). This isn't 100% accurate because we don't actually inspect
+ * the blocks.
+ */
+static bool
+may_need_astc_shadow(const struct gen_device_info *devinfo,
+                     mesa_format format)
+{
+   return devinfo->gen == 9 && !gen_device_info_is_9lp(devinfo) &&
+          _mesa_get_format_layout(format) == MESA_FORMAT_LAYOUT_ASTC &&
+          _mesa_get_format_color_encoding(format) == GL_LINEAR;
+}
+
 /**
  * Choose the aux usage for this miptree.  This function must be called fairly
  * late in the miptree create process after we have a tiling.
@@ -719,6 +732,18 @@ miptree_create(struct brw_context *brw,
       }
    }
 
+   if (may_need_astc_shadow(devinfo, format)) {
+      mt->shadow_mt =
+         make_surface(brw, target, format, first_level, last_level,
+                      width0, height0, depth0, num_samples,
+                      ISL_TILING_Y0_BIT, mt_surf_usage(format),
+                      BO_ALLOC_BUSY, 0, NULL);
+      if (mt->shadow_mt == NULL) {
+         intel_miptree_release(&mt);
+         return NULL;
+      }
+   }
+
    mt->etc_format = (_mesa_is_format_color_format(format) && mt_fmt != format) ?
                     format : MESA_FORMAT_NONE;
 
diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
index d75c93b8b42..b22514de386 100644
--- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
+++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
@@ -301,6 +301,7 @@ struct intel_mipmap_tree
     *
     * This miptree may be used for:
     * - Stencil texturing (pre-BDW) as required by GL_ARB_stencil_texturing.
+    * - Correctly sampling from ASTC LDR blocks on big-core gen9 platforms.
     */
    struct intel_mipmap_tree *shadow_mt;
    bool shadow_needs_update;
-- 
2.19.0



More information about the mesa-dev mailing list