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