From 1019e5d4d8cf03a867104c47e349f499159e5cdb Mon Sep 17 00:00:00 2001 From: Andrew Woloszyn Date: Wed, 4 Oct 2023 17:02:19 -0400 Subject: [PATCH] Added some fixes for zircon tests in the Android CTS. We shouldn't have been trying to run the tests in the first place but vkGetPhysicalDevice*Properties was returning true for these handles even on Android. Reviewed-by: Aaron Ruby Acked-by: Yonggang Luo Acked-by: Adam Jackson Part-of: --- .../guest/vulkan_enc/ResourceTracker.cpp | 75 +++++++++++++++++-- .../guest/vulkan_enc/ResourceTracker.h | 15 ++++ 2 files changed, 85 insertions(+), 5 deletions(-) diff --git a/src/gfxstream/guest/vulkan_enc/ResourceTracker.cpp b/src/gfxstream/guest/vulkan_enc/ResourceTracker.cpp index cc91770fe48..fa4c8209dc3 100644 --- a/src/gfxstream/guest/vulkan_enc/ResourceTracker.cpp +++ b/src/gfxstream/guest/vulkan_enc/ResourceTracker.cpp @@ -5294,6 +5294,7 @@ VkResult ResourceTracker::on_vkCreateSemaphore(void* context, VkResult input_res const VkSemaphoreCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSemaphore* pSemaphore) { + (void)input_result; VkEncoder* enc = (VkEncoder*)context; VkSemaphoreCreateInfo finalCreateInfo = *pCreateInfo; @@ -6245,6 +6246,10 @@ VkResult ResourceTracker::on_vkGetPhysicalDeviceImageFormatProperties2_common( VkEncoder* enc = (VkEncoder*)context; (void)input_result; + uint32_t supportedHandleType = 0; + VkExternalImageFormatProperties* ext_img_properties = + vk_find_struct(pImageFormatProperties); + #ifdef VK_USE_PLATFORM_FUCHSIA constexpr VkFormat kExternalImageSupportedFormats[] = { @@ -6259,8 +6264,6 @@ VkResult ResourceTracker::on_vkGetPhysicalDeviceImageFormatProperties2_common( VK_FORMAT_R8G8_SSCALED, VK_FORMAT_R8G8_SRGB, }; - VkExternalImageFormatProperties* ext_img_properties = - vk_find_struct(pImageFormatProperties); if (ext_img_properties) { if (std::find(std::begin(kExternalImageSupportedFormats), @@ -6269,12 +6272,23 @@ VkResult ResourceTracker::on_vkGetPhysicalDeviceImageFormatProperties2_common( return VK_ERROR_FORMAT_NOT_SUPPORTED; } } + supportedHandleType |= VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VM_BIT_FUCHSIA; #endif #ifdef VK_USE_PLATFORM_ANDROID_KHR VkAndroidHardwareBufferUsageANDROID* output_ahw_usage = vk_find_struct(pImageFormatProperties); + supportedHandleType |= VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT | + VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID; #endif + const VkPhysicalDeviceExternalImageFormatInfo* ext_img_info = + vk_find_struct(pImageFormatInfo); + if (supportedHandleType && ext_img_info) { + // 0 is a valid handleType so we don't check against 0 + if (ext_img_info->handleType != (ext_img_info->handleType & supportedHandleType)) { + return VK_ERROR_FORMAT_NOT_SUPPORTED; + } + } VkResult hostRes; @@ -6290,8 +6304,6 @@ VkResult ResourceTracker::on_vkGetPhysicalDeviceImageFormatProperties2_common( #ifdef VK_USE_PLATFORM_FUCHSIA if (ext_img_properties) { - const VkPhysicalDeviceExternalImageFormatInfo* ext_img_info = - vk_find_struct(pImageFormatInfo); if (ext_img_info) { if (static_cast(ext_img_info->handleType) == VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA) { @@ -6313,7 +6325,9 @@ VkResult ResourceTracker::on_vkGetPhysicalDeviceImageFormatProperties2_common( pImageFormatInfo->flags, pImageFormatInfo->usage); } #endif - + if (ext_img_properties) { + transformImpl_VkExternalMemoryProperties_fromhost(&ext_img_properties->externalMemoryProperties, 0); + } return hostRes; } @@ -6335,6 +6349,57 @@ VkResult ResourceTracker::on_vkGetPhysicalDeviceImageFormatProperties2KHR( pImageFormatProperties); } +void ResourceTracker::on_vkGetPhysicalDeviceExternalBufferProperties_common( + bool isKhr, void* context, VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo, + VkExternalBufferProperties* pExternalBufferProperties) { + VkEncoder* enc = (VkEncoder*)context; + + uint32_t supportedHandleType = 0; +#ifdef VK_USE_PLATFORM_FUCHSIA + supportedHandleType |= VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VM_BIT_FUCHSIA; +#endif +#ifdef VK_USE_PLATFORM_ANDROID_KHR + supportedHandleType |= VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT | + VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID; +#endif + if (supportedHandleType) { + // 0 is a valid handleType so we can't check against 0 + if (pExternalBufferInfo->handleType != (pExternalBufferInfo->handleType & supportedHandleType)) { + return; + } + } + + if (isKhr) { + enc->vkGetPhysicalDeviceExternalBufferPropertiesKHR( + physicalDevice, pExternalBufferInfo, pExternalBufferProperties, true /* do lock */); + } else { + enc->vkGetPhysicalDeviceExternalBufferProperties( + physicalDevice, pExternalBufferInfo, pExternalBufferProperties, true /* do lock */); + } + transformImpl_VkExternalMemoryProperties_fromhost(&pExternalBufferProperties->externalMemoryProperties, 0); +} + +void ResourceTracker::on_vkGetPhysicalDeviceExternalBufferProperties( + void* context, VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo, + VkExternalBufferProperties* pExternalBufferProperties) { + return on_vkGetPhysicalDeviceExternalBufferProperties_common( + false /* not KHR */, context, physicalDevice, pExternalBufferInfo, + pExternalBufferProperties + ); +} + +void ResourceTracker::on_vkGetPhysicalDeviceExternalBufferPropertiesKHR( + void* context, VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceExternalBufferInfoKHR* pExternalBufferInfo, + VkExternalBufferPropertiesKHR* pExternalBufferProperties) { + return on_vkGetPhysicalDeviceExternalBufferProperties_common( + true /* is KHR */, context, physicalDevice, pExternalBufferInfo, + pExternalBufferProperties + ); +} + void ResourceTracker::on_vkGetPhysicalDeviceExternalSemaphoreProperties( void*, VkPhysicalDevice, const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo, VkExternalSemaphoreProperties* pExternalSemaphoreProperties) { diff --git a/src/gfxstream/guest/vulkan_enc/ResourceTracker.h b/src/gfxstream/guest/vulkan_enc/ResourceTracker.h index 1659123bce0..80a4a71582a 100644 --- a/src/gfxstream/guest/vulkan_enc/ResourceTracker.h +++ b/src/gfxstream/guest/vulkan_enc/ResourceTracker.h @@ -417,6 +417,16 @@ class ResourceTracker { const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo, VkImageFormatProperties2* pImageFormatProperties); + void on_vkGetPhysicalDeviceExternalBufferProperties( + void* context, VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo, + VkExternalBufferProperties* pExternalBufferProperties); + + void on_vkGetPhysicalDeviceExternalBufferPropertiesKHR( + void* context, VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceExternalBufferInfoKHR* pExternalBufferInfo, + VkExternalBufferPropertiesKHR* pExternalBufferProperties); + void on_vkGetPhysicalDeviceExternalSemaphoreProperties( void* context, VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo, @@ -560,6 +570,11 @@ class ResourceTracker { const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo, VkImageFormatProperties2* pImageFormatProperties); + void on_vkGetPhysicalDeviceExternalBufferProperties_common( + bool isKhr, void* context, VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo, + VkExternalBufferProperties* pExternalBufferProperties); + template VkResult on_vkQueueSubmitTemplate(void* context, VkResult input_result, VkQueue queue, uint32_t submitCount, const VkSubmitInfoType* pSubmits,