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:
@@ -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;
|
||||
|
||||
@@ -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},
|
||||
}});
|
||||
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user