diff --git a/docs/features.txt b/docs/features.txt index 1f12d7e719e..232f87c3e90 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -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) diff --git a/src/panfrost/vulkan/panvk_device_memory.c b/src/panfrost/vulkan/panvk_device_memory.c index 10edf39245b..1e0ffaec2da 100644 --- a/src/panfrost/vulkan/panvk_device_memory.c +++ b/src/panfrost/vulkan/panvk_device_memory.c @@ -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); diff --git a/src/panfrost/vulkan/panvk_image.c b/src/panfrost/vulkan/panvk_image.c index ce915dda926..00d88cad3f4 100644 --- a/src/panfrost/vulkan/panvk_image.c +++ b/src/panfrost/vulkan/panvk_image.c @@ -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; } diff --git a/src/panfrost/vulkan/panvk_physical_device.c b/src/panfrost/vulkan/panvk_physical_device.c index b1bed6a08bb..52d56095e26 100644 --- a/src/panfrost/vulkan/panvk_physical_device.c +++ b/src/panfrost/vulkan/panvk_physical_device.c @@ -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; diff --git a/src/panfrost/vulkan/panvk_vX_physical_device.c b/src/panfrost/vulkan/panvk_vX_physical_device.c index 34dd1ad1830..ab1efb1042e 100644 --- a/src/panfrost/vulkan/panvk_vX_physical_device.c +++ b/src/panfrost/vulkan/panvk_vX_physical_device.c @@ -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,