From 50851f17d1cfdb9cc05a49ab051af7b7707ca9fe Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 13 Feb 2025 09:03:07 +0100 Subject: [PATCH] radv/meta: remove the buffer dependency for image copy operations Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/meta/radv_meta.h | 3 ++- src/amd/vulkan/meta/radv_meta_blit2d.c | 4 ++-- src/amd/vulkan/meta/radv_meta_bufimage.c | 15 +++++++-------- src/amd/vulkan/meta/radv_meta_copy.c | 24 ++++++++++++++---------- 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/amd/vulkan/meta/radv_meta.h b/src/amd/vulkan/meta/radv_meta.h index 72cdc4f6686..621ff2565a8 100644 --- a/src/amd/vulkan/meta/radv_meta.h +++ b/src/amd/vulkan/meta/radv_meta.h @@ -182,7 +182,8 @@ struct radv_meta_blit2d_surf { }; struct radv_meta_blit2d_buffer { - struct radv_buffer *buffer; + uint64_t addr; + uint64_t size; uint32_t offset; uint32_t pitch; uint8_t bs; diff --git a/src/amd/vulkan/meta/radv_meta_blit2d.c b/src/amd/vulkan/meta/radv_meta_blit2d.c index 31eb1a6ea09..0054523e0f6 100644 --- a/src/amd/vulkan/meta/radv_meta_blit2d.c +++ b/src/amd/vulkan/meta/radv_meta_blit2d.c @@ -76,8 +76,8 @@ blit2d_bind_src(struct radv_cmd_buffer *cmd_buffer, VkPipelineLayout layout, str .data.pUniformTexelBuffer = &(VkDescriptorAddressInfoEXT){ .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT, - .address = src_buf->buffer->addr + src_buf->offset, - .range = vk_buffer_range(&src_buf->buffer->vk, src_buf->offset, VK_WHOLE_SIZE), + .address = src_buf->addr + src_buf->offset, + .range = src_buf->size - src_buf->offset, .format = depth_format ? depth_format : src_buf->format}, }}); diff --git a/src/amd/vulkan/meta/radv_meta_bufimage.c b/src/amd/vulkan/meta/radv_meta_bufimage.c index 58db1d115fc..f0400bf993e 100644 --- a/src/amd/vulkan/meta/radv_meta_bufimage.c +++ b/src/amd/vulkan/meta/radv_meta_bufimage.c @@ -668,8 +668,7 @@ fixup_gfx9_cs_copy(struct radv_cmd_buffer *cmd_buffer, const struct radv_meta_bl struct radeon_winsys_bo *img_bo = image->bindings[0].bo; const uint64_t img_va = radv_buffer_get_va(img_bo) + image->bindings[0].offset + addr; /* buf_bsurf->offset already includes the layer offset */ - const uint64_t mem_va = - buf_bsurf->buffer->addr + buf_bsurf->offset + y * buf_bsurf->pitch * surf->bpe + x * surf->bpe; + const uint64_t mem_va = buf_bsurf->addr + buf_bsurf->offset + y * buf_bsurf->pitch * surf->bpe + x * surf->bpe; if (to_image) { radv_copy_memory(cmd_buffer, mem_va, img_va, surf->bpe); } else { @@ -731,8 +730,8 @@ radv_meta_image_to_buffer(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_b .data.pStorageTexelBuffer = &(VkDescriptorAddressInfoEXT){ .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT, - .address = dst->buffer->addr + dst->offset, - .range = vk_buffer_range(&dst->buffer->vk, dst->offset, VK_WHOLE_SIZE), + .address = dst->addr + dst->offset, + .range = dst->size - dst->offset, .format = dst->format, }, }}); @@ -774,8 +773,8 @@ radv_meta_buffer_to_image_cs_r32g32b32(struct radv_cmd_buffer *cmd_buffer, struc .data.pUniformTexelBuffer = &(VkDescriptorAddressInfoEXT){ .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT, - .address = src->buffer->addr + src->offset, - .range = vk_buffer_range(&src->buffer->vk, src->offset, VK_WHOLE_SIZE), + .address = src->addr + src->offset, + .range = src->size - src->offset, .format = src->format, }, }, @@ -840,8 +839,8 @@ radv_meta_buffer_to_image_cs(struct radv_cmd_buffer *cmd_buffer, struct radv_met .data.pStorageTexelBuffer = &(VkDescriptorAddressInfoEXT){ .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT, - .address = src->buffer->addr + src->offset, - .range = vk_buffer_range(&src->buffer->vk, src->offset, VK_WHOLE_SIZE), + .address = src->addr + src->offset, + .range = src->size - src->offset, .format = src->format, }, }, diff --git a/src/amd/vulkan/meta/radv_meta_copy.c b/src/amd/vulkan/meta/radv_meta_copy.c index 196b4a7202f..ba6f48ba0fb 100644 --- a/src/amd/vulkan/meta/radv_meta_copy.c +++ b/src/amd/vulkan/meta/radv_meta_copy.c @@ -99,11 +99,11 @@ transfer_copy_buffer_image(struct radv_cmd_buffer *cmd_buffer, uint64_t buffer_v } static void -copy_buffer_to_image(struct radv_cmd_buffer *cmd_buffer, struct radv_buffer *buffer, struct radv_image *image, - VkImageLayout layout, const VkBufferImageCopy2 *region) +copy_buffer_to_image(struct radv_cmd_buffer *cmd_buffer, uint64_t buffer_addr, uint64_t buffer_size, + struct radv_image *image, VkImageLayout layout, const VkBufferImageCopy2 *region) { if (cmd_buffer->qf == RADV_QUEUE_TRANSFER) { - transfer_copy_buffer_image(cmd_buffer, buffer->addr, image, region, true); + transfer_copy_buffer_image(cmd_buffer, buffer_addr, image, region, true); return; } @@ -172,9 +172,10 @@ copy_buffer_to_image(struct radv_cmd_buffer *cmd_buffer, struct radv_buffer *buf const struct vk_image_buffer_layout buf_layout = vk_image_buffer_copy_layout(&image->vk, region); struct radv_meta_blit2d_buffer buf_bsurf = { + .addr = buffer_addr, + .size = buffer_size, .bs = img_bsurf.bs, .format = img_bsurf.format, - .buffer = buffer, .offset = region->bufferOffset, .pitch = buf_layout.row_stride_B / buf_layout.element_size_B, }; @@ -232,7 +233,8 @@ radv_CmdCopyBufferToImage2(VkCommandBuffer commandBuffer, const VkCopyBufferToIm radv_cs_add_buffer(device->ws, cmd_buffer->cs, dst_image->bindings[bind_idx].bo); - copy_buffer_to_image(cmd_buffer, src_buffer, dst_image, pCopyBufferToImageInfo->dstImageLayout, region); + copy_buffer_to_image(cmd_buffer, src_buffer->addr, src_buffer->vk.size, dst_image, + pCopyBufferToImageInfo->dstImageLayout, region); } if (radv_is_format_emulated(pdev, dst_image->vk.format)) { @@ -260,12 +262,12 @@ radv_CmdCopyBufferToImage2(VkCommandBuffer commandBuffer, const VkCopyBufferToIm } static void -copy_image_to_buffer(struct radv_cmd_buffer *cmd_buffer, struct radv_buffer *buffer, struct radv_image *image, - VkImageLayout layout, const VkBufferImageCopy2 *region) +copy_image_to_buffer(struct radv_cmd_buffer *cmd_buffer, uint64_t buffer_addr, uint64_t buffer_size, + struct radv_image *image, VkImageLayout layout, const VkBufferImageCopy2 *region) { struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); if (cmd_buffer->qf == RADV_QUEUE_TRANSFER) { - transfer_copy_buffer_image(cmd_buffer, buffer->addr, image, region, false); + transfer_copy_buffer_image(cmd_buffer, buffer_addr, image, region, false); return; } @@ -329,9 +331,10 @@ copy_image_to_buffer(struct radv_cmd_buffer *cmd_buffer, struct radv_buffer *buf } struct radv_meta_blit2d_buffer buf_info = { + .addr = buffer_addr, + .size = buffer_size, .bs = img_info.bs, .format = img_info.format, - .buffer = buffer, .offset = region->bufferOffset, .pitch = buf_extent_el.width, }; @@ -379,7 +382,8 @@ radv_CmdCopyImageToBuffer2(VkCommandBuffer commandBuffer, const VkCopyImageToBuf radv_cs_add_buffer(device->ws, cmd_buffer->cs, src_image->bindings[bind_idx].bo); - copy_image_to_buffer(cmd_buffer, dst_buffer, src_image, pCopyImageToBufferInfo->srcImageLayout, region); + copy_image_to_buffer(cmd_buffer, dst_buffer->addr, dst_buffer->vk.size, src_image, + pCopyImageToBufferInfo->srcImageLayout, region); } }