From b75c1b047f74927cd40bc408bbc9e4d7fb4977f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timur=20Krist=C3=B3f?= Date: Wed, 25 May 2022 11:35:37 +0200 Subject: [PATCH] radv: Disable predication for supass clear and image clears. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit According to the Vulkan spec 21.4 "Conditional Rendering", only clearing attachments with vkCmdClearAttachments is subject to conditional rendering. Subpass clear and vkCmdClearColorImage / vkCmdClearDepthStencilImage should always be executed even if it happens in a conditional rendering block. Cc: mesa-stable Signed-off-by: Timur Kristóf Reviewed-by: Bas Nieuwenhuizen Reviewed-by: Samuel Pitoiset Part-of: (cherry picked from commit 55466ca506f6ea6c4f242f764f4d52588869d423) --- .pick_status.json | 2 +- src/amd/vulkan/radv_meta_clear.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index 24a482fb204..fd3cf574781 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -283,7 +283,7 @@ "description": "radv: Disable predication for supass clear and image clears.", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/amd/vulkan/radv_meta_clear.c b/src/amd/vulkan/radv_meta_clear.c index d1b3c77d955..8720ed30a95 100644 --- a/src/amd/vulkan/radv_meta_clear.c +++ b/src/amd/vulkan/radv_meta_clear.c @@ -1897,6 +1897,10 @@ radv_cmd_buffer_clear_subpass(struct radv_cmd_buffer *cmd_buffer) if (!radv_subpass_needs_clear(cmd_buffer)) return; + /* Subpass clear should not be affected by conditional rendering. */ + bool old_predicating = cmd_buffer->state.predicating; + cmd_buffer->state.predicating = false; + radv_meta_save(&saved_state, cmd_buffer, RADV_META_SAVE_GRAPHICS_PIPELINE | RADV_META_SAVE_CONSTANTS); @@ -1945,6 +1949,7 @@ radv_cmd_buffer_clear_subpass(struct radv_cmd_buffer *cmd_buffer) } radv_meta_restore(&saved_state, cmd_buffer); + cmd_buffer->state.predicating = old_predicating; cmd_buffer->state.flush_bits |= post_flush; } @@ -2212,6 +2217,10 @@ radv_CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image_h, VkImageL struct radv_meta_saved_state saved_state; bool cs; + /* Clear commands (except vkCmdClearAttachments) should not be affected by conditional rendering. */ + bool old_predicating = cmd_buffer->state.predicating; + cmd_buffer->state.predicating = false; + cs = cmd_buffer->qf == RADV_QUEUE_COMPUTE || !radv_image_is_renderable(cmd_buffer->device, image); @@ -2228,6 +2237,7 @@ radv_CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image_h, VkImageL pRanges, cs); radv_meta_restore(&saved_state, cmd_buffer); + cmd_buffer->state.predicating = old_predicating; } VKAPI_ATTR void VKAPI_CALL @@ -2240,6 +2250,10 @@ radv_CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image_h, RADV_FROM_HANDLE(radv_image, image, image_h); struct radv_meta_saved_state saved_state; + /* Clear commands (except vkCmdClearAttachments) should not be affected by conditional rendering. */ + bool old_predicating = cmd_buffer->state.predicating; + cmd_buffer->state.predicating = false; + radv_meta_save(&saved_state, cmd_buffer, RADV_META_SAVE_GRAPHICS_PIPELINE | RADV_META_SAVE_CONSTANTS); @@ -2247,6 +2261,7 @@ radv_CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image_h, rangeCount, pRanges, false); radv_meta_restore(&saved_state, cmd_buffer); + cmd_buffer->state.predicating = old_predicating; } VKAPI_ATTR void VKAPI_CALL