From dc0749adab3a6c0286aba9634b73ab9c32113f60 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Tue, 21 Mar 2023 18:25:37 -0500 Subject: [PATCH] vulkan/android: Fix hardware buffer usage flags We now add the correct usage flags for input attachments, storage images, and depth/stencil attachments. Reviewed-by: Lina Versace Part-of: --- src/vulkan/runtime/vk_android.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/vulkan/runtime/vk_android.c b/src/vulkan/runtime/vk_android.c index 0091474dcfc..862a9374ee7 100644 --- a/src/vulkan/runtime/vk_android.c +++ b/src/vulkan/runtime/vk_android.c @@ -35,6 +35,23 @@ #if ANDROID_API_LEVEL >= 26 #include +/* From the Android hardware_buffer.h header: + * + * "The buffer will be written to by the GPU as a framebuffer attachment. + * + * Note that the name of this flag is somewhat misleading: it does not + * imply that the buffer contains a color format. A buffer with depth or + * stencil format that will be used as a framebuffer attachment should + * also have this flag. Use the equivalent flag + * AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER to avoid this confusion." + * + * The flag was renamed from COLOR_OUTPUT to FRAMEBUFFER at Android API + * version 29. + */ +#if ANDROID_API_LEVEL < 29 +#define AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT +#endif + /* Construct ahw usage mask from image usage bits, see * 'AHardwareBuffer Usage Equivalence' in Vulkan spec. */ @@ -43,14 +60,19 @@ vk_image_usage_to_ahb_usage(const VkImageCreateFlags vk_create, const VkImageUsageFlags vk_usage) { uint64_t ahb_usage = 0; - if (vk_usage & VK_IMAGE_USAGE_SAMPLED_BIT) + if (vk_usage & (VK_IMAGE_USAGE_SAMPLED_BIT | + VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)) ahb_usage |= AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE; if (vk_usage & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) ahb_usage |= AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE; - if (vk_usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) - ahb_usage |= AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT; + if (vk_usage & (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | + VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)) + ahb_usage |= AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER; + + if (vk_usage & VK_IMAGE_USAGE_STORAGE_BIT) + ahb_usage |= AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER; if (vk_create & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) ahb_usage |= AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP;