[Mesa-dev] [PATCH 22/23] i965/gen9: Enable the use of YF/YS tiling on skl+

Anuj Phogat anuj.phogat at gmail.com
Mon Mar 30 14:04:53 PDT 2015


Note: Buffer size condition used in this patch to choose between
YF / YS tiling is just a place holder. I need some suggestions
here.

Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
---
 src/mesa/drivers/dri/i965/brw_tex_layout.c | 79 ++++++++++++++++++++++++++++++
 1 file changed, 79 insertions(+)

diff --git a/src/mesa/drivers/dri/i965/brw_tex_layout.c b/src/mesa/drivers/dri/i965/brw_tex_layout.c
index ce954dd..b563e12 100644
--- a/src/mesa/drivers/dri/i965/brw_tex_layout.c
+++ b/src/mesa/drivers/dri/i965/brw_tex_layout.c
@@ -684,6 +684,72 @@ intel_miptree_total_width_height(struct brw_context *brw,
    }
 }
 
+static bool
+intel_miptree_choose_tr_mode(struct brw_context *brw,
+                             mesa_format format,
+                             uint32_t width0,
+                             uint32_t num_samples,
+                             enum intel_miptree_tiling_mode requested,
+                             struct intel_mipmap_tree *mt,
+                             uint32_t tr_mode)
+{
+   const unsigned bpp = mt->cpp * 8;
+   uint64_t size;
+   char *tr_mode_str;
+
+   /* bpp must be power of 2. */
+   if (!mt->compressed &&
+       _mesa_is_format_color_format(mt->format) &&
+       (requested == INTEL_MIPTREE_TILING_Y ||
+        requested == INTEL_MIPTREE_TILING_ANY) &&
+       (bpp && (bpp & (bpp - 1)) == 0)) {
+
+      mt->tr_mode = tr_mode;
+      mt->align_w = intel_horizontal_texture_alignment_unit(brw, mt);
+      mt->align_h = intel_vertical_texture_alignment_unit(brw, mt);
+
+      intel_miptree_total_width_height(brw, mt);
+
+      tr_mode_str = mt->tr_mode == INTEL_MIPTREE_TRMODE_NONE ?
+                                   "INTEL_MIPTREE_TRMODE_NONE" :
+                                   (mt->tr_mode == INTEL_MIPTREE_TRMODE_YF ?
+                                    "INTEL_MIPTREE_TRMODE_YF" :
+                                    "INTEL_MIPTREE_TRMODE_YS");
+
+      mt->tiling = intel_miptree_choose_tiling(brw, format, width0,
+                                               num_samples,
+                                               requested, mt);
+
+      if (mt->tiling == I915_TILING_Y ||
+          mt->tiling == (I915_TILING_Y | I915_TILING_X)) {
+
+         size = mt->total_width * mt->total_height * mt->cpp;
+
+         /* Don't use YS tiling if buffer size is not the multiple of 64KB.
+          * Using 64KB format for buffers not meeting above condition will
+          * result in to wastage of memory.
+          *
+          * FIXME: Revisit this logic when we have more information about
+          * the specific cases when using YF/YS will be useful.
+          */
+         if ((mt->tr_mode == INTEL_MIPTREE_TRMODE_YS && size % 65536 == 0) ||
+             mt->tr_mode == INTEL_MIPTREE_TRMODE_YF)
+            return true;
+      }
+
+      /* Can't use requested tr_mode. Free up the memory allocated for
+       * miptree levels in intel_miptree_total_width_height().
+       */
+      unsigned level;
+      for (level = mt->first_level; level <= mt->last_level; level++) {
+         free(mt->level[level].slice);
+         mt->level[level].slice = NULL;
+      }
+   }
+
+   return false;
+}
+
 void
 brw_miptree_layout(struct brw_context *brw,
                    mesa_format format,
@@ -695,6 +761,19 @@ brw_miptree_layout(struct brw_context *brw,
 {
    bool gen6_hiz_or_stencil = false;
 
+   /* Check in advance if we can do Y tiling with Yf or Ys tiled resource
+    * modes. Fall back to using INTEL_MIPTREE_TRMODE_NONE.
+    */
+   if (brw->gen >= 9 && !for_bo) {
+      if (intel_miptree_choose_tr_mode(brw, format, width0, num_samples,
+                                       requested, mt,
+                                       INTEL_MIPTREE_TRMODE_YF) ||
+          intel_miptree_choose_tr_mode(brw, format, width0, num_samples,
+                                       requested, mt,
+                                       INTEL_MIPTREE_TRMODE_YS))
+         return;
+   }
+
    mt->tr_mode = INTEL_MIPTREE_TRMODE_NONE;
 
    if (brw->gen == 6 && mt->array_layout == ALL_SLICES_AT_EACH_LOD) {
-- 
2.3.4



More information about the mesa-dev mailing list