ac/surface/gfx6: don't overallocate mipmapped HTILE
authorMarek Olšák <marek.olsak@amd.com>
Tue, 1 May 2018 18:34:19 +0000 (14:34 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 24 May 2018 17:41:56 +0000 (13:41 -0400)
Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/amd/common/ac_surface.c

index b50157cdb9ab259e9f946d592123528ad9fa0c5f..6600ff6b7efeb48f6bd183fcae13bdfc5e7b96ff 100644 (file)
@@ -934,8 +934,17 @@ static int gfx6_compute_surface(ADDR_HANDLE addrlib,
        /* Make sure HTILE covers the whole miptree, because the shader reads
         * TC-compatible HTILE even for levels where it's disabled by DB.
         */
-       if (surf->htile_size && config->info.levels > 1)
-               surf->htile_size *= 2;
+       if (surf->htile_size && config->info.levels > 1 &&
+           surf->flags & RADEON_SURF_TC_COMPATIBLE_HTILE) {
+               /* MSAA can't occur with levels > 1, so ignore the sample count. */
+               const unsigned total_pixels = surf->surf_size / surf->bpe;
+               const unsigned htile_block_size = 8 * 8;
+               const unsigned htile_element_size = 4;
+
+               surf->htile_size = (total_pixels / htile_block_size) *
+                                  htile_element_size;
+               surf->htile_size = align(surf->htile_size, surf->htile_alignment);
+       }
 
        surf->is_linear = surf->u.legacy.level[0].mode == RADEON_SURF_MODE_LINEAR_ALIGNED;
        surf->is_displayable = surf->is_linear ||