From 2bd86f804829c5ac24379ab46a1055940d02cbc7 Mon Sep 17 00:00:00 2001 From: Roman Stratiienko Date: Wed, 13 Sep 2023 00:27:34 +0300 Subject: [PATCH] panvk: Add Android ICD loader entry point Enables offscreen rendering on Android. Signed-off-by: Roman Stratiienko Reviewed-by: Chia-I Wu Part-of: --- src/panfrost/vulkan/meson.build | 6 +++ src/panfrost/vulkan/panvk_android.c | 75 +++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 src/panfrost/vulkan/panvk_android.c diff --git a/src/panfrost/vulkan/meson.build b/src/panfrost/vulkan/meson.build index 4052465a944..40dfa47789a 100644 --- a/src/panfrost/vulkan/meson.build +++ b/src/panfrost/vulkan/meson.build @@ -99,6 +99,12 @@ if with_platform_wayland libpanvk_files += [wayland_drm_client_protocol_h, wayland_drm_protocol_c] endif +if with_platform_android + panvk_deps += [dep_android] + panvk_flags += '-DVK_USE_PLATFORM_ANDROID_KHR' + libpanvk_files += files('panvk_android.c') +endif + libvulkan_panfrost = shared_library( 'vulkan_panfrost', [libpanvk_files, panvk_entrypoints], diff --git a/src/panfrost/vulkan/panvk_android.c b/src/panfrost/vulkan/panvk_android.c new file mode 100644 index 00000000000..e8e85e1be3e --- /dev/null +++ b/src/panfrost/vulkan/panvk_android.c @@ -0,0 +1,75 @@ +/* + * Mesa 3-D graphics library + * + * Copyright © 2017, Google Inc. + * + * SPDX-License-Identifier: MIT + */ + +#include "panvk_private.h" + +#include +#include +#include + +#include "util/log.h" + +static int panvk_hal_open(const struct hw_module_t *mod, const char *id, + struct hw_device_t **dev); +static int panvk_hal_close(struct hw_device_t *dev); + +static_assert(HWVULKAN_DISPATCH_MAGIC == ICD_LOADER_MAGIC, ""); + +PUBLIC struct hwvulkan_module_t HAL_MODULE_INFO_SYM = { + .common = + { + .tag = HARDWARE_MODULE_TAG, + .module_api_version = HWVULKAN_MODULE_API_VERSION_0_1, + .hal_api_version = HARDWARE_MAKE_API_VERSION(1, 0), + .id = HWVULKAN_HARDWARE_MODULE_ID, + .name = "ARM Vulkan HAL", + .author = "Mesa3D", + .methods = + &(hw_module_methods_t){ + .open = panvk_hal_open, + }, + }, +}; + +static int +panvk_hal_open(const struct hw_module_t *mod, const char *id, + struct hw_device_t **dev) +{ + assert(mod == &HAL_MODULE_INFO_SYM.common); + assert(strcmp(id, HWVULKAN_DEVICE_0) == 0); + + hwvulkan_device_t *hal_dev = malloc(sizeof(*hal_dev)); + if (!hal_dev) + return -1; + + *hal_dev = (hwvulkan_device_t){ + .common = + { + .tag = HARDWARE_DEVICE_TAG, + .version = HWVULKAN_DEVICE_API_VERSION_0_1, + .module = &HAL_MODULE_INFO_SYM.common, + .close = panvk_hal_close, + }, + .EnumerateInstanceExtensionProperties = + panvk_EnumerateInstanceExtensionProperties, + .CreateInstance = panvk_CreateInstance, + .GetInstanceProcAddr = panvk_GetInstanceProcAddr, + }; + + mesa_logi("panvk: Warning: Android Vulkan implementation is experimental"); + + *dev = &hal_dev->common; + return 0; +} + +static int +panvk_hal_close(struct hw_device_t *dev) +{ + /* hwvulkan.h claims that hw_device_t::close() is never called. */ + return -1; +}