aboutsummaryrefslogtreecommitdiff
path: root/loader
diff options
context:
space:
mode:
Diffstat (limited to 'loader')
-rw-r--r--loader/loader.c58
-rw-r--r--loader/vk_loader_platform.h61
2 files changed, 71 insertions, 48 deletions
diff --git a/loader/loader.c b/loader/loader.c
index d0cdc00b..6b228935 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -2492,8 +2492,9 @@ loader_add_layer_properties(const struct loader_instance *inst,
* location is used to look for manifest files. The location
* is interpreted as Registry path on Windows and a directory path(s)
* on Linux. "home_location" is an additional directory in the users home
- * directory to look at. It is exapanded into the dir path $HOME/home_location.
- * This "home_location" is only used on Linux.
+ * directory to look at. It is expanded into the dir path
+ * $XDG_DATA_HOME/home_location or $HOME/.local/share/home_location depending
+ * on environment variables. This "home_location" is only used on Linux.
*
* \returns
* VKResult
@@ -2707,10 +2708,11 @@ static VkResult loader_get_manifest_files(
#if !defined(_WIN32)
if (home_location != NULL &&
(next_file == NULL || *next_file == '\0') && override == NULL) {
- char *home = secure_getenv("HOME");
- if (home != NULL) {
- size_t len;
- char *home_loc = loader_stack_alloc(strlen(home) + 2 +
+ char *xdgdatahome = secure_getenv("XDG_DATA_HOME");
+ size_t len;
+ if (xdgdatahome != NULL) {
+
+ char *home_loc = loader_stack_alloc(strlen(xdgdatahome) + 2 +
strlen(home_location));
if (home_loc == NULL) {
loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
@@ -2718,7 +2720,7 @@ static VkResult loader_get_manifest_files(
res = VK_ERROR_OUT_OF_HOST_MEMORY;
goto out;
}
- strcpy(home_loc, home);
+ strcpy(home_loc, xdgdatahome);
// Add directory separator if needed
if (home_location[0] != DIRECTORY_SYMBOL) {
len = strlen(home_loc);
@@ -2732,9 +2734,49 @@ static VkResult loader_get_manifest_files(
loader_log(
inst, VK_DEBUG_REPORT_DEBUG_BIT_EXT, 0,
- "Searching the following paths for manifest files: %s\n",
+ "Searching the following path for manifest files: %s\n",
home_loc);
list_is_dirs = true;
+
+ } else {
+
+ char *home = secure_getenv("HOME");
+ if (home != NULL) {
+ char *home_loc = loader_stack_alloc(strlen(home) + 16 +
+ strlen(home_location));
+ if (home_loc == NULL) {
+ loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
+ "Out of memory can't get manifest files");
+ res = VK_ERROR_OUT_OF_HOST_MEMORY;
+ goto out;
+ }
+ strcpy(home_loc, home);
+
+ len = strlen(home);
+ if (home[len] != DIRECTORY_SYMBOL) {
+ home_loc[len] = DIRECTORY_SYMBOL;
+ home_loc[len + 1] = '\0';
+ }
+ strcat(home_loc, ".local/share");
+
+ if (home_location[0] != DIRECTORY_SYMBOL) {
+ len = strlen(home_loc);
+ home_loc[len] = DIRECTORY_SYMBOL;
+ home_loc[len + 1] = '\0';
+ }
+ strcat(home_loc, home_location);
+ file = home_loc;
+ next_file = loader_get_next_path(file);
+ home_location = NULL;
+
+ loader_log(
+ inst, VK_DEBUG_REPORT_DEBUG_BIT_EXT, 0,
+ "Searching the following path for manifest files: %s\n",
+ home_loc);
+ list_is_dirs = true;
+ } else {
+ // without knowing HOME, we just.. give up
+ }
}
}
#endif
diff --git a/loader/vk_loader_platform.h b/loader/vk_loader_platform.h
index d1318539..3a026404 100644
--- a/loader/vk_loader_platform.h
+++ b/loader/vk_loader_platform.h
@@ -50,42 +50,23 @@
#define PATH_SEPERATOR ':'
#define DIRECTORY_SYMBOL '/'
-#define VULKAN_ICDCONF_DIR \
- "/" \
- "vulkan" \
- "/" \
- "icd.d"
-#define VULKAN_ICD_DIR \
- "/" \
- "vulkan" \
- "/" \
- "icd"
-#define VULKAN_ELAYERCONF_DIR \
- "/" \
- "vulkan" \
- "/" \
- "explicit_layer.d"
-#define VULKAN_ILAYERCONF_DIR \
- "/" \
- "vulkan" \
- "/" \
- "implicit_layer.d"
-#define VULKAN_LAYER_DIR \
- "/" \
- "vulkan" \
- "/" \
- "layer"
+#define VULKAN_DIR "/vulkan/"
+#define VULKAN_ICDCONF_DIR "icd.d"
+#define VULKAN_ICD_DIR "icd"
+#define VULKAN_ELAYERCONF_DIR "explicit_layer.d"
+#define VULKAN_ILAYERCONF_DIR "implicit_layer.d"
+#define VULKAN_LAYER_DIR "layer"
#if defined(LOCALPREFIX)
#define LOCAL_DRIVERS_INFO \
- LOCALPREFIX "/" SYSCONFDIR VULKAN_ICDCONF_DIR ":" LOCALPREFIX \
- "/" DATADIR VULKAN_ICDCONF_DIR ":"
+ LOCALPREFIX "/" SYSCONFDIR VULKAN_DIR VULKAN_ICDCONF_DIR ":" \
+ LOCALPREFIX "/" DATADIR VULKAN_DIR VULKAN_ICDCONF_DIR ":"
#define LOCAL_ELAYERS_INFO \
- LOCALPREFIX "/" SYSCONFDIR VULKAN_ELAYERCONF_DIR ":" LOCALPREFIX \
- "/" DATADIR VULKAN_ELAYERCONF_DIR ":"
+ LOCALPREFIX "/" SYSCONFDIR VULKAN_DIR VULKAN_ELAYERCONF_DIR ":" \
+ LOCALPREFIX "/" DATADIR VULKAN_DIR VULKAN_ELAYERCONF_DIR ":"
#define LOCAL_ILAYERS_INFO \
- LOCALPREFIX "/" SYSCONFDIR VULKAN_ILAYERCONF_DIR ":" LOCALPREFIX \
- "/" DATADIR VULKAN_ILAYERCONF_DIR ":"
+ LOCALPREFIX "/" SYSCONFDIR VULKAN_DIR VULKAN_ILAYERCONF_DIR ":" \
+ LOCALPREFIX "/" DATADIR VULKAN_DIR VULKAN_ILAYERCONF_DIR ":"
#else
#define LOCAL_DRIVERS_INFO
#define LOCAL_ELAYERS_INFO
@@ -94,25 +75,25 @@
#define DEFAULT_VK_DRIVERS_INFO \
LOCAL_DRIVERS_INFO \
- "/" SYSCONFDIR VULKAN_ICDCONF_DIR ":" \
- "/usr/" DATADIR VULKAN_ICDCONF_DIR
+ "/" SYSCONFDIR VULKAN_DIR VULKAN_ICDCONF_DIR ":" \
+ "/usr/" DATADIR VULKAN_DIR VULKAN_ICDCONF_DIR
#define DEFAULT_VK_DRIVERS_PATH ""
#define DEFAULT_VK_ELAYERS_INFO \
LOCAL_ELAYERS_INFO \
- "/" SYSCONFDIR VULKAN_ELAYERCONF_DIR ":" \
- "/usr/" DATADIR VULKAN_ELAYERCONF_DIR
+ "/" SYSCONFDIR VULKAN_DIR VULKAN_ELAYERCONF_DIR ":" \
+ "/usr/" DATADIR VULKAN_DIR VULKAN_ELAYERCONF_DIR
#define DEFAULT_VK_ILAYERS_INFO \
LOCAL_ILAYERS_INFO \
- "/" SYSCONFDIR VULKAN_ILAYERCONF_DIR ":" \
- "/usr/" DATADIR VULKAN_ILAYERCONF_DIR
+ "/" SYSCONFDIR VULKAN_DIR VULKAN_ILAYERCONF_DIR ":" \
+ "/usr/" DATADIR VULKAN_DIR VULKAN_ILAYERCONF_DIR
#define DEFAULT_VK_LAYERS_PATH ""
#if !defined(LAYERS_SOURCE_PATH)
#define LAYERS_SOURCE_PATH NULL
#endif
#define LAYERS_PATH_ENV "VK_LAYER_PATH"
-#define HOME_VK_DRIVERS_INFO "/.local/share" VULKAN_ICDCONF_DIR
-#define HOME_VK_ELAYERS_INFO "/.local/share" VULKAN_ELAYERCONF_DIR
-#define HOME_VK_ILAYERS_INFO "/.local/share" VULKAN_ILAYERCONF_DIR
+#define HOME_VK_DRIVERS_INFO VULKAN_DIR VULKAN_ICDCONF_DIR
+#define HOME_VK_ELAYERS_INFO VULKAN_DIR VULKAN_ELAYERCONF_DIR
+#define HOME_VK_ILAYERS_INFO VULKAN_DIR VULKAN_ILAYERCONF_DIR
// C99:
#define PRINTF_SIZE_T_SPECIFIER "%zu"