1 /*
2 * Mesa 3-D graphics library
3 *
4 * Copyright © 2017, Google Inc.
5 *
6 * SPDX-License-Identifier: MIT
7 */
8
9 #include <hardware/hardware.h>
10 #include <hardware/hwvulkan.h>
11 #include <vulkan/vk_icd.h>
12
13 #include "util/log.h"
14
15 static int panvk_hal_open(const struct hw_module_t *mod, const char *id,
16 struct hw_device_t **dev);
17 static int panvk_hal_close(struct hw_device_t *dev);
18
19 static_assert(HWVULKAN_DISPATCH_MAGIC == ICD_LOADER_MAGIC, "");
20
21 PUBLIC struct hwvulkan_module_t HAL_MODULE_INFO_SYM = {
22 .common =
23 {
24 .tag = HARDWARE_MODULE_TAG,
25 .module_api_version = HWVULKAN_MODULE_API_VERSION_0_1,
26 .hal_api_version = HARDWARE_MAKE_API_VERSION(1, 0),
27 .id = HWVULKAN_HARDWARE_MODULE_ID,
28 .name = "ARM Vulkan HAL",
29 .author = "Mesa3D",
30 .methods =
31 &(hw_module_methods_t){
32 .open = panvk_hal_open,
33 },
34 },
35 };
36
37 static int
panvk_hal_open(const struct hw_module_t * mod,const char * id,struct hw_device_t ** dev)38 panvk_hal_open(const struct hw_module_t *mod, const char *id,
39 struct hw_device_t **dev)
40 {
41 assert(mod == &HAL_MODULE_INFO_SYM.common);
42 assert(strcmp(id, HWVULKAN_DEVICE_0) == 0);
43
44 hwvulkan_device_t *hal_dev = malloc(sizeof(*hal_dev));
45 if (!hal_dev)
46 return -1;
47
48 *hal_dev = (hwvulkan_device_t){
49 .common =
50 {
51 .tag = HARDWARE_DEVICE_TAG,
52 .version = HWVULKAN_DEVICE_API_VERSION_0_1,
53 .module = &HAL_MODULE_INFO_SYM.common,
54 .close = panvk_hal_close,
55 },
56 .EnumerateInstanceExtensionProperties =
57 panvk_EnumerateInstanceExtensionProperties,
58 .CreateInstance = panvk_CreateInstance,
59 .GetInstanceProcAddr = panvk_GetInstanceProcAddr,
60 };
61
62 mesa_logi("panvk: Warning: Android Vulkan implementation is experimental");
63
64 *dev = &hal_dev->common;
65 return 0;
66 }
67
68 static int
panvk_hal_close(struct hw_device_t * dev)69 panvk_hal_close(struct hw_device_t *dev)
70 {
71 /* hwvulkan.h claims that hw_device_t::close() is never called. */
72 return -1;
73 }
74