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