diff options
author | Timur Kristóf <timur.kristof@gmail.com> | 2022-05-25 11:35:37 +0200 |
---|---|---|
committer | Dylan Baker <dylan.c.baker@intel.com> | 2022-06-01 14:10:28 -0700 |
commit | b75c1b047f74927cd40bc408bbc9e4d7fb4977f2 (patch) | |
tree | 73c6f627dc53d029adb41464fb01b6acafe28704 | |
parent | d62bc76174ecf5e5c86082457d3a8d7d40a86cc8 (diff) |
radv: Disable predication for supass clear and image clears.
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 <timur.kristof@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16654>
(cherry picked from commit 55466ca506f6ea6c4f242f764f4d52588869d423)
-rw-r--r-- | .pick_status.json | 2 | ||||
-rw-r--r-- | src/amd/vulkan/radv_meta_clear.c | 15 |
2 files changed, 16 insertions, 1 deletions
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 |