diff --git a/src/vulkan/runtime/vk_android.c b/src/vulkan/runtime/vk_android.c index 77ee1cc90b4..7a4cde6c32f 100644 --- a/src/vulkan/runtime/vk_android.c +++ b/src/vulkan/runtime/vk_android.c @@ -328,6 +328,28 @@ vk_android_get_anb_layout( out_layouts, max_planes); } +VkResult +vk_android_get_ahb_layout( + struct AHardwareBuffer *ahardware_buffer, + VkImageDrmFormatModifierExplicitCreateInfoEXT *out, + VkSubresourceLayout *out_layouts, int max_planes) +{ + AHardwareBuffer_Desc description; + const native_handle_t *handle = + AHardwareBuffer_getNativeHandle(ahardware_buffer); + + AHardwareBuffer_describe(ahardware_buffer, &description); + + struct u_gralloc_buffer_handle gr_handle = { + .handle = handle, + .pixel_stride = description.stride, + .hal_format = description.format, + }; + + return vk_gralloc_to_drm_explicit_layout(&gr_handle, out, + out_layouts, max_planes); +} + /* From the Android hardware_buffer.h header: * * "The buffer will be written to by the GPU as a framebuffer attachment. diff --git a/src/vulkan/runtime/vk_android.h b/src/vulkan/runtime/vk_android.h index 2cfb436c3c2..448887d5797 100644 --- a/src/vulkan/runtime/vk_android.h +++ b/src/vulkan/runtime/vk_android.h @@ -36,6 +36,7 @@ extern "C" { struct u_gralloc; struct vk_device; struct vk_image; +struct AHardwareBuffer; #if DETECT_OS_ANDROID struct u_gralloc *vk_android_get_ugralloc(void); @@ -49,6 +50,10 @@ VkResult vk_android_get_anb_layout( const VkImageCreateInfo *pCreateInfo, VkImageDrmFormatModifierExplicitCreateInfoEXT *out, VkSubresourceLayout *out_layouts, int max_planes); +VkResult vk_android_get_ahb_layout( + struct AHardwareBuffer *ahardware_buffer, + VkImageDrmFormatModifierExplicitCreateInfoEXT *out, + VkSubresourceLayout *out_layouts, int max_planes); #else static inline struct u_gralloc * vk_android_get_ugralloc(void) @@ -85,6 +90,15 @@ vk_android_get_anb_layout( return VK_ERROR_FEATURE_NOT_PRESENT; } +static inline VkResult +vk_android_get_ahb_layout( + struct AHardwareBuffer *ahardware_buffer, + VkImageDrmFormatModifierExplicitCreateInfoEXT *out, + VkSubresourceLayout *out_layouts, int max_planes) +{ + return VK_ERROR_FEATURE_NOT_PRESENT; +} + #endif #if DETECT_OS_ANDROID && ANDROID_API_LEVEL >= 26