blob: e93f258579d2a705548d1717d912b32c55c8fe77 [file] [log] [blame]
Chia-I Wuc1e0f962014-08-04 08:03:57 +08001/*
Courtney Goeltzenleuchter0b018602015-04-08 15:36:08 -06002 * Vulkan
Chia-I Wuc1e0f962014-08-04 08:03:57 +08003 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
Chia-I Wud8ab1e62014-09-02 08:32:09 +080023 *
24 * Authors:
25 * Chia-I Wu <olv@lunarg.com>
Chia-I Wuc1e0f962014-08-04 08:03:57 +080026 */
27
28#ifndef LOADER_H
29#define LOADER_H
30
Courtney Goeltzenleuchter0b018602015-04-08 15:36:08 -060031#include <vulkan.h>
32#include <vkDbg.h>
Chia-I Wu73e9db32015-04-16 22:02:10 +080033#include <vk_wsi_lunarg.h>
Courtney Goeltzenleuchter0b018602015-04-08 15:36:08 -060034#include <vkLayer.h>
35#include <vkIcd.h>
Chia-I Wufe333ed2015-04-11 15:34:07 +080036#include <assert.h>
37
Chia-I Wuc1e0f962014-08-04 08:03:57 +080038#if defined(__GNUC__) && __GNUC__ >= 4
39# define LOADER_EXPORT __attribute__((visibility("default")))
40#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)
41# define LOADER_EXPORT __attribute__((visibility("default")))
42#else
43# define LOADER_EXPORT
44#endif
45
Jon Ashburn13482452015-05-12 17:26:48 -060046#define MAX_LAYER_LIBRARIES 64
47#define MAX_GPUS_FOR_LAYER 16
48
49struct loader_scanned_layers {
50 char *name;
51 uint32_t extension_count;
52 struct extension_property *extensions;
53};
54
55struct loader_layers {
56 loader_platform_dl_handle lib_handle;
57 char name[256];
58};
59
Jon Ashburnebfa25e2015-05-15 15:09:35 -060060struct loader_icd {
61 const struct loader_scanned_icds *scanned_icds;
62
63 VkLayerDispatchTable *loader_dispatch;
64 uint32_t layer_count[MAX_GPUS_FOR_LAYER];
65 struct loader_layers layer_libs[MAX_GPUS_FOR_LAYER][MAX_LAYER_LIBRARIES];
66 VkBaseLayerObject *wrappedGpus[MAX_GPUS_FOR_LAYER];
67 uint32_t gpu_count;
68 VkBaseLayerObject *gpus;
69 VkInstance instance; // instance object from the icd
70 PFN_vkGetProcAddr GetProcAddr;
71 PFN_vkDestroyInstance DestroyInstance;
72 PFN_vkEnumeratePhysicalDevices EnumeratePhysicalDevices;
73 PFN_vkGetPhysicalDeviceInfo GetPhysicalDeviceInfo;
74 PFN_vkCreateDevice CreateDevice;
75 PFN_vkGetPhysicalDeviceExtensionInfo GetPhysicalDeviceExtensionInfo;
76 PFN_vkEnumerateLayers EnumerateLayers;
77 PFN_vkGetMultiDeviceCompatibility GetMultiDeviceCompatibility;
78 PFN_vkDbgRegisterMsgCallback DbgRegisterMsgCallback;
79 PFN_vkDbgUnregisterMsgCallback DbgUnregisterMsgCallback;
80 PFN_vkDbgSetGlobalOption DbgSetGlobalOption;
81 PFN_vkGetDisplayInfoWSI GetDisplayInfoWSI;
82 struct loader_icd *next;
83};
84
Jon Ashburn13482452015-05-12 17:26:48 -060085struct loader_instance {
Jon Ashburnebfa25e2015-05-15 15:09:35 -060086 VkLayerInstanceDispatchTable *disp; // must be first entry in structure
87
Jon Ashburn13482452015-05-12 17:26:48 -060088 uint32_t layer_count;
89 struct loader_layers layer_libs[MAX_LAYER_LIBRARIES];
90 VkBaseLayerObject *wrappedInstance;
91 uint32_t total_gpu_count;
92 struct loader_icd *icds;
93 struct loader_instance *next;
94 uint32_t extension_count;
95 char **extension_names;
96};
97
98struct loader_struct {
99 struct loader_instance *instances;
100 bool icds_scanned;
101 struct loader_scanned_icds *scanned_icd_list;
102 bool layer_scanned;
103 char *layer_dirs;
104 unsigned int scanned_layer_count;
105 struct loader_scanned_layers scanned_layers[MAX_LAYER_LIBRARIES];
106 size_t scanned_ext_list_capacity;
107 uint32_t scanned_ext_list_count; // coalesced from all layers/drivers
108 struct extension_property **scanned_ext_list;
109};
110
Jon Ashburn62a54d12015-05-01 18:00:33 -0600111static inline void loader_set_dispatch(VkObject obj, const void *data)
Chia-I Wufe333ed2015-04-11 15:34:07 +0800112{
113 *((const void **) obj) = data;
114}
115
Jon Ashburn62a54d12015-05-01 18:00:33 -0600116static inline VkLayerDispatchTable *loader_get_dispatch(const VkObject obj)
Chia-I Wufe333ed2015-04-11 15:34:07 +0800117{
Jon Ashburn62a54d12015-05-01 18:00:33 -0600118 return *((VkLayerDispatchTable **) obj);
Chia-I Wufe333ed2015-04-11 15:34:07 +0800119}
120
Jon Ashburn13482452015-05-12 17:26:48 -0600121static inline VkLayerInstanceDispatchTable *loader_get_instance_dispatch(const VkObject obj)
122{
123 return *((VkLayerInstanceDispatchTable **) obj);
124}
125
Jon Ashburn62a54d12015-05-01 18:00:33 -0600126static inline void loader_init_dispatch(VkObject obj, const void *data)
Chia-I Wufe333ed2015-04-11 15:34:07 +0800127{
Jon Ashburn167b2b12015-04-15 13:34:33 -0600128#ifdef DEBUG
Chia-I Wufe333ed2015-04-11 15:34:07 +0800129 assert(valid_loader_magic_value(obj) &&
130 "Incompatible ICD, first dword must be initialized to ICD_LOADER_MAGIC. See loader/README.md for details.");
Jon Ashburn167b2b12015-04-15 13:34:33 -0600131#endif
Chia-I Wufe333ed2015-04-11 15:34:07 +0800132
Jon Ashburn62a54d12015-05-01 18:00:33 -0600133 loader_set_dispatch(obj, data);
Chia-I Wufe333ed2015-04-11 15:34:07 +0800134}
135
Jon Ashburn13482452015-05-12 17:26:48 -0600136/* global variables used across files */
137extern struct loader_struct loader;
138extern LOADER_PLATFORM_THREAD_ONCE_DEFINITION(once_icd);
139extern LOADER_PLATFORM_THREAD_ONCE_DEFINITION(once_layer);
140extern LOADER_PLATFORM_THREAD_ONCE_DEFINITION(once_exts);
141extern VkLayerInstanceDispatchTable instance_disp;
Jon Ashburn37e7f972015-04-06 10:58:22 -0600142
Jon Ashburn13482452015-05-12 17:26:48 -0600143/* instance layer chain termination entrypoint definitions */
144VkResult loader_CreateInstance(
145 const VkInstanceCreateInfo* pCreateInfo,
146 VkInstance* pInstance);
Chia-I Wufe333ed2015-04-11 15:34:07 +0800147
Jon Ashburn13482452015-05-12 17:26:48 -0600148VkResult loader_DestroyInstance(
149 VkInstance instance);
150
151VkResult loader_EnumeratePhysicalDevices(
152 VkInstance instance,
153 uint32_t* pPhysicalDeviceCount,
154 VkPhysicalDevice* pPhysicalDevices);
Jon Ashburnebfa25e2015-05-15 15:09:35 -0600155VkResult loader_GetPhysicalDeviceInfo(
156 VkPhysicalDevice gpu,
157 VkPhysicalDeviceInfoType infoType,
158 size_t* pDataSize,
159 void* pData);
160
161VkResult loader_CreateDevice(
162 VkPhysicalDevice gpu,
163 const VkDeviceCreateInfo* pCreateInfo,
164 VkDevice* pDevice);
Jon Ashburn13482452015-05-12 17:26:48 -0600165
Jon Ashburne8c90eb2015-05-18 15:28:32 -0600166#if 0
Jon Ashburn13482452015-05-12 17:26:48 -0600167VkResult VKAPI loader_GetGlobalExtensionInfo(
168 VkExtensionInfoType infoType,
169 uint32_t extensionIndex,
170 size_t* pDataSize,
171 void* pData);
Jon Ashburne8c90eb2015-05-18 15:28:32 -0600172#endif
Jon Ashburn13482452015-05-12 17:26:48 -0600173
Jon Ashburnebfa25e2015-05-15 15:09:35 -0600174VkResult loader_GetPhysicalDeviceExtensionInfo(
175 VkPhysicalDevice gpu,
176 VkExtensionInfoType infoType,
177 uint32_t extensionIndex,
178 size_t* pDataSize,
179 void* pData);
180
181VkResult loader_EnumerateLayers(
182 VkPhysicalDevice gpu,
183 size_t maxStringSize,
184 size_t* pLayerCount,
185 char* const* pOutLayers,
186 void* pReserved);
187
188VkResult loader_GetMultiDeviceCompatibility(
189 VkPhysicalDevice gpu0,
190 VkPhysicalDevice gpu1,
191 VkPhysicalDeviceCompatibilityInfo* pInfo);
192
Jon Ashburn13482452015-05-12 17:26:48 -0600193VkResult loader_DbgRegisterMsgCallback(
194 VkInstance instance,
195 VK_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback,
196 void* pUserData);
197
198VkResult loader_DbgUnregisterMsgCallback(
199 VkInstance instance,
200 VK_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback);
201
202VkResult loader_DbgSetGlobalOption(
203 VkInstance instance,
204 VK_DBG_GLOBAL_OPTION dbgOption,
205 size_t dataSize,
206 const void* pData);
207
Jon Ashburnebfa25e2015-05-15 15:09:35 -0600208VkResult loader_GetDisplayInfoWSI(
209 VkDisplayWSI display,
210 VkDisplayInfoTypeWSI infoType,
211 size_t* pDataSize,
212 void* pData);
213
Jon Ashburn13482452015-05-12 17:26:48 -0600214/* function definitions */
215bool loader_is_extension_scanned(const char *name);
216void loader_icd_scan(void);
217void layer_lib_scan(void);
218void loader_coalesce_extensions(void);
Jon Ashburnebfa25e2015-05-15 15:09:35 -0600219struct loader_icd * loader_get_icd(const VkBaseLayerObject *gpu,
220 uint32_t *gpu_index);
Jon Ashburn13482452015-05-12 17:26:48 -0600221uint32_t loader_activate_instance_layers(struct loader_instance *inst);
Chia-I Wuc1e0f962014-08-04 08:03:57 +0800222#endif /* LOADER_H */