From 60488962dbec646f3b9dadfec0def3bebc385f60 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Thu, 23 May 2024 13:34:03 -0700 Subject: [PATCH] venus: allow non-wsi image alias path to passthrough upon bind memory Signed-off-by: Yiwei Zhang Part-of: --- src/virtio/vulkan/vn_image.c | 49 +++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/src/virtio/vulkan/vn_image.c b/src/virtio/vulkan/vn_image.c index dde0438b281..f39d38e4b91 100644 --- a/src/virtio/vulkan/vn_image.c +++ b/src/virtio/vulkan/vn_image.c @@ -765,23 +765,16 @@ vn_GetImageSparseMemoryRequirements2( pSparseMemoryRequirements); } -static void -vn_image_bind_wsi_memory(struct vn_image *img, struct vn_device_memory *mem) +static VkResult +vn_image_bind_wsi_memory(struct vn_device *dev, + uint32_t count, + const VkBindImageMemoryInfo *infos) { - assert(img->wsi.is_wsi && !img->wsi.memory); - img->wsi.memory = mem; -} + STACK_ARRAY(VkBindImageMemoryInfo, local_infos, count); + typed_memcpy(local_infos, infos, count); -VkResult -vn_BindImageMemory2(VkDevice device, - uint32_t bindInfoCount, - const VkBindImageMemoryInfo *pBindInfos) -{ - STACK_ARRAY(VkBindImageMemoryInfo, bind_infos, bindInfoCount); - typed_memcpy(bind_infos, pBindInfos, bindInfoCount); - - for (uint32_t i = 0; i < bindInfoCount; i++) { - VkBindImageMemoryInfo *info = &bind_infos[i]; + for (uint32_t i = 0; i < count; i++) { + VkBindImageMemoryInfo *info = &local_infos[i]; struct vn_image *img = vn_image_from_handle(info->image); struct vn_device_memory *mem = vn_device_memory_from_handle(info->memory); @@ -808,15 +801,31 @@ vn_BindImageMemory2(VkDevice device, assert(mem && info->memory != VK_NULL_HANDLE); if (img->wsi.is_wsi) - vn_image_bind_wsi_memory(img, mem); + img->wsi.memory = mem; } + vn_async_vkBindImageMemory2(dev->primary_ring, vn_device_to_handle(dev), + count, local_infos); + + STACK_ARRAY_FINISH(local_infos); + + return VK_SUCCESS; +} + +VkResult +vn_BindImageMemory2(VkDevice device, + uint32_t bindInfoCount, + const VkBindImageMemoryInfo *pBindInfos) +{ struct vn_device *dev = vn_device_from_handle(device); + + for (uint32_t i = 0; i < bindInfoCount; i++) { + if (pBindInfos[i].memory == VK_NULL_HANDLE) + return vn_image_bind_wsi_memory(dev, bindInfoCount, pBindInfos); + } + vn_async_vkBindImageMemory2(dev->primary_ring, device, bindInfoCount, - bind_infos); - - STACK_ARRAY_FINISH(bind_infos); - + pBindInfos); return VK_SUCCESS; }