From fff16a97485cf47c932a450c708a511d5085bf79 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Mon, 2 Mar 2026 14:28:18 +0100 Subject: [PATCH] radv: replace radv_sdma_surf by ac_sdma_surf Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/common/ac_cmdbuf_sdma.h | 2 + src/amd/vulkan/meta/radv_meta_copy.c | 8 +- src/amd/vulkan/radv_sdma.c | 196 +++++---------------------- src/amd/vulkan/radv_sdma.h | 58 +++----- 4 files changed, 57 insertions(+), 207 deletions(-) diff --git a/src/amd/common/ac_cmdbuf_sdma.h b/src/amd/common/ac_cmdbuf_sdma.h index 8480506e777..4443ff34922 100644 --- a/src/amd/common/ac_cmdbuf_sdma.h +++ b/src/amd/common/ac_cmdbuf_sdma.h @@ -10,6 +10,7 @@ #include "util/format/u_format.h" +enum sdma_version; struct radeon_info; struct ac_cmdbuf; @@ -21,6 +22,7 @@ struct ac_sdma_surf { const struct radeon_surf *surf; uint64_t va; + enum pipe_format img_format; enum pipe_format format; uint32_t bpp; diff --git a/src/amd/vulkan/meta/radv_meta_copy.c b/src/amd/vulkan/meta/radv_meta_copy.c index 46eb16313b8..9876ecc6b9d 100644 --- a/src/amd/vulkan/meta/radv_meta_copy.c +++ b/src/amd/vulkan/meta/radv_meta_copy.c @@ -115,8 +115,8 @@ transfer_copy_memory_image(struct radv_cmd_buffer *cmd_buffer, uint64_t buffer_v const VkOffset3D img_offset_el = vk_image_offset_to_elements(&image->vk, region->imageOffset); const VkExtent3D img_extent_el = vk_image_extent_to_elements(&image->vk, region->imageExtent); - struct radv_sdma_surf buf = radv_sdma_get_buf_surf(buffer_va, image, region); - const struct radv_sdma_surf img = + struct ac_sdma_surf buf = radv_sdma_get_buf_surf(buffer_va, image, region); + const struct ac_sdma_surf img = radv_sdma_get_surf(cmd_buffer, image, layout, region->imageSubresource, img_offset_el); const VkExtent3D extent = radv_sdma_get_copy_extent(image, region->imageSubresource, img_extent_el); @@ -521,9 +521,9 @@ transfer_copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_i src_subresource.aspectMask = BITFIELD_BIT(b); dst_subresource.aspectMask = BITFIELD_BIT(u_bit_scan(&dst_aspect_mask_remaining)); - const struct radv_sdma_surf src = + const struct ac_sdma_surf src = radv_sdma_get_surf(cmd_buffer, src_image, src_image_layout, src_subresource, src_offset_el); - const struct radv_sdma_surf dst = + const struct ac_sdma_surf dst = radv_sdma_get_surf(cmd_buffer, dst_image, dst_image_layout, dst_subresource, dst_offset_el); const VkExtent3D extent = radv_sdma_get_copy_extent(src_image, src_subresource, img_extent_el); diff --git a/src/amd/vulkan/radv_sdma.c b/src/amd/vulkan/radv_sdma.c index fc227eaa9ea..0b807b0e91c 100644 --- a/src/amd/vulkan/radv_sdma.c +++ b/src/amd/vulkan/radv_sdma.c @@ -63,10 +63,10 @@ radv_sdma_surf_type_from_aspect_mask(const VkImageAspectFlags aspectMask) } static struct radv_sdma_chunked_copy_info -radv_sdma_get_chunked_copy_info(const struct radv_device *const device, const struct radv_sdma_surf *const img, +radv_sdma_get_chunked_copy_info(const struct radv_device *const device, const struct ac_sdma_surf *const img, const VkExtent3D extent) { - const uint32_t blk_h = vk_format_get_blockheight(img->img_format); + const uint32_t blk_h = util_format_get_blockheight(img->img_format); const unsigned extent_horizontal_blocks = extent.width; const unsigned extent_vertical_blocks = extent.height; const unsigned aligned_row_pitch = align(extent_horizontal_blocks, 4); @@ -101,7 +101,7 @@ radv_sdma_get_bpe(const struct radv_image *const image, const VkImageSubresource return vk_format_get_blocksize(format); } -struct radv_sdma_surf +struct ac_sdma_surf radv_sdma_get_buf_surf(uint64_t buffer_va, const struct radv_image *const image, const VkBufferImageCopy2 *const region) { const struct vk_image_buffer_layout layout = vk_image_buffer_copy_layout(&image->vk, region); @@ -114,7 +114,7 @@ radv_sdma_get_buf_surf(uint64_t buffer_va, const struct radv_image *const image, const uint32_t bpe = radv_sdma_get_bpe(image, ®ion->imageSubresource); - const struct radv_sdma_surf info = { + const struct ac_sdma_surf info = { .va = buffer_va + region->bufferOffset, .pitch = pitch, .slice_pitch = slice_pitch, @@ -124,7 +124,7 @@ radv_sdma_get_buf_surf(uint64_t buffer_va, const struct radv_image *const image, return info; } -struct radv_sdma_surf +struct ac_sdma_surf radv_sdma_get_surf(struct radv_cmd_buffer *cmd_buffer, const struct radv_image *const image, VkImageLayout image_layout, const VkImageSubresourceLayers subresource, const VkOffset3D offset) { @@ -140,10 +140,10 @@ radv_sdma_get_surf(struct radv_cmd_buffer *cmd_buffer, const struct radv_image * const uint32_t bpe = radv_sdma_get_bpe(image, &subresource); const uint32_t blk_w = vk_format_get_blockwidth(image->vk.format); - struct radv_sdma_surf info = { + struct ac_sdma_surf info = { .surf = surf, - .img_format = image->vk.format, - .format = vk_format_get_aspect_format(image->vk.format, subresource.aspectMask), + .img_format = radv_format_to_pipe_format(image->vk.format), + .format = radv_format_to_pipe_format(vk_format_get_aspect_format(image->vk.format, subresource.aspectMask)), .extent = { .width = vk_format_get_plane_width(image->vk.format, plane_idx, image->vk.extent.width), @@ -247,169 +247,42 @@ radv_sdma_fill_memory(const struct radv_device *device, struct radv_cmd_stream * static void radv_sdma_emit_copy_linear_sub_window(const struct radv_device *device, struct radv_cmd_stream *cs, - const struct radv_sdma_surf *const src, const struct radv_sdma_surf *const dst, + const struct ac_sdma_surf *const src, const struct ac_sdma_surf *const dst, const VkExtent3D extent) { const struct radv_physical_device *pdev = radv_device_physical(device); - const struct ac_sdma_surf surf_src = { - .surf = src->surf, - .va = src->va, - .format = radv_format_to_pipe_format(src->format), - .bpp = src->bpp, - .offset = - { - .x = src->offset.x, - .y = src->offset.y, - .z = src->offset.z, - }, - .is_compressed = src->is_compressed, - .pitch = src->pitch, - .slice_pitch = src->slice_pitch, - }; - - const struct ac_sdma_surf surf_dst = { - .surf = dst->surf, - .va = dst->va, - .format = radv_format_to_pipe_format(dst->format), - .bpp = dst->bpp, - .offset = - { - .x = dst->offset.x, - .y = dst->offset.y, - .z = dst->offset.z, - }, - .is_compressed = dst->is_compressed, - .pitch = dst->pitch, - .slice_pitch = dst->slice_pitch, - }; - radeon_check_space(device->ws, cs->b, 13); - ac_emit_sdma_copy_linear_sub_window(cs->b, pdev->info.sdma_ip_version, &surf_src, &surf_dst, extent.width, - extent.height, extent.depth); + ac_emit_sdma_copy_linear_sub_window(cs->b, pdev->info.sdma_ip_version, src, dst, extent.width, extent.height, + extent.depth); } static void radv_sdma_emit_copy_tiled_sub_window(const struct radv_device *device, struct radv_cmd_stream *cs, - const struct radv_sdma_surf *const tiled, - const struct radv_sdma_surf *const linear, const VkExtent3D extent, - const bool detile) + const struct ac_sdma_surf *const tiled, const struct ac_sdma_surf *const linear, + const VkExtent3D extent, const bool detile) { const struct radv_physical_device *pdev = radv_device_physical(device); - const struct ac_sdma_surf surf_linear = { - .surf = linear->surf, - .va = linear->va, - .format = radv_format_to_pipe_format(linear->format), - .offset = - { - .x = linear->offset.x, - .y = linear->offset.y, - .z = linear->offset.z, - }, - .is_compressed = linear->is_compressed, - .pitch = linear->pitch, - .slice_pitch = linear->slice_pitch, - }; - - const struct ac_sdma_surf surf_tiled = { - .surf = tiled->surf, - .va = tiled->va, - .format = radv_format_to_pipe_format(tiled->format), - .bpp = tiled->bpp, - .offset = - { - .x = tiled->offset.x, - .y = tiled->offset.y, - .z = tiled->offset.z, - }, - .is_compressed = tiled->is_compressed, - .is_stencil = tiled->is_stencil, - .extent = - { - .width = tiled->extent.width, - .height = tiled->extent.height, - .depth = tiled->extent.depth, - }, - .first_level = tiled->first_level, - .num_levels = tiled->num_levels, - .surf_type = tiled->surf_type, - .meta_va = tiled->meta_va, - .htile_enabled = tiled->htile_enabled, - }; - radeon_check_space(device->ws, cs->b, 17); - ac_emit_sdma_copy_tiled_sub_window(cs->b, &pdev->info, &surf_linear, &surf_tiled, detile, extent.width, - extent.height, extent.depth, false); + ac_emit_sdma_copy_tiled_sub_window(cs->b, &pdev->info, linear, tiled, detile, extent.width, extent.height, + extent.depth, false); } static void radv_sdma_emit_copy_t2t_sub_window(const struct radv_device *device, struct radv_cmd_stream *cs, - const struct radv_sdma_surf *const src, const struct radv_sdma_surf *const dst, + const struct ac_sdma_surf *const src, const struct ac_sdma_surf *const dst, const VkExtent3D extent) { const struct radv_physical_device *pdev = radv_device_physical(device); - const struct ac_sdma_surf surf_src = { - .surf = src->surf, - .va = src->va, - .format = radv_format_to_pipe_format(src->format), - .bpp = src->bpp, - .offset = - { - .x = src->offset.x, - .y = src->offset.y, - .z = src->offset.z, - }, - .is_compressed = src->is_compressed, - .is_stencil = src->is_stencil, - .extent = - { - .width = src->extent.width, - .height = src->extent.height, - .depth = src->extent.depth, - }, - .first_level = src->first_level, - .num_levels = src->num_levels, - .surf_type = src->surf_type, - .meta_va = src->meta_va, - .htile_enabled = src->htile_enabled, - }; - - const struct ac_sdma_surf surf_dst = { - .surf = dst->surf, - .va = dst->va, - .format = radv_format_to_pipe_format(dst->format), - .bpp = dst->bpp, - .offset = - { - .x = dst->offset.x, - .y = dst->offset.y, - .z = dst->offset.z, - }, - .is_compressed = dst->is_compressed, - .is_stencil = dst->is_stencil, - .extent = - { - .width = dst->extent.width, - .height = dst->extent.height, - .depth = dst->extent.depth, - }, - .first_level = dst->first_level, - .num_levels = dst->num_levels, - .surf_type = dst->surf_type, - .meta_va = dst->meta_va, - .htile_enabled = dst->htile_enabled, - }; - radeon_check_space(device->ws, cs->b, 18); - ac_emit_sdma_copy_t2t_sub_window(cs->b, &pdev->info, &surf_src, &surf_dst, extent.width, extent.height, - extent.depth); + ac_emit_sdma_copy_t2t_sub_window(cs->b, &pdev->info, src, dst, extent.width, extent.height, extent.depth); } void radv_sdma_copy_buffer_image(const struct radv_device *device, struct radv_cmd_stream *cs, - const struct radv_sdma_surf *buf, const struct radv_sdma_surf *img, const VkExtent3D extent, + const struct ac_sdma_surf *buf, const struct ac_sdma_surf *img, const VkExtent3D extent, bool to_image) { if (img->surf->is_linear) { @@ -423,8 +296,8 @@ radv_sdma_copy_buffer_image(const struct radv_device *device, struct radv_cmd_st } bool -radv_sdma_use_unaligned_buffer_image_copy(const struct radv_device *device, const struct radv_sdma_surf *buf, - const struct radv_sdma_surf *img, const VkExtent3D ext) +radv_sdma_use_unaligned_buffer_image_copy(const struct radv_device *device, const struct ac_sdma_surf *buf, + const struct ac_sdma_surf *img, const VkExtent3D ext) { if (!util_is_aligned(buf->pitch, radv_sdma_pitch_alignment(device, img->bpp))) return true; @@ -440,12 +313,12 @@ radv_sdma_use_unaligned_buffer_image_copy(const struct radv_device *device, cons void radv_sdma_copy_buffer_image_unaligned(const struct radv_device *device, struct radv_cmd_stream *cs, - const struct radv_sdma_surf *buf, const struct radv_sdma_surf *img_in, + const struct ac_sdma_surf *buf, const struct ac_sdma_surf *img_in, const VkExtent3D base_extent, struct radeon_winsys_bo *temp_bo, bool to_image) { const struct radv_sdma_chunked_copy_info info = radv_sdma_get_chunked_copy_info(device, img_in, base_extent); - struct radv_sdma_surf img = *img_in; - struct radv_sdma_surf tmp = { + struct ac_sdma_surf img = *img_in; + struct ac_sdma_surf tmp = { .surf = img.surf, .va = radv_buffer_get_va(temp_bo), .format = img.format, @@ -505,8 +378,8 @@ radv_sdma_copy_buffer_image_unaligned(const struct radv_device *device, struct r } void -radv_sdma_copy_image(const struct radv_device *device, struct radv_cmd_stream *cs, const struct radv_sdma_surf *src, - const struct radv_sdma_surf *dst, const VkExtent3D extent) +radv_sdma_copy_image(const struct radv_device *device, struct radv_cmd_stream *cs, const struct ac_sdma_surf *src, + const struct ac_sdma_surf *dst, const VkExtent3D extent) { if (src->surf->is_linear) { if (dst->surf->is_linear) { @@ -524,8 +397,8 @@ radv_sdma_copy_image(const struct radv_device *device, struct radv_cmd_stream *c } bool -radv_sdma_use_t2t_scanline_copy(const struct radv_device *device, const struct radv_sdma_surf *src, - const struct radv_sdma_surf *dst, const VkExtent3D extent) +radv_sdma_use_t2t_scanline_copy(const struct radv_device *device, const struct ac_sdma_surf *src, + const struct ac_sdma_surf *dst, const VkExtent3D extent) { bool needs_3d_alignment = src->surf->u.gfx9.resource_type == RADEON_RESOURCE_3D; @@ -581,8 +454,9 @@ radv_sdma_use_t2t_scanline_copy(const struct radv_device *device, const struct r !util_is_aligned(dst->offset.z, alignment->depth)) return true; - if (ver < SDMA_6_0 && ((src->img_format == VK_FORMAT_S8_UINT && vk_format_is_color(dst->img_format)) || - (vk_format_is_color(src->img_format) && dst->img_format == VK_FORMAT_S8_UINT))) { + if (ver < SDMA_6_0 && + ((src->img_format == PIPE_FORMAT_S8_UINT && vk_format_is_color(vk_format_from_pipe_format(dst->img_format))) || + (vk_format_is_color(vk_format_from_pipe_format(src->img_format)) && dst->img_format == PIPE_FORMAT_S8_UINT))) { /* For weird reasons, color<->stencil only T2T subwindow copies on SDMA4-5 don't work as * expected, and the driver needs to fallback to scanline copies to workaround them. */ @@ -594,12 +468,12 @@ radv_sdma_use_t2t_scanline_copy(const struct radv_device *device, const struct r void radv_sdma_copy_image_t2t_scanline(const struct radv_device *device, struct radv_cmd_stream *cs, - const struct radv_sdma_surf *src, const struct radv_sdma_surf *dst, + const struct ac_sdma_surf *src, const struct ac_sdma_surf *dst, const VkExtent3D extent, struct radeon_winsys_bo *temp_bo) { const struct radv_sdma_chunked_copy_info info = radv_sdma_get_chunked_copy_info(device, src, extent); - struct radv_sdma_surf t2l_src = *src; - struct radv_sdma_surf t2l_dst = { + struct ac_sdma_surf t2l_src = *src; + struct ac_sdma_surf t2l_dst = { .surf = src->surf, .va = radv_buffer_get_va(temp_bo), .format = src->format, @@ -607,8 +481,8 @@ radv_sdma_copy_image_t2t_scanline(const struct radv_device *device, struct radv_ .is_compressed = src->is_compressed, .pitch = info.aligned_row_pitch, }; - struct radv_sdma_surf l2t_dst = *dst; - struct radv_sdma_surf l2t_src = { + struct ac_sdma_surf l2t_dst = *dst; + struct ac_sdma_surf l2t_src = { .surf = dst->surf, .va = radv_buffer_get_va(temp_bo), .format = dst->format, diff --git a/src/amd/vulkan/radv_sdma.h b/src/amd/vulkan/radv_sdma.h index f16fc31a524..af7ceeb0f20 100644 --- a/src/amd/vulkan/radv_sdma.h +++ b/src/amd/vulkan/radv_sdma.h @@ -7,6 +7,8 @@ #ifndef RADV_SDMA_H #define RADV_SDMA_H +#include "ac_cmdbuf_sdma.h" + #include "radv_formats.h" #include "radv_image.h" @@ -17,34 +19,6 @@ struct radv_cmd_buffer; extern "C" { #endif -struct radv_sdma_surf { - const struct radeon_surf *surf; - VkFormat img_format; /* Image format. */ - VkFormat format; /* Image subresource format. */ - VkExtent3D extent; /* Image extent. */ - VkOffset3D offset; /* Image offset. */ - uint64_t va; /* Virtual address of image data. */ - unsigned bpp; /* Bytes per pixel. */ - unsigned first_level; /* First mip level in the image. */ - unsigned num_levels; /* Mip levels in the image. */ - bool is_stencil; /* Whether the image is stencil only. */ - - union { - /* linear images only */ - struct { - unsigned pitch; /* Row pitch in bytes. */ - unsigned slice_pitch; /* Slice pitch in bytes. */ - }; - /* tiled images only */ - struct { - uint64_t meta_va; /* Virtual address of metadata. */ - bool is_compressed; - uint32_t surf_type; - bool htile_enabled; - }; - }; -}; - static inline uint32_t radv_sdma_get_texel_scale(const struct radv_image *image) { @@ -69,26 +43,26 @@ radv_sdma_get_copy_extent(const struct radv_image *const image, const VkImageSub return extent; } -struct radv_sdma_surf radv_sdma_get_buf_surf(uint64_t buffer_va, const struct radv_image *const image, - const VkBufferImageCopy2 *const region); -struct radv_sdma_surf radv_sdma_get_surf(struct radv_cmd_buffer *cmd_buffer, const struct radv_image *const image, - VkImageLayout image_layout, const VkImageSubresourceLayers subresource, - const VkOffset3D offset); +struct ac_sdma_surf radv_sdma_get_buf_surf(uint64_t buffer_va, const struct radv_image *const image, + const VkBufferImageCopy2 *const region); +struct ac_sdma_surf radv_sdma_get_surf(struct radv_cmd_buffer *cmd_buffer, const struct radv_image *const image, + VkImageLayout image_layout, const VkImageSubresourceLayers subresource, + const VkOffset3D offset); void radv_sdma_copy_buffer_image(const struct radv_device *device, struct radv_cmd_stream *cs, - const struct radv_sdma_surf *buf, const struct radv_sdma_surf *img, + const struct ac_sdma_surf *buf, const struct ac_sdma_surf *img, const VkExtent3D extent, bool to_image); -bool radv_sdma_use_unaligned_buffer_image_copy(const struct radv_device *device, const struct radv_sdma_surf *buf, - const struct radv_sdma_surf *img, const VkExtent3D ext); +bool radv_sdma_use_unaligned_buffer_image_copy(const struct radv_device *device, const struct ac_sdma_surf *buf, + const struct ac_sdma_surf *img, const VkExtent3D ext); void radv_sdma_copy_buffer_image_unaligned(const struct radv_device *device, struct radv_cmd_stream *cs, - const struct radv_sdma_surf *buf, const struct radv_sdma_surf *img_in, + const struct ac_sdma_surf *buf, const struct ac_sdma_surf *img_in, const VkExtent3D copy_extent, struct radeon_winsys_bo *temp_bo, bool to_image); -void radv_sdma_copy_image(const struct radv_device *device, struct radv_cmd_stream *cs, - const struct radv_sdma_surf *src, const struct radv_sdma_surf *dst, const VkExtent3D extent); -bool radv_sdma_use_t2t_scanline_copy(const struct radv_device *device, const struct radv_sdma_surf *src, - const struct radv_sdma_surf *dst, const VkExtent3D extent); +void radv_sdma_copy_image(const struct radv_device *device, struct radv_cmd_stream *cs, const struct ac_sdma_surf *src, + const struct ac_sdma_surf *dst, const VkExtent3D extent); +bool radv_sdma_use_t2t_scanline_copy(const struct radv_device *device, const struct ac_sdma_surf *src, + const struct ac_sdma_surf *dst, const VkExtent3D extent); void radv_sdma_copy_image_t2t_scanline(const struct radv_device *device, struct radv_cmd_stream *cs, - const struct radv_sdma_surf *src, const struct radv_sdma_surf *dst, + const struct ac_sdma_surf *src, const struct ac_sdma_surf *dst, const VkExtent3D extent, struct radeon_winsys_bo *temp_bo); void radv_sdma_copy_memory(const struct radv_device *device, struct radv_cmd_stream *cs, uint64_t src_va, uint64_t dst_va, uint64_t size);