From 50fd07948f019afa69cd3ebdbf25b2b39a07e0bb Mon Sep 17 00:00:00 2001 From: Jakob Sinclair Date: Mon, 4 May 2026 12:53:26 +0200 Subject: [PATCH] panvk/csf: Use same clear path for color, depth and stencil images Do the same for cmdClearDepthStencilImage as for cmdClearColorImage, RUN_FRAGMENT with a clear value set is the only thing needed. This skips setting up primitives and executing a shader. --- src/panfrost/vulkan/csf/panvk_cmd_buffer.h | 5 ++- src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 45 +++++++++++++-------- src/panfrost/vulkan/panvk_vX_cmd_meta.c | 9 ++++- 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/src/panfrost/vulkan/csf/panvk_cmd_buffer.h b/src/panfrost/vulkan/csf/panvk_cmd_buffer.h index 327421fc61a..ab6bbc669b1 100644 --- a/src/panfrost/vulkan/csf/panvk_cmd_buffer.h +++ b/src/panfrost/vulkan/csf/panvk_cmd_buffer.h @@ -540,10 +540,11 @@ panvk_cache_flush_is_nop(const struct panvk_cache_flush_info *cache_flush) extern const struct vk_command_buffer_ops panvk_per_arch(cmd_buffer_ops); void panvk_per_arch(cmd_fb_barrier)(struct panvk_cmd_buffer *cmdbuf); -void panvk_per_arch(cmd_clear_color_image)( +void panvk_per_arch(cmd_clear_image)( struct panvk_cmd_buffer *cmdbuf, struct panvk_device *dev, struct panvk_image *image, VkImageLayout image_layout, - const VkClearColorValue *color_value, uint32_t range_count, + const VkClearColorValue *color_value, + const VkClearDepthStencilValue *depth_stencil_value, uint32_t range_count, const VkImageSubresourceRange *ranges); #if PAN_ARCH == 10 diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index 7804f759528..7951204fb01 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -3707,9 +3707,10 @@ static void setup_clear_render_state(struct panvk_cmd_buffer *cmdbuf, struct panvk_image_view *clear_image_view, VkImageLayout image_layout, - const VkClearValue clear_value, uint32_t layer_count) + const VkClearValue clear_value, uint32_t layer_count, + VkImageAspectFlags aspects) { - const VkRenderingAttachmentInfo color_att = { + const VkRenderingAttachmentInfo clear_att = { .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO, .imageView = panvk_image_view_to_handle(clear_image_view), .imageLayout = image_layout, @@ -3721,6 +3722,10 @@ setup_clear_render_state(struct panvk_cmd_buffer *cmdbuf, .clearValue = clear_value, }; + const bool clear_color = aspects & VK_IMAGE_ASPECT_COLOR_BIT; + const bool clear_depth = aspects & VK_IMAGE_ASPECT_DEPTH_BIT; + const bool clear_stencil = aspects & VK_IMAGE_ASPECT_STENCIL_BIT; + const VkRenderingInfo info = { .sType = VK_STRUCTURE_TYPE_RENDERING_INFO, .flags = 0, @@ -3735,10 +3740,10 @@ setup_clear_render_state(struct panvk_cmd_buffer *cmdbuf, }, .layerCount = layer_count, .viewMask = 0, - .colorAttachmentCount = 1, - .pColorAttachments = &color_att, - .pDepthAttachment = NULL, - .pStencilAttachment = NULL, + .colorAttachmentCount = clear_color, + .pColorAttachments = clear_color ? &clear_att : NULL, + .pDepthAttachment = clear_depth ? &clear_att : NULL, + .pStencilAttachment = clear_stencil ? &clear_att : NULL, }; panvk_per_arch(cmd_init_render_state)(cmdbuf, &info); @@ -3779,13 +3784,12 @@ reset_render_state(struct panvk_cmd_buffer *cmdbuf, bool suspending, } void -panvk_per_arch(cmd_clear_color_image)(struct panvk_cmd_buffer *cmdbuf, - struct panvk_device *dev, - struct panvk_image *image, - VkImageLayout image_layout, - const VkClearColorValue *color_value, - uint32_t range_count, - const VkImageSubresourceRange *ranges) +panvk_per_arch(cmd_clear_image)( + struct panvk_cmd_buffer *cmdbuf, struct panvk_device *dev, + struct panvk_image *image, VkImageLayout image_layout, + const VkClearColorValue *color_value, + const VkClearDepthStencilValue *depth_stencil_value, uint32_t range_count, + const VkImageSubresourceRange *ranges) { for (uint32_t r = 0; r < range_count; r++) { const VkImageSubresourceRange *range = &ranges[r]; @@ -3815,12 +3819,19 @@ panvk_per_arch(cmd_clear_color_image)(struct panvk_cmd_buffer *cmdbuf, return; } - const VkClearValue clear_value = { - .color = *color_value, - }; + VkImageAspectFlags aspects; + VkClearValue clear_value; + if (color_value != NULL) { + aspects = image_view->vk.aspects; + clear_value.color = *color_value; + } else { + assert(depth_stencil_value); + aspects = range->aspectMask; + clear_value.depthStencil = *depth_stencil_value; + } setup_clear_render_state(cmdbuf, image_view, image_layout, clear_value, - layer_count); + layer_count, aspects); VkResult result = get_render_ctx(cmdbuf); if (unlikely(result != VK_SUCCESS)) { reset_render_state(cmdbuf, false, false); diff --git a/src/panfrost/vulkan/panvk_vX_cmd_meta.c b/src/panfrost/vulkan/panvk_vX_cmd_meta.c index ff4443b1bfb..a2992eb7cce 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_meta.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_meta.c @@ -299,9 +299,14 @@ panvk_per_arch(CmdClearDepthStencilImage)( struct panvk_cmd_meta_graphics_save_ctx save = {0}; meta_gfx_start(cmdbuf, &save); +#if PAN_ARCH >= 10 + panvk_per_arch(cmd_clear_image)(cmdbuf, dev, img, imageLayout, NULL, + pDepthStencil, rangeCount, pRanges); +#else vk_meta_clear_depth_stencil_image(&cmdbuf->vk, &dev->meta, &img->vk, imageLayout, pDepthStencil, rangeCount, pRanges); +#endif meta_gfx_end(cmdbuf, &save); } @@ -319,8 +324,8 @@ panvk_per_arch(CmdClearColorImage)(VkCommandBuffer commandBuffer, VkImage image, meta_gfx_start(cmdbuf, &save); #if PAN_ARCH >= 10 - panvk_per_arch(cmd_clear_color_image)(cmdbuf, dev, img, imageLayout, pColor, - rangeCount, pRanges); + panvk_per_arch(cmd_clear_image)(cmdbuf, dev, img, imageLayout, pColor, NULL, + rangeCount, pRanges); #else vk_meta_clear_color_image(&cmdbuf->vk, &dev->meta, &img->vk, imageLayout, img->vk.format, pColor, rangeCount, pRanges);