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