xref: /aosp_15_r20/external/mesa3d/src/gfxstream/guest/vulkan/gfxstream_vk_android.cpp (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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