radv/meta: remove the buffer dependency for image copy operations

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33526>
This commit is contained in:
Samuel Pitoiset
2025-02-13 09:03:07 +01:00
parent ae5d2bfd36
commit 50851f17d1
4 changed files with 25 additions and 21 deletions
+2 -1
View File
@@ -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;
+2 -2
View File
@@ -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},
}});
+7 -8
View File
@@ -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,
},
},
+14 -10
View File
@@ -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);
}
}