ac/surface: store HTILE mip info into the surface
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Tue, 15 Dec 2020 17:59:18 +0000 (18:59 +0100)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Wed, 27 Jan 2021 08:02:17 +0000 (09:02 +0100)
GFX10 can only compress the first level in the mip tail.
GFX9+ is not yet supported because mips are interleaved.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8124>

src/amd/common/ac_surface.c
src/amd/common/ac_surface.h

index e534c16..b987da2 100644 (file)
@@ -933,6 +933,7 @@ static int gfx6_compute_level(ADDR_HANDLE addrlib, const struct ac_surf_config *
          surf->htile_size = AddrHtileOut->htileBytes;
          surf->htile_slice_size = AddrHtileOut->sliceSize;
          surf->htile_alignment = AddrHtileOut->baseAlign;
+         surf->num_htile_levels = level + 1;
       }
    }
 
@@ -1754,9 +1755,11 @@ static int gfx9_compute_miptree(struct ac_addrlib *addrlib, const struct radeon_
       /* HTILE */
       ADDR2_COMPUTE_HTILE_INFO_INPUT hin = {0};
       ADDR2_COMPUTE_HTILE_INFO_OUTPUT hout = {0};
+      ADDR2_META_MIP_INFO meta_mip_info[RADEON_SURF_MAX_LEVELS] = {0};
 
       hin.size = sizeof(ADDR2_COMPUTE_HTILE_INFO_INPUT);
       hout.size = sizeof(ADDR2_COMPUTE_HTILE_INFO_OUTPUT);
+      hout.pMipInfo = meta_mip_info;
 
       assert(in->flags.metaPipeUnaligned == 0);
       assert(in->flags.metaRbUnaligned == 0);
@@ -1778,6 +1781,24 @@ static int gfx9_compute_miptree(struct ac_addrlib *addrlib, const struct radeon_
       surf->htile_size = hout.htileBytes;
       surf->htile_slice_size = hout.sliceSize;
       surf->htile_alignment = hout.baseAlign;
+      surf->num_htile_levels = in->numMipLevels;
+
+      for (unsigned i = 0; i < in->numMipLevels; i++) {
+         surf->u.gfx9.htile_levels[i].offset = meta_mip_info[i].offset;
+         surf->u.gfx9.htile_levels[i].size = meta_mip_info[i].sliceSize;
+
+         if (meta_mip_info[i].inMiptail) {
+            /* GFX10 can only compress the first level
+             * in the mip tail.
+             */
+            surf->num_htile_levels = i + 1;
+            break;
+         }
+      }
+
+      if (!surf->num_htile_levels)
+         surf->htile_size = 0;
+
       return 0;
    }
 
index 6590024..201ef08 100644 (file)
@@ -202,6 +202,9 @@ struct gfx9_surf_layout {
 
    /* DCC level info */
    struct gfx9_surf_level dcc_levels[RADEON_SURF_MAX_LEVELS];
+
+   /* HTILE level info */
+   struct gfx9_surf_level htile_levels[RADEON_SURF_MAX_LEVELS];
 };
 
 struct radeon_surf {
@@ -268,6 +271,7 @@ struct radeon_surf {
    uint32_t htile_size;
    uint32_t htile_slice_size;
    uint32_t htile_alignment;
+   uint32_t num_htile_levels : 4;
 
    uint32_t cmask_size;
    uint32_t cmask_slice_size;