v2: have separate memory properties for android, set usage flags for buffers correctly
Signed-off-by: Tapani Pälli <tapani.pa...@intel.com> --- src/intel/vulkan/anv_formats.c | 71 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/src/intel/vulkan/anv_formats.c b/src/intel/vulkan/anv_formats.c index dc398306a70..56425a8b614 100644 --- a/src/intel/vulkan/anv_formats.c +++ b/src/intel/vulkan/anv_formats.c @@ -929,9 +929,31 @@ static const VkExternalMemoryProperties prime_fd_props = { .exportFromImportedHandleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT | VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, .compatibleHandleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT | - VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT | + VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, +}; + +static const VkExternalMemoryProperties android_buffer_props = { + .externalMemoryFeatures = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT | + VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT, + .exportFromImportedHandleTypes = + VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, + .compatibleHandleTypes = + VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, +}; + + +static const VkExternalMemoryProperties android_image_props = { + .externalMemoryFeatures = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT | + VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT | + VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT, + .exportFromImportedHandleTypes = + VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, + .compatibleHandleTypes = + VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, }; VkResult anv_GetPhysicalDeviceImageFormatProperties2( @@ -943,8 +965,12 @@ VkResult anv_GetPhysicalDeviceImageFormatProperties2( const VkPhysicalDeviceExternalImageFormatInfo *external_info = NULL; VkExternalImageFormatPropertiesKHR *external_props = NULL; VkSamplerYcbcrConversionImageFormatProperties *ycbcr_props = NULL; + struct VkAndroidHardwareBufferUsageANDROID *android_usage = NULL; VkResult result; + /* Only used on Android environment. */ + (void) android_usage; + /* Extract input structs */ vk_foreach_struct_const(s, base_info->pNext) { switch (s->sType) { @@ -966,6 +992,9 @@ VkResult anv_GetPhysicalDeviceImageFormatProperties2( case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES: ycbcr_props = (void *) s; break; + case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID: + android_usage = (void *) s; + break; default: anv_debug_ignored_stype(s->sType); break; @@ -977,6 +1006,38 @@ VkResult anv_GetPhysicalDeviceImageFormatProperties2( if (result != VK_SUCCESS) goto fail; +#ifdef ANDROID + if (android_usage) { + android_usage->androidHardwareBufferUsage = 0; + + if (base_info->usage & VK_IMAGE_USAGE_SAMPLED_BIT) + android_usage->androidHardwareBufferUsage |= + AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE; + + if (base_info->usage & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) + android_usage->androidHardwareBufferUsage |= + AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE; + + if (base_info->usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) + android_usage->androidHardwareBufferUsage |= + AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT; + + if (base_info->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) + android_usage->androidHardwareBufferUsage |= + AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP; + + if (base_info->flags & VK_IMAGE_CREATE_PROTECTED_BIT) + android_usage->androidHardwareBufferUsage |= + AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT; + + /* No usage bits set - set at least one GPU usage. */ + if (android_usage->androidHardwareBufferUsage == 0) + android_usage->androidHardwareBufferUsage = + AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE; + + } +#endif + /* From the Vulkan 1.0.42 spec: * * If handleType is 0, vkGetPhysicalDeviceImageFormatProperties2 will @@ -990,6 +1051,10 @@ VkResult anv_GetPhysicalDeviceImageFormatProperties2( if (external_props) external_props->externalMemoryProperties = prime_fd_props; break; + case VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID: + if (external_props) + external_props->externalMemoryProperties = android_image_props; + break; default: /* From the Vulkan 1.0.42 spec: * @@ -1072,6 +1137,10 @@ void anv_GetPhysicalDeviceExternalBufferProperties( case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT: pExternalBufferProperties->externalMemoryProperties = prime_fd_props; return; + case VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID: + pExternalBufferProperties->externalMemoryProperties = + android_buffer_props; + return; default: goto unsupported; } -- 2.14.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev