The open source OpenXR runtime

a/android: add ahardwarebuffer_is_supported function

Part-of: <https://gitlab.freedesktop.org/monado/monado/-/merge_requests/2407>

authored by

Simon Zeni and committed by
korejan
fad04551 4f3c9bb2

+58 -2
+1
doc/changes/auxiliary/mr.2407.md
···
··· 1 + a/android: add ahardwarebuffer_is_supported function for format checking
+52 -1
src/xrt/auxiliary/android/android_ahardwarebuffer_allocator.c
··· 1 - // Copyright 2020, Collabora, Ltd. 2 // SPDX-License-Identifier: BSL-1.0 3 /*! 4 * @file 5 * @brief AHardwareBuffer backed image buffer allocator. 6 * @author Rylie Pavlik <rylie.pavlik@collabora.com> 7 * @ingroup aux_android 8 */ 9 ··· 46 case VK_FORMAT_R8G8B8A8_UNORM: return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM; 47 default: return 0; 48 } 49 } 50 51 xrt_result_t
··· 1 + // Copyright 2020-2025, Collabora, Ltd. 2 // SPDX-License-Identifier: BSL-1.0 3 /*! 4 * @file 5 * @brief AHardwareBuffer backed image buffer allocator. 6 * @author Rylie Pavlik <rylie.pavlik@collabora.com> 7 + * @author Simon Zeni <simon.zeni@collabora.com> 8 * @ingroup aux_android 9 */ 10 ··· 47 case VK_FORMAT_R8G8B8A8_UNORM: return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM; 48 default: return 0; 49 } 50 + } 51 + 52 + static uint64_t 53 + swapchain_usage_to_ahardwarebuffer(enum xrt_swapchain_usage_bits bits) 54 + { 55 + uint64_t ahb_usage = 0; 56 + if (bits & (XRT_SWAPCHAIN_USAGE_SAMPLED | XRT_SWAPCHAIN_USAGE_INPUT_ATTACHMENT)) { 57 + ahb_usage |= AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE; 58 + } 59 + 60 + if (bits & (XRT_SWAPCHAIN_USAGE_COLOR | XRT_SWAPCHAIN_USAGE_DEPTH_STENCIL)) { 61 + ahb_usage |= AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER; 62 + } 63 + 64 + if (bits & XRT_SWAPCHAIN_CREATE_PROTECTED_CONTENT) { 65 + ahb_usage |= AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT; 66 + } 67 + 68 + // Fallback if no bits are set 69 + if (ahb_usage == 0) { 70 + ahb_usage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE; 71 + } 72 + 73 + return ahb_usage; 74 + } 75 + 76 + bool 77 + ahardwarebuffer_is_supported(uint64_t format, enum xrt_swapchain_usage_bits xbits) 78 + { 79 + // Minimal buffer description to probe support 80 + AHardwareBuffer_Desc desc = { 81 + .width = 16, 82 + .height = 16, 83 + .layers = 1, 84 + .format = vk_format_to_ahardwarebuffer(format), 85 + .usage = swapchain_usage_to_ahardwarebuffer(xbits), 86 + }; 87 + 88 + #if __ANDROID_API__ >= 29 89 + return AHardwareBuffer_isSupported(&desc); 90 + #else 91 + AHardwareBuffer *buffer; 92 + int ret = AHardwareBuffer_allocate(&desc, &buffer); 93 + if (ret) { 94 + return false; 95 + } 96 + 97 + AHardwareBuffer_release(buffer); 98 + return true; 99 + #endif 100 } 101 102 xrt_result_t
+5 -1
src/xrt/auxiliary/android/android_ahardwarebuffer_allocator.h
··· 1 - // Copyright 2020, Collabora, Ltd. 2 // SPDX-License-Identifier: BSL-1.0 3 /*! 4 * @file 5 * @brief Header exposing factory function for AHardwareBuffer backed image 6 buffer allocator. 7 * @author Rylie Pavlik <rylie.pavlik@collabora.com> 8 * @ingroup aux_android 9 */ 10 ··· 24 25 xrt_result_t 26 ahardwarebuffer_image_allocate(const struct xrt_swapchain_create_info *xsci, xrt_graphics_buffer_handle_t *out_image); 27 28 #endif // XRT_GRAPHICS_BUFFER_HANDLE_IS_AHARDWAREBUFFER 29
··· 1 + // Copyright 2020-2025, Collabora, Ltd. 2 // SPDX-License-Identifier: BSL-1.0 3 /*! 4 * @file 5 * @brief Header exposing factory function for AHardwareBuffer backed image 6 buffer allocator. 7 * @author Rylie Pavlik <rylie.pavlik@collabora.com> 8 + * @author Simon Zeni <simon.zeni@collabora.com> 9 * @ingroup aux_android 10 */ 11 ··· 25 26 xrt_result_t 27 ahardwarebuffer_image_allocate(const struct xrt_swapchain_create_info *xsci, xrt_graphics_buffer_handle_t *out_image); 28 + 29 + bool 30 + ahardwarebuffer_is_supported(uint64_t format, enum xrt_swapchain_usage_bits xbits); 31 32 #endif // XRT_GRAPHICS_BUFFER_HANDLE_IS_AHARDWAREBUFFER 33