panvk: support VK_ANDROID_external_memory_android_hardware_buffer
Some checks are pending
macOS-CI / macOS-CI (dri) (push) Waiting to run
macOS-CI / macOS-CI (xlib) (push) Waiting to run

This last piece hooks up:
- GetPhysicalDeviceImageFormatProperties2
- GetPhysicalDeviceExternalBufferProperties
- GetImageMemoryRequirements2

Test:
- dEQP-VK.api.external.memory.android_hardware_buffer.*
- CtsNativeHardwareTestCases via ANGLE
- Android HWUI and SurfaceFlinger via skiavk (entirely AHB based)

Acked-by: Lars-Ivar Hesselberg Simonsen <lars-ivar.simonsen@arm.com>
Reviewed-by: Faith Ekstrand <faith.ekstrand@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36603>
This commit is contained in:
Yiwei Zhang 2025-08-06 09:37:17 +00:00 committed by Marge Bot
parent 66bbd9eec8
commit b76c556c59
5 changed files with 27 additions and 5 deletions

View file

@ -671,7 +671,7 @@ Khronos extensions that are not part of any Vulkan version:
VK_EXT_vertex_input_dynamic_state DONE (anv, hk, lvp, nvk, panvk, radv, tu, vn)
VK_EXT_ycbcr_image_arrays DONE (anv, hasvk, hk, lvp, nvk, panvk/v10+, radv, vn)
VK_EXT_zero_initialize_device_memory DONE (nvk, radv)
VK_ANDROID_external_memory_android_hardware_buffer DONE (anv, radv, tu, vn)
VK_ANDROID_external_memory_android_hardware_buffer DONE (anv, panvk, radv, tu, vn)
VK_ANDROID_native_buffer DONE (anv, panvk, radv, tu, v3dv, vn)
VK_GOOGLE_decorate_string DONE (anv, hasvk, hk, lvp, nvk, panvk, radv, tu, vn)
VK_GOOGLE_hlsl_functionality1 DONE (anv, hasvk, hk, lvp, nvk, panvk, radv, tu, vn)

View file

@ -7,6 +7,7 @@
#include "vulkan/util/vk_util.h"
#include "panvk_android.h"
#include "panvk_device.h"
#include "panvk_device_memory.h"
#include "panvk_entrypoints.h"
@ -46,6 +47,11 @@ panvk_AllocateMemory(VkDevice _device,
const VkAllocationCallbacks *pAllocator,
VkDeviceMemory *pMem)
{
if (panvk_android_is_ahb_memory(pAllocateInfo)) {
return panvk_android_allocate_ahb_memory(_device, pAllocateInfo,
pAllocator, pMem);
}
VK_FROM_HANDLE(panvk_device, device, _device);
struct panvk_instance *instance =
to_panvk_instance(device->vk.physical->instance);

View file

@ -589,7 +589,8 @@ panvk_GetImageMemoryRequirements2(VkDevice device,
switch (ext->sType) {
case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: {
VkMemoryDedicatedRequirements *dedicated = (void *)ext;
dedicated->requiresDedicatedAllocation = false;
dedicated->requiresDedicatedAllocation =
vk_image_is_android_hardware_buffer(&image->vk);
dedicated->prefersDedicatedAllocation = dedicated->requiresDedicatedAllocation;
break;
}

View file

@ -15,6 +15,7 @@
#include "util/disk_cache.h"
#include "git_sha1.h"
#include "vk_android.h"
#include "vk_device.h"
#include "vk_drm_syncobj.h"
#include "vk_format.h"
@ -1136,9 +1137,15 @@ panvk_GetPhysicalDeviceImageFormatProperties2(
external_props = &fallback_external_props;
}
result = panvk_get_external_image_format_properties(
physical_device, base_info, external_info->handleType,
&external_props->externalMemoryProperties);
if (external_info->handleType ==
VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID) {
result = vk_android_get_ahb_image_properties(physicalDevice, base_info,
base_props);
} else {
result = panvk_get_external_image_format_properties(
physical_device, base_info, external_info->handleType,
&external_props->externalMemoryProperties);
}
if (result != VK_SUCCESS)
goto fail;
@ -1263,6 +1270,13 @@ panvk_GetPhysicalDeviceExternalBufferProperties(
const VkPhysicalDeviceExternalBufferInfo *pExternalBufferInfo,
VkExternalBufferProperties *pExternalBufferProperties)
{
if (pExternalBufferInfo->handleType ==
VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID) {
vk_android_get_ahb_buffer_properties(physicalDevice, pExternalBufferInfo,
pExternalBufferProperties);
return;
}
const VkExternalMemoryHandleTypeFlags supported_handle_types =
VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT |
VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;

View file

@ -177,6 +177,7 @@ panvk_per_arch(get_physical_device_extensions)(
.EXT_ycbcr_2plane_444_formats = PAN_ARCH >= 10,
.EXT_ycbcr_image_arrays = PAN_ARCH >= 10,
.EXT_inline_uniform_block = true,
.ANDROID_external_memory_android_hardware_buffer = has_gralloc,
.ANDROID_native_buffer = has_gralloc,
.GOOGLE_decorate_string = true,
.GOOGLE_hlsl_functionality1 = true,