Mesa (main): radv: add support for clearing multi layers with normal gfx clear path

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Aug 30 16:37:14 UTC 2021


Module: Mesa
Branch: main
Commit: 2d1b85fe22b91eea185fa5066f7334c76549ba0a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=2d1b85fe22b91eea185fa5066f7334c76549ba0a

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Wed Aug 25 12:45:18 2021 +0200

radv: add support for clearing multi layers with normal gfx clear path

Allow to clear range of layers with vkCmdClear{Color,DepthStencil}Image().

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12557>

---

 src/amd/vulkan/radv_meta_clear.c | 25 +++++++++++++------------
 1 file changed, 13 insertions(+), 12 deletions(-)

diff --git a/src/amd/vulkan/radv_meta_clear.c b/src/amd/vulkan/radv_meta_clear.c
index 341e8dea416..21d4ab199e4 100644
--- a/src/amd/vulkan/radv_meta_clear.c
+++ b/src/amd/vulkan/radv_meta_clear.c
@@ -2103,7 +2103,8 @@ radv_cmd_buffer_clear_subpass(struct radv_cmd_buffer *cmd_buffer)
 static void
 radv_clear_image_layer(struct radv_cmd_buffer *cmd_buffer, struct radv_image *image,
                        VkImageLayout image_layout, const VkImageSubresourceRange *range,
-                       VkFormat format, int level, int layer, const VkClearValue *clear_val)
+                       VkFormat format, int level, unsigned layer_count,
+                       const VkClearValue *clear_val)
 {
    VkDevice device_h = radv_device_to_handle(cmd_buffer->device);
    struct radv_image_view iview;
@@ -2119,8 +2120,8 @@ radv_clear_image_layer(struct radv_cmd_buffer *cmd_buffer, struct radv_image *im
                            .subresourceRange = {.aspectMask = range->aspectMask,
                                                 .baseMipLevel = range->baseMipLevel + level,
                                                 .levelCount = 1,
-                                                .baseArrayLayer = range->baseArrayLayer + layer,
-                                                .layerCount = 1},
+                                                .baseArrayLayer = range->baseArrayLayer,
+                                                .layerCount = layer_count},
                         },
                         NULL);
 
@@ -2135,7 +2136,7 @@ radv_clear_image_layer(struct radv_cmd_buffer *cmd_buffer, struct radv_image *im
                                     },
                                  .width = width,
                                  .height = height,
-                                 .layers = 1},
+                                 .layers = layer_count},
       &cmd_buffer->pool->alloc, &fb);
 
    VkAttachmentDescription2 att_desc = {
@@ -2240,8 +2241,8 @@ radv_clear_image_layer(struct radv_cmd_buffer *cmd_buffer, struct radv_image *im
             .offset = {0, 0},
             .extent = {width, height},
          },
-      .baseArrayLayer = range->baseArrayLayer,
-      .layerCount = 1, /* FINISHME: clear multi-layer framebuffer */
+      .baseArrayLayer = 0,
+      .layerCount = layer_count,
    };
 
    emit_clear(cmd_buffer, &clear_att, &clear_rect, NULL, NULL, 0, false);
@@ -2379,9 +2380,9 @@ radv_cmd_clear_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *imag
          const uint32_t layer_count = image->type == VK_IMAGE_TYPE_3D
                                          ? radv_minify(image->info.depth, range->baseMipLevel + l)
                                          : radv_get_layerCount(image, range);
-         for (uint32_t s = 0; s < layer_count; ++s) {
 
-            if (cs) {
+         if (cs) {
+            for (uint32_t s = 0; s < layer_count; ++s) {
                struct radv_meta_blit2d_surf surf;
                surf.format = format;
                surf.image = image;
@@ -2390,11 +2391,11 @@ radv_cmd_clear_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *imag
                surf.aspect_mask = range->aspectMask;
                surf.disable_compression = disable_compression;
                radv_meta_clear_image_cs(cmd_buffer, &surf, &internal_clear_value.color);
-            } else {
-               assert(!disable_compression);
-               radv_clear_image_layer(cmd_buffer, image, image_layout, range, format, l, s,
-                                      &internal_clear_value);
             }
+         } else {
+            assert(!disable_compression);
+            radv_clear_image_layer(cmd_buffer, image, image_layout, range, format, l, layer_count,
+                                   &internal_clear_value);
          }
       }
    }



More information about the mesa-commit mailing list