From c4b30b604fda53dfaed83bcbe1467ac1023b2c90 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Sat, 22 Jun 2024 18:35:05 +0000 Subject: [PATCH] venus: support VK_ANDROID_NATIVE_BUFFER_SPEC_VERSION 8 The aliased WSI image creation path is very much like the AHB case. It's also the same with the deferred ANB binding path to support VK_EXT_swapchain_maintenance1. Drop the cap as mesa currently only supports up to spec version 8 because the later versions haven't been upstreamed to the Vulkan registry yet. Signed-off-by: Yiwei Zhang Part-of: --- src/virtio/vulkan/vn_android.c | 37 +++++++++++++++++++++++--- src/virtio/vulkan/vn_android.h | 15 ++++++++--- src/virtio/vulkan/vn_image.c | 15 +++++++---- src/virtio/vulkan/vn_physical_device.c | 8 ------ 4 files changed, 55 insertions(+), 20 deletions(-) diff --git a/src/virtio/vulkan/vn_android.c b/src/virtio/vulkan/vn_android.c index d609ebc51c7..9f85470a73e 100644 --- a/src/virtio/vulkan/vn_android.c +++ b/src/virtio/vulkan/vn_android.c @@ -523,10 +523,20 @@ vn_android_image_from_anb_internal(struct vn_device *dev, return result; /* encoder will strip the Android specific pNext structs */ - result = vn_image_create(dev, &builder.create, alloc, &img); - if (result != VK_SUCCESS) { - vn_log(dev->instance, "anb: vn_image_create failed"); - return result; + if (*out_img) { + /* driver side img obj has been created for deferred init like ahb */ + img = *out_img; + result = vn_image_init_deferred(dev, &builder.create, img); + if (result != VK_SUCCESS) { + vn_log(dev->instance, "anb: vn_image_init_deferred failed"); + return result; + } + } else { + result = vn_image_create(dev, &builder.create, alloc, &img); + if (result != VK_SUCCESS) { + vn_log(dev->instance, "anb: vn_image_create failed"); + return result; + } } img->wsi.is_wsi = true; @@ -634,6 +644,25 @@ vn_android_image_from_anb(struct vn_device *dev, return VK_SUCCESS; } +struct vn_device_memory * +vn_android_get_wsi_memory_from_bind_info( + struct vn_device *dev, const VkBindImageMemoryInfo *bind_info) +{ + const VkNativeBufferANDROID *anb_info = + vk_find_struct_const(bind_info->pNext, NATIVE_BUFFER_ANDROID); + assert(anb_info && anb_info->handle); + + struct vn_image *img = vn_image_from_handle(bind_info->image); + VkResult result = vn_android_image_from_anb_internal( + dev, &img->deferred_info->create, anb_info, &dev->base.base.alloc, + &img); + if (result != VK_SUCCESS) + return NULL; + + assert(img->wsi.memory_owned); + return img->wsi.memory; +} + static VkResult vn_android_get_ahb_format_properties( struct vn_device *dev, diff --git a/src/virtio/vulkan/vn_android.h b/src/virtio/vulkan/vn_android.h index 3a281e91539..06e4525795b 100644 --- a/src/virtio/vulkan/vn_android.h +++ b/src/virtio/vulkan/vn_android.h @@ -17,9 +17,6 @@ #include #include -/* venus implements VK_ANDROID_native_buffer up to spec version 7 */ -#define VN_ANDROID_NATIVE_BUFFER_SPEC_VERSION 7 - #if DETECT_OS_ANDROID VkResult @@ -29,6 +26,10 @@ vn_android_image_from_anb(struct vn_device *dev, const VkAllocationCallbacks *alloc, struct vn_image **out_img); +struct vn_device_memory * +vn_android_get_wsi_memory_from_bind_info( + struct vn_device *dev, const VkBindImageMemoryInfo *bind_info); + bool vn_android_get_drm_format_modifier_info( const VkPhysicalDeviceImageFormatInfo2 *format_info, @@ -68,6 +69,14 @@ vn_android_image_from_anb(UNUSED struct vn_device *dev, return VK_ERROR_OUT_OF_HOST_MEMORY; } +static inline struct vn_device_memory * +vn_android_get_wsi_memory_from_bind_info( + UNUSED struct vn_device *dev, + UNUSED const VkBindImageMemoryInfo *bind_info) +{ + return NULL; +} + static inline bool vn_android_get_drm_format_modifier_info( UNUSED const VkPhysicalDeviceImageFormatInfo2 *format_info, diff --git a/src/virtio/vulkan/vn_image.c b/src/virtio/vulkan/vn_image.c index f39d38e4b91..e1249e99a5d 100644 --- a/src/virtio/vulkan/vn_image.c +++ b/src/virtio/vulkan/vn_image.c @@ -680,8 +680,12 @@ vn_CreateImage(VkDevice device, } else if (ahb_info) { result = vn_image_create_deferred(dev, pCreateInfo, alloc, &img); } else if (swapchain_info) { +#if DETECT_OS_ANDROID + result = vn_image_create_deferred(dev, pCreateInfo, alloc, &img); +#else result = vn_wsi_create_image_from_swapchain( dev, pCreateInfo, swapchain_info, alloc, &img); +#endif } else { struct vn_image_create_info local_info; if (external_info && @@ -781,10 +785,11 @@ vn_image_bind_wsi_memory(struct vn_device *dev, if (!mem) { #if DETECT_OS_ANDROID - /* TODO handle VkNativeBufferANDROID when we bump up - * VN_ANDROID_NATIVE_BUFFER_SPEC_VERSION - */ - unreachable("VkBindImageMemoryInfo with no memory"); + mem = vn_android_get_wsi_memory_from_bind_info(dev, info); + if (!mem) { + STACK_ARRAY_FINISH(local_infos); + return VK_ERROR_OUT_OF_HOST_MEMORY; + } #else const VkBindImageMemorySwapchainInfoKHR *swapchain_info = vk_find_struct_const(info->pNext, @@ -795,8 +800,8 @@ vn_image_bind_wsi_memory(struct vn_device *dev, vn_image_from_handle(wsi_common_get_image( swapchain_info->swapchain, swapchain_info->imageIndex)); mem = swapchain_img->wsi.memory; - info->memory = vn_device_memory_to_handle(mem); #endif + info->memory = vn_device_memory_to_handle(mem); } assert(mem && info->memory != VK_NULL_HANDLE); diff --git a/src/virtio/vulkan/vn_physical_device.c b/src/virtio/vulkan/vn_physical_device.c index 9c5ab0681f3..fc746d86a02 100644 --- a/src/virtio/vulkan/vn_physical_device.c +++ b/src/virtio/vulkan/vn_physical_device.c @@ -1169,14 +1169,6 @@ vn_physical_device_init_supported_extensions( physical_dev->extension_spec_versions[i], props->specVersion); } } - - /* override VK_ANDROID_native_buffer spec version */ - if (native.ANDROID_native_buffer) { - const uint32_t index = - VN_EXTENSION_TABLE_INDEX(native, ANDROID_native_buffer); - physical_dev->extension_spec_versions[index] = - VN_ANDROID_NATIVE_BUFFER_SPEC_VERSION; - } } static VkResult