From 6e2da49e92cf16dfe633ab5d155c168c5508126e Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Tue, 11 Feb 2025 12:42:36 +0100 Subject: [PATCH] radv/meta: add BOs to cmdbuf list earlier for image copy operations Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/meta/radv_meta_blit2d.c | 4 --- src/amd/vulkan/meta/radv_meta_bufimage.c | 10 ------ src/amd/vulkan/meta/radv_meta_copy.c | 43 ++++++++++++++++-------- 3 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/amd/vulkan/meta/radv_meta_blit2d.c b/src/amd/vulkan/meta/radv_meta_blit2d.c index b8af2efdcce..31eb1a6ea09 100644 --- a/src/amd/vulkan/meta/radv_meta_blit2d.c +++ b/src/amd/vulkan/meta/radv_meta_blit2d.c @@ -67,11 +67,7 @@ blit2d_bind_src(struct radv_cmd_buffer *cmd_buffer, VkPipelineLayout layout, str struct radv_meta_blit2d_buffer *src_buf, struct blit2d_src_temps *tmp, enum blit2d_src_type src_type, VkFormat depth_format, VkImageAspectFlagBits aspects, uint32_t log2_samples) { - struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); - if (src_type == BLIT2D_SRC_TYPE_BUFFER) { - radv_cs_add_buffer(device->ws, cmd_buffer->cs, src_buf->buffer->bo); - radv_meta_bind_descriptors( cmd_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 1, (VkDescriptorGetInfoEXT[]){{ diff --git a/src/amd/vulkan/meta/radv_meta_bufimage.c b/src/amd/vulkan/meta/radv_meta_bufimage.c index e110ea2a5a6..6d416e90633 100644 --- a/src/amd/vulkan/meta/radv_meta_bufimage.c +++ b/src/amd/vulkan/meta/radv_meta_bufimage.c @@ -714,8 +714,6 @@ radv_meta_image_to_buffer(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_b create_iview(cmd_buffer, src, &src_view, VK_FORMAT_UNDEFINED, src->aspect_mask); - radv_cs_add_buffer(device->ws, cmd_buffer->cs, dst->buffer->bo); - radv_meta_bind_descriptors( cmd_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, layout, 2, (VkDescriptorGetInfoEXT[]){{ @@ -768,9 +766,6 @@ radv_meta_buffer_to_image_cs_r32g32b32(struct radv_cmd_buffer *cmd_buffer, struc return; } - radv_cs_add_buffer(device->ws, cmd_buffer->cs, src->buffer->bo); - radv_cs_add_buffer(device->ws, cmd_buffer->cs, dst->image->bindings[0].bo); - radv_meta_bind_descriptors( cmd_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, layout, 2, (VkDescriptorGetInfoEXT[]){ @@ -838,8 +833,6 @@ radv_meta_buffer_to_image_cs(struct radv_cmd_buffer *cmd_buffer, struct radv_met create_iview(cmd_buffer, dst, &dst_view, VK_FORMAT_UNDEFINED, dst->aspect_mask); - radv_cs_add_buffer(device->ws, cmd_buffer->cs, src->buffer->bo); - radv_meta_bind_descriptors( cmd_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, layout, 2, (VkDescriptorGetInfoEXT[]){{ @@ -900,9 +893,6 @@ radv_meta_image_to_image_cs_r32g32b32(struct radv_cmd_buffer *cmd_buffer, struct assert(dst->format == VK_FORMAT_R32G32B32_UINT || dst->format == VK_FORMAT_R32G32B32_SINT || dst->format == VK_FORMAT_R32G32B32_SFLOAT); - radv_cs_add_buffer(device->ws, cmd_buffer->cs, src->image->bindings[0].bo); - radv_cs_add_buffer(device->ws, cmd_buffer->cs, dst->image->bindings[0].bo); - radv_meta_bind_descriptors( cmd_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, layout, 2, (VkDescriptorGetInfoEXT[]){ diff --git a/src/amd/vulkan/meta/radv_meta_copy.c b/src/amd/vulkan/meta/radv_meta_copy.c index 79c3464c55a..810f2bdd6e6 100644 --- a/src/amd/vulkan/meta/radv_meta_copy.c +++ b/src/amd/vulkan/meta/radv_meta_copy.c @@ -81,10 +81,6 @@ transfer_copy_buffer_image(struct radv_cmd_buffer *cmd_buffer, struct radv_buffe const struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); struct radeon_cmdbuf *cs = cmd_buffer->cs; const VkImageAspectFlags aspect_mask = region->imageSubresource.aspectMask; - const unsigned binding_idx = image->disjoint ? radv_plane_from_aspect(aspect_mask) : 0; - - radv_cs_add_buffer(device->ws, cs, image->bindings[binding_idx].bo); - radv_cs_add_buffer(device->ws, cs, buffer->bo); struct radv_sdma_surf buf = radv_sdma_get_buf_surf(buffer, image, region, aspect_mask); const struct radv_sdma_surf img = @@ -227,9 +223,16 @@ radv_CmdCopyBufferToImage2(VkCommandBuffer commandBuffer, const VkCopyBufferToIm struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); const struct radv_physical_device *pdev = radv_device_physical(device); + radv_cs_add_buffer(device->ws, cmd_buffer->cs, src_buffer->bo); + for (unsigned r = 0; r < pCopyBufferToImageInfo->regionCount; r++) { - copy_buffer_to_image(cmd_buffer, src_buffer, dst_image, pCopyBufferToImageInfo->dstImageLayout, - &pCopyBufferToImageInfo->pRegions[r]); + const VkBufferImageCopy2 *region = &pCopyBufferToImageInfo->pRegions[r]; + const VkImageAspectFlags aspect_mask = region->imageSubresource.aspectMask; + const unsigned bind_idx = dst_image->disjoint ? radv_plane_from_aspect(aspect_mask) : 0; + + 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); } if (radv_is_format_emulated(pdev, dst_image->vk.format)) { @@ -365,10 +368,18 @@ radv_CmdCopyImageToBuffer2(VkCommandBuffer commandBuffer, const VkCopyImageToBuf VK_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); VK_FROM_HANDLE(radv_image, src_image, pCopyImageToBufferInfo->srcImage); VK_FROM_HANDLE(radv_buffer, dst_buffer, pCopyImageToBufferInfo->dstBuffer); + struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); + + radv_cs_add_buffer(device->ws, cmd_buffer->cs, dst_buffer->bo); for (unsigned r = 0; r < pCopyImageToBufferInfo->regionCount; r++) { - copy_image_to_buffer(cmd_buffer, dst_buffer, src_image, pCopyImageToBufferInfo->srcImageLayout, - &pCopyImageToBufferInfo->pRegions[r]); + const VkBufferImageCopy2 *region = &pCopyImageToBufferInfo->pRegions[r]; + const VkImageAspectFlags aspect_mask = region->imageSubresource.aspectMask; + const unsigned bind_idx = src_image->disjoint ? radv_plane_from_aspect(aspect_mask) : 0; + + 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); } } @@ -383,11 +394,6 @@ transfer_copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_i u_foreach_bit (b, region->srcSubresource.aspectMask) { const VkImageAspectFlags src_aspect_mask = BITFIELD_BIT(b); const VkImageAspectFlags dst_aspect_mask = BITFIELD_BIT(u_bit_scan(&dst_aspect_mask_remaining)); - const unsigned src_binding_idx = src_image->disjoint ? radv_plane_from_aspect(src_aspect_mask) : 0; - const unsigned dst_binding_idx = dst_image->disjoint ? radv_plane_from_aspect(dst_aspect_mask) : 0; - - radv_cs_add_buffer(device->ws, cs, src_image->bindings[src_binding_idx].bo); - radv_cs_add_buffer(device->ws, cs, dst_image->bindings[dst_binding_idx].bo); const struct radv_sdma_surf src = radv_sdma_get_surf(device, src_image, region->srcSubresource, region->srcOffset, src_aspect_mask); @@ -608,8 +614,17 @@ radv_CmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyI const struct radv_physical_device *pdev = radv_device_physical(device); for (unsigned r = 0; r < pCopyImageInfo->regionCount; r++) { + const VkImageCopy2 *region = &pCopyImageInfo->pRegions[r]; + const VkImageAspectFlags src_aspect_mask = region->srcSubresource.aspectMask; + const unsigned src_bind_idx = src_image->disjoint ? radv_plane_from_aspect(src_aspect_mask) : 0; + const VkImageAspectFlags dst_aspect_mask = region->dstSubresource.aspectMask; + const unsigned dst_bind_idx = dst_image->disjoint ? radv_plane_from_aspect(dst_aspect_mask) : 0; + + radv_cs_add_buffer(device->ws, cmd_buffer->cs, src_image->bindings[src_bind_idx].bo); + radv_cs_add_buffer(device->ws, cmd_buffer->cs, dst_image->bindings[dst_bind_idx].bo); + copy_image(cmd_buffer, src_image, pCopyImageInfo->srcImageLayout, dst_image, pCopyImageInfo->dstImageLayout, - &pCopyImageInfo->pRegions[r]); + region); } if (radv_is_format_emulated(pdev, dst_image->vk.format)) {