blob: c2e15a574415a274a986d0fa8cf4ba2a5d5ba615 [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
60struct loader_instance {
61 VkLayerInstanceDispatchTable *disp;
62 uint32_t layer_count;
63 struct loader_layers layer_libs[MAX_LAYER_LIBRARIES];
64 VkBaseLayerObject *wrappedInstance;
65 uint32_t total_gpu_count;
66 struct loader_icd *icds;
67 struct loader_instance *next;
68 uint32_t extension_count;
69 char **extension_names;
70};
71
72struct loader_struct {
73 struct loader_instance *instances;
74 bool icds_scanned;
75 struct loader_scanned_icds *scanned_icd_list;
76 bool layer_scanned;
77 char *layer_dirs;
78 unsigned int scanned_layer_count;
79 struct loader_scanned_layers scanned_layers[MAX_LAYER_LIBRARIES];
80 size_t scanned_ext_list_capacity;
81 uint32_t scanned_ext_list_count; // coalesced from all layers/drivers
82 struct extension_property **scanned_ext_list;
83};
84
Jon Ashburn62a54d12015-05-01 18:00:33 -060085static inline void loader_set_dispatch(VkObject obj, const void *data)
Chia-I Wufe333ed2015-04-11 15:34:07 +080086{
87 *((const void **) obj) = data;
88}
89
Jon Ashburn62a54d12015-05-01 18:00:33 -060090static inline VkLayerDispatchTable *loader_get_dispatch(const VkObject obj)
Chia-I Wufe333ed2015-04-11 15:34:07 +080091{
Jon Ashburn62a54d12015-05-01 18:00:33 -060092 return *((VkLayerDispatchTable **) obj);
Chia-I Wufe333ed2015-04-11 15:34:07 +080093}
94
Jon Ashburn13482452015-05-12 17:26:48 -060095static inline VkLayerInstanceDispatchTable *loader_get_instance_dispatch(const VkObject obj)
96{
97 return *((VkLayerInstanceDispatchTable **) obj);
98}
99
Jon Ashburn62a54d12015-05-01 18:00:33 -0600100static inline void loader_init_dispatch(VkObject obj, const void *data)
Chia-I Wufe333ed2015-04-11 15:34:07 +0800101{
Jon Ashburn167b2b12015-04-15 13:34:33 -0600102#ifdef DEBUG
Chia-I Wufe333ed2015-04-11 15:34:07 +0800103 assert(valid_loader_magic_value(obj) &&
104 "Incompatible ICD, first dword must be initialized to ICD_LOADER_MAGIC. See loader/README.md for details.");
Jon Ashburn167b2b12015-04-15 13:34:33 -0600105#endif
Chia-I Wufe333ed2015-04-11 15:34:07 +0800106
Jon Ashburn62a54d12015-05-01 18:00:33 -0600107 loader_set_dispatch(obj, data);
Chia-I Wufe333ed2015-04-11 15:34:07 +0800108}
109
Jon Ashburn13482452015-05-12 17:26:48 -0600110/* global variables used across files */
111extern struct loader_struct loader;
112extern LOADER_PLATFORM_THREAD_ONCE_DEFINITION(once_icd);
113extern LOADER_PLATFORM_THREAD_ONCE_DEFINITION(once_layer);
114extern LOADER_PLATFORM_THREAD_ONCE_DEFINITION(once_exts);
115extern VkLayerInstanceDispatchTable instance_disp;
Jon Ashburn37e7f972015-04-06 10:58:22 -0600116
Jon Ashburn13482452015-05-12 17:26:48 -0600117/* instance layer chain termination entrypoint definitions */
118VkResult loader_CreateInstance(
119 const VkInstanceCreateInfo* pCreateInfo,
120 VkInstance* pInstance);
Chia-I Wufe333ed2015-04-11 15:34:07 +0800121
Jon Ashburn13482452015-05-12 17:26:48 -0600122VkResult loader_DestroyInstance(
123 VkInstance instance);
124
125VkResult loader_EnumeratePhysicalDevices(
126 VkInstance instance,
127 uint32_t* pPhysicalDeviceCount,
128 VkPhysicalDevice* pPhysicalDevices);
129
130VkResult VKAPI loader_GetGlobalExtensionInfo(
131 VkExtensionInfoType infoType,
132 uint32_t extensionIndex,
133 size_t* pDataSize,
134 void* pData);
135
136VkResult loader_DbgRegisterMsgCallback(
137 VkInstance instance,
138 VK_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback,
139 void* pUserData);
140
141VkResult loader_DbgUnregisterMsgCallback(
142 VkInstance instance,
143 VK_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback);
144
145VkResult loader_DbgSetGlobalOption(
146 VkInstance instance,
147 VK_DBG_GLOBAL_OPTION dbgOption,
148 size_t dataSize,
149 const void* pData);
150
151/* function definitions */
152bool loader_is_extension_scanned(const char *name);
153void loader_icd_scan(void);
154void layer_lib_scan(void);
155void loader_coalesce_extensions(void);
156uint32_t loader_activate_instance_layers(struct loader_instance *inst);
Chia-I Wuc1e0f962014-08-04 08:03:57 +0800157#endif /* LOADER_H */