blob: 54a97584caed7a47aa446b5552dcb4cbd6fea614 [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
166VkResult VKAPI loader_GetGlobalExtensionInfo(
167 VkExtensionInfoType infoType,
168 uint32_t extensionIndex,
169 size_t* pDataSize,
170 void* pData);
171
Jon Ashburnebfa25e2015-05-15 15:09:35 -0600172VkResult loader_GetPhysicalDeviceExtensionInfo(
173 VkPhysicalDevice gpu,
174 VkExtensionInfoType infoType,
175 uint32_t extensionIndex,
176 size_t* pDataSize,
177 void* pData);
178
179VkResult loader_EnumerateLayers(
180 VkPhysicalDevice gpu,
181 size_t maxStringSize,
182 size_t* pLayerCount,
183 char* const* pOutLayers,
184 void* pReserved);
185
186VkResult loader_GetMultiDeviceCompatibility(
187 VkPhysicalDevice gpu0,
188 VkPhysicalDevice gpu1,
189 VkPhysicalDeviceCompatibilityInfo* pInfo);
190
Jon Ashburn13482452015-05-12 17:26:48 -0600191VkResult loader_DbgRegisterMsgCallback(
192 VkInstance instance,
193 VK_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback,
194 void* pUserData);
195
196VkResult loader_DbgUnregisterMsgCallback(
197 VkInstance instance,
198 VK_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback);
199
200VkResult loader_DbgSetGlobalOption(
201 VkInstance instance,
202 VK_DBG_GLOBAL_OPTION dbgOption,
203 size_t dataSize,
204 const void* pData);
205
Jon Ashburnebfa25e2015-05-15 15:09:35 -0600206VkResult loader_GetDisplayInfoWSI(
207 VkDisplayWSI display,
208 VkDisplayInfoTypeWSI infoType,
209 size_t* pDataSize,
210 void* pData);
211
Jon Ashburn13482452015-05-12 17:26:48 -0600212/* function definitions */
213bool loader_is_extension_scanned(const char *name);
214void loader_icd_scan(void);
215void layer_lib_scan(void);
216void loader_coalesce_extensions(void);
Jon Ashburnebfa25e2015-05-15 15:09:35 -0600217struct loader_icd * loader_get_icd(const VkBaseLayerObject *gpu,
218 uint32_t *gpu_index);
Jon Ashburn13482452015-05-12 17:26:48 -0600219uint32_t loader_activate_instance_layers(struct loader_instance *inst);
Chia-I Wuc1e0f962014-08-04 08:03:57 +0800220#endif /* LOADER_H */