diff --git a/src/panfrost/vulkan/meson.build b/src/panfrost/vulkan/meson.build index 97c93bd084d..49319e1bfbc 100644 --- a/src/panfrost/vulkan/meson.build +++ b/src/panfrost/vulkan/meson.build @@ -176,6 +176,10 @@ if with_platform_wayland panvk_deps += dep_wayland_client endif +if with_platform_android + libpanvk_files += files('panvk_android.c') +endif + libvulkan_panfrost = shared_library( 'vulkan_panfrost', [libpanvk_files, panvk_entrypoints, panvk_tracepoints], diff --git a/src/panfrost/vulkan/panvk_android.c b/src/panfrost/vulkan/panvk_android.c new file mode 100644 index 00000000000..363e8130cbb --- /dev/null +++ b/src/panfrost/vulkan/panvk_android.c @@ -0,0 +1,62 @@ +/* + * Copyright 2025 Google LLC + * SPDX-License-Identifier: MIT + */ + +#include "panvk_android.h" + +#include "vulkan/vk_android_native_buffer.h" + +#include "vk_util.h" + +bool +panvk_android_is_gralloc_image(const VkImageCreateInfo *pCreateInfo) +{ + vk_foreach_struct_const(ext, pCreateInfo->pNext) { + switch ((uint32_t)ext->sType) { + case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID: + return true; + case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR: { + const VkImageSwapchainCreateInfoKHR *swapchain_info = (void *)ext; + if (swapchain_info->swapchain != VK_NULL_HANDLE) + return true; + break; + } + case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO: { + const VkExternalMemoryImageCreateInfo *external_info = (void *)ext; + if (external_info->handleTypes & + VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID) + return true; + break; + } + default: + break; + } + } + return false; +} + +static VkResult +panvk_android_create_deferred_image(VkDevice device, + const VkImageCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkImage *pImage) +{ + return VK_ERROR_FEATURE_NOT_PRESENT; +} + +VkResult +panvk_android_create_gralloc_image(VkDevice device, + const VkImageCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkImage *pImage) +{ + const VkNativeBufferANDROID *anb = + vk_find_struct_const(pCreateInfo->pNext, NATIVE_BUFFER_ANDROID); + if (!anb) { + return panvk_android_create_deferred_image(device, pCreateInfo, + pAllocator, pImage); + } + + return VK_ERROR_FEATURE_NOT_PRESENT; +} diff --git a/src/panfrost/vulkan/panvk_android.h b/src/panfrost/vulkan/panvk_android.h new file mode 100644 index 00000000000..24bc7af8a64 --- /dev/null +++ b/src/panfrost/vulkan/panvk_android.h @@ -0,0 +1,41 @@ +/* + * Copyright 2025 Google LLC + * SPDX-License-Identifier: MIT + */ + +#ifndef PANVK_ANDROID_H +#define PANVK_ANDROID_H + +#include + +#include "util/detect_os.h" +#include "vulkan/vulkan.h" + +#ifdef VK_USE_PLATFORM_ANDROID_KHR + +bool panvk_android_is_gralloc_image(const VkImageCreateInfo *pCreateInfo); + +VkResult panvk_android_create_gralloc_image( + VkDevice device, const VkImageCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkImage *pImage); + +#else /* VK_USE_PLATFORM_ANDROID_KHR */ + +static inline bool +panvk_android_is_gralloc_image(const VkImageCreateInfo *pCreateInfo) +{ + return false; +} + +static inline VkResult +panvk_android_create_gralloc_image(VkDevice device, + const VkImageCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkImage *pImage) +{ + return VK_ERROR_FEATURE_NOT_PRESENT; +} + +#endif /* VK_USE_PLATFORM_ANDROID_KHR */ + +#endif /* PANVK_ANDROID_H */ diff --git a/src/panfrost/vulkan/panvk_image.c b/src/panfrost/vulkan/panvk_image.c index 36184cd8582..b4213807ff8 100644 --- a/src/panfrost/vulkan/panvk_image.c +++ b/src/panfrost/vulkan/panvk_image.c @@ -29,6 +29,7 @@ #include "pan_afbc.h" #include "pan_props.h" +#include "panvk_android.h" #include "panvk_device.h" #include "panvk_device_memory.h" #include "panvk_entrypoints.h" @@ -431,6 +432,11 @@ panvk_CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo, struct panvk_physical_device *phys_dev = to_panvk_physical_device(dev->vk.physical); + if (panvk_android_is_gralloc_image(pCreateInfo)) { + return panvk_android_create_gralloc_image(device, pCreateInfo, pAllocator, + pImage); + } + const VkImageSwapchainCreateInfoKHR *swapchain_info = vk_find_struct_const(pCreateInfo->pNext, IMAGE_SWAPCHAIN_CREATE_INFO_KHR); if (swapchain_info && swapchain_info->swapchain != VK_NULL_HANDLE) {