1 /*
2 * Copyright 2023 Google LLC
3 * SPDX-License-Identifier: MIT
4 */
5
6 #include <errno.h>
7 #include <hardware/hardware.h>
8 #include <hardware/hwvulkan.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <vulkan/vk_icd.h>
13
14 #include "gfxstream_vk_entrypoints.h"
15 #include "util/macros.h"
16
17 static int gfxstream_vk_hal_open(const struct hw_module_t* mod, const char* id,
18 struct hw_device_t** dev);
19 static int gfxstream_vk_hal_close(struct hw_device_t* dev);
20
21 static_assert(HWVULKAN_DISPATCH_MAGIC == ICD_LOADER_MAGIC, "");
22
23 hw_module_methods_t gfxstream_vk_hal_ops = {
24 .open = gfxstream_vk_hal_open,
25 };
26
27 PUBLIC struct hwvulkan_module_t HAL_MODULE_INFO_SYM = {
28 .common =
29 {
30 .tag = HARDWARE_MODULE_TAG,
31 .module_api_version = HWVULKAN_MODULE_API_VERSION_0_1,
32 .hal_api_version = HARDWARE_MAKE_API_VERSION(1, 0),
33 .id = HWVULKAN_HARDWARE_MODULE_ID,
34 .name = "gfxstream Vulkan HAL",
35 .author = "Android Open Source Project",
36 .methods = &(gfxstream_vk_hal_ops),
37 },
38 };
39
gfxstream_vk_hal_open(const struct hw_module_t * mod,const char * id,struct hw_device_t ** dev)40 static int gfxstream_vk_hal_open(const struct hw_module_t* mod, const char* id,
41 struct hw_device_t** dev) {
42 assert(mod == &HAL_MODULE_INFO_SYM.common);
43 assert(strcmp(id, HWVULKAN_DEVICE_0) == 0);
44
45 hwvulkan_device_t* hal_dev = (hwvulkan_device_t*)calloc(1, sizeof(*hal_dev));
46 if (!hal_dev) 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 = gfxstream_vk_hal_close,
55 },
56 .EnumerateInstanceExtensionProperties = gfxstream_vk_EnumerateInstanceExtensionProperties,
57 .CreateInstance = gfxstream_vk_CreateInstance,
58 .GetInstanceProcAddr = gfxstream_vk_GetInstanceProcAddr,
59 };
60
61 *dev = &hal_dev->common;
62 return 0;
63 }
64
gfxstream_vk_hal_close(struct hw_device_t * dev)65 static int gfxstream_vk_hal_close(struct hw_device_t* dev) {
66 /* hwvulkan.h claims that hw_device_t::close() is never called. */
67 return -1;
68 }
69