From: Marek Olšák <marek.ol...@amd.com>

---
 src/gallium/drivers/radeon/r600_texture.c | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/radeon/r600_texture.c 
b/src/gallium/drivers/radeon/r600_texture.c
index 2953379..b81dbb7 100644
--- a/src/gallium/drivers/radeon/r600_texture.c
+++ b/src/gallium/drivers/radeon/r600_texture.c
@@ -217,24 +217,27 @@ static int r600_init_surface(struct r600_common_screen 
*rscreen,
                        bpe = 4;
                }
        }
 
        if (!is_flushed_depth && is_depth) {
                flags |= RADEON_SURF_ZBUFFER;
 
                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;
                }
 
                if (is_stencil)
                        flags |= RADEON_SURF_SBUFFER;
        }
 
        if (rscreen->chip_class >= VI &&
            (ptex->flags & R600_RESOURCE_FLAG_DISABLE_DCC ||
             ptex->format == PIPE_FORMAT_R9G9B9E5_FLOAT))
@@ -1004,25 +1007,32 @@ r600_texture_create_object(struct pipe_screen *screen,
        /* don't include stencil-only formats which we don't support for 
rendering */
        rtex->is_depth = 
util_format_has_depth(util_format_description(rtex->resource.b.b.format));
 
        rtex->surface = *surface;
        rtex->size = rtex->surface.surf_size;
 
        rtex->tc_compatible_htile = rtex->surface.htile_size != 0 &&
                                    (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.
         * Applies to R600-Cayman. */
        rtex->non_disp_tiling = rtex->is_depth && rtex->surface.level[0].mode 
>= RADEON_SURF_MODE_1D;
        /* Applies to GCN. */
        rtex->last_msaa_resolve_target_micro_mode = 
rtex->surface.micro_tile_mode;
 
        /* Disable separate DCC at the beginning. DRI2 doesn't reuse buffers
         * between frames, so the only thing that can enable separate DCC
-- 
2.7.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to