Module: Mesa
Branch: staging/20.3
Commit: ae1c5dc6b68d9e8cf4c9f82ec5586af614513b59
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=ae1c5dc6b68d9e8cf4c9f82ec5586af614513b59

Author: Samuel Pitoiset <samuel.pitoi...@gmail.com>
Date:   Thu Jan  7 08:38:01 2021 +0100

radv: disable TC-compat HTILE in GENERAL for Detroit: Become Human

The game has invalid usage of render loops and enabling TC-compat
HTILE in GENERAL introduces rendering issues.

Gitlab: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3063
Cc: mesa-stable
Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8412>

---

 src/amd/vulkan/radv_cmd_buffer.c | 12 ++++++------
 src/amd/vulkan/radv_device.c     |  8 ++++++++
 src/amd/vulkan/radv_image.c      |  4 +++-
 src/amd/vulkan/radv_meta_clear.c |  4 ++--
 src/amd/vulkan/radv_private.h    |  4 +++-
 5 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index 5555f7c4263..8488190a8a0 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -1694,7 +1694,7 @@ radv_update_zrange_precision(struct radv_cmd_buffer 
*cmd_buffer,
            !radv_image_is_tc_compat_htile(image))
                return;
 
-       if (!radv_layout_is_htile_compressed(image, layout, in_render_loop,
+       if (!radv_layout_is_htile_compressed(cmd_buffer->device, image, layout, 
in_render_loop,
                                             radv_image_queue_family_mask(image,
                                                                          
cmd_buffer->queue_family_index,
                                                                          
cmd_buffer->queue_family_index))) {
@@ -1737,7 +1737,7 @@ radv_emit_fb_ds_state(struct radv_cmd_buffer *cmd_buffer,
        uint32_t db_z_info = ds->db_z_info;
        uint32_t db_stencil_info = ds->db_stencil_info;
 
-       if (!radv_layout_is_htile_compressed(image, layout, in_render_loop,
+       if (!radv_layout_is_htile_compressed(cmd_buffer->device, image, layout, 
in_render_loop,
                                             radv_image_queue_family_mask(image,
                                                                          
cmd_buffer->queue_family_index,
                                                                          
cmd_buffer->queue_family_index))) {
@@ -5950,11 +5950,11 @@ static void radv_handle_depth_image_transition(struct 
radv_cmd_buffer *cmd_buffe
 
        if (src_layout == VK_IMAGE_LAYOUT_UNDEFINED) {
                radv_initialize_htile(cmd_buffer, image, range);
-       } else if (!radv_layout_is_htile_compressed(image, src_layout, 
src_render_loop, src_queue_mask) &&
-                  radv_layout_is_htile_compressed(image, dst_layout, 
dst_render_loop, dst_queue_mask)) {
+       } else if (!radv_layout_is_htile_compressed(cmd_buffer->device, image, 
src_layout, src_render_loop, src_queue_mask) &&
+                  radv_layout_is_htile_compressed(cmd_buffer->device, image, 
dst_layout, dst_render_loop, dst_queue_mask)) {
                radv_initialize_htile(cmd_buffer, image, range);
-       } else if (radv_layout_is_htile_compressed(image, src_layout, 
src_render_loop, src_queue_mask) &&
-                  !radv_layout_is_htile_compressed(image, dst_layout, 
dst_render_loop, dst_queue_mask)) {
+       } else if (radv_layout_is_htile_compressed(cmd_buffer->device, image, 
src_layout, src_render_loop, src_queue_mask) &&
+                  !radv_layout_is_htile_compressed(cmd_buffer->device, image, 
dst_layout, dst_render_loop, dst_queue_mask)) {
                cmd_buffer->state.flush_bits |= RADV_CMD_FLAG_FLUSH_AND_INV_DB |
                                                
RADV_CMD_FLAG_FLUSH_AND_INV_DB_META;
 
diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index c606423d7a6..80c622bcab0 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -620,6 +620,14 @@ radv_handle_per_app_options(struct radv_instance *instance,
                        /* Fix various artifacts in Detroit: Become Human */
                        instance->debug_flags |= RADV_DEBUG_ZERO_VRAM |
                                                 RADV_DEBUG_DISCARD_TO_DEMOTE;
+
+                       /* Fix rendering issues in Detroit: Become Human
+                        * because the game uses render loops (it
+                        * samples/renders from/to the same depth/stencil
+                        * texture inside the same draw) without input
+                        * attachments and that is invalid Vulkan usage.
+                        */
+                       instance->disable_tc_compat_htile_in_general = true;
                }
        }
 
diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c
index 2bad566d12e..edf7cf642bf 100644
--- a/src/amd/vulkan/radv_image.c
+++ b/src/amd/vulkan/radv_image.c
@@ -1738,7 +1738,8 @@ radv_image_view_init(struct radv_image_view *iview,
        }
 }
 
-bool radv_layout_is_htile_compressed(const struct radv_image *image,
+bool radv_layout_is_htile_compressed(const struct radv_device *device,
+                                    const struct radv_image *image,
                                      VkImageLayout layout,
                                     bool in_render_loop,
                                      unsigned queue_mask)
@@ -1746,6 +1747,7 @@ bool radv_layout_is_htile_compressed(const struct 
radv_image *image,
        if (radv_image_is_tc_compat_htile(image)) {
                if (layout == VK_IMAGE_LAYOUT_GENERAL &&
                    !in_render_loop &&
+                   !device->instance->disable_tc_compat_htile_in_general &&
                    !(image->usage & VK_IMAGE_USAGE_STORAGE_BIT)) {
                        /* It should be safe to enable TC-compat HTILE with
                         * VK_IMAGE_LAYOUT_GENERAL if we are not in a render
diff --git a/src/amd/vulkan/radv_meta_clear.c b/src/amd/vulkan/radv_meta_clear.c
index 448489548ad..0261a4dfce4 100644
--- a/src/amd/vulkan/radv_meta_clear.c
+++ b/src/amd/vulkan/radv_meta_clear.c
@@ -733,7 +733,7 @@ static bool depth_view_can_fast_clear(struct 
radv_cmd_buffer *cmd_buffer,
            iview->base_mip == 0 &&
            iview->base_layer == 0 &&
            iview->layer_count == iview->image->info.array_size &&
-           radv_layout_is_htile_compressed(iview->image, layout, 
in_render_loop, queue_mask) &&
+           radv_layout_is_htile_compressed(cmd_buffer->device, iview->image, 
layout, in_render_loop, queue_mask) &&
            radv_image_extent_compare(iview->image, &iview->extent))
                return true;
        return false;
@@ -1090,7 +1090,7 @@ radv_can_fast_clear_depth(struct radv_cmd_buffer 
*cmd_buffer,
        if (!radv_image_view_can_fast_clear(cmd_buffer->device, iview))
                return false;
 
-       if (!radv_layout_is_htile_compressed(iview->image, image_layout, 
in_render_loop,
+       if (!radv_layout_is_htile_compressed(cmd_buffer->device, iview->image, 
image_layout, in_render_loop,
                                             
radv_image_queue_family_mask(iview->image,
                                                                          
cmd_buffer->queue_family_index,
                                                                          
cmd_buffer->queue_family_index)))
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 6c3a166fa37..cb2b638bff2 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -358,6 +358,7 @@ struct radv_instance {
         * Workarounds for game bugs.
         */
        bool enable_mrt_output_nan_fixup;
+       bool disable_tc_compat_htile_in_general;
 };
 
 VkResult radv_init_wsi(struct radv_physical_device *physical_device);
@@ -1901,7 +1902,8 @@ struct radv_image {
  * If this is false reads that don't use the htile should be able to return
  * correct results.
  */
-bool radv_layout_is_htile_compressed(const struct radv_image *image,
+bool radv_layout_is_htile_compressed(const struct radv_device *device,
+                                    const struct radv_image *image,
                                      VkImageLayout layout,
                                      bool in_render_loop,
                                      unsigned queue_mask);

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

Reply via email to