Module: Mesa Branch: main Commit: cadcbed2588a68b40d324c3df8b4b75c619c6156 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=cadcbed2588a68b40d324c3df8b4b75c619c6156
Author: Danylo Piliaiev <[email protected]> Date: Wed Jan 19 19:43:39 2022 +0200 tu: expose VK_KHR_copy_commands2 Relevant CTS tests: dEQP-VK.api.copy_and_blit.copy_commands2.* Signed-off-by: Danylo Piliaiev <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14623> --- docs/features.txt | 2 +- src/freedreno/vulkan/tu_clear_blit.c | 126 +++++++++++++++-------------------- src/freedreno/vulkan/tu_device.c | 1 + 3 files changed, 54 insertions(+), 75 deletions(-) diff --git a/docs/features.txt b/docs/features.txt index e3be413db68..585891783a2 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -473,7 +473,7 @@ Vulkan 1.2 -- all DONE: anv, vn Khronos extensions that are not part of any Vulkan version: VK_KHR_android_surface not started - VK_KHR_copy_commands2 DONE (anv, lvp, radv, v3dv) + VK_KHR_copy_commands2 DONE (anv, lvp, radv, tu, v3dv) VK_KHR_deferred_host_operations DONE (anv, radv) VK_KHR_display DONE (anv, lvp, radv, tu, v3dv) VK_KHR_display_swapchain not started diff --git a/src/freedreno/vulkan/tu_clear_blit.c b/src/freedreno/vulkan/tu_clear_blit.c index 988c7d11a74..bdfffa19382 100644 --- a/src/freedreno/vulkan/tu_clear_blit.c +++ b/src/freedreno/vulkan/tu_clear_blit.c @@ -1295,7 +1295,7 @@ static void tu6_blit_image(struct tu_cmd_buffer *cmd, struct tu_image *src_image, struct tu_image *dst_image, - const VkImageBlit *info, + const VkImageBlit2KHR *info, VkFilter filter) { const struct blit_ops *ops = &r2d_ops; @@ -1428,35 +1428,30 @@ tu6_blit_image(struct tu_cmd_buffer *cmd, } VKAPI_ATTR void VKAPI_CALL -tu_CmdBlitImage(VkCommandBuffer commandBuffer, - VkImage srcImage, - VkImageLayout srcImageLayout, - VkImage dstImage, - VkImageLayout dstImageLayout, - uint32_t regionCount, - const VkImageBlit *pRegions, - VkFilter filter) +tu_CmdBlitImage2KHR(VkCommandBuffer commandBuffer, + const VkBlitImageInfo2KHR* pBlitImageInfo) { TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); - TU_FROM_HANDLE(tu_image, src_image, srcImage); - TU_FROM_HANDLE(tu_image, dst_image, dstImage); + TU_FROM_HANDLE(tu_image, src_image, pBlitImageInfo->srcImage); + TU_FROM_HANDLE(tu_image, dst_image, pBlitImageInfo->dstImage); - for (uint32_t i = 0; i < regionCount; ++i) { + for (uint32_t i = 0; i < pBlitImageInfo->regionCount; ++i) { /* can't blit both depth and stencil at once with D32_S8 * TODO: more advanced 3D blit path to support it instead? */ if (src_image->vk_format == VK_FORMAT_D32_SFLOAT_S8_UINT || dst_image->vk_format == VK_FORMAT_D32_SFLOAT_S8_UINT) { - VkImageBlit region = pRegions[i]; - u_foreach_bit(b, pRegions[i].dstSubresource.aspectMask) { + VkImageBlit2KHR region = pBlitImageInfo->pRegions[i]; + u_foreach_bit(b, region.dstSubresource.aspectMask) { region.srcSubresource.aspectMask = BIT(b); region.dstSubresource.aspectMask = BIT(b); - tu6_blit_image(cmd, src_image, dst_image, ®ion, filter); + tu6_blit_image(cmd, src_image, dst_image, ®ion, pBlitImageInfo->filter); } continue; } - tu6_blit_image(cmd, src_image, dst_image, pRegions + i, filter); + tu6_blit_image(cmd, src_image, dst_image, pBlitImageInfo->pRegions + i, + pBlitImageInfo->filter); } } @@ -1490,7 +1485,7 @@ static void tu_copy_buffer_to_image(struct tu_cmd_buffer *cmd, struct tu_buffer *src_buffer, struct tu_image *dst_image, - const VkBufferImageCopy *info) + const VkBufferImageCopy2KHR *info) { struct tu_cs *cs = &cmd->cs; uint32_t layers = MAX2(info->imageExtent.depth, info->imageSubresource.layerCount); @@ -1552,26 +1547,23 @@ tu_copy_buffer_to_image(struct tu_cmd_buffer *cmd, } VKAPI_ATTR void VKAPI_CALL -tu_CmdCopyBufferToImage(VkCommandBuffer commandBuffer, - VkBuffer srcBuffer, - VkImage dstImage, - VkImageLayout dstImageLayout, - uint32_t regionCount, - const VkBufferImageCopy *pRegions) +tu_CmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer, + const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) { TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); - TU_FROM_HANDLE(tu_image, dst_image, dstImage); - TU_FROM_HANDLE(tu_buffer, src_buffer, srcBuffer); + TU_FROM_HANDLE(tu_image, dst_image, pCopyBufferToImageInfo->dstImage); + TU_FROM_HANDLE(tu_buffer, src_buffer, pCopyBufferToImageInfo->srcBuffer); - for (unsigned i = 0; i < regionCount; ++i) - tu_copy_buffer_to_image(cmd, src_buffer, dst_image, pRegions + i); + for (unsigned i = 0; i < pCopyBufferToImageInfo->regionCount; ++i) + tu_copy_buffer_to_image(cmd, src_buffer, dst_image, + pCopyBufferToImageInfo->pRegions + i); } static void tu_copy_image_to_buffer(struct tu_cmd_buffer *cmd, struct tu_image *src_image, struct tu_buffer *dst_buffer, - const VkBufferImageCopy *info) + const VkBufferImageCopy2KHR *info) { struct tu_cs *cs = &cmd->cs; uint32_t layers = MAX2(info->imageExtent.depth, info->imageSubresource.layerCount); @@ -1632,19 +1624,16 @@ tu_copy_image_to_buffer(struct tu_cmd_buffer *cmd, } VKAPI_ATTR void VKAPI_CALL -tu_CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, - VkImage srcImage, - VkImageLayout srcImageLayout, - VkBuffer dstBuffer, - uint32_t regionCount, - const VkBufferImageCopy *pRegions) +tu_CmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer, + const VkCopyImageToBufferInfo2KHR* pCopyImageToBufferInfo) { TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); - TU_FROM_HANDLE(tu_image, src_image, srcImage); - TU_FROM_HANDLE(tu_buffer, dst_buffer, dstBuffer); + TU_FROM_HANDLE(tu_image, src_image, pCopyImageToBufferInfo->srcImage); + TU_FROM_HANDLE(tu_buffer, dst_buffer, pCopyImageToBufferInfo->dstBuffer); - for (unsigned i = 0; i < regionCount; ++i) - tu_copy_image_to_buffer(cmd, src_image, dst_buffer, pRegions + i); + for (unsigned i = 0; i < pCopyImageToBufferInfo->regionCount; ++i) + tu_copy_image_to_buffer(cmd, src_image, dst_buffer, + pCopyImageToBufferInfo->pRegions + i); } /* Tiled formats don't support swapping, which means that we can't support @@ -1680,7 +1669,7 @@ static void tu_copy_image_to_image(struct tu_cmd_buffer *cmd, struct tu_image *src_image, struct tu_image *dst_image, - const VkImageCopy *info) + const VkImageCopy2KHR *info) { const struct blit_ops *ops = &r2d_ops; struct tu_cs *cs = &cmd->cs; @@ -1860,22 +1849,17 @@ tu_copy_image_to_image(struct tu_cmd_buffer *cmd, } VKAPI_ATTR void VKAPI_CALL -tu_CmdCopyImage(VkCommandBuffer commandBuffer, - VkImage srcImage, - VkImageLayout srcImageLayout, - VkImage destImage, - VkImageLayout destImageLayout, - uint32_t regionCount, - const VkImageCopy *pRegions) +tu_CmdCopyImage2KHR(VkCommandBuffer commandBuffer, + const VkCopyImageInfo2KHR* pCopyImageInfo) { TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); - TU_FROM_HANDLE(tu_image, src_image, srcImage); - TU_FROM_HANDLE(tu_image, dst_image, destImage); + TU_FROM_HANDLE(tu_image, src_image, pCopyImageInfo->srcImage); + TU_FROM_HANDLE(tu_image, dst_image, pCopyImageInfo->dstImage); - for (uint32_t i = 0; i < regionCount; ++i) { + for (uint32_t i = 0; i < pCopyImageInfo->regionCount; ++i) { if (src_image->vk_format == VK_FORMAT_D32_SFLOAT_S8_UINT) { - VkImageCopy info = pRegions[i]; - u_foreach_bit(b, pRegions[i].dstSubresource.aspectMask) { + VkImageCopy2KHR info = pCopyImageInfo->pRegions[i]; + u_foreach_bit(b, info.dstSubresource.aspectMask) { info.srcSubresource.aspectMask = BIT(b); info.dstSubresource.aspectMask = BIT(b); tu_copy_image_to_image(cmd, src_image, dst_image, &info); @@ -1883,7 +1867,8 @@ tu_CmdCopyImage(VkCommandBuffer commandBuffer, continue; } - tu_copy_image_to_image(cmd, src_image, dst_image, pRegions + i); + tu_copy_image_to_image(cmd, src_image, dst_image, + pCopyImageInfo->pRegions + i); } } @@ -1921,21 +1906,19 @@ copy_buffer(struct tu_cmd_buffer *cmd, } VKAPI_ATTR void VKAPI_CALL -tu_CmdCopyBuffer(VkCommandBuffer commandBuffer, - VkBuffer srcBuffer, - VkBuffer dstBuffer, - uint32_t regionCount, - const VkBufferCopy *pRegions) +tu_CmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, + const VkCopyBufferInfo2KHR *pCopyBufferInfo) { TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); - TU_FROM_HANDLE(tu_buffer, src_buffer, srcBuffer); - TU_FROM_HANDLE(tu_buffer, dst_buffer, dstBuffer); + TU_FROM_HANDLE(tu_buffer, src_buffer, pCopyBufferInfo->srcBuffer); + TU_FROM_HANDLE(tu_buffer, dst_buffer, pCopyBufferInfo->dstBuffer); - for (unsigned i = 0; i < regionCount; ++i) { + for (unsigned i = 0; i < pCopyBufferInfo->regionCount; ++i) { + const VkBufferCopy2KHR *region = &pCopyBufferInfo->pRegions[i]; copy_buffer(cmd, - tu_buffer_iova(dst_buffer) + pRegions[i].dstOffset, - tu_buffer_iova(src_buffer) + pRegions[i].srcOffset, - pRegions[i].size, 1); + tu_buffer_iova(dst_buffer) + region->dstOffset, + tu_buffer_iova(src_buffer) + region->srcOffset, + region->size, 1); } } @@ -1998,17 +1981,12 @@ tu_CmdFillBuffer(VkCommandBuffer commandBuffer, } VKAPI_ATTR void VKAPI_CALL -tu_CmdResolveImage(VkCommandBuffer commandBuffer, - VkImage srcImage, - VkImageLayout srcImageLayout, - VkImage dstImage, - VkImageLayout dstImageLayout, - uint32_t regionCount, - const VkImageResolve *pRegions) +tu_CmdResolveImage2KHR(VkCommandBuffer commandBuffer, + const VkResolveImageInfo2KHR* pResolveImageInfo) { TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); - TU_FROM_HANDLE(tu_image, src_image, srcImage); - TU_FROM_HANDLE(tu_image, dst_image, dstImage); + TU_FROM_HANDLE(tu_image, src_image, pResolveImageInfo->srcImage); + TU_FROM_HANDLE(tu_image, dst_image, pResolveImageInfo->dstImage); const struct blit_ops *ops = &r2d_ops; struct tu_cs *cs = &cmd->cs; @@ -2016,8 +1994,8 @@ tu_CmdResolveImage(VkCommandBuffer commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, 0, false, dst_image->layout[0].ubwc, VK_SAMPLE_COUNT_1_BIT); - for (uint32_t i = 0; i < regionCount; ++i) { - const VkImageResolve *info = &pRegions[i]; + for (uint32_t i = 0; i < pResolveImageInfo->regionCount; ++i) { + const VkImageResolve2KHR *info = &pResolveImageInfo->pRegions[i]; uint32_t layers = MAX2(info->extent.depth, info->dstSubresource.layerCount); assert(info->srcSubresource.layerCount == info->dstSubresource.layerCount); diff --git a/src/freedreno/vulkan/tu_device.c b/src/freedreno/vulkan/tu_device.c index 0653ff8720e..b2147cbfa85 100644 --- a/src/freedreno/vulkan/tu_device.c +++ b/src/freedreno/vulkan/tu_device.c @@ -117,6 +117,7 @@ get_device_extensions(const struct tu_physical_device *device, *ext = (struct vk_device_extension_table) { .KHR_16bit_storage = device->info->a6xx.storage_16bit, .KHR_bind_memory2 = true, + .KHR_copy_commands2 = true, .KHR_create_renderpass2 = true, .KHR_dedicated_allocation = true, .KHR_depth_stencil_resolve = true,
