Module: Mesa Branch: main Commit: a21cba679917680e6ac41ed4c8df49d1eefe82b4 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a21cba679917680e6ac41ed4c8df49d1eefe82b4
Author: Timur Kristóf <timur.kris...@gmail.com> Date: Thu Dec 7 15:45:22 2023 +0100 radv: Unify SDMA surface struct for linear and tiled images. Using just one struct for both types of images (and buffers) will simplify a lot of code. 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 | 41 ++++++++++++++++++++--------------------- src/amd/vulkan/radv_sdma.h | 38 ++++++++++++++++++++------------------ 2 files changed, 40 insertions(+), 39 deletions(-) diff --git a/src/amd/vulkan/radv_sdma.c b/src/amd/vulkan/radv_sdma.c index 38278693de9..0dda8776cda 100644 --- a/src/amd/vulkan/radv_sdma.c +++ b/src/amd/vulkan/radv_sdma.c @@ -183,7 +183,7 @@ radv_sdma_get_chunked_copy_info(const struct radv_device *const device, const st return r; } -static struct radv_sdma_linear_info +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) { @@ -192,7 +192,7 @@ radv_sdma_get_linear_buf_info(const struct radv_buffer *const buffer, const stru (region->bufferImageHeight ? region->bufferImageHeight : region->imageExtent.height) * pitch; const struct radeon_surf *surf = &image->planes[0].surface; - const struct radv_sdma_linear_info info = { + const struct radv_sdma_surf info = { .va = radv_buffer_get_va(buffer->bo) + buffer->offset + region->bufferOffset, .pitch = pitch, .slice_pitch = slice_pitch, @@ -204,17 +204,17 @@ radv_sdma_get_linear_buf_info(const struct radv_buffer *const buffer, const stru return info; } -static struct radv_sdma_linear_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_linear_info empty_info = {0}; + const struct radv_sdma_surf empty_info = {0}; return empty_info; } - const struct radv_sdma_linear_info 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], @@ -293,7 +293,7 @@ radv_sdma_get_tiled_header_dword(const struct radv_device *const device, const s } } -static struct radv_sdma_tiled_info +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) { @@ -305,7 +305,7 @@ radv_sdma_get_tiled_img_info(const struct radv_device *const device, const struc 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_tiled_info info = { + struct radv_sdma_surf info = { .bpp = surf->bpe, .va = (image->bindings[0].bo->va + image->bindings[0].offset + surf->u.gfx9.surf_offset) | surf->tile_swizzle << 8, @@ -408,9 +408,9 @@ radv_sdma_fill_buffer(const struct radv_device *device, struct radeon_cmdbuf *cs static void radv_sdma_emit_copy_linear_sub_window(const struct radv_device *device, struct radeon_cmdbuf *cs, - const struct radv_sdma_linear_info *const src, - const struct radv_sdma_linear_info *const dst, const VkOffset3D src_pix_offset, - const VkOffset3D dst_pix_offset, const VkExtent3D pix_extent) + const struct radv_sdma_surf *const src, const struct radv_sdma_surf *const dst, + const VkOffset3D src_pix_offset, const VkOffset3D dst_pix_offset, + const VkExtent3D pix_extent) { /* This packet is the same since SDMA v2.4, haven't bothered to check older versions. * The main difference is the bitfield sizes: @@ -457,10 +457,9 @@ radv_sdma_emit_copy_linear_sub_window(const struct radv_device *device, struct r static void radv_sdma_emit_copy_tiled_sub_window(const struct radv_device *device, struct radeon_cmdbuf *cs, - const struct radv_sdma_tiled_info *const tiled, - const struct radv_sdma_linear_info *const linear, - const VkOffset3D tiled_pix_offset, const VkOffset3D linear_pix_offset, - const VkExtent3D pix_extent, const bool detile) + const struct radv_sdma_surf *const tiled, + const struct radv_sdma_surf *const linear, const VkOffset3D tiled_pix_offset, + const VkOffset3D linear_pix_offset, const VkExtent3D pix_extent, const bool detile) { if (!device->physical_device->rad_info.sdma_supports_compression) { assert(!tiled->meta_va); @@ -510,20 +509,20 @@ 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_linear_info buf_info = radv_sdma_get_linear_buf_info(buffer, image, region); + const struct radv_sdma_surf buf_info = radv_sdma_get_linear_buf_info(buffer, image, region); 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_linear_info linear = radv_sdma_get_linear_img_info(image, region->imageSubresource); + 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); else radv_sdma_emit_copy_linear_sub_window(device, cs, &linear, &buf_info, img_offset, zero_offset, extent); } else { - const struct radv_sdma_tiled_info tiled = radv_sdma_get_tiled_img_info(device, image, region->imageSubresource); + 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); } } @@ -565,11 +564,11 @@ 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_linear_info buf = radv_sdma_get_linear_buf_info(buffer, image, region); - const struct radv_sdma_linear_info linear = radv_sdma_get_linear_img_info(image, region->imageSubresource); - const struct radv_sdma_tiled_info tiled = radv_sdma_get_tiled_img_info(device, image, region->imageSubresource); + 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); - struct radv_sdma_linear_info tmp = { + struct radv_sdma_surf tmp = { .va = temp_bo->va, .bpp = info.bpp, .blk_w = info.blk_w, diff --git a/src/amd/vulkan/radv_sdma.h b/src/amd/vulkan/radv_sdma.h index 797bd3b98fd..3c7d9053055 100644 --- a/src/amd/vulkan/radv_sdma.h +++ b/src/amd/vulkan/radv_sdma.h @@ -30,25 +30,27 @@ extern "C" { #endif -struct radv_sdma_linear_info { - uint64_t va; - unsigned pitch; - unsigned slice_pitch; - unsigned bpp; - unsigned blk_w; - unsigned blk_h; -}; +struct radv_sdma_surf { + VkExtent3D extent; /* Image extent. */ + uint64_t va; /* Virtual address of image data. */ + unsigned bpp; /* Bytes per pixel. */ + unsigned blk_w; /* Image format block width in pixels. */ + unsigned blk_h; /* Image format block height in pixels. */ -struct radv_sdma_tiled_info { - VkExtent3D extent; - uint64_t va; - uint64_t meta_va; - uint32_t meta_config; - uint32_t info_dword; - uint32_t header_dword; - unsigned bpp; - unsigned blk_w; - unsigned blk_h; + 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. */ + uint32_t meta_config; /* Metadata configuration DWORD. */ + uint32_t header_dword; /* Extra bits for the copy packet header. */ + uint32_t info_dword; /* Image information DWORD. */ + }; + }; }; void radv_sdma_copy_buffer_image(const struct radv_device *device, struct radeon_cmdbuf *cs, struct radv_image *image,