turnip: Fix error behavior for VkPhysicalDeviceExternalImageFormatInfo

If the handle type is unsupported, then the spec requires us to return
VK_ERROR_FORMAT_NOT_SUPPORTED.

Reviewed-by: Chia-I Wu <olvaffe@gmail.com>
Closes: https://gitlab.freedesktop.org/bnieuwenhuizen/mesa/merge_requests/17
This commit is contained in:
Chad Versace 2019-02-01 16:48:44 -08:00 committed by Chia-I Wu
parent 4b9f967cd1
commit d5239bc59c
1 changed files with 24 additions and 26 deletions

View File

@ -544,8 +544,9 @@ tu_GetPhysicalDeviceImageFormatProperties(
pImageFormatProperties); pImageFormatProperties);
} }
static void static VkResult
get_external_image_format_properties( tu_get_external_image_format_properties(
const struct tu_physical_device *physical_device,
const VkPhysicalDeviceImageFormatInfo2KHR *pImageFormatInfo, const VkPhysicalDeviceImageFormatInfo2KHR *pImageFormatInfo,
VkExternalMemoryHandleTypeFlagBitsKHR handleType, VkExternalMemoryHandleTypeFlagBitsKHR handleType,
VkExternalMemoryPropertiesKHR *external_properties) VkExternalMemoryPropertiesKHR *external_properties)
@ -553,6 +554,15 @@ get_external_image_format_properties(
VkExternalMemoryFeatureFlagBitsKHR flags = 0; VkExternalMemoryFeatureFlagBitsKHR flags = 0;
VkExternalMemoryHandleTypeFlagsKHR export_flags = 0; VkExternalMemoryHandleTypeFlagsKHR export_flags = 0;
VkExternalMemoryHandleTypeFlagsKHR compat_flags = 0; VkExternalMemoryHandleTypeFlagsKHR compat_flags = 0;
/* From the Vulkan 1.1.98 spec:
*
* If handleType is not compatible with the format, type, tiling,
* usage, and flags specified in VkPhysicalDeviceImageFormatInfo2,
* then vkGetPhysicalDeviceImageFormatProperties2 returns
* VK_ERROR_FORMAT_NOT_SUPPORTED.
*/
switch (handleType) { switch (handleType) {
case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR: case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR:
case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT: case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT:
@ -566,7 +576,9 @@ get_external_image_format_properties(
VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT; VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
break; break;
default: default:
break; return vk_errorf(physical_device->instance, VK_ERROR_FORMAT_NOT_SUPPORTED,
"VkExternalMemoryTypeFlagBits(0x%x) unsupported for VkImageType(%d)",
handleType, pImageFormatInfo->type);
} }
break; break;
case VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT: case VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT:
@ -574,7 +586,9 @@ get_external_image_format_properties(
compat_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT; compat_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT;
break; break;
default: default:
break; return vk_errorf(physical_device->instance, VK_ERROR_FORMAT_NOT_SUPPORTED,
"VkExternalMemoryTypeFlagBits(0x%x) unsupported",
handleType);
} }
*external_properties = (VkExternalMemoryPropertiesKHR) { *external_properties = (VkExternalMemoryPropertiesKHR) {
@ -582,6 +596,8 @@ get_external_image_format_properties(
.exportFromImportedHandleTypes = export_flags, .exportFromImportedHandleTypes = export_flags,
.compatibleHandleTypes = compat_flags, .compatibleHandleTypes = compat_flags,
}; };
return VK_SUCCESS;
} }
VkResult VkResult
@ -631,30 +647,12 @@ tu_GetPhysicalDeviceImageFormatProperties2(
* present and VkExternalImageFormatPropertiesKHR will be ignored. * present and VkExternalImageFormatPropertiesKHR will be ignored.
*/ */
if (external_info && external_info->handleType != 0) { if (external_info && external_info->handleType != 0) {
switch (external_info->handleType) { result = tu_get_external_image_format_properties(
case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR: physical_device, base_info, external_info->handleType,
case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT:
case VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT:
get_external_image_format_properties(
base_info, external_info->handleType,
&external_props->externalMemoryProperties); &external_props->externalMemoryProperties);
break; if (result != VK_SUCCESS)
default:
/* From the Vulkan 1.0.42 spec:
*
* If handleType is not compatible with the [parameters]
* specified
* in VkPhysicalDeviceImageFormatInfo2KHR, then
* vkGetPhysicalDeviceImageFormatProperties2KHR returns
* VK_ERROR_FORMAT_NOT_SUPPORTED.
*/
result = vk_errorf(
physical_device->instance, VK_ERROR_FORMAT_NOT_SUPPORTED,
"unsupported VkExternalMemoryTypeFlagBitsKHR 0x%x",
external_info->handleType);
goto fail; goto fail;
} }
}
return VK_SUCCESS; return VK_SUCCESS;