The open source OpenXR runtime
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

c/util: Filter Vulkan formats for AHardwareBuffer formats

Some drivers says that they can export/import Vulkan formats that doesn't
have a direct mapping to a AHardwareBuffer format. Our import/export code
doesn't handle that case so make sure to filter out those formats.

+61
+61
src/xrt/compositor/util/comp_vulkan.c
··· 297 297 * 298 298 */ 299 299 300 + #if defined(XRT_GRAPHICS_BUFFER_HANDLE_IS_AHARDWAREBUFFER) 301 + static bool 302 + has_ahardware_buffer_format_conversion(VkFormat format) 303 + { 304 + /* 305 + * Format mappings from official Android docs: 306 + * 307 + * | AHardwareBuffer Format | Vulkan format | 308 + * |-------------------------------------------|----------------------------------------------| 309 + * | AHARDWAREBUFFER_FORMAT_BLOB | N/A | 310 + * | AHARDWAREBUFFER_FORMAT_D16_UNORM | VK_FORMAT_D16_UNORM | 311 + * | AHARDWAREBUFFER_FORMAT_D24_UNORM | VK_FORMAT_X8_D24_UNORM_PACK32 | 312 + * | AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT | VK_FORMAT_D24_UNORM_S8_UINT | 313 + * | AHARDWAREBUFFER_FORMAT_D32_FLOAT | VK_FORMAT_D32_SFLOAT | 314 + * | AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT | VK_FORMAT_D32_SFLOAT_S8_UINT | 315 + * | AHARDWAREBUFFER_FORMAT_R10G10B10A10_UNORM | VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16 | 316 + * | AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM | VK_FORMAT_A2B10G10R10_UNORM_PACK32 | 317 + * | AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT | VK_FORMAT_R16G16B16A16_SFLOAT | 318 + * | AHARDWAREBUFFER_FORMAT_R16G16_UINT | VK_FORMAT_R16G16_UINT | 319 + * | AHARDWAREBUFFER_FORMAT_R16_UINT | VK_FORMAT_R16_UINT | 320 + * | AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM | VK_FORMAT_R5G6B5_UNORM_PACK16 | 321 + * | AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM | VK_FORMAT_R8G8B8A8_UNORM | 322 + * | AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM | VK_FORMAT_R8G8B8A8_UNORM | 323 + * | AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM | VK_FORMAT_R8G8B8_UNORM | 324 + * | AHARDWAREBUFFER_FORMAT_R8_UNORM | VK_FORMAT_R8_UNORM | 325 + * | AHARDWAREBUFFER_FORMAT_S8_UINT | VK_FORMAT_S8_UINT | 326 + * | AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420 | N/A | 327 + * | AHARDWAREBUFFER_FORMAT_YCbCr_P010 | N/A | 328 + * 329 + * The VK_FORMAT_R8G8B8A8_SRGB format maps to AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM. 330 + */ 331 + 332 + switch (format) { 333 + case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16: return true; // AHARDWAREBUFFER_FORMAT_R10G10B10A10_UNORM 334 + case VK_FORMAT_D16_UNORM: return true; // AHARDWAREBUFFER_FORMAT_D16_UNORM 335 + case VK_FORMAT_X8_D24_UNORM_PACK32: return true; // AHARDWAREBUFFER_FORMAT_D24_UNORM 336 + case VK_FORMAT_D24_UNORM_S8_UINT: return true; // AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT 337 + case VK_FORMAT_D32_SFLOAT: return true; // AHARDWAREBUFFER_FORMAT_D32_FLOAT 338 + case VK_FORMAT_D32_SFLOAT_S8_UINT: return true; // AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT 339 + case VK_FORMAT_A2B10G10R10_UNORM_PACK32: return true; // AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM 340 + case VK_FORMAT_R16G16B16A16_SFLOAT: return true; // AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT 341 + case VK_FORMAT_R16G16_UINT: return true; // AHARDWAREBUFFER_FORMAT_R16G16_UINT 342 + case VK_FORMAT_R16_UINT: return true; // AHARDWAREBUFFER_FORMAT_R16_UINT 343 + case VK_FORMAT_R5G6B5_UNORM_PACK16: return true; // AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM 344 + case VK_FORMAT_R8G8B8A8_UNORM: return true; // AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM 345 + case VK_FORMAT_R8G8B8A8_SRGB: return true; // AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM 346 + case VK_FORMAT_R8G8B8_UNORM: return true; // AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM 347 + case VK_FORMAT_R8_UNORM: return true; // AHARDWAREBUFFER_FORMAT_R8_UNORM 348 + case VK_FORMAT_S8_UINT: return true; // AHARDWAREBUFFER_FORMAT_S8_UINT 349 + default: return false; 350 + } 351 + } 352 + #endif 353 + 300 354 static bool 301 355 is_format_supported(struct vk_bundle *vk, VkFormat format, enum xrt_swapchain_usage_bits xbits) 302 356 { 303 357 /* 304 358 * First check if the format is supported at all. 305 359 */ 360 + 361 + #if defined(XRT_GRAPHICS_BUFFER_HANDLE_IS_AHARDWAREBUFFER) 362 + if (!has_ahardware_buffer_format_conversion(format)) { 363 + VK_DEBUG(vk, "Format '%s' does not map to a AHardwareBuffer format!", vk_format_string(format)); 364 + return false; 365 + } 366 + #endif 306 367 307 368 VkFormatProperties prop; 308 369 vk->vkGetPhysicalDeviceFormatProperties(vk->physical_device, format, &prop);