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.

Bug: 303485663
Test: Ran dEQP with the *zircon* tests.
Change-Id: I66cec1be6a8dbca3416b19b8ddca1616440106a3
diff --git a/guest/vulkan_enc/ResourceTracker.cpp b/guest/vulkan_enc/ResourceTracker.cpp
index 228c70b..1460933 100644
--- a/guest/vulkan_enc/ResourceTracker.cpp
+++ b/guest/vulkan_enc/ResourceTracker.cpp
@@ -5291,6 +5291,7 @@
                                                const VkSemaphoreCreateInfo* pCreateInfo,
                                                const VkAllocationCallbacks* pAllocator,
                                                VkSemaphore* pSemaphore) {
+    (void)input_result;
     VkEncoder* enc = (VkEncoder*)context;
 
     VkSemaphoreCreateInfo finalCreateInfo = *pCreateInfo;
@@ -6242,6 +6243,10 @@
     VkEncoder* enc = (VkEncoder*)context;
     (void)input_result;
 
+    uint32_t supportedHandleType = 0;
+    VkExternalImageFormatProperties* ext_img_properties =
+        vk_find_struct<VkExternalImageFormatProperties>(pImageFormatProperties);
+
 #ifdef VK_USE_PLATFORM_FUCHSIA
 
     constexpr VkFormat kExternalImageSupportedFormats[] = {
@@ -6256,8 +6261,6 @@
         VK_FORMAT_R8G8_SSCALED,   VK_FORMAT_R8G8_SRGB,
     };
 
-    VkExternalImageFormatProperties* ext_img_properties =
-        vk_find_struct<VkExternalImageFormatProperties>(pImageFormatProperties);
 
     if (ext_img_properties) {
         if (std::find(std::begin(kExternalImageSupportedFormats),
@@ -6266,12 +6269,23 @@
             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<VkAndroidHardwareBufferUsageANDROID>(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<VkPhysicalDeviceExternalImageFormatInfo>(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;
 
@@ -6287,8 +6301,6 @@
 
 #ifdef VK_USE_PLATFORM_FUCHSIA
     if (ext_img_properties) {
-        const VkPhysicalDeviceExternalImageFormatInfo* ext_img_info =
-            vk_find_struct<VkPhysicalDeviceExternalImageFormatInfo>(pImageFormatInfo);
         if (ext_img_info) {
             if (static_cast<uint32_t>(ext_img_info->handleType) ==
                 VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA) {
@@ -6310,7 +6322,9 @@
             pImageFormatInfo->flags, pImageFormatInfo->usage);
     }
 #endif
-
+    if (ext_img_properties) {
+        transformImpl_VkExternalMemoryProperties_fromhost(&ext_img_properties->externalMemoryProperties, 0);
+    }
     return hostRes;
 }
 
@@ -6332,6 +6346,57 @@
         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) {