···
1
+
diff --git a/CMakeLists.txt b/CMakeLists.txt
2
+
index 27ab6e5..e59256e 100644
5
+
@@ -256,17 +256,10 @@ if(NOT WIN32)
6
+
include(GNUInstallDirs)
8
+
add_definitions(-DSYSCONFDIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}")
9
+
- add_definitions(-DDATADIR="${CMAKE_INSTALL_FULL_DATADIR}")
11
+
# Make sure /etc is searched by the loader
12
+
- if (NOT (CMAKE_INSTALL_FULL_SYSCONFDIR STREQUAL "/etc"))
13
+
+ if(NOT (CMAKE_INSTALL_FULL_SYSCONFDIR STREQUAL "/etc"))
14
+
add_definitions(-DEXTRASYSCONFDIR="/etc")
17
+
- # Make sure /usr/share is searched by the loader
18
+
- if (NOT (CMAKE_INSTALL_FULL_DATADIR STREQUAL "/usr/share"))
19
+
- add_definitions(-DEXTRADATADIR="/usr/share")
diff --git a/loader/loader.c b/loader/loader.c
2
-
index a950ea1..9462d05 100644
25
+
index 24758f4..af7cc85 100644
5
-
@@ -2671,6 +2671,94 @@ static VkResult loader_get_manifest_files(
28
+
@@ -2909,7 +2909,7 @@ static VkResult
29
+
loader_get_manifest_files(const struct loader_instance *inst,
30
+
const char *env_override, const char *source_override,
31
+
bool is_layer, bool warn_if_not_present,
32
+
- const char *location, const char *home_location,
33
+
+ const char *location, const char *relative_location,
34
+
struct loader_manifest_files *out_files) {
35
+
const char * override = NULL;
36
+
char *override_getenv = NULL;
37
+
@@ -2941,9 +2941,9 @@ loader_get_manifest_files(const struct loader_instance *inst,
40
+
#if !defined(_WIN32)
41
+
- if (location == NULL && home_location == NULL) {
42
+
+ if (location == NULL && relative_location == NULL) {
44
+
- home_location = NULL;
45
+
+ relative_location = NULL;
46
+
if (location == NULL) {
48
+
loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
49
+
@@ -2962,16 +2962,89 @@ loader_get_manifest_files(const struct loader_instance *inst,
50
+
// Make a copy of the input we are using so it is not modified
51
+
// Also handle getting the location(s) from registry on Windows
52
+
if (override == NULL) {
53
+
- loc = loader_stack_alloc(strlen(location) + 1);
54
+
+ size_t loc_size = strlen(location) + 1;
10
-
+ if (home_location && override == NULL) {
11
-
+ char *xdgconfdirs = secure_getenv("XDG_CONFIG_DIRS");
12
-
+ char *xdgdatadirs = secure_getenv("XDG_DATA_DIRS");
13
-
+ char *cur, *src = loc;
14
-
+ size_t src_size = strlen(src), rel_size = strlen(home_location);
18
-
+ size += src_size + 1;
20
-
+ if (xdgconfdirs == NULL)
56
+
+ const char *xdgconfdirs = secure_getenv("XDG_CONFIG_DIRS");
57
+
+ const char *xdgdatadirs = secure_getenv("XDG_DATA_DIRS");
58
+
+ if (xdgconfdirs == NULL || xdgconfdirs[0] == '\0')
+ xdgconfdirs = "/etc/xdg";
22
-
+ if (xdgdatadirs == NULL)
60
+
+ if (xdgdatadirs == NULL || xdgdatadirs[0] == '\0')
+ xdgdatadirs = "/usr/local/share:/usr/share";
25
-
+ for (char *x = xdgconfdirs; *x; ++x)
26
-
+ if (*x == PATH_SEPERATOR) size += rel_size;
27
-
+ size += strlen(xdgconfdirs) + rel_size + 1;
28
-
+ for (char *x = xdgdatadirs; *x; ++x)
29
-
+ if (*x == PATH_SEPERATOR) size += rel_size;
30
-
+ size += strlen(xdgdatadirs) + rel_size + 1;
32
-
+#if defined(LOCALPREFIX)
33
-
+ size += strlen(LOCALPREFIX "/" SYSCONFDIR) + rel_size + 1;
34
-
+ size += strlen(LOCALPREFIX "/" DATADIR) + rel_size + 1;
62
+
+ const size_t rel_size = strlen(relative_location);
63
+
+ // Leave space for trailing separators
64
+
+ loc_size += strlen(xdgconfdirs) + strlen(xdgdatadirs) + 2*rel_size + 2;
65
+
+ for (const char *x = xdgconfdirs; *x; ++x)
66
+
+ if (*x == PATH_SEPARATOR) loc_size += rel_size;
67
+
+ for (const char *x = xdgdatadirs; *x; ++x)
68
+
+ if (*x == PATH_SEPARATOR) loc_size += rel_size;
69
+
+ loc_size += strlen(SYSCONFDIR) + rel_size + 1;
70
+
+#ifdef EXTRASYSCONFDIR
71
+
+ loc_size += strlen(EXTRASYSCONFDIR) + rel_size + 1;
37
-
+ loc = cur = loader_stack_alloc(size);
38
-
+ if (cur == NULL) {
39
-
+ loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
40
-
+ "Out of memory can't get manifest files");
41
-
+ res = VK_ERROR_OUT_OF_HOST_MEMORY;
74
+
+ loc = loader_stack_alloc(loc_size);
76
+
loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
77
+
"loader_get_manifest_files: Failed to allocate "
78
+
"%d bytes for manifest file location.",
79
+
- strlen(location));
81
+
res = VK_ERROR_OUT_OF_HOST_MEMORY;
84
+
- strcpy(loc, location);
85
+
+ char *loc_write = loc;
86
+
+#if !defined(_WIN32)
87
+
+ const char *loc_read;
45
-
+ if (src_size > 0) {
46
-
+ memcpy(cur, src, src_size);
48
-
+ *cur++ = PATH_SEPERATOR;
51
-
+ src = xdgconfdirs;
52
-
+ for (char *x = src;; ++x) {
53
-
+ if (*x == PATH_SEPERATOR || *x == 0) {
54
-
+ size_t s = x - src;
55
-
+ memcpy(cur, src, s); cur += s;
56
-
+ memcpy(cur, home_location, rel_size); cur += rel_size;
57
-
+ *cur++ = PATH_SEPERATOR;
89
+
+ loc_read = &xdgconfdirs[0];
90
+
+ for (const char *x = loc_read;; ++x) {
91
+
+ if (*x == PATH_SEPARATOR || *x == '\0') {
92
+
+ const size_t s = x - loc_read;
93
+
+ memcpy(loc_write, loc_read, s);
95
+
+ memcpy(loc_write, relative_location, rel_size);
96
+
+ loc_write += rel_size;
97
+
+ *loc_write++ = PATH_SEPARATOR;
64
-
+#if defined(LOCALPREFIX)
65
-
+ strcpy(cur, LOCALPREFIX "/" SYSCONFDIR);
66
-
+ cur += strlen(cur);
67
-
+ memcpy(cur, home_location, rel_size); cur += rel_size;
68
-
+ *cur++ = PATH_SEPERATOR;
104
+
+ memcpy(loc_write, SYSCONFDIR, strlen(SYSCONFDIR));
105
+
+ loc_write += strlen(SYSCONFDIR);
106
+
+ memcpy(loc_write, relative_location, rel_size);
107
+
+ loc_write += rel_size;
108
+
+ *loc_write++ = PATH_SEPARATOR;
110
+
+#ifdef EXTRASYSCONFDIR
111
+
+ memcpy(loc_write, EXTRASYSCONFDIR, strlen(EXTRASYSCONFDIR));
112
+
+ loc_write += strlen(EXTRASYSCONFDIR);
113
+
+ memcpy(loc_write, relative_location, rel_size);
114
+
+ loc_write += rel_size;
115
+
+ *loc_write++ = PATH_SEPARATOR;
71
-
+ src = xdgdatadirs;
72
-
+ for (char *x = src;; ++x) {
73
-
+ if (*x == PATH_SEPERATOR || *x == 0) {
74
-
+ size_t s = x - src;
75
-
+ memcpy(cur, src, s); cur += s;
76
-
+ memcpy(cur, home_location, rel_size); cur += rel_size;
77
-
+ *cur++ = PATH_SEPERATOR;
118
+
+ loc_read = &xdgdatadirs[0];
119
+
+ for (const char *x = loc_read;; ++x) {
120
+
+ if (*x == PATH_SEPARATOR || *x == '\0') {
121
+
+ const size_t s = x - loc_read;
122
+
+ memcpy(loc_write, loc_read, s);
124
+
+ memcpy(loc_write, relative_location, rel_size);
125
+
+ loc_write += rel_size;
126
+
+ *loc_write++ = PATH_SEPARATOR;
84
-
+#if defined(LOCALPREFIX)
85
-
+ strcpy(cur, LOCALPREFIX "/" DATADIR);
86
-
+ cur += strlen(cur);
87
-
+ memcpy(cur, home_location, rel_size); cur += rel_size;
88
-
+ *cur++ = PATH_SEPERATOR;
91
-
+ loc[size - 1] = 0;
92
-
+ assert(cur == loc + size);
93
-
+ list_is_dirs = true;
133
+
+ *loc_write = '\0';
135
+
+ memcpy(loc_write, location, loc_size);
136
+
+ loc[loc_size-1] = '\0';
97
-
// Print out the paths being searched if debugging is enabled
98
-
loader_log(inst, VK_DEBUG_REPORT_DEBUG_BIT_EXT, 0,
99
-
"Searching the following paths for manifest files: %s\n", loc);
139
+
#if defined(_WIN32)
140
+
VkResult reg_result = loaderGetRegistryFiles(inst, loc, ®);
141
+
if (VK_SUCCESS != reg_result || NULL == reg) {
142
+
@@ -3122,14 +3195,14 @@ loader_get_manifest_files(const struct loader_instance *inst,
145
+
#if !defined(_WIN32)
146
+
- if (home_location != NULL &&
147
+
+ if (relative_location != NULL &&
148
+
(next_file == NULL || *next_file == '\0') && override == NULL) {
149
+
char *xdgdatahome = secure_getenv("XDG_DATA_HOME");
151
+
if (xdgdatahome != NULL) {
153
+
char *home_loc = loader_stack_alloc(strlen(xdgdatahome) + 2 +
154
+
- strlen(home_location));
155
+
+ strlen(relative_location));
156
+
if (home_loc == NULL) {
157
+
loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
158
+
"loader_get_manifest_files: Failed to allocate "
159
+
@@ -3139,15 +3212,15 @@ loader_get_manifest_files(const struct loader_instance *inst,
161
+
strcpy(home_loc, xdgdatahome);
162
+
// Add directory separator if needed
163
+
- if (home_location[0] != DIRECTORY_SYMBOL) {
164
+
+ if (relative_location[0] != DIRECTORY_SYMBOL) {
165
+
len = strlen(home_loc);
166
+
home_loc[len] = DIRECTORY_SYMBOL;
167
+
home_loc[len + 1] = '\0';
169
+
- strcat(home_loc, home_location);
170
+
+ strcat(home_loc, relative_location);
172
+
next_file = loader_get_next_path(file);
173
+
- home_location = NULL;
174
+
+ relative_location = NULL;
177
+
inst, VK_DEBUG_REPORT_DEBUG_BIT_EXT, 0,
178
+
@@ -3160,7 +3233,7 @@ loader_get_manifest_files(const struct loader_instance *inst,
179
+
char *home = secure_getenv("HOME");
180
+
if (home != NULL) {
181
+
char *home_loc = loader_stack_alloc(strlen(home) + 16 +
182
+
- strlen(home_location));
183
+
+ strlen(relative_location));
184
+
if (home_loc == NULL) {
186
+
inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
187
+
@@ -3178,15 +3251,15 @@ loader_get_manifest_files(const struct loader_instance *inst,
189
+
strcat(home_loc, ".local/share");
191
+
- if (home_location[0] != DIRECTORY_SYMBOL) {
192
+
+ if (relative_location[0] != DIRECTORY_SYMBOL) {
193
+
len = strlen(home_loc);
194
+
home_loc[len] = DIRECTORY_SYMBOL;
195
+
home_loc[len + 1] = '\0';
197
+
- strcat(home_loc, home_location);
198
+
+ strcat(home_loc, relative_location);
200
+
next_file = loader_get_next_path(file);
201
+
- home_location = NULL;
202
+
+ relative_location = NULL;
205
+
inst, VK_DEBUG_REPORT_DEBUG_BIT_EXT, 0,
206
+
@@ -3263,7 +3336,7 @@ VkResult loader_icd_scan(const struct loader_instance *inst,
207
+
// Get a list of manifest files for ICDs
208
+
res = loader_get_manifest_files(inst, "VK_ICD_FILENAMES", NULL, false, true,
209
+
DEFAULT_VK_DRIVERS_INFO,
210
+
- HOME_VK_DRIVERS_INFO, &manifest_files);
211
+
+ RELATIVE_VK_DRIVERS_INFO, &manifest_files);
212
+
if (VK_SUCCESS != res || manifest_files.count == 0) {
215
+
@@ -3490,7 +3563,7 @@ void loader_layer_scan(const struct loader_instance *inst,
217
+
loader_get_manifest_files(inst, LAYERS_PATH_ENV, LAYERS_SOURCE_PATH,
218
+
true, true, DEFAULT_VK_ELAYERS_INFO,
219
+
- HOME_VK_ELAYERS_INFO, &manifest_files[0])) {
220
+
+ RELATIVE_VK_ELAYERS_INFO, &manifest_files[0])) {
224
+
@@ -3499,7 +3572,7 @@ void loader_layer_scan(const struct loader_instance *inst,
225
+
// overridden by LAYERS_PATH_ENV
226
+
if (VK_SUCCESS != loader_get_manifest_files(inst, NULL, NULL, true, false,
227
+
DEFAULT_VK_ILAYERS_INFO,
228
+
- HOME_VK_ILAYERS_INFO,
229
+
+ RELATIVE_VK_ILAYERS_INFO,
230
+
&manifest_files[1])) {
233
+
@@ -3569,7 +3642,7 @@ void loader_implicit_layer_scan(const struct loader_instance *inst,
234
+
// overridden by LAYERS_PATH_ENV
235
+
VkResult res = loader_get_manifest_files(
236
+
inst, NULL, NULL, true, false, DEFAULT_VK_ILAYERS_INFO,
237
+
- HOME_VK_ILAYERS_INFO, &manifest_files);
238
+
+ RELATIVE_VK_ILAYERS_INFO, &manifest_files);
239
+
if (VK_SUCCESS != res || manifest_files.count == 0) {
diff --git a/loader/vk_loader_platform.h b/loader/vk_loader_platform.h
101
-
index 3a02640..70a2652 100644
243
+
index dc4ac10..50a7966 100644
--- a/loader/vk_loader_platform.h
+++ b/loader/vk_loader_platform.h
104
-
@@ -57,35 +57,10 @@
#define VULKAN_ILAYERCONF_DIR "implicit_layer.d"
#define VULKAN_LAYER_DIR "layer"
108
-
-#if defined(LOCALPREFIX)
109
-
-#define LOCAL_DRIVERS_INFO \
110
-
- LOCALPREFIX "/" SYSCONFDIR VULKAN_DIR VULKAN_ICDCONF_DIR ":" \
111
-
- LOCALPREFIX "/" DATADIR VULKAN_DIR VULKAN_ICDCONF_DIR ":"
112
-
-#define LOCAL_ELAYERS_INFO \
113
-
- LOCALPREFIX "/" SYSCONFDIR VULKAN_DIR VULKAN_ELAYERCONF_DIR ":" \
114
-
- LOCALPREFIX "/" DATADIR VULKAN_DIR VULKAN_ELAYERCONF_DIR ":"
115
-
-#define LOCAL_ILAYERS_INFO \
116
-
- LOCALPREFIX "/" SYSCONFDIR VULKAN_DIR VULKAN_ILAYERCONF_DIR ":" \
117
-
- LOCALPREFIX "/" DATADIR VULKAN_DIR VULKAN_ILAYERCONF_DIR ":"
250
+
-#if defined(EXTRASYSCONFDIR)
251
+
-#define EXTRA_DRIVERS_SYSCONFDIR_INFO ":" \
252
+
- EXTRASYSCONFDIR VULKAN_DIR VULKAN_ICDCONF_DIR
253
+
-#define EXTRA_ELAYERS_SYSCONFDIR_INFO ":" \
254
+
- EXTRASYSCONFDIR VULKAN_DIR VULKAN_ELAYERCONF_DIR
255
+
-#define EXTRA_ILAYERS_SYSCONFDIR_INFO ":" \
256
+
- EXTRASYSCONFDIR VULKAN_DIR VULKAN_ILAYERCONF_DIR
258
+
-#define EXTRA_DRIVERS_SYSCONFDIR_INFO
259
+
-#define EXTRA_ELAYERS_SYSCONFDIR_INFO
260
+
-#define EXTRA_ILAYERS_SYSCONFDIR_INFO
263
+
-#if defined(EXTRADATADIR)
264
+
-#define EXTRA_DRIVERS_DATADIR_INFO ":" \
265
+
- EXTRADATADIR VULKAN_DIR VULKAN_ICDCONF_DIR
266
+
-#define EXTRA_ELAYERS_DATADIR_INFO ":" \
267
+
- EXTRADATADIR VULKAN_DIR VULKAN_ELAYERCONF_DIR
268
+
-#define EXTRA_ILAYERS_DATADIR_INFO ":" \
269
+
- EXTRADATADIR VULKAN_DIR VULKAN_ILAYERCONF_DIR
119
-
-#define LOCAL_DRIVERS_INFO
120
-
-#define LOCAL_ELAYERS_INFO
121
-
-#define LOCAL_ILAYERS_INFO
271
+
-#define EXTRA_DRIVERS_DATADIR_INFO
272
+
-#define EXTRA_ELAYERS_DATADIR_INFO
273
+
-#define EXTRA_ILAYERS_DATADIR_INFO
-#define DEFAULT_VK_DRIVERS_INFO \
125
-
- LOCAL_DRIVERS_INFO \
126
-
- "/" SYSCONFDIR VULKAN_DIR VULKAN_ICDCONF_DIR ":" \
127
-
- "/usr/" DATADIR VULKAN_DIR VULKAN_ICDCONF_DIR
128
-
+#define DEFAULT_VK_DRIVERS_INFO ""
129
-
#define DEFAULT_VK_DRIVERS_PATH ""
277
+
- SYSCONFDIR VULKAN_DIR VULKAN_ICDCONF_DIR ":" \
278
+
- DATADIR VULKAN_DIR VULKAN_ICDCONF_DIR \
279
+
- EXTRA_DRIVERS_SYSCONFDIR_INFO \
280
+
- EXTRA_DRIVERS_DATADIR_INFO
-#define DEFAULT_VK_ELAYERS_INFO \
131
-
- LOCAL_ELAYERS_INFO \
132
-
- "/" SYSCONFDIR VULKAN_DIR VULKAN_ELAYERCONF_DIR ":" \
133
-
- "/usr/" DATADIR VULKAN_DIR VULKAN_ELAYERCONF_DIR
282
+
- SYSCONFDIR VULKAN_DIR VULKAN_ELAYERCONF_DIR ":" \
283
+
- DATADIR VULKAN_DIR VULKAN_ELAYERCONF_DIR \
284
+
- EXTRA_ELAYERS_SYSCONFDIR_INFO \
285
+
- EXTRA_ELAYERS_DATADIR_INFO
-#define DEFAULT_VK_ILAYERS_INFO \
135
-
- LOCAL_ILAYERS_INFO \
136
-
- "/" SYSCONFDIR VULKAN_DIR VULKAN_ILAYERCONF_DIR ":" \
137
-
- "/usr/" DATADIR VULKAN_DIR VULKAN_ILAYERCONF_DIR
287
+
- SYSCONFDIR VULKAN_DIR VULKAN_ILAYERCONF_DIR ":" \
288
+
- DATADIR VULKAN_DIR VULKAN_ILAYERCONF_DIR \
289
+
- EXTRA_ILAYERS_SYSCONFDIR_INFO \
290
+
- EXTRA_ILAYERS_DATADIR_INFO
291
+
+#define DEFAULT_VK_DRIVERS_INFO ""
+#define DEFAULT_VK_ELAYERS_INFO ""
+#define DEFAULT_VK_ILAYERS_INFO ""
140
-
#define DEFAULT_VK_LAYERS_PATH ""
141
-
#if !defined(LAYERS_SOURCE_PATH)
295
+
#define DEFAULT_VK_DRIVERS_PATH ""
296
+
#if !defined(DEFAULT_VK_LAYERS_PATH)
299
+
#define LAYERS_PATH_ENV "VK_LAYER_PATH"
301
+
-#define HOME_VK_DRIVERS_INFO VULKAN_DIR VULKAN_ICDCONF_DIR
302
+
-#define HOME_VK_ELAYERS_INFO VULKAN_DIR VULKAN_ELAYERCONF_DIR
303
+
-#define HOME_VK_ILAYERS_INFO VULKAN_DIR VULKAN_ILAYERCONF_DIR
304
+
+#define RELATIVE_VK_DRIVERS_INFO VULKAN_DIR VULKAN_ICDCONF_DIR
305
+
+#define RELATIVE_VK_ELAYERS_INFO VULKAN_DIR VULKAN_ELAYERCONF_DIR
306
+
+#define RELATIVE_VK_ILAYERS_INFO VULKAN_DIR VULKAN_ILAYERCONF_DIR
309
+
#define PRINTF_SIZE_T_SPECIFIER "%zu"
310
+
@@ -251,9 +213,9 @@ loader_platform_thread_cond_broadcast(loader_platform_thread_cond *pCond) {
#define LAYERS_SOURCE_PATH NULL
313
+
#define LAYERS_PATH_ENV "VK_LAYER_PATH"
314
+
-#define HOME_VK_DRIVERS_INFO ""
315
+
-#define HOME_VK_ELAYERS_INFO ""
316
+
-#define HOME_VK_ILAYERS_INFO ""
317
+
+#define RELATIVE_VK_DRIVERS_INFO ""
318
+
+#define RELATIVE_VK_ELAYERS_INFO ""
319
+
+#define RELATIVE_VK_ILAYERS_INFO ""
320
+
#define PRINTF_SIZE_T_SPECIFIER "%Iu"