mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-21 18:40:42 +01:00
venus: refactor more to image format props sanitization
The external memory properties fix can be done once and cached. To be noted, VkAndroidHardwareBufferUsageANDROID is a driver side struct so will stay outside the cache. Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33389>
This commit is contained in:
parent
5d440a7d97
commit
1885ff8a39
1 changed files with 50 additions and 46 deletions
|
|
@ -2312,13 +2312,52 @@ vn_image_store_format_in_cache(
|
|||
|
||||
static inline void
|
||||
vn_sanitize_image_format_properties(
|
||||
struct vn_physical_device *physical_dev,
|
||||
const VkPhysicalDeviceImageFormatInfo2 *info,
|
||||
const VkPhysicalDeviceExternalImageFormatInfo *external_info,
|
||||
VkImageFormatProperties2 *props)
|
||||
{
|
||||
const VkExternalMemoryHandleTypeFlagBits renderer_handle_type =
|
||||
physical_dev->external_memory.renderer_handle_type;
|
||||
const VkExternalMemoryHandleTypeFlags supported_handle_types =
|
||||
physical_dev->external_memory.supported_handle_types;
|
||||
|
||||
/* TODO drop this after supporting VK_EXT_rgba10x6_formats */
|
||||
if (info->format == VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16) {
|
||||
props->imageFormatProperties.sampleCounts = VK_SAMPLE_COUNT_1_BIT;
|
||||
}
|
||||
|
||||
/* sanitize VkExternalMemoryProperties */
|
||||
VkExternalImageFormatProperties *external_props =
|
||||
vk_find_struct(props->pNext, EXTERNAL_IMAGE_FORMAT_PROPERTIES);
|
||||
if (external_props) {
|
||||
VkExternalMemoryProperties *mem_props =
|
||||
&external_props->externalMemoryProperties;
|
||||
if (external_info->handleType ==
|
||||
VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID) {
|
||||
assert(physical_dev->instance->renderer->info.has_dma_buf_import);
|
||||
mem_props->externalMemoryFeatures =
|
||||
VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT |
|
||||
VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT |
|
||||
VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
|
||||
mem_props->exportFromImportedHandleTypes =
|
||||
VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
|
||||
mem_props->compatibleHandleTypes =
|
||||
VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
|
||||
} else {
|
||||
/* export support is via virtgpu but import relies on the renderer */
|
||||
if (!physical_dev->instance->renderer->info.has_dma_buf_import) {
|
||||
mem_props->externalMemoryFeatures &=
|
||||
~VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
|
||||
}
|
||||
|
||||
mem_props->compatibleHandleTypes = supported_handle_types;
|
||||
mem_props->exportFromImportedHandleTypes =
|
||||
(mem_props->exportFromImportedHandleTypes & renderer_handle_type)
|
||||
? supported_handle_types
|
||||
: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
VkResult
|
||||
|
|
@ -2422,6 +2461,10 @@ vn_GetPhysicalDeviceImageFormatProperties2(
|
|||
return vn_error(physical_dev->instance,
|
||||
VK_ERROR_FORMAT_NOT_SUPPORTED);
|
||||
}
|
||||
} else if (!physical_dev->instance->renderer->info.has_dma_buf_import) {
|
||||
/* AHB backed image requires renderer to support import bit */
|
||||
return vn_error(physical_dev->instance,
|
||||
VK_ERROR_FORMAT_NOT_SUPPORTED);
|
||||
}
|
||||
|
||||
if (external_info->handleType != renderer_handle_type) {
|
||||
|
|
@ -2461,7 +2504,8 @@ vn_GetPhysicalDeviceImageFormatProperties2(
|
|||
ring, physicalDevice, pImageFormatInfo, pImageFormatProperties);
|
||||
|
||||
if (result == VK_SUCCESS) {
|
||||
vn_sanitize_image_format_properties(pImageFormatInfo,
|
||||
vn_sanitize_image_format_properties(physical_dev, pImageFormatInfo,
|
||||
external_info,
|
||||
pImageFormatProperties);
|
||||
}
|
||||
|
||||
|
|
@ -2474,11 +2518,10 @@ vn_GetPhysicalDeviceImageFormatProperties2(
|
|||
}
|
||||
}
|
||||
|
||||
if (result != VK_SUCCESS || !external_info)
|
||||
return vn_result(physical_dev->instance, result);
|
||||
|
||||
if (external_info->handleType ==
|
||||
VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID) {
|
||||
/* VkAndroidHardwareBufferUsageANDROID is always populated directly */
|
||||
if (result == VK_SUCCESS && external_info &&
|
||||
external_info->handleType ==
|
||||
VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID) {
|
||||
VkAndroidHardwareBufferUsageANDROID *ahb_usage =
|
||||
vk_find_struct(pImageFormatProperties->pNext,
|
||||
ANDROID_HARDWARE_BUFFER_USAGE_ANDROID);
|
||||
|
|
@ -2491,46 +2534,7 @@ vn_GetPhysicalDeviceImageFormatProperties2(
|
|||
pImageFormatProperties->imageFormatProperties.maxMipLevels = 1;
|
||||
}
|
||||
|
||||
VkExternalImageFormatProperties *img_props = vk_find_struct(
|
||||
pImageFormatProperties->pNext, EXTERNAL_IMAGE_FORMAT_PROPERTIES);
|
||||
if (!img_props)
|
||||
return VK_SUCCESS;
|
||||
|
||||
VkExternalMemoryProperties *mem_props =
|
||||
&img_props->externalMemoryProperties;
|
||||
|
||||
if (renderer_handle_type ==
|
||||
VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT &&
|
||||
!physical_dev->instance->renderer->info.has_dma_buf_import) {
|
||||
mem_props->externalMemoryFeatures &=
|
||||
~VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
|
||||
}
|
||||
|
||||
if (external_info->handleType ==
|
||||
VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID) {
|
||||
/* AHB backed image requires renderer to support import bit */
|
||||
if (!(mem_props->externalMemoryFeatures &
|
||||
VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT))
|
||||
return vn_error(physical_dev->instance,
|
||||
VK_ERROR_FORMAT_NOT_SUPPORTED);
|
||||
|
||||
mem_props->externalMemoryFeatures =
|
||||
VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT |
|
||||
VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT |
|
||||
VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
|
||||
mem_props->exportFromImportedHandleTypes =
|
||||
VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
|
||||
mem_props->compatibleHandleTypes =
|
||||
VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
|
||||
} else {
|
||||
mem_props->compatibleHandleTypes = supported_handle_types;
|
||||
mem_props->exportFromImportedHandleTypes =
|
||||
(mem_props->exportFromImportedHandleTypes & renderer_handle_type)
|
||||
? supported_handle_types
|
||||
: 0;
|
||||
}
|
||||
|
||||
return VK_SUCCESS;
|
||||
return vn_result(physical_dev->instance, result);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue