summary refs log tree commit diff
path: root/pkgs/development/libraries/vulkan-loader/use-xdg-paths.patch
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/libraries/vulkan-loader/use-xdg-paths.patch')
-rw-r--r--pkgs/development/libraries/vulkan-loader/use-xdg-paths.patch388
1 files changed, 284 insertions, 104 deletions
diff --git a/pkgs/development/libraries/vulkan-loader/use-xdg-paths.patch b/pkgs/development/libraries/vulkan-loader/use-xdg-paths.patch
index 1ae0f20889fc..eb7869cd73c0 100644
--- a/pkgs/development/libraries/vulkan-loader/use-xdg-paths.patch
+++ b/pkgs/development/libraries/vulkan-loader/use-xdg-paths.patch
@@ -1,142 +1,322 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 27ab6e5..e59256e 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -256,17 +256,10 @@ if(NOT WIN32)
+     include(GNUInstallDirs)
+ 
+     add_definitions(-DSYSCONFDIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}")
+-    add_definitions(-DDATADIR="${CMAKE_INSTALL_FULL_DATADIR}")
+-
+     # Make sure /etc is searched by the loader
+-    if (NOT (CMAKE_INSTALL_FULL_SYSCONFDIR STREQUAL "/etc"))
++    if(NOT (CMAKE_INSTALL_FULL_SYSCONFDIR STREQUAL "/etc"))
+         add_definitions(-DEXTRASYSCONFDIR="/etc")
+     endif()
+-
+-    # Make sure /usr/share is searched by the loader
+-    if (NOT (CMAKE_INSTALL_FULL_DATADIR STREQUAL "/usr/share"))
+-        add_definitions(-DEXTRADATADIR="/usr/share")
+-    endif()
+ endif()
+ 
+ if(UNIX)
 diff --git a/loader/loader.c b/loader/loader.c
-index a950ea1..9462d05 100644
+index 24758f4..af7cc85 100644
 --- a/loader/loader.c
 +++ b/loader/loader.c
-@@ -2671,6 +2671,94 @@ static VkResult loader_get_manifest_files(
-         }
+@@ -2909,7 +2909,7 @@ static VkResult
+ loader_get_manifest_files(const struct loader_instance *inst,
+                           const char *env_override, const char *source_override,
+                           bool is_layer, bool warn_if_not_present,
+-                          const char *location, const char *home_location,
++                          const char *location, const char *relative_location,
+                           struct loader_manifest_files *out_files) {
+     const char * override = NULL;
+     char *override_getenv = NULL;
+@@ -2941,9 +2941,9 @@ loader_get_manifest_files(const struct loader_instance *inst,
      }
  
+ #if !defined(_WIN32)
+-    if (location == NULL && home_location == NULL) {
++    if (location == NULL && relative_location == NULL) {
+ #else
+-    home_location = NULL;
++    relative_location = NULL;
+     if (location == NULL) {
+ #endif
+         loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
+@@ -2962,16 +2962,89 @@ loader_get_manifest_files(const struct loader_instance *inst,
+     // Make a copy of the input we are using so it is not modified
+     // Also handle getting the location(s) from registry on Windows
+     if (override == NULL) {
+-        loc = loader_stack_alloc(strlen(location) + 1);
++        size_t loc_size = strlen(location) + 1;
 +#if !defined(_WIN32)
-+    if (home_location && override == NULL) {
-+        char *xdgconfdirs = secure_getenv("XDG_CONFIG_DIRS");
-+        char *xdgdatadirs = secure_getenv("XDG_DATA_DIRS");
-+        char *cur, *src = loc;
-+        size_t src_size = strlen(src), rel_size = strlen(home_location);
-+        size_t size = 0;
-+
-+        if (src_size > 0)
-+            size += src_size + 1;
-+
-+        if (xdgconfdirs == NULL)
++        const char *xdgconfdirs = secure_getenv("XDG_CONFIG_DIRS");
++        const char *xdgdatadirs = secure_getenv("XDG_DATA_DIRS");
++        if (xdgconfdirs == NULL || xdgconfdirs[0] == '\0')
 +            xdgconfdirs = "/etc/xdg";
-+        if (xdgdatadirs == NULL)
++        if (xdgdatadirs == NULL || xdgdatadirs[0] == '\0')
 +            xdgdatadirs = "/usr/local/share:/usr/share";
-+
-+        for (char *x = xdgconfdirs; *x; ++x)
-+            if (*x == PATH_SEPERATOR) size += rel_size;
-+        size += strlen(xdgconfdirs) + rel_size + 1;
-+        for (char *x = xdgdatadirs; *x; ++x)
-+            if (*x == PATH_SEPERATOR) size += rel_size;
-+        size += strlen(xdgdatadirs) + rel_size + 1;
-+
-+#if defined(LOCALPREFIX)
-+        size += strlen(LOCALPREFIX "/" SYSCONFDIR) + rel_size + 1;
-+        size += strlen(LOCALPREFIX "/" DATADIR) + rel_size + 1;
++        const size_t rel_size = strlen(relative_location);
++        // Leave space for trailing separators
++        loc_size += strlen(xdgconfdirs) + strlen(xdgdatadirs) + 2*rel_size + 2;
++        for (const char *x = xdgconfdirs; *x; ++x)
++            if (*x == PATH_SEPARATOR) loc_size += rel_size;
++        for (const char *x = xdgdatadirs; *x; ++x)
++            if (*x == PATH_SEPARATOR) loc_size += rel_size;
++        loc_size += strlen(SYSCONFDIR) + rel_size + 1;
++#ifdef EXTRASYSCONFDIR
++        loc_size += strlen(EXTRASYSCONFDIR) + rel_size + 1;
 +#endif
++#endif
++        loc = loader_stack_alloc(loc_size);
+         if (loc == NULL) {
+             loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
+                        "loader_get_manifest_files: Failed to allocate "
+                        "%d bytes for manifest file location.",
+-                       strlen(location));
++                       loc_size);
+             res = VK_ERROR_OUT_OF_HOST_MEMORY;
+             goto out;
+         }
+-        strcpy(loc, location);
++        char *loc_write = loc;
++#if !defined(_WIN32)
++        const char *loc_read;
 +
-+        loc = cur = loader_stack_alloc(size);
-+        if (cur == 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;
-+        }
-+
-+        if (src_size > 0) {
-+          memcpy(cur, src, src_size);
-+          cur += src_size;
-+          *cur++ = PATH_SEPERATOR;
-+        }
-+
-+        src = xdgconfdirs;
-+        for (char *x = src;; ++x) {
-+            if (*x == PATH_SEPERATOR || *x == 0) {
-+                size_t s = x - src;
-+                memcpy(cur, src, s); cur += s;
-+                memcpy(cur, home_location, rel_size); cur += rel_size;
-+                *cur++ = PATH_SEPERATOR;
++        loc_read = &xdgconfdirs[0];
++        for (const char *x = loc_read;; ++x) {
++            if (*x == PATH_SEPARATOR || *x == '\0') {
++                const size_t s = x - loc_read;
++                memcpy(loc_write, loc_read, s);
++                loc_write += s;
++                memcpy(loc_write, relative_location, rel_size);
++                loc_write += rel_size;
++                *loc_write++ = PATH_SEPARATOR;
 +                if (*x == 0)
 +                    break;
-+                src = ++x;
++                loc_read = ++x;
 +            }
 +        }
 +
-+#if defined(LOCALPREFIX)
-+        strcpy(cur, LOCALPREFIX "/" SYSCONFDIR);
-+        cur += strlen(cur);
-+        memcpy(cur, home_location, rel_size); cur += rel_size;
-+        *cur++ = PATH_SEPERATOR;
++        memcpy(loc_write, SYSCONFDIR, strlen(SYSCONFDIR));
++        loc_write += strlen(SYSCONFDIR);
++        memcpy(loc_write, relative_location, rel_size);
++        loc_write += rel_size;
++        *loc_write++ = PATH_SEPARATOR;
++
++#ifdef EXTRASYSCONFDIR
++        memcpy(loc_write, EXTRASYSCONFDIR, strlen(EXTRASYSCONFDIR));
++        loc_write += strlen(EXTRASYSCONFDIR);
++        memcpy(loc_write, relative_location, rel_size);
++        loc_write += rel_size;
++        *loc_write++ = PATH_SEPARATOR;
 +#endif
 +
-+        src = xdgdatadirs;
-+        for (char *x = src;; ++x) {
-+            if (*x == PATH_SEPERATOR || *x == 0) {
-+                size_t s = x - src;
-+                memcpy(cur, src, s); cur += s;
-+                memcpy(cur, home_location, rel_size); cur += rel_size;
-+                *cur++ = PATH_SEPERATOR;
++        loc_read = &xdgdatadirs[0];
++        for (const char *x = loc_read;; ++x) {
++            if (*x == PATH_SEPARATOR || *x == '\0') {
++                const size_t s = x - loc_read;
++                memcpy(loc_write, loc_read, s);
++                loc_write += s;
++                memcpy(loc_write, relative_location, rel_size);
++                loc_write += rel_size;
++                *loc_write++ = PATH_SEPARATOR;
 +                if (*x == 0)
 +                    break;
-+                src = ++x;
++                loc_read = ++x;
 +            }
 +        }
-+
-+#if defined(LOCALPREFIX)
-+        strcpy(cur, LOCALPREFIX "/" DATADIR);
-+        cur += strlen(cur);
-+        memcpy(cur, home_location, rel_size); cur += rel_size;
-+        *cur++ = PATH_SEPERATOR;
++        --loc_write;
++        *loc_write = '\0';
++#else
++        memcpy(loc_write, location, loc_size);
++        loc[loc_size-1] = '\0';
 +#endif
 +
-+        loc[size - 1] = 0;
-+        assert(cur == loc + size);
-+        list_is_dirs = true;
-+    }
-+#endif
-+
-     // Print out the paths being searched if debugging is enabled
-     loader_log(inst, VK_DEBUG_REPORT_DEBUG_BIT_EXT, 0,
-                "Searching the following paths for manifest files: %s\n", loc);
+ #if defined(_WIN32)
+         VkResult reg_result = loaderGetRegistryFiles(inst, loc, &reg);
+         if (VK_SUCCESS != reg_result || NULL == reg) {
+@@ -3122,14 +3195,14 @@ loader_get_manifest_files(const struct loader_instance *inst,
+         }
+         file = next_file;
+ #if !defined(_WIN32)
+-        if (home_location != NULL &&
++        if (relative_location != NULL &&
+             (next_file == NULL || *next_file == '\0') && override == NULL) {
+             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));
++                                                    strlen(relative_location));
+                 if (home_loc == NULL) {
+                     loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
+                                "loader_get_manifest_files: Failed to allocate "
+@@ -3139,15 +3212,15 @@ loader_get_manifest_files(const struct loader_instance *inst,
+                 }
+                 strcpy(home_loc, xdgdatahome);
+                 // Add directory separator if needed
+-                if (home_location[0] != DIRECTORY_SYMBOL) {
++                if (relative_location[0] != DIRECTORY_SYMBOL) {
+                     len = strlen(home_loc);
+                     home_loc[len] = DIRECTORY_SYMBOL;
+                     home_loc[len + 1] = '\0';
+                 }
+-                strcat(home_loc, home_location);
++                strcat(home_loc, relative_location);
+                 file = home_loc;
+                 next_file = loader_get_next_path(file);
+-                home_location = NULL;
++                relative_location = NULL;
+ 
+                 loader_log(
+                     inst, VK_DEBUG_REPORT_DEBUG_BIT_EXT, 0,
+@@ -3160,7 +3233,7 @@ loader_get_manifest_files(const struct loader_instance *inst,
+                 char *home = secure_getenv("HOME");
+                 if (home != NULL) {
+                     char *home_loc = loader_stack_alloc(strlen(home) + 16 +
+-                                                        strlen(home_location));
++                                                        strlen(relative_location));
+                     if (home_loc == NULL) {
+                         loader_log(
+                             inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,
+@@ -3178,15 +3251,15 @@ loader_get_manifest_files(const struct loader_instance *inst,
+                     }
+                     strcat(home_loc, ".local/share");
+ 
+-                    if (home_location[0] != DIRECTORY_SYMBOL) {
++                    if (relative_location[0] != DIRECTORY_SYMBOL) {
+                         len = strlen(home_loc);
+                         home_loc[len] = DIRECTORY_SYMBOL;
+                         home_loc[len + 1] = '\0';
+                     }
+-                    strcat(home_loc, home_location);
++                    strcat(home_loc, relative_location);
+                     file = home_loc;
+                     next_file = loader_get_next_path(file);
+-                    home_location = NULL;
++                    relative_location = NULL;
+ 
+                     loader_log(
+                         inst, VK_DEBUG_REPORT_DEBUG_BIT_EXT, 0,
+@@ -3263,7 +3336,7 @@ VkResult loader_icd_scan(const struct loader_instance *inst,
+     // Get a list of manifest files for ICDs
+     res = loader_get_manifest_files(inst, "VK_ICD_FILENAMES", NULL, false, true,
+                                     DEFAULT_VK_DRIVERS_INFO,
+-                                    HOME_VK_DRIVERS_INFO, &manifest_files);
++                                    RELATIVE_VK_DRIVERS_INFO, &manifest_files);
+     if (VK_SUCCESS != res || manifest_files.count == 0) {
+         goto out;
+     }
+@@ -3490,7 +3563,7 @@ void loader_layer_scan(const struct loader_instance *inst,
+     if (VK_SUCCESS !=
+         loader_get_manifest_files(inst, LAYERS_PATH_ENV, LAYERS_SOURCE_PATH,
+                                   true, true, DEFAULT_VK_ELAYERS_INFO,
+-                                  HOME_VK_ELAYERS_INFO, &manifest_files[0])) {
++                                  RELATIVE_VK_ELAYERS_INFO, &manifest_files[0])) {
+         goto out;
+     }
+ 
+@@ -3499,7 +3572,7 @@ void loader_layer_scan(const struct loader_instance *inst,
+     // overridden by LAYERS_PATH_ENV
+     if (VK_SUCCESS != loader_get_manifest_files(inst, NULL, NULL, true, false,
+                                                 DEFAULT_VK_ILAYERS_INFO,
+-                                                HOME_VK_ILAYERS_INFO,
++                                                RELATIVE_VK_ILAYERS_INFO,
+                                                 &manifest_files[1])) {
+         goto out;
+     }
+@@ -3569,7 +3642,7 @@ void loader_implicit_layer_scan(const struct loader_instance *inst,
+     // overridden by LAYERS_PATH_ENV
+     VkResult res = loader_get_manifest_files(
+         inst, NULL, NULL, true, false, DEFAULT_VK_ILAYERS_INFO,
+-        HOME_VK_ILAYERS_INFO, &manifest_files);
++        RELATIVE_VK_ILAYERS_INFO, &manifest_files);
+     if (VK_SUCCESS != res || manifest_files.count == 0) {
+         return;
+     }
 diff --git a/loader/vk_loader_platform.h b/loader/vk_loader_platform.h
-index 3a02640..70a2652 100644
+index dc4ac10..50a7966 100644
 --- a/loader/vk_loader_platform.h
 +++ b/loader/vk_loader_platform.h
-@@ -57,35 +57,10 @@
+@@ -57,47 +57,9 @@
  #define VULKAN_ILAYERCONF_DIR "implicit_layer.d"
  #define VULKAN_LAYER_DIR      "layer"
  
--#if defined(LOCALPREFIX)
--#define LOCAL_DRIVERS_INFO                                                     \
--    LOCALPREFIX "/" SYSCONFDIR VULKAN_DIR VULKAN_ICDCONF_DIR ":"               \
--    LOCALPREFIX "/" DATADIR    VULKAN_DIR VULKAN_ICDCONF_DIR ":"
--#define LOCAL_ELAYERS_INFO                                                     \
--    LOCALPREFIX "/" SYSCONFDIR VULKAN_DIR VULKAN_ELAYERCONF_DIR ":"            \
--    LOCALPREFIX "/" DATADIR    VULKAN_DIR VULKAN_ELAYERCONF_DIR ":"
--#define LOCAL_ILAYERS_INFO                                                     \
--    LOCALPREFIX "/" SYSCONFDIR VULKAN_DIR VULKAN_ILAYERCONF_DIR ":"            \
--    LOCALPREFIX "/" DATADIR    VULKAN_DIR VULKAN_ILAYERCONF_DIR ":"
+-#if defined(EXTRASYSCONFDIR)
+-#define EXTRA_DRIVERS_SYSCONFDIR_INFO ":"                                      \
+-    EXTRASYSCONFDIR VULKAN_DIR VULKAN_ICDCONF_DIR
+-#define EXTRA_ELAYERS_SYSCONFDIR_INFO ":"                                      \
+-    EXTRASYSCONFDIR VULKAN_DIR VULKAN_ELAYERCONF_DIR
+-#define EXTRA_ILAYERS_SYSCONFDIR_INFO ":"                                      \
+-    EXTRASYSCONFDIR VULKAN_DIR VULKAN_ILAYERCONF_DIR
+-#else
+-#define EXTRA_DRIVERS_SYSCONFDIR_INFO
+-#define EXTRA_ELAYERS_SYSCONFDIR_INFO
+-#define EXTRA_ILAYERS_SYSCONFDIR_INFO
+-#endif
+-
+-#if defined(EXTRADATADIR)
+-#define EXTRA_DRIVERS_DATADIR_INFO ":"                                         \
+-    EXTRADATADIR VULKAN_DIR VULKAN_ICDCONF_DIR
+-#define EXTRA_ELAYERS_DATADIR_INFO ":"                                         \
+-    EXTRADATADIR VULKAN_DIR VULKAN_ELAYERCONF_DIR
+-#define EXTRA_ILAYERS_DATADIR_INFO ":"                                         \
+-    EXTRADATADIR VULKAN_DIR VULKAN_ILAYERCONF_DIR
 -#else
--#define LOCAL_DRIVERS_INFO
--#define LOCAL_ELAYERS_INFO
--#define LOCAL_ILAYERS_INFO
+-#define EXTRA_DRIVERS_DATADIR_INFO
+-#define EXTRA_ELAYERS_DATADIR_INFO
+-#define EXTRA_ILAYERS_DATADIR_INFO
 -#endif
 -
 -#define DEFAULT_VK_DRIVERS_INFO                                                \
--    LOCAL_DRIVERS_INFO                                                         \
--    "/"  SYSCONFDIR VULKAN_DIR VULKAN_ICDCONF_DIR ":"                          \
--    "/usr/" DATADIR VULKAN_DIR VULKAN_ICDCONF_DIR
-+#define DEFAULT_VK_DRIVERS_INFO ""
- #define DEFAULT_VK_DRIVERS_PATH ""
+-    SYSCONFDIR   VULKAN_DIR VULKAN_ICDCONF_DIR ":"                             \
+-    DATADIR      VULKAN_DIR VULKAN_ICDCONF_DIR                                 \
+-    EXTRA_DRIVERS_SYSCONFDIR_INFO                                              \
+-    EXTRA_DRIVERS_DATADIR_INFO
 -#define DEFAULT_VK_ELAYERS_INFO                                                \
--    LOCAL_ELAYERS_INFO                                                         \
--    "/"  SYSCONFDIR VULKAN_DIR VULKAN_ELAYERCONF_DIR ":"                       \
--    "/usr/" DATADIR VULKAN_DIR VULKAN_ELAYERCONF_DIR
+-    SYSCONFDIR   VULKAN_DIR VULKAN_ELAYERCONF_DIR ":"                          \
+-    DATADIR      VULKAN_DIR VULKAN_ELAYERCONF_DIR                              \
+-    EXTRA_ELAYERS_SYSCONFDIR_INFO                                              \
+-    EXTRA_ELAYERS_DATADIR_INFO
 -#define DEFAULT_VK_ILAYERS_INFO                                                \
--    LOCAL_ILAYERS_INFO                                                         \
--    "/"  SYSCONFDIR VULKAN_DIR VULKAN_ILAYERCONF_DIR ":"                       \
--    "/usr/" DATADIR VULKAN_DIR VULKAN_ILAYERCONF_DIR
+-    SYSCONFDIR   VULKAN_DIR VULKAN_ILAYERCONF_DIR ":"                          \
+-    DATADIR      VULKAN_DIR VULKAN_ILAYERCONF_DIR                              \
+-    EXTRA_ILAYERS_SYSCONFDIR_INFO                                              \
+-    EXTRA_ILAYERS_DATADIR_INFO
++#define DEFAULT_VK_DRIVERS_INFO ""
 +#define DEFAULT_VK_ELAYERS_INFO ""
 +#define DEFAULT_VK_ILAYERS_INFO ""
- #define DEFAULT_VK_LAYERS_PATH ""
- #if !defined(LAYERS_SOURCE_PATH)
+ 
+ #define DEFAULT_VK_DRIVERS_PATH ""
+ #if !defined(DEFAULT_VK_LAYERS_PATH)
+@@ -109,9 +71,9 @@
+ #endif
+ #define LAYERS_PATH_ENV "VK_LAYER_PATH"
+ 
+-#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
++#define RELATIVE_VK_DRIVERS_INFO VULKAN_DIR VULKAN_ICDCONF_DIR
++#define RELATIVE_VK_ELAYERS_INFO VULKAN_DIR VULKAN_ELAYERCONF_DIR
++#define RELATIVE_VK_ILAYERS_INFO VULKAN_DIR VULKAN_ILAYERCONF_DIR
+ 
+ // C99:
+ #define PRINTF_SIZE_T_SPECIFIER "%zu"
+@@ -251,9 +213,9 @@ loader_platform_thread_cond_broadcast(loader_platform_thread_cond *pCond) {
  #define LAYERS_SOURCE_PATH NULL
+ #endif
+ #define LAYERS_PATH_ENV "VK_LAYER_PATH"
+-#define HOME_VK_DRIVERS_INFO ""
+-#define HOME_VK_ELAYERS_INFO ""
+-#define HOME_VK_ILAYERS_INFO ""
++#define RELATIVE_VK_DRIVERS_INFO ""
++#define RELATIVE_VK_ELAYERS_INFO ""
++#define RELATIVE_VK_ILAYERS_INFO ""
+ #define PRINTF_SIZE_T_SPECIFIER "%Iu"
+ 
+ // File IO