From 7c19437292c0da14bda555b3f55875eb8c0b2ed2 Mon Sep 17 00:00:00 2001 From: Karol Herbst 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