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

Author: Timur Kristóf <timur.kris...@gmail.com>
Date:   Thu Dec  7 21:28:07 2023 +0100

radv: Use correct plane and binding index with SDMA.

This lets us support multi-planar images properly on transfer queues.

Signed-off-by: Timur Kristóf <timur.kris...@gmail.com>
Reviewed-by: Tatsuyuki Ishi <ishitatsuy...@gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoi...@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26353>

---

 src/amd/vulkan/meta/radv_meta_copy.c |  6 ++++--
 src/amd/vulkan/radv_sdma.c           | 31 ++++++++++++++++++++-----------
 src/amd/vulkan/radv_sdma.h           |  6 ++++--
 3 files changed, 28 insertions(+), 15 deletions(-)

diff --git a/src/amd/vulkan/meta/radv_meta_copy.c 
b/src/amd/vulkan/meta/radv_meta_copy.c
index fe32d2c9dda..9c35ddb6b61 100644
--- a/src/amd/vulkan/meta/radv_meta_copy.c
+++ b/src/amd/vulkan/meta/radv_meta_copy.c
@@ -99,8 +99,10 @@ transfer_copy_buffer_image(struct radv_cmd_buffer 
*cmd_buffer, struct radv_buffe
    radv_cs_add_buffer(device->ws, cs, image->bindings[0].bo);
    radv_cs_add_buffer(device->ws, cs, buffer->bo);
 
-   struct radv_sdma_surf buf = radv_sdma_get_buf_surf(buffer, image, region);
-   const struct radv_sdma_surf img = radv_sdma_get_surf(device, image, 
region->imageSubresource, region->imageOffset);
+   const VkImageAspectFlags aspect_mask = region->imageSubresource.aspectMask;
+   struct radv_sdma_surf buf = radv_sdma_get_buf_surf(buffer, image, region, 
aspect_mask);
+   const struct radv_sdma_surf img =
+      radv_sdma_get_surf(device, image, region->imageSubresource, 
region->imageOffset, aspect_mask);
    const VkExtent3D extent = radv_sdma_get_copy_extent(image, 
region->imageSubresource, region->imageExtent);
 
    if (radv_sdma_use_unaligned_buffer_image_copy(device, &buf, &img, extent)) {
diff --git a/src/amd/vulkan/radv_sdma.c b/src/amd/vulkan/radv_sdma.c
index 51c3b34ffda..f03cbb28978 100644
--- a/src/amd/vulkan/radv_sdma.c
+++ b/src/amd/vulkan/radv_sdma.c
@@ -150,13 +150,16 @@ radv_sdma_get_chunked_copy_info(const struct radv_device 
*const device, const st
 
 struct radv_sdma_surf
 radv_sdma_get_buf_surf(const struct radv_buffer *const buffer, const struct 
radv_image *const image,
-                       const VkBufferImageCopy2 *const region)
+                       const VkBufferImageCopy2 *const region, const 
VkImageAspectFlags aspect_mask)
 {
+   assert(util_bitcount(aspect_mask) == 1);
+
    const unsigned pitch = (region->bufferRowLength ? region->bufferRowLength : 
region->imageExtent.width);
    const unsigned slice_pitch =
       (region->bufferImageHeight ? region->bufferImageHeight : 
region->imageExtent.height) * pitch;
 
-   const struct radeon_surf *surf = &image->planes[0].surface;
+   const unsigned plane_idx = 
radv_plane_from_aspect(region->imageSubresource.aspectMask);
+   const struct radeon_surf *surf = &image->planes[plane_idx].surface;
    const struct radv_sdma_surf info = {
       .va = radv_buffer_get_va(buffer->bo) + buffer->offset + 
region->bufferOffset,
       .pitch = pitch,
@@ -172,21 +175,22 @@ radv_sdma_get_buf_surf(const struct radv_buffer *const 
buffer, const struct radv
 
 static uint32_t
 radv_sdma_get_metadata_config(const struct radv_device *const device, const 
struct radv_image *const image,
-                              const struct radeon_surf *const surf, const 
VkImageSubresourceLayers subresource)
+                              const struct radeon_surf *const surf, const 
VkImageSubresourceLayers subresource,
+                              const VkImageAspectFlags aspect_mask)
 {
    if (!device->physical_device->rad_info.sdma_supports_compression ||
        !(radv_dcc_enabled(image, subresource.mipLevel) || 
radv_image_has_htile(image))) {
       return 0;
    }
 
-   const VkFormat format = vk_format_get_aspect_format(image->vk.format, 
subresource.aspectMask);
+   const VkFormat format = vk_format_get_aspect_format(image->vk.format, 
aspect_mask);
    const struct util_format_description *desc = vk_format_description(format);
 
    const uint32_t data_format =
       ac_get_cb_format(device->physical_device->rad_info.gfx_level, 
vk_format_to_pipe_format(format));
    const uint32_t alpha_is_on_msb = vi_alpha_is_on_msb(device, format);
    const uint32_t number_type = radv_translate_buffer_numformat(desc, 
vk_format_get_first_non_void_channel(format));
-   const uint32_t surface_type = 
radv_sdma_surface_type_from_aspect_mask(subresource.aspectMask);
+   const uint32_t surface_type = 
radv_sdma_surface_type_from_aspect_mask(aspect_mask);
    const uint32_t max_comp_block_size = 
surf->u.gfx9.color.dcc.max_compressed_block_size;
    const uint32_t max_uncomp_block_size = 
radv_get_dcc_max_uncompressed_block_size(device, image);
    const uint32_t pipe_aligned = surf->u.gfx9.color.dcc.pipe_aligned;
@@ -236,15 +240,20 @@ radv_sdma_get_tiled_header_dword(const struct radv_device 
*const device, const s
 
 struct radv_sdma_surf
 radv_sdma_get_surf(const struct radv_device *const device, const struct 
radv_image *const image,
-                   const VkImageSubresourceLayers subresource, const 
VkOffset3D offset)
+                   const VkImageSubresourceLayers subresource, const 
VkOffset3D offset,
+                   const VkImageAspectFlags aspect_mask)
 {
-   const struct radv_image_binding *binding = &image->bindings[0];
-   const struct radeon_surf *const surf = &image->planes[0].surface;
+   assert(util_bitcount(aspect_mask) == 1);
+
+   const unsigned plane_idx = radv_plane_from_aspect(aspect_mask);
+   const unsigned binding_idx = image->disjoint ? plane_idx : 0;
+   const struct radv_image_binding *binding = &image->bindings[binding_idx];
+   const struct radeon_surf *const surf = &image->planes[plane_idx].surface;
    struct radv_sdma_surf info = {
       .extent =
          {
-            .width = vk_format_get_plane_width(image->vk.format, 0, 
image->vk.extent.width),
-            .height = vk_format_get_plane_height(image->vk.format, 0, 
image->vk.extent.height),
+            .width = vk_format_get_plane_width(image->vk.format, plane_idx, 
image->vk.extent.width),
+            .height = vk_format_get_plane_height(image->vk.format, plane_idx, 
image->vk.extent.height),
             .depth = image->vk.image_type == VK_IMAGE_TYPE_3D ? 
image->vk.extent.depth : image->vk.array_layers,
          },
       .offset =
@@ -275,7 +284,7 @@ radv_sdma_get_surf(const struct radv_device *const device, 
const struct radv_ima
       if (device->physical_device->rad_info.sdma_supports_compression &&
           (radv_dcc_enabled(image, subresource.mipLevel) || 
radv_image_has_htile(image))) {
          info.meta_va = binding->bo->va + binding->offset + surf->meta_offset;
-         info.meta_config = radv_sdma_get_metadata_config(device, image, surf, 
subresource);
+         info.meta_config = radv_sdma_get_metadata_config(device, image, surf, 
subresource, aspect_mask);
       }
    }
 
diff --git a/src/amd/vulkan/radv_sdma.h b/src/amd/vulkan/radv_sdma.h
index 87dc02186ce..5f5a701e6f1 100644
--- a/src/amd/vulkan/radv_sdma.h
+++ b/src/amd/vulkan/radv_sdma.h
@@ -67,9 +67,11 @@ radv_sdma_get_copy_extent(const struct radv_image *const 
image, const VkImageSub
 
 struct radv_sdma_surf radv_sdma_get_buf_surf(const struct radv_buffer *const 
buffer,
                                              const struct radv_image *const 
image,
-                                             const VkBufferImageCopy2 *const 
region);
+                                             const VkBufferImageCopy2 *const 
region,
+                                             const VkImageAspectFlags 
aspect_mask);
 struct radv_sdma_surf radv_sdma_get_surf(const struct radv_device *const 
device, const struct radv_image *const image,
-                                         const VkImageSubresourceLayers 
subresource, const VkOffset3D offset);
+                                         const VkImageSubresourceLayers 
subresource, const VkOffset3D offset,
+                                         const VkImageAspectFlags aspect_mask);
 void radv_sdma_copy_buffer_image(const struct radv_device *device, struct 
radeon_cmdbuf *cs,
                                  const struct radv_sdma_surf *buf, const 
struct radv_sdma_surf *img,
                                  const VkExtent3D extent, bool to_image);

Reply via email to