Blob Blame History Raw
From 7c19437292c0da14bda555b3f55875eb8c0b2ed2 Mon Sep 17 00:00:00 2001
From: Karol Herbst <kherbst@redhat.com>
Date: Thu, 16 Sep 2021 13:07:31 -0400
Subject: [PATCH 3/6] Revert "nouveau: Use format modifiers in buffer
 allocation"

This reverts commit 129d83cac2accc4a66eae50c19ac245b864dc98c.
---
 .../drivers/nouveau/nvc0/nvc0_miptree.c       | 125 ++----------------
 1 file changed, 8 insertions(+), 117 deletions(-)

diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c b/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c
index e0a9d48249f..8260a90f0d6 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c
@@ -184,7 +184,7 @@ nvc0_choose_tiled_storage_type(struct pipe_screen *pscreen,
 
 static uint32_t
 nvc0_mt_choose_storage_type(struct pipe_screen *pscreen,
-                            const struct nv50_miptree *mt,
+                            struct nv50_miptree *mt,
                             bool compressed)
 {
    const unsigned ms = util_logbase2(mt->base.base.nr_samples);
@@ -249,7 +249,7 @@ nvc0_miptree_init_layout_video(struct nv50_miptree *mt)
 }
 
 static void
-nvc0_miptree_init_layout_tiled(struct nv50_miptree *mt, uint64_t modifier)
+nvc0_miptree_init_layout_tiled(struct nv50_miptree *mt)
 {
    struct pipe_resource *pt = &mt->base.base;
    unsigned w, h, d, l;
@@ -266,9 +266,6 @@ nvc0_miptree_init_layout_tiled(struct nv50_miptree *mt, uint64_t modifier)
    d = mt->layout_3d ? pt->depth0 : 1;
 
    assert(!mt->ms_mode || !pt->last_level);
-   assert(modifier == DRM_FORMAT_MOD_INVALID ||
-          (!pt->last_level && !mt->layout_3d));
-   assert(modifier != DRM_FORMAT_MOD_LINEAR);
 
    for (l = 0; l <= pt->last_level; ++l) {
       struct nv50_miptree_level *lvl = &mt->level[l];
@@ -278,16 +275,7 @@ nvc0_miptree_init_layout_tiled(struct nv50_miptree *mt, uint64_t modifier)
 
       lvl->offset = mt->total_size;
 
-      if (modifier != DRM_FORMAT_MOD_INVALID)
-         /* Extract the log2(block height) field from the modifier and pack it
-          * into tile_mode's y field. Other tile dimensions are always 1
-          * (represented using 0 here) for 2D surfaces, and non-2D surfaces are
-          * not supported by the current modifiers (asserted above). Note the
-          * modifier must be validated prior to calling this function.
-          */
-         lvl->tile_mode = ((uint32_t)modifier & 0xf) << 4;
-      else
-         lvl->tile_mode = nvc0_tex_choose_tile_dims(nbx, nby, d, mt->layout_3d);
+      lvl->tile_mode = nvc0_tex_choose_tile_dims(nbx, nby, d, mt->layout_3d);
 
       tsx = NVC0_TILE_SIZE_X(lvl->tile_mode); /* x is tile row pitch in bytes */
       tsy = NVC0_TILE_SIZE_Y(lvl->tile_mode);
@@ -358,84 +346,6 @@ nvc0_miptree_get_handle(struct pipe_screen *pscreen,
    return true;
 }
 
-static uint64_t
-nvc0_miptree_select_best_modifier(struct pipe_screen *pscreen,
-                                  const struct nv50_miptree *mt,
-                                  const uint64_t *modifiers,
-                                  unsigned int count)
-{
-   /*
-    * Supported block heights are 1,2,4,8,16,32, stored as log2() their
-    * value. Reserve one slot for each, as well as the linear modifier.
-    */
-   uint64_t prio_supported_mods[] = {
-      DRM_FORMAT_MOD_INVALID,
-      DRM_FORMAT_MOD_INVALID,
-      DRM_FORMAT_MOD_INVALID,
-      DRM_FORMAT_MOD_INVALID,
-      DRM_FORMAT_MOD_INVALID,
-      DRM_FORMAT_MOD_INVALID,
-      DRM_FORMAT_MOD_LINEAR,
-   };
-   const uint32_t uc_kind = nvc0_mt_choose_storage_type(pscreen, mt, false);
-   int top_mod_slot = ARRAY_SIZE(prio_supported_mods);
-   const uint32_t kind_gen = nvc0_get_kind_generation(pscreen);
-   unsigned int i;
-   int p;
-
-   if (uc_kind != 0u) {
-      const struct pipe_resource *pt = &mt->base.base;
-      const unsigned nbx = util_format_get_nblocksx(pt->format, pt->width0);
-      const unsigned nby = util_format_get_nblocksy(pt->format, pt->height0);
-      const uint32_t lbh_preferred =
-         NVC0_TILE_MODE_Y(nvc0_tex_choose_tile_dims(nbx, nby, 1u, false));
-      uint32_t lbh = lbh_preferred;
-      bool dec_lbh = true;
-      const uint8_t s = nouveau_screen(pscreen)->tegra_sector_layout ? 0 : 1;
-
-      for (i = 0; i < ARRAY_SIZE(prio_supported_mods) - 1; i++) {
-         assert(lbh <= 5u);
-         prio_supported_mods[i] =
-            DRM_FORMAT_MOD_NVIDIA_BLOCK_LINEAR_2D(0, s, kind_gen, uc_kind, lbh);
-
-         /*
-          * The preferred block height is the largest block size that doesn't
-          * waste excessive space with unused padding bytes relative to the
-          * height of the image.  Construct the priority array such that
-          * the preferred block height is highest priority, followed by
-          * progressively smaller block sizes down to a block height of one,
-          * followed by progressively larger (more wasteful) block sizes up
-          * to 5.
-          */
-         if (lbh == 0u) {
-            lbh = lbh_preferred + 1u;
-            dec_lbh = false;
-         } else if (dec_lbh) {
-            lbh--;
-         } else {
-            lbh++;
-         }
-      }
-   }
-
-   assert(prio_supported_mods[ARRAY_SIZE(prio_supported_mods) - 1] ==
-          DRM_FORMAT_MOD_LINEAR);
-
-   for (i = 0u; i < count; i++) {
-      for (p = 0; p < ARRAY_SIZE(prio_supported_mods); p++) {
-         if (prio_supported_mods[p] == modifiers[i]) {
-            if (top_mod_slot > p) top_mod_slot = p;
-            break;
-         }
-      }
-   }
-
-   if (top_mod_slot >= ARRAY_SIZE(prio_supported_mods))
-       return DRM_FORMAT_MOD_INVALID;
-
-   return prio_supported_mods[top_mod_slot];
-}
-
 struct pipe_resource *
 nvc0_miptree_create(struct pipe_screen *pscreen,
                     const struct pipe_resource *templ,
@@ -450,7 +360,6 @@ nvc0_miptree_create(struct pipe_screen *pscreen,
    union nouveau_bo_config bo_config;
    uint32_t bo_flags;
    unsigned pitch_align;
-   uint64_t modifier = DRM_FORMAT_MOD_INVALID;
 
    if (!mt)
       return NULL;
@@ -460,9 +369,6 @@ nvc0_miptree_create(struct pipe_screen *pscreen,
    pt->screen = pscreen;
 
    if (pt->usage == PIPE_USAGE_STAGING) {
-      /* PIPE_USAGE_STAGING, and usage in general, should not be specified when
-       * modifiers are used. */
-      assert(count == 0);
       switch (pt->target) {
       case PIPE_TEXTURE_2D:
       case PIPE_TEXTURE_RECT:
@@ -476,27 +382,13 @@ nvc0_miptree_create(struct pipe_screen *pscreen,
       }
    }
 
-   if (pt->bind & PIPE_BIND_LINEAR)
+   if (count == 1 && modifiers[0] == DRM_FORMAT_MOD_LINEAR)
       pt->flags |= NOUVEAU_RESOURCE_FLAG_LINEAR;
 
-   if (count > 0) {
-      modifier = nvc0_miptree_select_best_modifier(pscreen, mt,
-                                                   modifiers, count);
-
-      if (modifier == DRM_FORMAT_MOD_INVALID) {
-         FREE(mt);
-         return NULL;
-      }
+   if (pt->bind & PIPE_BIND_LINEAR)
+      pt->flags |= NOUVEAU_RESOURCE_FLAG_LINEAR;
 
-      if (modifier == DRM_FORMAT_MOD_LINEAR) {
-         pt->flags |= NOUVEAU_RESOURCE_FLAG_LINEAR;
-         bo_config.nvc0.memtype = 0;
-      } else {
-         bo_config.nvc0.memtype = (modifier >> 12) & 0xff;
-      }
-   } else {
-      bo_config.nvc0.memtype = nvc0_mt_choose_storage_type(pscreen, mt, compressed);
-   }
+   bo_config.nvc0.memtype = nvc0_mt_choose_storage_type(pscreen, mt, compressed);
 
    if (!nvc0_miptree_init_ms_mode(mt)) {
       FREE(mt);
@@ -504,11 +396,10 @@ nvc0_miptree_create(struct pipe_screen *pscreen,
    }
 
    if (unlikely(pt->flags & NVC0_RESOURCE_FLAG_VIDEO)) {
-      assert(modifier == DRM_FORMAT_MOD_INVALID);
       nvc0_miptree_init_layout_video(mt);
    } else
    if (likely(bo_config.nvc0.memtype)) {
-      nvc0_miptree_init_layout_tiled(mt, modifier);
+      nvc0_miptree_init_layout_tiled(mt);
    } else {
       /* When modifiers are supplied, usage is zero. TODO: detect the
        * modifiers+cursor case. */
-- 
2.31.1