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

Author: Timur Kristóf <timur.kris...@gmail.com>
Date:   Thu Dec  7 17:38:40 2023 +0100

radv: Refactor and simplify SDMA surface info functions.

This makes it possible to call the function just once instead
of calling different functions repeatedly.

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/radv_sdma.c | 113 ++++++++++++++++++---------------------------
 1 file changed, 44 insertions(+), 69 deletions(-)

diff --git a/src/amd/vulkan/radv_sdma.c b/src/amd/vulkan/radv_sdma.c
index 0dda8776cda..0e984e5cf41 100644
--- a/src/amd/vulkan/radv_sdma.c
+++ b/src/amd/vulkan/radv_sdma.c
@@ -101,16 +101,6 @@ radv_sdma_get_copy_extent(const struct radv_image *const 
image, const VkImageSub
    return extent;
 }
 
-ALWAYS_INLINE static VkExtent3D
-radv_sdma_get_image_extent(const struct radv_image *const image)
-{
-   VkExtent3D extent = image->vk.extent;
-   if (image->vk.image_type != VK_IMAGE_TYPE_3D)
-      extent.depth = image->vk.array_layers;
-
-   return extent;
-}
-
 ALWAYS_INLINE static VkExtent3D
 radv_sdma_pixel_extent_to_blocks(const VkExtent3D extent, const unsigned 
blk_w, const unsigned blk_h)
 {
@@ -184,8 +174,8 @@ radv_sdma_get_chunked_copy_info(const struct radv_device 
*const device, const st
 }
 
 static struct radv_sdma_surf
-radv_sdma_get_linear_buf_info(const struct radv_buffer *const buffer, const 
struct radv_image *const image,
-                              const VkBufferImageCopy2 *const region)
+radv_sdma_get_buf_surf(const struct radv_buffer *const buffer, const struct 
radv_image *const image,
+                       const VkBufferImageCopy2 *const region)
 {
    const unsigned pitch = (region->bufferRowLength ? region->bufferRowLength : 
region->imageExtent.width);
    const unsigned slice_pitch =
@@ -204,39 +194,15 @@ radv_sdma_get_linear_buf_info(const struct radv_buffer 
*const buffer, const stru
    return info;
 }
 
-static struct radv_sdma_surf
-radv_sdma_get_linear_img_info(const struct radv_image *const image, const 
VkImageSubresourceLayers subresource)
-{
-   const struct radeon_surf *surf = &image->planes[0].surface;
-
-   if (!surf->is_linear) {
-      const struct radv_sdma_surf empty_info = {0};
-      return empty_info;
-   }
-
-   const struct radv_sdma_surf info = {
-      .va = image->bindings[0].bo->va + image->bindings[0].offset + 
surf->u.gfx9.surf_offset +
-            surf->u.gfx9.offset[subresource.mipLevel],
-      .pitch = surf->u.gfx9.pitch[subresource.mipLevel],
-      .slice_pitch = surf->blk_w * surf->blk_h * surf->u.gfx9.surf_slice_size 
/ surf->bpe,
-      .bpp = surf->bpe,
-      .blk_w = surf->blk_w,
-      .blk_h = surf->blk_h,
-   };
-
-   return info;
-}
-
 static uint32_t
 radv_sdma_get_metadata_config(const struct radv_device *const device, const 
struct radv_image *const image,
-                              const VkImageSubresourceLayers subresource)
+                              const struct radeon_surf *const surf, const 
VkImageSubresourceLayers subresource)
 {
    if (!device->physical_device->rad_info.sdma_supports_compression ||
        !(radv_dcc_enabled(image, subresource.mipLevel) || 
radv_image_has_htile(image))) {
       return 0;
    }
 
-   const struct radeon_surf *const surf = &image->planes[0].surface;
    const VkFormat format = vk_format_get_aspect_format(image->vk.format, 
subresource.aspectMask);
    const struct util_format_description *desc = vk_format_description(format);
 
@@ -255,9 +221,8 @@ radv_sdma_get_metadata_config(const struct radv_device 
*const device, const stru
 
 static uint32_t
 radv_sdma_get_tiled_info_dword(const struct radv_device *const device, const 
struct radv_image *const image,
-                               const VkImageSubresourceLayers subresource)
+                               const struct radeon_surf *const surf, const 
VkImageSubresourceLayers subresource)
 {
-   const struct radeon_surf *const surf = &image->planes[0].surface;
    const uint32_t element_size = util_logbase2(surf->bpe);
    const uint32_t swizzle_mode = surf->has_stencil ? 
surf->u.gfx9.zs.stencil_swizzle_mode : surf->u.gfx9.swizzle_mode;
    const enum gfx9_resource_type dimension = 
radv_sdma_surface_resource_type(device, surf);
@@ -294,30 +259,43 @@ radv_sdma_get_tiled_header_dword(const struct radv_device 
*const device, const s
 }
 
 static struct radv_sdma_surf
-radv_sdma_get_tiled_img_info(const struct radv_device *const device, const 
struct radv_image *const image,
-                             const VkImageSubresourceLayers subresource)
+radv_sdma_get_surf(const struct radv_device *const device, const struct 
radv_image *const image,
+                   const VkImageSubresourceLayers subresource)
 {
+   const struct radv_image_binding *binding = &image->bindings[0];
    const struct radeon_surf *const surf = &image->planes[0].surface;
-
-   /* 1D resources should be linear. */
-   assert(surf->u.gfx9.resource_type != RADEON_RESOURCE_1D);
-
-   const uint32_t meta_config = radv_sdma_get_metadata_config(device, image, 
subresource);
-   const uint64_t meta_va = image->bindings[0].bo->va + 
image->bindings[0].offset + surf->meta_offset;
-
    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),
+            .depth = image->vk.image_type == VK_IMAGE_TYPE_3D ? 
image->vk.extent.depth : image->vk.array_layers,
+         },
       .bpp = surf->bpe,
-      .va = (image->bindings[0].bo->va + image->bindings[0].offset + 
surf->u.gfx9.surf_offset) | surf->tile_swizzle
-                                                                               
                     << 8,
-      .meta_va = meta_config ? meta_va : 0,
-      .meta_config = meta_config,
-      .extent = radv_sdma_get_image_extent(image),
-      .info_dword = radv_sdma_get_tiled_info_dword(device, image, subresource),
-      .header_dword = radv_sdma_get_tiled_header_dword(device, image, 
subresource),
       .blk_w = surf->blk_w,
       .blk_h = surf->blk_h,
    };
 
+   if (surf->is_linear) {
+      info.va =
+         binding->bo->va + binding->offset + surf->u.gfx9.surf_offset + 
surf->u.gfx9.offset[subresource.mipLevel];
+      info.pitch = surf->u.gfx9.pitch[subresource.mipLevel];
+      info.slice_pitch = surf->blk_w * surf->blk_h * 
surf->u.gfx9.surf_slice_size / surf->bpe;
+   } else {
+      /* 1D resources should be linear. */
+      assert(surf->u.gfx9.resource_type != RADEON_RESOURCE_1D);
+
+      info.va = (binding->bo->va + binding->offset + surf->u.gfx9.surf_offset) 
| surf->tile_swizzle << 8;
+      info.info_dword = radv_sdma_get_tiled_info_dword(device, image, surf, 
subresource);
+      info.header_dword = radv_sdma_get_tiled_header_dword(device, image, 
subresource);
+
+      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);
+      }
+   }
+
    return info;
 }
 
@@ -509,21 +487,19 @@ void
 radv_sdma_copy_buffer_image(const struct radv_device *device, struct 
radeon_cmdbuf *cs, struct radv_image *image,
                             struct radv_buffer *buffer, const 
VkBufferImageCopy2 *region, bool to_image)
 {
-   const struct radv_sdma_surf buf_info = 
radv_sdma_get_linear_buf_info(buffer, image, region);
+   const 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);
    const VkExtent3D extent = radv_sdma_get_copy_extent(image, 
region->imageSubresource, region->imageExtent);
    const VkOffset3D img_offset = radv_sdma_get_img_offset(image, 
region->imageSubresource, region->imageOffset);
    const VkOffset3D zero_offset = {0};
 
    if (image->planes[0].surface.is_linear) {
-      const struct radv_sdma_surf linear = 
radv_sdma_get_linear_img_info(image, region->imageSubresource);
-
       if (to_image)
-         radv_sdma_emit_copy_linear_sub_window(device, cs, &buf_info, &linear, 
zero_offset, img_offset, extent);
+         radv_sdma_emit_copy_linear_sub_window(device, cs, &buf, &img, 
zero_offset, img_offset, extent);
       else
-         radv_sdma_emit_copy_linear_sub_window(device, cs, &linear, &buf_info, 
img_offset, zero_offset, extent);
+         radv_sdma_emit_copy_linear_sub_window(device, cs, &img, &buf, 
img_offset, zero_offset, extent);
    } else {
-      const struct radv_sdma_surf tiled = radv_sdma_get_tiled_img_info(device, 
image, region->imageSubresource);
-      radv_sdma_emit_copy_tiled_sub_window(device, cs, &tiled, &buf_info, 
img_offset, zero_offset, extent, !to_image);
+      radv_sdma_emit_copy_tiled_sub_window(device, cs, &img, &buf, img_offset, 
zero_offset, extent, !to_image);
    }
 }
 
@@ -564,9 +540,8 @@ radv_sdma_copy_buffer_image_unaligned(const struct 
radv_device *device, struct r
    const VkOffset3D base_offset = radv_sdma_get_img_offset(image, 
region->imageSubresource, region->imageOffset);
    const VkExtent3D base_extent = radv_sdma_get_copy_extent(image, 
region->imageSubresource, region->imageExtent);
    const struct radv_sdma_chunked_copy_info info = 
radv_sdma_get_chunked_copy_info(device, image, base_extent);
-   const struct radv_sdma_surf buf = radv_sdma_get_linear_buf_info(buffer, 
image, region);
-   const struct radv_sdma_surf linear = radv_sdma_get_linear_img_info(image, 
region->imageSubresource);
-   const struct radv_sdma_surf tiled = radv_sdma_get_tiled_img_info(device, 
image, region->imageSubresource);
+   const 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);
 
    struct radv_sdma_surf tmp = {
       .va = temp_bo->va,
@@ -598,9 +573,9 @@ radv_sdma_copy_buffer_image_unaligned(const struct 
radv_device *device, struct r
          if (!to_image) {
             /* Copy the rows from the source image to the temporary buffer. */
             if (is_linear)
-               radv_sdma_emit_copy_linear_sub_window(device, cs, &linear, 
&tmp, offset, zero_offset, extent);
+               radv_sdma_emit_copy_linear_sub_window(device, cs, &img, &tmp, 
offset, zero_offset, extent);
             else
-               radv_sdma_emit_copy_tiled_sub_window(device, cs, &tiled, &tmp, 
offset, zero_offset, extent, true);
+               radv_sdma_emit_copy_tiled_sub_window(device, cs, &img, &tmp, 
offset, zero_offset, extent, true);
 
             /* Wait for the copy to finish. */
             radv_sdma_emit_nop(device, cs);
@@ -623,9 +598,9 @@ radv_sdma_copy_buffer_image_unaligned(const struct 
radv_device *device, struct r
          if (to_image) {
             /* Copy the rows from the temporary buffer to the destination 
image. */
             if (is_linear)
-               radv_sdma_emit_copy_linear_sub_window(device, cs, &tmp, 
&linear, zero_offset, offset, extent);
+               radv_sdma_emit_copy_linear_sub_window(device, cs, &tmp, &img, 
zero_offset, offset, extent);
             else
-               radv_sdma_emit_copy_tiled_sub_window(device, cs, &tiled, &tmp, 
offset, zero_offset, extent, false);
+               radv_sdma_emit_copy_tiled_sub_window(device, cs, &img, &tmp, 
offset, zero_offset, extent, false);
 
             /* Wait for the copy to finish. */
             radv_sdma_emit_nop(device, cs);

Reply via email to