From 5e2fcdfea2516596da39b47589dd7e3a293e3feb Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Wed, 18 Jun 2025 14:20:40 +0200 Subject: [PATCH] radv/meta: add a helper to determine if clearing is a full rect Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/meta/radv_meta_clear.c | 44 +++++++++++++++------------ 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/src/amd/vulkan/meta/radv_meta_clear.c b/src/amd/vulkan/meta/radv_meta_clear.c index ec0f0e71d29..308043860ee 100644 --- a/src/amd/vulkan/meta/radv_meta_clear.c +++ b/src/amd/vulkan/meta/radv_meta_clear.c @@ -16,6 +16,28 @@ #include "ac_formats.h" +static bool +radv_is_clear_rect_full(const struct radv_image_view *iview, const VkClearRect *clear_rect, uint32_t view_mask) +{ + const struct radv_image *image = iview->image; + + if (clear_rect->rect.offset.x || clear_rect->rect.offset.y || + clear_rect->rect.extent.width != image->vk.extent.width || + clear_rect->rect.extent.height != image->vk.extent.height) + return false; + + if (view_mask && (image->vk.array_layers >= 32 || (1u << image->vk.array_layers) - 1u != view_mask)) + return false; + + if (!view_mask && clear_rect->baseArrayLayer != 0) + return false; + + if (!view_mask && clear_rect->layerCount != image->vk.array_layers) + return false; + + return true; +} + static VkResult get_color_pipeline_layout(struct radv_device *device, VkPipelineLayout *layout_out) { @@ -719,16 +741,7 @@ radv_can_fast_clear_depth(struct radv_cmd_buffer *cmd_buffer, const struct radv_ radv_image_queue_family_mask(iview->image, cmd_buffer->qf, cmd_buffer->qf))) return false; - if (clear_rect->rect.offset.x || clear_rect->rect.offset.y || - clear_rect->rect.extent.width != iview->image->vk.extent.width || - clear_rect->rect.extent.height != iview->image->vk.extent.height) - return false; - - if (view_mask && (iview->image->vk.array_layers >= 32 || (1u << iview->image->vk.array_layers) - 1u != view_mask)) - return false; - if (!view_mask && clear_rect->baseArrayLayer != 0) - return false; - if (!view_mask && clear_rect->layerCount != iview->image->vk.array_layers) + if (!radv_is_clear_rect_full(iview, clear_rect, view_mask)) return false; if (device->vk.enabled_extensions.EXT_depth_range_unrestricted && (aspects & VK_IMAGE_ASPECT_DEPTH_BIT) && @@ -1384,16 +1397,7 @@ radv_can_fast_clear_color(struct radv_cmd_buffer *cmd_buffer, const struct radv_ radv_image_queue_family_mask(iview->image, cmd_buffer->qf, cmd_buffer->qf))) return false; - if (clear_rect->rect.offset.x || clear_rect->rect.offset.y || - clear_rect->rect.extent.width != iview->image->vk.extent.width || - clear_rect->rect.extent.height != iview->image->vk.extent.height) - return false; - - if (view_mask && (iview->image->vk.array_layers >= 32 || (1u << iview->image->vk.array_layers) - 1u != view_mask)) - return false; - if (!view_mask && clear_rect->baseArrayLayer != 0) - return false; - if (!view_mask && clear_rect->layerCount != iview->image->vk.array_layers) + if (!radv_is_clear_rect_full(iview, clear_rect, view_mask)) return false; /* DCC */