Module: Mesa Branch: main Commit: 35c85c0ae69ada5a6119aa21dadb848a49b046c5 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=35c85c0ae69ada5a6119aa21dadb848a49b046c5
Author: Yiwei Zhang <[email protected]> Date: Fri Feb 17 01:35:26 2023 -0800 venus: fix device memory export alloc info Signed-off-by: Yiwei Zhang <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21379> --- src/virtio/vulkan/vn_device_memory.c | 68 ++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/virtio/vulkan/vn_device_memory.c b/src/virtio/vulkan/vn_device_memory.c index 38e35c84964..d80e5ceb4fe 100644 --- a/src/virtio/vulkan/vn_device_memory.c +++ b/src/virtio/vulkan/vn_device_memory.c @@ -384,6 +384,62 @@ vn_device_memory_alloc_generic( return VK_SUCCESS; } +struct vn_device_memory_alloc_info { + VkMemoryAllocateInfo alloc; + VkExportMemoryAllocateInfo export; + VkMemoryAllocateFlagsInfo flags; + VkMemoryDedicatedAllocateInfo dedicated; + VkMemoryOpaqueCaptureAddressAllocateInfo capture; +}; + +static const VkMemoryAllocateInfo * +vn_device_memory_fix_alloc_info( + const VkMemoryAllocateInfo *alloc_info, + const VkExternalMemoryHandleTypeFlagBits renderer_handle_type, + bool has_guest_vram, + struct vn_device_memory_alloc_info *local_info) +{ + local_info->alloc = *alloc_info; + VkBaseOutStructure *cur = (void *)&local_info->alloc; + + vk_foreach_struct_const(src, alloc_info->pNext) { + void *next = NULL; + switch (src->sType) { + case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO: + /* guest vram turns export alloc into import, so drop export info */ + if (has_guest_vram) + break; + memcpy(&local_info->export, src, sizeof(local_info->export)); + local_info->export.handleTypes = renderer_handle_type; + next = &local_info->export; + break; + case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO: + memcpy(&local_info->flags, src, sizeof(local_info->flags)); + next = &local_info->flags; + break; + case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO: + memcpy(&local_info->dedicated, src, sizeof(local_info->dedicated)); + next = &local_info->dedicated; + break; + case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO: + memcpy(&local_info->capture, src, sizeof(local_info->capture)); + next = &local_info->capture; + break; + default: + break; + } + + if (next) { + cur->pNext = next; + cur = next; + } + } + + cur->pNext = NULL; + + return &local_info->alloc; +} + static VkResult vn_device_memory_alloc(struct vn_device *dev, struct vn_device_memory *mem, @@ -393,6 +449,18 @@ vn_device_memory_alloc(struct vn_device *dev, const struct vn_instance *instance = dev->physical_device->instance; const struct vn_renderer_info *renderer_info = &instance->renderer->info; + const VkExternalMemoryHandleTypeFlagBits renderer_handle_type = + dev->physical_device->external_memory.renderer_handle_type; + struct vn_device_memory_alloc_info local_info; + if (external_handles && external_handles != renderer_handle_type) { + alloc_info = vn_device_memory_fix_alloc_info( + alloc_info, renderer_handle_type, renderer_info->has_guest_vram, + &local_info); + + /* ensure correct blob flags */ + external_handles = renderer_handle_type; + } + if (renderer_info->has_guest_vram) { return vn_device_memory_alloc_guest_vram(dev, mem, alloc_info, external_handles);
