radeonsi/gfx9: allow Z16_UNORM for TC-compatible HTILE
authorMarek Olšák <marek.olsak@amd.com>
Sat, 15 Oct 2016 13:06:01 +0000 (15:06 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 30 Mar 2017 12:44:33 +0000 (14:44 +0200)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeon/r600_texture.c

index 29533799082a70e3104379bbb820565815b99d6a..b81dbb7c2f671a84a5dd8559b2aca760d59a5892 100644 (file)
@@ -224,10 +224,13 @@ static int r600_init_surface(struct r600_common_screen *rscreen,
                if (tc_compatible_htile &&
                    array_mode == RADEON_SURF_MODE_2D) {
                        /* TC-compatible HTILE only supports Z32_FLOAT.
-                        * Promote Z16 to Z32. DB->CB copies will convert
+                        * GFX9 also supports Z16_UNORM.
+                        * On VI, promote Z16 to Z32. DB->CB copies will convert
                         * the format for transfers.
                         */
-                       bpe = 4;
+                       if (rscreen->chip_class == VI)
+                               bpe = 4;
+
                        flags |= RADEON_SURF_TC_COMPATIBLE_HTILE;
                }
 
@@ -1011,11 +1014,18 @@ r600_texture_create_object(struct pipe_screen *screen,
                                    (rtex->surface.flags &
                                     RADEON_SURF_TC_COMPATIBLE_HTILE);
 
-       /* TC-compatible HTILE only supports Z32_FLOAT. */
-       if (rtex->tc_compatible_htile)
-               rtex->db_render_format = PIPE_FORMAT_Z32_FLOAT;
-       else
+       /* TC-compatible HTILE:
+        * - VI only supports Z32_FLOAT.
+        * - GFX9 only supports Z32_FLOAT and Z16_UNORM. */
+       if (rtex->tc_compatible_htile) {
+               if (rscreen->chip_class >= GFX9 &&
+                   base->format == PIPE_FORMAT_Z16_UNORM)
+                       rtex->db_render_format = base->format;
+               else
+                       rtex->db_render_format = PIPE_FORMAT_Z32_FLOAT;
+       } else {
                rtex->db_render_format = base->format;
+       }
 
        /* Tiled depth textures utilize the non-displayable tile order.
         * This must be done after r600_setup_surface.