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) {