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);