mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 21:40:08 +01:00
radv: Expose image handle compat types for Android handles.
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
This commit is contained in:
parent
1b0ceba925
commit
dad047a56a
3 changed files with 50 additions and 4 deletions
|
|
@ -742,3 +742,27 @@ radv_create_ahb_memory(struct radv_device *device,
|
|||
return VK_ERROR_EXTENSION_NOT_PRESENT;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool radv_android_gralloc_supports_format(VkFormat format, VkImageUsageFlagBits usage) {
|
||||
#if RADV_SUPPORT_ANDROID_HARDWARE_BUFFER
|
||||
/* Ideally we check Gralloc for what it supports and then merge that with the radv
|
||||
format support, but there is no easy gralloc query besides just creating an image.
|
||||
That seems a bit on the expensive side, so just hardcode for now. */
|
||||
/* TODO: Add multi-plane formats after confirming everything works between radeonsi
|
||||
and radv. */
|
||||
switch(format) {
|
||||
case VK_FORMAT_R8G8B8A8_UNORM:
|
||||
case VK_FORMAT_R5G6B5_UNORM_PACK16:
|
||||
return true;
|
||||
case VK_FORMAT_R8_UNORM:
|
||||
case VK_FORMAT_R8G8_UNORM:
|
||||
return !(usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
#else
|
||||
(void)format;
|
||||
(void)usage;
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1299,9 +1299,11 @@ VkResult radv_GetPhysicalDeviceImageFormatProperties(
|
|||
}
|
||||
|
||||
static void
|
||||
get_external_image_format_properties(const VkPhysicalDeviceImageFormatInfo2 *pImageFormatInfo,
|
||||
get_external_image_format_properties(struct radv_physical_device *physical_device,
|
||||
const VkPhysicalDeviceImageFormatInfo2 *pImageFormatInfo,
|
||||
VkExternalMemoryHandleTypeFlagBits handleType,
|
||||
VkExternalMemoryProperties *external_properties)
|
||||
VkExternalMemoryProperties *external_properties,
|
||||
VkImageFormatProperties *format_properties)
|
||||
{
|
||||
VkExternalMemoryFeatureFlagBits flags = 0;
|
||||
VkExternalMemoryHandleTypeFlags export_flags = 0;
|
||||
|
|
@ -1323,6 +1325,24 @@ get_external_image_format_properties(const VkPhysicalDeviceImageFormatInfo2 *pIm
|
|||
break;
|
||||
}
|
||||
break;
|
||||
case VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID:
|
||||
if (!physical_device->supported_extensions.ANDROID_external_memory_android_hardware_buffer)
|
||||
break;
|
||||
|
||||
if (!radv_android_gralloc_supports_format(pImageFormatInfo->format,
|
||||
pImageFormatInfo->usage))
|
||||
break;
|
||||
|
||||
if (pImageFormatInfo->type != VK_IMAGE_TYPE_2D)
|
||||
break;
|
||||
|
||||
format_properties->maxMipLevels = MIN2(1, format_properties->maxMipLevels);
|
||||
format_properties->maxArrayLayers = MIN2(1, format_properties->maxArrayLayers);
|
||||
format_properties->sampleCounts &= VK_SAMPLE_COUNT_1_BIT;
|
||||
|
||||
flags = VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT|VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT|VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
|
||||
compat_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
|
||||
break;
|
||||
case VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT:
|
||||
flags = VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
|
||||
compat_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT;
|
||||
|
|
@ -1400,8 +1420,9 @@ VkResult radv_GetPhysicalDeviceImageFormatProperties2(
|
|||
* present and VkExternalImageFormatProperties will be ignored.
|
||||
*/
|
||||
if (external_info && external_info->handleType != 0) {
|
||||
get_external_image_format_properties(base_info, external_info->handleType,
|
||||
&external_props->externalMemoryProperties);
|
||||
get_external_image_format_properties(physical_device, base_info, external_info->handleType,
|
||||
&external_props->externalMemoryProperties,
|
||||
&base_props->imageFormatProperties);
|
||||
if (!external_props->externalMemoryProperties.externalMemoryFeatures) {
|
||||
/* From the Vulkan 1.0.97 spec:
|
||||
*
|
||||
|
|
|
|||
|
|
@ -1947,6 +1947,7 @@ radv_create_ahb_memory(struct radv_device *device,
|
|||
VkFormat
|
||||
radv_select_android_external_format(const void *next, VkFormat default_format);
|
||||
|
||||
bool radv_android_gralloc_supports_format(VkFormat format, VkImageUsageFlagBits usage);
|
||||
|
||||
struct radv_image_view_extra_create_info {
|
||||
bool disable_compression;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue