panvk: Add Android ICD loader entry point
authorRoman Stratiienko <r.stratiienko@gmail.com>
Tue, 12 Sep 2023 21:27:34 +0000 (00:27 +0300)
committerMarge Bot <emma+marge@anholt.net>
Fri, 15 Sep 2023 10:39:02 +0000 (10:39 +0000)
Enables offscreen rendering on Android.

Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
Reviewed-by: Chia-I Wu <olvaffe@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25194>

src/panfrost/vulkan/meson.build
src/panfrost/vulkan/panvk_android.c [new file with mode: 0644]

index 4052465..40dfa47 100644 (file)
@@ -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 (file)
index 0000000..e8e85e1
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Mesa 3-D graphics library
+ *
+ * Copyright © 2017, Google Inc.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "panvk_private.h"
+
+#include <hardware/hardware.h>
+#include <hardware/hwvulkan.h>
+#include <vulkan/vk_icd.h>
+
+#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;
+}