diff --git a/src/vulkan/runtime/vk_android.c b/src/vulkan/runtime/vk_android.c index d6e807d141f..0492776cf6a 100644 --- a/src/vulkan/runtime/vk_android.c +++ b/src/vulkan/runtime/vk_android.c @@ -27,6 +27,7 @@ #include "vk_common_entrypoints.h" #include "vk_device.h" #include "vk_enum_defines.h" +#include "vk_format.h" #include "vk_image.h" #include "vk_log.h" #include "vk_physical_device.h" @@ -868,6 +869,7 @@ vk_common_GetAndroidHardwareBufferPropertiesANDROID( VkAndroidHardwareBufferFormatPropertiesANDROID *format_prop = NULL; VkAndroidHardwareBufferFormatProperties2ANDROID *format_prop2 = NULL; + VkAndroidHardwareBufferFormatResolvePropertiesANDROID *format_resolve = NULL; vk_foreach_struct(ext, pProperties->pNext) { switch (ext->sType) { @@ -877,6 +879,9 @@ vk_common_GetAndroidHardwareBufferPropertiesANDROID( case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID: format_prop2 = (void *)ext; break; + case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_RESOLVE_PROPERTIES_ANDROID: + format_resolve = (void *)ext; + break; default: break; } @@ -886,7 +891,7 @@ vk_common_GetAndroidHardwareBufferPropertiesANDROID( VkAndroidHardwareBufferFormatProperties2ANDROID local_prop2 = { .sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID, }; - if (!format_prop2 && format_prop) + if (!format_prop2 && (format_prop || format_resolve)) format_prop2 = &local_prop2; if (format_prop2) { @@ -908,6 +913,19 @@ vk_common_GetAndroidHardwareBufferPropertiesANDROID( format_prop->suggestedYChromaOffset = format_prop2->suggestedYChromaOffset; } + if (format_resolve) { + if (device->enabled_extensions.ANDROID_external_format_resolve) { + assert(format_prop2->externalFormat != VK_FORMAT_UNDEFINED); + const uint32_t num_bits = vk_format_get_component_bits( + format_prop2->externalFormat, UTIL_FORMAT_COLORSPACE_RGB, 1); + format_resolve->colorAttachmentFormat = + num_bits == 8 ? VK_FORMAT_R8G8B8A8_UNORM + : VK_FORMAT_R16G16B16A16_UNORM; + } else { + format_resolve->colorAttachmentFormat = VK_FORMAT_UNDEFINED; + } + } + const native_handle_t *handle = AHardwareBuffer_getNativeHandle(buffer); assert(handle && handle->numFds > 0); pProperties->allocationSize = lseek(handle->data[0], 0, SEEK_END);