From 1e3981f69c76f13d29e01906f87bbd9278dd2f52 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Wed, 21 Apr 2021 13:14:21 -0700 Subject: [PATCH] venus: enable external memory support This enables VK_KHR_external_memory_fd and VK_EXT_external_memory_dma_buf support. Signed-off-by: Chia-I Wu Reviewed-by: Yiwei Zhang Part-of: --- src/virtio/vulkan/vn_device.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/virtio/vulkan/vn_device.c b/src/virtio/vulkan/vn_device.c index 1199e49ed07..1703b29e41b 100644 --- a/src/virtio/vulkan/vn_device.c +++ b/src/virtio/vulkan/vn_device.c @@ -1363,6 +1363,11 @@ vn_physical_device_init_external_memory( physical_dev->external_memory.supported_handle_types = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT | VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT; + + physical_dev->base.base.supported_extensions.KHR_external_memory_fd = + true; + physical_dev->base.base.supported_extensions + .EXT_external_memory_dma_buf = true; } } @@ -2890,7 +2895,8 @@ vn_EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, if (physical_dev->base.base.supported_extensions.extensions[i]) { vk_outarray_append(&out, prop) { *prop = vk_device_extensions[i]; - prop->specVersion = physical_dev->extension_spec_versions[i]; + if (physical_dev->extension_spec_versions[i]) + prop->specVersion = physical_dev->extension_spec_versions[i]; } } } @@ -3048,6 +3054,7 @@ vn_device_fix_create_info(const struct vn_device *dev, VkDeviceCreateInfo *local_info) { /* extra_exts and block_exts must not overlap */ + const struct vn_physical_device *physical_dev = dev->physical_device; const char *extra_exts[8]; const char *block_exts[8]; uint32_t extra_count = 0; @@ -3063,6 +3070,20 @@ vn_device_fix_create_info(const struct vn_device *dev, if (dev->base.base.enabled_extensions.ANDROID_native_buffer) block_exts[block_count++] = VK_ANDROID_NATIVE_BUFFER_EXTENSION_NAME; + if (dev->base.base.enabled_extensions.KHR_external_memory_fd || + dev->base.base.enabled_extensions.EXT_external_memory_dma_buf) { + switch (physical_dev->external_memory.renderer_handle_type) { + case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT: + extra_exts[extra_count++] = VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME; + FALLTHROUGH; + case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT: + extra_exts[extra_count++] = VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME; + break; + default: + break; + } + } + if (!extra_count && (!block_count || !dev_info->enabledExtensionCount)) return dev_info;