1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2017, Google Inc.
3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker */
5*61046927SAndroid Build Coastguard Worker
6*61046927SAndroid Build Coastguard Worker #include "tu_android.h"
7*61046927SAndroid Build Coastguard Worker
8*61046927SAndroid Build Coastguard Worker #include <android/hardware_buffer.h>
9*61046927SAndroid Build Coastguard Worker #include <hardware/hardware.h>
10*61046927SAndroid Build Coastguard Worker #include <hardware/hwvulkan.h>
11*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
12*61046927SAndroid Build Coastguard Worker
13*61046927SAndroid Build Coastguard Worker #include "util/u_gralloc/u_gralloc.h"
14*61046927SAndroid Build Coastguard Worker #include "vk_android.h"
15*61046927SAndroid Build Coastguard Worker
16*61046927SAndroid Build Coastguard Worker #include "tu_device.h"
17*61046927SAndroid Build Coastguard Worker
18*61046927SAndroid Build Coastguard Worker static int
19*61046927SAndroid Build Coastguard Worker tu_hal_open(const struct hw_module_t *mod,
20*61046927SAndroid Build Coastguard Worker const char *id,
21*61046927SAndroid Build Coastguard Worker struct hw_device_t **dev);
22*61046927SAndroid Build Coastguard Worker static int
23*61046927SAndroid Build Coastguard Worker tu_hal_close(struct hw_device_t *dev);
24*61046927SAndroid Build Coastguard Worker
25*61046927SAndroid Build Coastguard Worker static_assert(HWVULKAN_DISPATCH_MAGIC == ICD_LOADER_MAGIC, "");
26*61046927SAndroid Build Coastguard Worker
27*61046927SAndroid Build Coastguard Worker struct hw_module_methods_t HAL_MODULE_METHODS = {
28*61046927SAndroid Build Coastguard Worker .open = tu_hal_open,
29*61046927SAndroid Build Coastguard Worker };
30*61046927SAndroid Build Coastguard Worker
31*61046927SAndroid Build Coastguard Worker PUBLIC struct hwvulkan_module_t HAL_MODULE_INFO_SYM = {
32*61046927SAndroid Build Coastguard Worker .common =
33*61046927SAndroid Build Coastguard Worker {
34*61046927SAndroid Build Coastguard Worker .tag = HARDWARE_MODULE_TAG,
35*61046927SAndroid Build Coastguard Worker .module_api_version = HWVULKAN_MODULE_API_VERSION_0_1,
36*61046927SAndroid Build Coastguard Worker .hal_api_version = HARDWARE_MAKE_API_VERSION(1, 0),
37*61046927SAndroid Build Coastguard Worker .id = HWVULKAN_HARDWARE_MODULE_ID,
38*61046927SAndroid Build Coastguard Worker .name = "Turnip Vulkan HAL",
39*61046927SAndroid Build Coastguard Worker .author = "Google",
40*61046927SAndroid Build Coastguard Worker .methods = &HAL_MODULE_METHODS,
41*61046927SAndroid Build Coastguard Worker },
42*61046927SAndroid Build Coastguard Worker };
43*61046927SAndroid Build Coastguard Worker
44*61046927SAndroid Build Coastguard Worker static int
tu_hal_open(const struct hw_module_t * mod,const char * id,struct hw_device_t ** dev)45*61046927SAndroid Build Coastguard Worker tu_hal_open(const struct hw_module_t *mod,
46*61046927SAndroid Build Coastguard Worker const char *id,
47*61046927SAndroid Build Coastguard Worker struct hw_device_t **dev)
48*61046927SAndroid Build Coastguard Worker {
49*61046927SAndroid Build Coastguard Worker assert(mod == &HAL_MODULE_INFO_SYM.common);
50*61046927SAndroid Build Coastguard Worker assert(strcmp(id, HWVULKAN_DEVICE_0) == 0);
51*61046927SAndroid Build Coastguard Worker
52*61046927SAndroid Build Coastguard Worker hwvulkan_device_t *hal_dev = (hwvulkan_device_t *) malloc(sizeof(*hal_dev));
53*61046927SAndroid Build Coastguard Worker if (!hal_dev)
54*61046927SAndroid Build Coastguard Worker return -1;
55*61046927SAndroid Build Coastguard Worker
56*61046927SAndroid Build Coastguard Worker *hal_dev = (hwvulkan_device_t){
57*61046927SAndroid Build Coastguard Worker .common =
58*61046927SAndroid Build Coastguard Worker {
59*61046927SAndroid Build Coastguard Worker .tag = HARDWARE_DEVICE_TAG,
60*61046927SAndroid Build Coastguard Worker .version = HWVULKAN_DEVICE_API_VERSION_0_1,
61*61046927SAndroid Build Coastguard Worker .module = &HAL_MODULE_INFO_SYM.common,
62*61046927SAndroid Build Coastguard Worker .close = tu_hal_close,
63*61046927SAndroid Build Coastguard Worker },
64*61046927SAndroid Build Coastguard Worker .EnumerateInstanceExtensionProperties =
65*61046927SAndroid Build Coastguard Worker tu_EnumerateInstanceExtensionProperties,
66*61046927SAndroid Build Coastguard Worker .CreateInstance = tu_CreateInstance,
67*61046927SAndroid Build Coastguard Worker .GetInstanceProcAddr = tu_GetInstanceProcAddr,
68*61046927SAndroid Build Coastguard Worker };
69*61046927SAndroid Build Coastguard Worker
70*61046927SAndroid Build Coastguard Worker vk_android_init_ugralloc();
71*61046927SAndroid Build Coastguard Worker
72*61046927SAndroid Build Coastguard Worker *dev = &hal_dev->common;
73*61046927SAndroid Build Coastguard Worker return 0;
74*61046927SAndroid Build Coastguard Worker }
75*61046927SAndroid Build Coastguard Worker
76*61046927SAndroid Build Coastguard Worker static int
tu_hal_close(struct hw_device_t * dev)77*61046927SAndroid Build Coastguard Worker tu_hal_close(struct hw_device_t *dev)
78*61046927SAndroid Build Coastguard Worker {
79*61046927SAndroid Build Coastguard Worker /* hwvulkan.h claims that hw_device_t::close() is never called. */
80*61046927SAndroid Build Coastguard Worker vk_android_destroy_ugralloc();
81*61046927SAndroid Build Coastguard Worker return -1;
82*61046927SAndroid Build Coastguard Worker }
83