diff --git a/bin/meson.build b/bin/meson.build index 8761bde2f682be618c6971921dc426b9311cda61..c99713ded380b34a9537829a17e0d474f3e1fc41 100644 --- a/bin/meson.build +++ b/bin/meson.build @@ -24,7 +24,7 @@ executable( 'steam-runtime-system-info', 'system-info.c', - dependencies : [glib, libsteamrt_dep, json_glib], + dependencies : [glib, json_glib, libsteamrt_dep], install : true, # Use the adjacent libsteam-runtime-tools and json-glib, ignoring # LD_LIBRARY_PATH even if set diff --git a/bin/system-info.c b/bin/system-info.c index 413ecb4181711ff468c66feb845e4d91ca373fad..fc8769ced7e5461d5e7abebc852993f0d2fa9f50 100644 --- a/bin/system-info.c +++ b/bin/system-info.c @@ -449,6 +449,56 @@ print_graphics_details(JsonBuilder *builder, json_builder_end_object (builder); // End garphics-details } +static void +print_dri_details (JsonBuilder *builder, + GList *dri_list) +{ + GList *iter; + + json_builder_set_member_name (builder, "dri_drivers"); + json_builder_begin_array (builder); + { + for (iter = dri_list; iter != NULL; iter = iter->next) + { + json_builder_begin_object (builder); + json_builder_set_member_name (builder, "library_path"); + json_builder_add_string_value (builder, srt_dri_driver_get_library_path (iter->data)); + if (srt_dri_driver_is_extra (iter->data)) + { + json_builder_set_member_name (builder, "is_extra"); + json_builder_add_boolean_value (builder, TRUE); + } + json_builder_end_object (builder); + } + } + json_builder_end_array (builder); // End dri_drivers +} + +static void +print_va_api_details (JsonBuilder *builder, + GList *va_api_list) +{ + GList *iter; + + json_builder_set_member_name (builder, "va-api_drivers"); + json_builder_begin_array (builder); + { + for (iter = va_api_list; iter != NULL; iter = iter->next) + { + json_builder_begin_object (builder); + json_builder_set_member_name (builder, "library_path"); + json_builder_add_string_value (builder, srt_va_api_driver_get_library_path (iter->data)); + if (srt_va_api_driver_is_extra (iter->data)) + { + json_builder_set_member_name (builder, "is_extra"); + json_builder_add_boolean_value (builder, TRUE); + } + json_builder_end_object (builder); + } + } + json_builder_end_array (builder); // End va-api_drivers +} + static const char * const locales[] = { "", @@ -758,6 +808,8 @@ main (int argc, for (gsize i = 0; i < G_N_ELEMENTS (multiarch_tuples) - 1; i++) { GList *libraries = NULL; + GList *dri_list = NULL; + GList *va_api_list = NULL; json_builder_set_member_name (builder, multiarch_tuples[i]); json_builder_begin_object (builder); @@ -781,12 +833,21 @@ main (int argc, GList *graphics_list = srt_system_info_check_all_graphics (info, multiarch_tuples[i]); - print_graphics_details (builder, graphics_list); + dri_list = srt_system_info_list_dri_drivers (info, multiarch_tuples[i], + SRT_DRIVER_FLAGS_INCLUDE_ALL); + print_dri_details (builder, dri_list); + + va_api_list = srt_system_info_list_va_api_drivers (info, multiarch_tuples[i], + SRT_DRIVER_FLAGS_INCLUDE_ALL); + print_va_api_details (builder, va_api_list); + json_builder_end_object (builder); // End multiarch_tuple object g_list_free_full (libraries, g_object_unref); g_list_free_full (graphics_list, g_object_unref); + g_list_free_full (dri_list, g_object_unref); + g_list_free_full (va_api_list, g_object_unref); } json_builder_end_object (builder); diff --git a/bin/system-info.md b/bin/system-info.md index b762c2f358b6a5700ce7f8e2b3d3f8cd176da018..154f97d93febcda05463a85c8d5d307d3547e38c 100644 --- a/bin/system-info.md +++ b/bin/system-info.md @@ -413,6 +413,34 @@ keys: : The test to see if drawing works for the given graphics mode had an error and was unable to draw. + **dri_drivers** + : An array of objects describing the Mesa DRI driver modules that have been + found. These drivers are used by Mesa and by older versions of Xorg. + Every object can have the following keys: + + **library_path** + : Path to the driver module that has been found. + + **is_extra** + : A boolean value indicating whether the driver module is in an + "unusual" location, probably not in the canonical search path. + This key is optional and if is not provided, the default %FALSE + value should be assumed. + + **va-api_drivers** + : An array of objects describing the VA-API driver modules that have been + found. These drivers are used by the VA-API, either `libva.so.2` (the + current version) or `libva.so.1` (a legacy version). + Every object can have the following keys: + + **library_path** + : Path to the driver module that has been found. + + **is_extra** + : A boolean value indicating whether the driver module is in an + "unusual" location, probably not in the canonical search path. + This key is optional and if is not provided, the default %FALSE + value should be assumed. **locale-issues** : An array of strings indicating locale-related issues. diff --git a/debian/control b/debian/control index 69eec0dc620498ca0c350079b8f0c1945a0bf201..b756aa547d5b6fa88b3acd6feb5d6e9fd3c5ae1f 100644 --- a/debian/control +++ b/debian/control @@ -9,6 +9,7 @@ Build-Depends: glslang-tools, gtk-doc-tools <!nodoc>, libcapsule-tools, + libelf-dev, libgl1-mesa-dev | libgl-dev, libglib2.0-dev, libjson-glib-dev (>= 1.0), diff --git a/debian/gitlab-ci.yml b/debian/gitlab-ci.yml index 86a69d6c1708a3c306d340cb979d6fff80a53ac8..f1bcb8c245dce75179b9e70b31773c49480b30f3 100644 --- a/debian/gitlab-ci.yml +++ b/debian/gitlab-ci.yml @@ -12,6 +12,7 @@ variables: debhelper glslang-tools gtk-doc-tools + libelf-dev libegl1-mesa-dev libgl1-mesa-dev libgles2-mesa-dev diff --git a/helpers/meson.build b/helpers/meson.build index 75dfd1544f4d15c876f0025efdd8f95a8bc8613e..c9fd9f63f92b933ea06ad3470e7eab8eff690351 100644 --- a/helpers/meson.build +++ b/helpers/meson.build @@ -35,7 +35,7 @@ executable( multiarch + '-check-locale', 'check-locale.c', include_directories : project_include_dirs, - dependencies : [json_glib, glib], + dependencies : [glib, json_glib], install : true, install_dir : pkglibexecdir, # Use json-glib and GLib from the adjacent libdir, ignoring LD_LIBRARY_PATH diff --git a/meson.build b/meson.build index f9b06477ec74325b186cdf22d6011d7704259d93..2ed7a2cba1b8b83f9074a472ba96c84cbd0d2d3f 100644 --- a/meson.build +++ b/meson.build @@ -189,6 +189,15 @@ json_glib = dependency( threads = dependency( 'threads', ) + +libelf = dependency( + 'libelf', + required: false, +) +if not libelf.found() + libelf = c_compiler.find_library('elf', required: true) +endif + vulkan = dependency( 'vulkan', ) diff --git a/steam-runtime-tools/graphics-internal.h b/steam-runtime-tools/graphics-internal.h index 196c2d435f2d942856d1b072a8b7c5c88b2b7406..11517d001317cf54b739e78e78054158131ec2ad 100644 --- a/steam-runtime-tools/graphics-internal.h +++ b/steam-runtime-tools/graphics-internal.h @@ -142,9 +142,30 @@ _srt_graphics_rendering_interface_string (SrtRenderingInterface rendering_interf #endif +/** + * SrtGraphicsModule: + * @SRT_GRAPHICS_DRI_MODULE: Mesa DRI driver module + * @SRT_GRAPHICS_VAAPI_MODULE: VA-API driver module + */ +typedef enum +{ + SRT_GRAPHICS_DRI_MODULE = 0, + SRT_GRAPHICS_VAAPI_MODULE +} SrtGraphicsModule; + G_GNUC_INTERNAL GList *_srt_load_egl_icds (gchar **envp, const char * const *multiarch_tuples); G_GNUC_INTERNAL GList *_srt_load_vulkan_icds (gchar **envp, const char * const *multiarch_tuples); + +G_GNUC_INTERNAL +GList *_srt_list_va_api_drivers (gchar **envp, + const char *helpers_path, + const char *multiarch_tuple); + +G_GNUC_INTERNAL +GList *_srt_list_dri_drivers (gchar **envp, + const char *helpers_path, + const char *multiarch_tuple); diff --git a/steam-runtime-tools/graphics.c b/steam-runtime-tools/graphics.c index dfc7bb89308fedf048d53ee5a27579569e836edf..84d494b36657fc7fbe70c5553fbe1b7b3d2a0006 100644 --- a/steam-runtime-tools/graphics.c +++ b/steam-runtime-tools/graphics.c @@ -29,11 +29,18 @@ #include "steam-runtime-tools/enums.h" #include "steam-runtime-tools/glib-compat.h" #include "steam-runtime-tools/graphics-internal.h" +#include "steam-runtime-tools/library-internal.h" #include "steam-runtime-tools/utils.h" #include "steam-runtime-tools/utils-internal.h" +#include <errno.h> +#include <fcntl.h> +#include <gelf.h> #include <stdint.h> +#include <stdlib.h> #include <string.h> +#include <sys/types.h> +#include <libelf.h> #include <json-glib/json-glib.h> @@ -2172,6 +2179,865 @@ _srt_load_egl_icds (gchar **envp, return g_list_reverse (ret); } +/** + * SrtDriDriver: + * + * Opaque object representing a Mesa DRI driver. + */ + +struct _SrtDriDriver +{ + /*< private >*/ + GObject parent; + gchar *library_path; + gboolean is_extra; +}; + +struct _SrtDriDriverClass +{ + /*< private >*/ + GObjectClass parent_class; +}; + +enum +{ + DRI_DRIVER_PROP_0, + DRI_DRIVER_PROP_LIBRARY_PATH, + DRI_DRIVER_PROP_IS_EXTRA, + N_DRI_DRIVER_PROPERTIES +}; + +G_DEFINE_TYPE (SrtDriDriver, srt_dri_driver, G_TYPE_OBJECT) + +static void +srt_dri_driver_init (SrtDriDriver *self) +{ +} + +static void +srt_dri_driver_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + SrtDriDriver *self = SRT_DRI_DRIVER (object); + + switch (prop_id) + { + case DRI_DRIVER_PROP_LIBRARY_PATH: + g_value_set_string (value, self->library_path); + break; + + case DRI_DRIVER_PROP_IS_EXTRA: + g_value_set_boolean (value, self->is_extra); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +srt_dri_driver_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + SrtDriDriver *self = SRT_DRI_DRIVER (object); + + switch (prop_id) + { + case DRI_DRIVER_PROP_LIBRARY_PATH: + g_return_if_fail (self->library_path == NULL); + self->library_path = g_value_dup_string (value); + break; + + case DRI_DRIVER_PROP_IS_EXTRA: + self->is_extra = g_value_get_boolean (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +srt_dri_driver_finalize (GObject *object) +{ + SrtDriDriver *self = SRT_DRI_DRIVER (object); + + g_clear_pointer (&self->library_path, g_free); + + G_OBJECT_CLASS (srt_dri_driver_parent_class)->finalize (object); +} + +static GParamSpec *dri_driver_properties[N_DRI_DRIVER_PROPERTIES] = { NULL }; + +static void +srt_dri_driver_class_init (SrtDriDriverClass *cls) +{ + GObjectClass *object_class = G_OBJECT_CLASS (cls); + + object_class->get_property = srt_dri_driver_get_property; + object_class->set_property = srt_dri_driver_set_property; + object_class->finalize = srt_dri_driver_finalize; + + dri_driver_properties[DRI_DRIVER_PROP_LIBRARY_PATH] = + g_param_spec_string ("library-path", "Library path", + "Absolute path to the DRI driver library", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + + dri_driver_properties[DRI_DRIVER_PROP_IS_EXTRA] = + g_param_spec_boolean ("is-extra", "Is extra?", + "TRUE if the driver is located in an unusual path", + FALSE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, N_DRI_DRIVER_PROPERTIES, + dri_driver_properties); +} + +/** + * srt_dri_driver_new: + * @library_path: (transfer none): the path to the library + * @is_extra: if the DRI driver is in an unusual path + * + * Returns: (transfer full): a new DRI driver + */ +static SrtDriDriver * +srt_dri_driver_new (const gchar *library_path, + gboolean is_extra) +{ + g_return_val_if_fail (library_path != NULL, NULL); + + return g_object_new (SRT_TYPE_DRI_DRIVER, + "library-path", library_path, + "is-extra", is_extra, + NULL); +} + +/** + * srt_dri_driver_get_library_path: + * @self: The DRI driver + * + * Return the library path for this DRI driver. + * + * Returns: (type filename) (transfer none) (nullable): #SrtDriDriver:library-path + */ +const gchar * +srt_dri_driver_get_library_path (SrtDriDriver *self) +{ + g_return_val_if_fail (SRT_IS_DRI_DRIVER (self), NULL); + return self->library_path; +} + +/** + * srt_dri_driver_is_extra: + * @self: The DRI driver + * + * Return a gboolean that indicates if the DRI is in an unusual position. + * + * Returns: %TRUE if the DRI driver is in an unusual position. + */ +gboolean +srt_dri_driver_is_extra (SrtDriDriver *self) +{ + g_return_val_if_fail (SRT_IS_DRI_DRIVER (self), FALSE); + return self->is_extra; +} + +/** + * _srt_get_library_class: + * @library: (not nullable) (type filename): The library path to use + * + * Return the class of the specified library. + * If it fails, %ELFCLASSNONE will be returned. + * + * Returns: the library class. + */ +static int +_srt_get_library_class (const gchar *library) +{ + Elf *elf = NULL; + int fd = -1; + int class = ELFCLASSNONE; + + g_return_val_if_fail (library != NULL, ELFCLASSNONE); + + if (elf_version (EV_CURRENT) == EV_NONE) + { + g_debug ("elf_version(EV_CURRENT): %s", elf_errmsg (elf_errno ())); + goto out; + } + + if ((fd = open (library, O_RDONLY | O_CLOEXEC, 0)) < 0) + { + g_debug ("failed to open %s", library); + goto out; + } + + if ((elf = elf_begin (fd, ELF_C_READ, NULL)) == NULL) + { + g_debug ("elf_begin() failed: %s", elf_errmsg (elf_errno ())); + goto out; + } + + class = gelf_getclass (elf); + +out: + if (elf != NULL) + elf_end (elf); + + if (fd >= 0) + close (fd); + + return class; +} + +/** + * _srt_get_extra_modules_directory: + * @library_search_path: (not nullable) (type filename): The absolute path to a directory that + * is in the library search path (e.g. /usr/lib/x86_64-linux-gnu) + * @multiarch_tuple: (not nullable) (type filename): A Debian-style multiarch tuple + * such as %SRT_ABI_X86_64 + * @driver_class: Get the extra directories based on this ELF class, like + * ELFCLASS64. + * + * Given a loader path, this function tries to create a list of extra directories where it + * might be possible to find driver modules. + * E.g. given /usr/lib/x86_64-linux-gnu, return /usr/lib64 and /usr/lib + * + * Returns: (transfer full) (element-type gchar *) (nullable): A list of absolute + * paths in descending alphabetical order, or %NULL if an error occurred. + */ +static GList * +_srt_get_extra_modules_directory (const gchar *library_search_path, + const gchar *multiarch_tuple, + int driver_class) +{ + GList *ret = NULL; + const gchar *libqual = NULL; + gchar *lib_multiarch; + gchar *dir; + + g_return_val_if_fail (library_search_path != NULL, NULL); + g_return_val_if_fail (multiarch_tuple != NULL, NULL); + + dir = g_strdup (library_search_path); + lib_multiarch = g_strdup_printf ("/lib/%s", multiarch_tuple); + + if (!g_str_has_suffix (dir, lib_multiarch)) + { + g_debug ("%s is not in the loader path: %s", lib_multiarch, library_search_path); + goto out; + } + + dir[strlen (dir) - strlen (lib_multiarch) + 1] = '\0'; + + switch (driver_class) + { + case ELFCLASS32: + libqual = "lib32"; + break; + + case ELFCLASS64: + libqual = "lib64"; + break; + + case ELFCLASSNONE: + default: + g_free (lib_multiarch); + g_free (dir); + g_return_val_if_reached (NULL); + } + + ret = g_list_prepend (ret, g_build_filename (dir, "lib", "dri", NULL)); + g_debug ("Looking in lib directory: %s", (const char *) ret->data); + ret = g_list_prepend (ret, g_build_filename (dir, libqual, "dri", NULL)); + g_debug ("Looking in libQUAL directory: %s", (const char *) ret->data); + +out: + g_free (lib_multiarch); + g_free (dir); + return ret; +} + +static SrtVaApiDriver * +srt_va_api_driver_new (const gchar *library_path, + gboolean is_extra); + +/** + * _srt_get_modules_from_path: + * @envp: (array zero-terminated=1): Behave as though `environ` was this array + * @helpers_path: (nullable): An optional path to find "inspect-library" helper, PATH + * is used if %NULL + * @multiarch_tuple: (not nullable) (type filename): A Debian-style multiarch tuple + * such as %SRT_ABI_X86_64 + * @module_directory_path: (not nullable) (type filename): Path where to + * search for driver modules + * @is_extra: If this path should be considered an extra or not + * @module: Which graphic module to search + * @drivers_out: (inout): Prepend the found drivers to this list. + * If @module is #SRT_GRAPHICS_DRI_MODULE, the element-type will be #SrtDriDriver. + * Otherwise if @module is #SRT_GRAPHICS_VAAPI_MODULE, the element-type will be #SrtVaApiDriver. + * + * @drivers_out will be prepended only with modules that are of the same ELF class that + * corresponds to @multiarch_tuple. + * + * Drivers are added to `drivers_out` in reverse lexicographic order + * (`r600_dri.so` is before `r200_dri.so`, which is before `i965_dri.so`). + */ +static void +_srt_get_modules_from_path (gchar **envp, + const char *helpers_path, + const char *multiarch_tuple, + const char *module_directory_path, + gboolean is_extra, + SrtGraphicsModule module, + GList **drivers_out) +{ + const gchar *member; + const gchar *module_suffix; + GDir *dir = NULL; + SrtLibraryIssues issues; + + g_return_if_fail (module_directory_path != NULL); + g_return_if_fail (drivers_out != NULL); + + g_debug ("Looking for %sdrivers in %s", + is_extra ? "extra " : "", + module_directory_path); + + switch (module) + { + case SRT_GRAPHICS_DRI_MODULE: + module_suffix = "_dri.so"; + break; + + case SRT_GRAPHICS_VAAPI_MODULE: + module_suffix = "_drv_video.so"; + break; + + default: + g_return_if_reached (); + } + + dir = g_dir_open (module_directory_path, 0, NULL); + if (dir) + { + GPtrArray *in_this_dir = g_ptr_array_new_with_free_func (g_free); + while ((member = g_dir_read_name (dir)) != NULL) + { + if (g_str_has_suffix (member, module_suffix)) + g_ptr_array_add (in_this_dir, g_build_filename (module_directory_path, member, NULL)); + } + + g_ptr_array_sort (in_this_dir, indirect_strcmp0); + + for (gsize j = 0; j < in_this_dir->len; j++) + { + const gchar *this_driver = g_ptr_array_index (in_this_dir, j); + issues = _srt_check_library_presence (helpers_path, this_driver, multiarch_tuple, + NULL, NULL, envp, SRT_LIBRARY_SYMBOLS_FORMAT_PLAIN, NULL); + /* If "${multiarch}-inspect-library" was unable to load the driver, it's safe to assume that + * its ELF class was not what we were searching for. */ + if (issues & SRT_LIBRARY_ISSUES_CANNOT_LOAD) + continue; + + switch (module) + { + case SRT_GRAPHICS_DRI_MODULE: + *drivers_out = g_list_prepend (*drivers_out, srt_dri_driver_new (this_driver, is_extra)); + break; + + case SRT_GRAPHICS_VAAPI_MODULE: + *drivers_out = g_list_prepend (*drivers_out, srt_va_api_driver_new (this_driver, is_extra)); + break; + + default: + g_return_if_reached (); + } + } + + g_ptr_array_free (in_this_dir, TRUE); + g_dir_close (dir); + } +} + +/** + * _srt_get_modules_full: + * @envp: (array zero-terminated=1): Behave as though `environ` was this array + * @helpers_path: (nullable): An optional path to find "inspect-library" helper, PATH is used if %NULL + * @multiarch_tuple: (not nullable) (type filename): A Debian-style multiarch tuple + * such as %SRT_ABI_X86_64 + * @module: Which graphic module to search + * @drivers_out: (inout): Prepend the found drivers to this list. + * If @module is #SRT_GRAPHICS_DRI_MODULE, the element-type will be #SrtDriDriver. + * Otherwise if @module is #SRT_GRAPHICS_VAAPI_MODULE, the element-type will be #SrtVaApiDriver. + * + * On exit, `drivers_out` will have the least-preferred directories first and the + * most-preferred directories last. Within a directory, the drivers will be + * in reverse lexicographic order: `r600_dri.so` before `r200_dri.so`, which in turn + * is before `nouveau_dri.so`. + */ +static void +_srt_get_modules_full (gchar **envp, + const char *helpers_path, + const char *multiarch_tuple, + SrtGraphicsModule module, + GList **drivers_out) +{ + const char * const *loader_libraries; + static const char *const dri_loaders[] = { "libGLX_mesa.so.0", "libEGL_mesa.so.0", + "libGL.so.1", NULL }; + static const char *const va_api_loaders[] = { "libva.so.2", "libva.so.1", NULL }; + const gchar *env_override; + const gchar *sysroot; + const gchar *drivers_path; + gchar *flatpak_info; + GHashTable *drivers_set; + gboolean is_extra = FALSE; + + g_return_if_fail (multiarch_tuple != NULL); + g_return_if_fail (drivers_out != NULL); + g_return_if_fail (_srt_check_not_setuid ()); + + switch (module) + { + case SRT_GRAPHICS_DRI_MODULE: + loader_libraries = dri_loaders; + env_override = "LIBGL_DRIVERS_PATH"; + break; + + case SRT_GRAPHICS_VAAPI_MODULE: + loader_libraries = va_api_loaders; + env_override = "LIBVA_DRIVERS_PATH"; + break; + + default: + g_return_if_reached (); + } + + if (envp) + { + sysroot = g_environ_getenv (envp, "SRT_TEST_SYSROOT"); + drivers_path = g_environ_getenv (envp, env_override); + } + else + { + sysroot = g_getenv ("SRT_TEST_SYSROOT"); + drivers_path = g_getenv (env_override); + } + + if (sysroot == NULL) + sysroot = "/"; + + flatpak_info = g_build_filename (sysroot, ".flatpak-info", NULL); + drivers_set = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + + if (drivers_path) + { + g_debug ("A driver path environment is available: %s", drivers_path); + gchar **entries = g_strsplit (drivers_path, ":", 0); + + for (gchar **entry = entries; entry != NULL && *entry != NULL; entry++) + { + if (*entry[0] == '\0') + continue; + + if (!g_hash_table_contains (drivers_set, *entry)) + { + g_hash_table_add (drivers_set, g_strdup (*entry)); + _srt_get_modules_from_path (envp, helpers_path, multiarch_tuple, *entry, + FALSE, module, drivers_out); + } + } + g_strfreev (entries); + + /* We continue to search for libraries but we mark them all as "extra" because the + * loader wouldn't have picked them up. */ + is_extra = TRUE; + } + + /* If we are in a Flatpak environment we search in the same paths that Flatpak uses, + * keeping also the same search order. + * + * For VA-API these are the paths used: + * "%{libdir}/dri:%{libdir}/dri/intel-vaapi-driver:%{libdir}/GL/lib/dri" + * (reference: + * <https://gitlab.com/freedesktop-sdk/freedesktop-sdk/blob/master/elements/components/libva.bst>) + * + * For Mesa there is just a single path: + * "%{libdir}/GL/lib/dri" + * (really `GL/default/lib/dri` or `GL/mesa-git/lib/dri`, but `GL/lib/dri` is + * populated with symbolic links; reference: + * <https://gitlab.com/freedesktop-sdk/freedesktop-sdk/blob/master/elements/extensions/mesa/mesa.bst> + * and + * <https://gitlab.com/freedesktop-sdk/freedesktop-sdk/blob/master/elements/flatpak-images/platform.bst>) + * */ + if (g_file_test (flatpak_info, G_FILE_TEST_EXISTS)) + { + gchar *libdir = g_build_filename (sysroot, "usr", "lib", multiarch_tuple, NULL); + if (module == SRT_GRAPHICS_VAAPI_MODULE) + { + gchar *libdir_dri = g_build_filename (libdir, "dri", NULL); + gchar *intel_vaapi = g_build_filename (libdir_dri, "intel-vaapi-driver", NULL); + if (!g_hash_table_contains (drivers_set, libdir_dri)) + { + g_hash_table_add (drivers_set, g_strdup (libdir_dri)); + _srt_get_modules_from_path (envp, helpers_path, multiarch_tuple, libdir_dri, + is_extra, module, drivers_out); + } + if (!g_hash_table_contains (drivers_set, intel_vaapi)) + { + g_hash_table_add (drivers_set, g_strdup (intel_vaapi)); + _srt_get_modules_from_path (envp, helpers_path, multiarch_tuple, intel_vaapi, + is_extra, module, drivers_out); + } + g_free (libdir_dri); + g_free (intel_vaapi); + } + + gchar *gl_lib_dri = g_build_filename (libdir, "GL", "lib", "dri", NULL); + if (!g_hash_table_contains (drivers_set, gl_lib_dri)) + { + g_hash_table_add (drivers_set, g_strdup (gl_lib_dri)); + _srt_get_modules_from_path (envp, helpers_path, multiarch_tuple, gl_lib_dri, + is_extra, module, drivers_out); + } + g_free (gl_lib_dri); + g_free (libdir); + + /* We continue to search for libraries but we mark them all as "extra" because the + * loader wouldn't have picked them up. */ + is_extra = TRUE; + } + + for (gsize i = 0; loader_libraries[i] != NULL; i++) + { + SrtLibrary *library_details = NULL; + char *driver_canonical_path; + gchar *libdir; + gchar *dri_path; + GList *extras = NULL; + SrtLibraryIssues issues; + + issues = _srt_check_library_presence (helpers_path, + loader_libraries[i], + multiarch_tuple, + NULL, /* symbols path */ + NULL, /* hidden dependencies */ + envp, + SRT_LIBRARY_SYMBOLS_FORMAT_PLAIN, + &library_details); + + if (issues & (SRT_LIBRARY_ISSUES_CANNOT_LOAD | + SRT_LIBRARY_ISSUES_INTERNAL_ERROR | + SRT_LIBRARY_ISSUES_TIMEOUT)) + { + const char *messages = srt_library_get_messages (library_details); + + if (messages == NULL || messages[0] == '\0') + messages = "(no diagnostic output)"; + + g_debug ("Unable to load library %s: %s", + loader_libraries[i], + messages); + } + + const gchar *loader_path = srt_library_get_absolute_path (library_details); + if (loader_path == NULL) + { + g_debug ("loader path for %s is NULL", loader_libraries[i]); + g_object_unref (library_details); + continue; + } + + /* The path might still be a symbolic link or it can contains ./ or ../ */ + driver_canonical_path = realpath (loader_path, NULL); + if (driver_canonical_path == NULL) + { + g_debug ("realpath(%s): %s", loader_path, g_strerror (errno)); + g_object_unref (library_details); + continue; + } + libdir = g_path_get_dirname (driver_canonical_path); + + dri_path = g_build_filename (libdir, "dri", NULL); + if (!g_hash_table_contains (drivers_set, dri_path)) + { + g_hash_table_add (drivers_set, g_strdup (dri_path)); + _srt_get_modules_from_path (envp, helpers_path, multiarch_tuple, dri_path, + is_extra, module, drivers_out); + } + + int driver_class = _srt_get_library_class (driver_canonical_path); + const GList *this_extra_path; + if (driver_class != ELFCLASSNONE) + { + extras = _srt_get_extra_modules_directory (libdir, multiarch_tuple, driver_class); + for (this_extra_path = extras; this_extra_path != NULL; this_extra_path = this_extra_path->next) + { + if (!g_hash_table_contains (drivers_set, this_extra_path->data)) + { + g_hash_table_add (drivers_set, g_strdup (this_extra_path->data)); + _srt_get_modules_from_path (envp, helpers_path, multiarch_tuple, + this_extra_path->data, TRUE, module, + drivers_out); + } + } + } + + free (driver_canonical_path); + g_free (libdir); + g_free (dri_path); + g_object_unref (library_details); + if (extras) + g_list_free_full (extras, g_free); + } + + + g_hash_table_unref (drivers_set); + g_free (flatpak_info); +} + +/** + * _srt_list_dri_drivers: + * @envp: (array zero-terminated=1): Behave as though `environ` was this array + * @helpers_path: (nullable): An optional path to find "inspect-library" helper, PATH is used if %NULL + * @multiarch_tuple: (not nullable) (type filename): A Debian-style multiarch tuple + * such as %SRT_ABI_X86_64 + * + * Implementation of srt_system_info_list_dri_drivers(). + * + * The returned list will have the most-preferred directories first and the + * least-preferred directories last. Within a directory, the drivers will be in + * lexicographic order, for example `nouveau_dri.so`, `r200_dri.so`, `r600_dri.so` + * in that order. + * + * Returns: (transfer full) (element-type SrtDriDriver) (nullable): A list of + * opaque #SrtDriDriver objects, or %NULL if nothing was found. Free with + * `g_list_free_full(list, g_object_unref)`. + */ +GList * +_srt_list_dri_drivers (gchar **envp, + const char *helpers_path, + const char *multiarch_tuple) +{ + GList *drivers = NULL; + + g_return_val_if_fail (multiarch_tuple != NULL, NULL); + + _srt_get_modules_full (envp, helpers_path, multiarch_tuple, SRT_GRAPHICS_DRI_MODULE, &drivers); + + return g_list_reverse (drivers); +} + +/** + * SrtVaApiDriver: + * + * Opaque object representing a VA-API driver. + */ + +struct _SrtVaApiDriver +{ + /*< private >*/ + GObject parent; + gchar *library_path; + gboolean is_extra; +}; + +struct _SrtVaApiDriverClass +{ + /*< private >*/ + GObjectClass parent_class; +}; + +enum +{ + VA_API_DRIVER_PROP_0, + VA_API_DRIVER_PROP_LIBRARY_PATH, + VA_API_DRIVER_PROP_IS_EXTRA, + N_VA_API_DRIVER_PROPERTIES +}; + +G_DEFINE_TYPE (SrtVaApiDriver, srt_va_api_driver, G_TYPE_OBJECT) + +static void +srt_va_api_driver_init (SrtVaApiDriver *self) +{ +} + +static void +srt_va_api_driver_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + SrtVaApiDriver *self = SRT_VA_API_DRIVER (object); + + switch (prop_id) + { + case VA_API_DRIVER_PROP_LIBRARY_PATH: + g_value_set_string (value, self->library_path); + break; + + case VA_API_DRIVER_PROP_IS_EXTRA: + g_value_set_boolean (value, self->is_extra); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +srt_va_api_driver_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + SrtVaApiDriver *self = SRT_VA_API_DRIVER (object); + + switch (prop_id) + { + case VA_API_DRIVER_PROP_LIBRARY_PATH: + g_return_if_fail (self->library_path == NULL); + self->library_path = g_value_dup_string (value); + break; + + case VA_API_DRIVER_PROP_IS_EXTRA: + self->is_extra = g_value_get_boolean (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +srt_va_api_driver_finalize (GObject *object) +{ + SrtVaApiDriver *self = SRT_VA_API_DRIVER (object); + + g_clear_pointer (&self->library_path, g_free); + + G_OBJECT_CLASS (srt_va_api_driver_parent_class)->finalize (object); +} + +static GParamSpec *va_api_driver_properties[N_VA_API_DRIVER_PROPERTIES] = { NULL }; + +static void +srt_va_api_driver_class_init (SrtVaApiDriverClass *cls) +{ + GObjectClass *object_class = G_OBJECT_CLASS (cls); + + object_class->get_property = srt_va_api_driver_get_property; + object_class->set_property = srt_va_api_driver_set_property; + object_class->finalize = srt_va_api_driver_finalize; + + va_api_driver_properties[VA_API_DRIVER_PROP_LIBRARY_PATH] = + g_param_spec_string ("library-path", "Library path", + "Absolute path to the DRI driver library", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + + va_api_driver_properties[VA_API_DRIVER_PROP_IS_EXTRA] = + g_param_spec_boolean ("is-extra", "Is extra?", + "TRUE if the driver is located in an unusual path", + FALSE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, N_VA_API_DRIVER_PROPERTIES, + va_api_driver_properties); +} + +/** + * srt_va_api_driver_new: + * @library_path: (transfer none): the path to the library + * @is_extra: if the DRI driver is in an unusual path + * + * Returns: (transfer full): a new VA-API driver + */ +static SrtVaApiDriver * +srt_va_api_driver_new (const gchar *library_path, + gboolean is_extra) +{ + g_return_val_if_fail (library_path != NULL, NULL); + + return g_object_new (SRT_TYPE_VA_API_DRIVER, + "library-path", library_path, + "is-extra", is_extra, + NULL); +} + +/** + * srt_va_api_driver_get_library_path: + * @self: The VA-API driver + * + * Return the library path for this VA-API driver. + * + * Returns: (type filename) (transfer none) (nullable): #SrtVaApiDriver:library-path + */ +const gchar * +srt_va_api_driver_get_library_path (SrtVaApiDriver *self) +{ + g_return_val_if_fail (SRT_IS_VA_API_DRIVER (self), NULL); + return self->library_path; +} + +/** + * srt_va_api_driver_is_extra: + * @self: The VA-API driver + * + * Return a gboolean that indicates if the VA-API is in an unusual position. + * + * Returns: %TRUE if the VA-API driver is in an unusual position. + */ +gboolean +srt_va_api_driver_is_extra (SrtVaApiDriver *self) +{ + g_return_val_if_fail (SRT_IS_VA_API_DRIVER (self), FALSE); + return self->is_extra; +} + +/* + * _srt_list_va_api_drivers: + * @envp: (array zero-terminated=1): Behave as though `environ` was this array + * @helpers_path: (nullable): An optional path to find "inspect-library" helper, PATH is used if %NULL + * @multiarch_tuple: (not nullable) (type filename): A Debian-style multiarch tuple + * such as %SRT_ABI_X86_64 + * + * Implementation of srt_system_info_list_va_api_drivers(). + * + * The returned list will have the most-preferred directories first and the + * least-preferred directories last. Within a directory, the drivers will be in + * lexicographic order, for example `nouveau_drv_video.so`, `r600_drv_video.so`, + * `radeonsi_drv_video.so` in that order. + * + * Returns: (transfer full) (element-type SrtVaApiDriver) (nullable): A list of + * opaque #SrtVaApiDriver objects, or %NULL if nothing was found. Free with + * `g_list_free_full(list, g_object_unref)`. + */ +GList * +_srt_list_va_api_drivers (gchar **envp, + const char *helpers_path, + const char *multiarch_tuple) +{ + GList *drivers = NULL; + + g_return_val_if_fail (multiarch_tuple != NULL, NULL); + + _srt_get_modules_full (envp, helpers_path, multiarch_tuple, SRT_GRAPHICS_VAAPI_MODULE, &drivers); + + return g_list_reverse (drivers); +} + /** * SrtVulkanIcd: * diff --git a/steam-runtime-tools/graphics.h b/steam-runtime-tools/graphics.h index cc6b79f5c4291619ff20a07c25c04c9cc4efaa50..e23c99743df4222945c0a53d073ac71cc80f00a3 100644 --- a/steam-runtime-tools/graphics.h +++ b/steam-runtime-tools/graphics.h @@ -155,6 +155,34 @@ gboolean srt_egl_icd_write_to_file (SrtEglIcd *self, const char *path, GError **error); +typedef struct _SrtDriDriver SrtDriDriver; +typedef struct _SrtDriDriverClass SrtDriDriverClass; + +#define SRT_TYPE_DRI_DRIVER (srt_dri_driver_get_type ()) +#define SRT_DRI_DRIVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SRT_TYPE_DRI_DRIVER, SrtDriDriver)) +#define SRT_DRI_DRIVER_CLASS(cls) (G_TYPE_CHECK_CLASS_CAST ((cls), SRT_TYPE_DRI_DRIVER, SrtDriDriverClass)) +#define SRT_IS_DRI_DRIVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SRT_TYPE_DRI_DRIVER)) +#define SRT_IS_DRI_DRIVER_CLASS(cls) (G_TYPE_CHECK_CLASS_TYPE ((cls), SRT_TYPE_DRI_DRIVER)) +#define SRT_DRI_DRIVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), SRT_TYPE_DRI_DRIVER, SrtDriDriverClass) +GType srt_dri_driver_get_type (void); + +const gchar *srt_dri_driver_get_library_path (SrtDriDriver *self); +gboolean srt_dri_driver_is_extra (SrtDriDriver *self); + +typedef struct _SrtVaApiDriver SrtVaApiDriver; +typedef struct _SrtVaApiDriverClass SrtVaApiDriverClass; + +#define SRT_TYPE_VA_API_DRIVER (srt_va_api_driver_get_type ()) +#define SRT_VA_API_DRIVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SRT_TYPE_VA_API_DRIVER, SrtVaApiDriver)) +#define SRT_VA_API_DRIVER_CLASS(cls) (G_TYPE_CHECK_CLASS_CAST ((cls), SRT_TYPE_VA_API_DRIVER, SrtVaApiDriverClass)) +#define SRT_IS_VA_API_DRIVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SRT_TYPE_VA_API_DRIVER)) +#define SRT_IS_VA_API_DRIVER_CLASS(cls) (G_TYPE_CHECK_CLASS_TYPE ((cls), SRT_TYPE_VA_API_DRIVER)) +#define SRT_VA_API_DRIVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), SRT_TYPE_VA_API_DRIVER, SrtVaApiDriverClass) +GType srt_va_api_driver_get_type (void); + +const gchar *srt_va_api_driver_get_library_path (SrtVaApiDriver *self); +gboolean srt_va_api_driver_is_extra (SrtVaApiDriver *self); + typedef struct _SrtVulkanIcd SrtVulkanIcd; typedef struct _SrtVulkanIcdClass SrtVulkanIcdClass; @@ -181,5 +209,7 @@ gboolean srt_vulkan_icd_write_to_file (SrtVulkanIcd *self, #ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC G_DEFINE_AUTOPTR_CLEANUP_FUNC (SrtGraphics, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (SrtEglIcd, g_object_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (SrtDriDriver, g_object_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (SrtVaApiDriver, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (SrtVulkanIcd, g_object_unref) #endif diff --git a/steam-runtime-tools/library-internal.h b/steam-runtime-tools/library-internal.h index 1463eb245d368e5edbe5c7c352e8ad2696926e26..4e9f3be147126f9c93ff4bb4739259bbf8612634 100644 --- a/steam-runtime-tools/library-internal.h +++ b/steam-runtime-tools/library-internal.h @@ -98,5 +98,6 @@ SrtLibraryIssues _srt_check_library_presence (const char *helpers_path, const char *multiarch, const char *symbols_path, const char * const *hidden_deps, + gchar **envp, SrtLibrarySymbolsFormat symbols_format, SrtLibrary **more_details_out); diff --git a/steam-runtime-tools/library.c b/steam-runtime-tools/library.c index f9f91330e36898fbbe790bf22cbe244a6470f7a5..2c5fd28a3137fc873d54336a95a489cbee6a72d3 100644 --- a/steam-runtime-tools/library.c +++ b/steam-runtime-tools/library.c @@ -542,7 +542,7 @@ srt_check_library_presence (const char *soname, SrtLibrary **more_details_out) { return _srt_check_library_presence (NULL, soname, multiarch, - symbols_path, NULL, + symbols_path, NULL, NULL, symbols_format, more_details_out); } @@ -552,6 +552,7 @@ _srt_check_library_presence (const char *helpers_path, const char *multiarch, const char *symbols_path, const char * const *hidden_deps, + gchar **envp, SrtLibrarySymbolsFormat symbols_format, SrtLibrary **more_details_out) { @@ -640,7 +641,11 @@ _srt_check_library_presence (const char *helpers_path, /* NULL terminate the array */ g_ptr_array_add (argv, NULL); - my_environ = g_get_environ (); + if (envp == NULL) + my_environ = g_get_environ (); + else + my_environ = g_strdupv (envp); + ld_preload = g_environ_getenv (my_environ, "LD_PRELOAD"); if (ld_preload != NULL) { diff --git a/steam-runtime-tools/meson.build b/steam-runtime-tools/meson.build index 33d5b4a91e30f86595582d9ad59dcc1f19d0648d..7f372c4f8225e21e3092953cb029a49fa455044a 100644 --- a/steam-runtime-tools/meson.build +++ b/steam-runtime-tools/meson.build @@ -76,7 +76,7 @@ libsteamrt = library( '-D_SRT_API_MAJOR="' + api_major + '"', ], include_directories : project_include_dirs, - dependencies : [glib, gobject, libdl, json_glib, threads], + dependencies : [libdl, threads, libelf, glib, gobject, json_glib], soversion : abi_major, version : abi_major + '.' + abi_minor, install : true, diff --git a/steam-runtime-tools/system-info.c b/steam-runtime-tools/system-info.c index cc3a01378aa0dbb112f4adedaf42ff526edbc0a1..c61f71b6e5d08c18200309d2ad12e696f3d85b3f 100644 --- a/steam-runtime-tools/system-info.c +++ b/steam-runtime-tools/system-info.c @@ -220,6 +220,12 @@ typedef struct GHashTable *cached_graphics_results; SrtGraphicsIssues cached_combined_graphics_issues; gboolean graphics_cache_available; + + GList *cached_dri_list; + gboolean dri_cache_available; + + GList *cached_va_api_list; + gboolean va_api_cache_available; } Abi; static Abi * @@ -248,6 +254,10 @@ ensure_abi (SrtSystemInfo *self, abi->libraries_cache_available = FALSE; abi->cached_graphics_results = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_object_unref); abi->cached_combined_graphics_issues = SRT_GRAPHICS_ISSUES_NONE; + abi->cached_dri_list = NULL; + abi->dri_cache_available = FALSE; + abi->cached_va_api_list = NULL; + abi->va_api_cache_available = FALSE; /* transfer ownership to self->abis */ g_ptr_array_add (self->abis, abi); @@ -264,6 +274,9 @@ abi_free (gpointer self) if (abi->cached_graphics_results != NULL) g_hash_table_unref (abi->cached_graphics_results); + g_list_free_full (abi->cached_dri_list, g_object_unref); + g_list_free_full (abi->cached_va_api_list, g_object_unref); + g_slice_free (Abi, self); } @@ -749,6 +762,8 @@ ensure_overrides_cached (SrtSystemInfo *self) int exit_status = -1; GError *error = NULL; + g_return_if_fail (_srt_check_not_setuid ()); + if (!self->overrides.have_data) { if (self->env != NULL) @@ -853,6 +868,8 @@ ensure_pinned_libs_cached (SrtSystemInfo *self) int exit_status = -1; GError *error = NULL; + g_return_if_fail (_srt_check_not_setuid ()); + if (!self->pinned_libs.have_data) { runtime = srt_system_info_dup_runtime_path (self); @@ -1145,6 +1162,7 @@ srt_system_info_check_libraries (SrtSystemInfo *self, multiarch_tuple, symbols_file, (const gchar * const *)hidden_deps, + NULL, SRT_LIBRARY_SYMBOLS_FORMAT_DEB_SYMBOLS, &library); g_hash_table_insert (abi->cached_results, soname, library); @@ -1282,6 +1300,7 @@ srt_system_info_check_library (SrtSystemInfo *self, multiarch_tuple, symbols_file, (const gchar * const *)hidden_deps, + NULL, SRT_LIBRARY_SYMBOLS_FORMAT_DEB_SYMBOLS, &library); g_hash_table_insert (abi->cached_results, soname_found, library); @@ -1307,6 +1326,7 @@ srt_system_info_check_library (SrtSystemInfo *self, multiarch_tuple, NULL, NULL, + NULL, SRT_LIBRARY_SYMBOLS_FORMAT_DEB_SYMBOLS, &library); g_hash_table_insert (abi->cached_results, g_strdup (soname), library); @@ -1365,6 +1385,42 @@ forget_graphics_results (SrtSystemInfo *self) } } +/* + * Forget any cached information about mesa DRI drivers. + */ +static void +forget_dris (SrtSystemInfo *self) +{ + gsize i; + + for (i = 0; i < self->abis->len; i++) + { + Abi *abi = g_ptr_array_index (self->abis, i); + + g_list_free_full (abi->cached_dri_list, g_object_unref); + abi->cached_dri_list = NULL; + abi->dri_cache_available = FALSE; + } +} + +/* + * Forget any cached information about VA-API drivers. + */ +static void +forget_va_apis (SrtSystemInfo *self) +{ + gsize i; + + for (i = 0; i < self->abis->len; i++) + { + Abi *abi = g_ptr_array_index (self->abis, i); + + g_list_free_full (abi->cached_va_api_list, g_object_unref); + abi->cached_va_api_list = NULL; + abi->va_api_cache_available = FALSE; + } +} + /** * srt_system_info_check_graphics: * @self: The #SrtSystemInfo object to use. @@ -1515,6 +1571,8 @@ srt_system_info_set_environ (SrtSystemInfo *self, { g_return_if_fail (SRT_IS_SYSTEM_INFO (self)); + forget_dris (self); + forget_va_apis (self); forget_libraries (self); forget_graphics_results (self); forget_locales (self); @@ -2090,6 +2148,8 @@ srt_system_info_set_helpers_path (SrtSystemInfo *self, { g_return_if_fail (SRT_IS_SYSTEM_INFO (self)); + forget_dris (self); + forget_va_apis (self); forget_libraries (self); forget_graphics_results (self); forget_locales (self); @@ -2421,3 +2481,113 @@ srt_system_info_list_vulkan_icds (SrtSystemInfo *self, return g_list_reverse (ret); } + +/** + * srt_system_info_list_dri_drivers: + * @self: The #SrtSystemInfo object + * @multiarch_tuple: (not nullable) (type filename): A Debian-style multiarch + * tuple such as %SRT_ABI_X86_64 + * @flags: Filter the list of DRI drivers accordingly to these flags. + * For example, "extra" drivers that are unlikely to be found by + * the Mesa DRI loader will only be included if the + * %SRT_DRIVER_FLAGS_INCLUDE_ALL flag is set. + * + * List of the available Mesa DRI modules. + * + * For the search $LIBGL_DRIVERS_PATH will be used if set. + * Otherwise some implementation-dependent paths will be used instead. + * + * Note that if `$LIBGL_DRIVERS_PATH` is set, all drivers outside that + * path will be treated as "extra", and omitted from the list unless + * %SRT_DRIVER_FLAGS_INCLUDE_ALL is used. + * + * Returns: (transfer full) (element-type SrtDriDriver) (nullable): A list of + * opaque #SrtDriDriver objects, or %NULL if nothing was found. Free with + * `g_list_free_full(list, g_object_unref)`. + */ +GList * +srt_system_info_list_dri_drivers (SrtSystemInfo *self, + const char *multiarch_tuple, + SrtDriverFlags flags) +{ + Abi *abi = NULL; + GList *ret = NULL; + const GList *iter; + + g_return_val_if_fail (SRT_IS_SYSTEM_INFO (self), NULL); + g_return_val_if_fail (multiarch_tuple != NULL, NULL); + + abi = ensure_abi (self, multiarch_tuple); + + if (!abi->dri_cache_available) + { + abi->cached_dri_list = _srt_list_dri_drivers (self->env, + self->helpers_path, + multiarch_tuple); + abi->dri_cache_available = TRUE; + } + + for (iter = abi->cached_dri_list; iter != NULL; iter = iter->next) + { + if ((flags & SRT_DRIVER_FLAGS_NONE) && srt_dri_driver_is_extra (iter->data)) + continue; + ret = g_list_prepend (ret, g_object_ref (iter->data)); + } + + return g_list_reverse (ret); +} + +/** + * srt_system_info_list_va_api_drivers: + * @self: The #SrtSystemInfo object + * @multiarch_tuple: (not nullable) (type filename): A Debian-style multiarch + * tuple such as %SRT_ABI_X86_64 + * @flags: Filter the list of VA-API drivers accordingly to these flags. + * For example, "extra" drivers that are unlikely to be found by + * the VA-API loader will only be included if the + * %SRT_DRIVER_FLAGS_INCLUDE_ALL flag is set. + * + * List of the available VA-API drivers. + * + * For the search $LIBVA_DRIVERS_PATH will be used if set. + * Otherwise some implementation-dependent paths will be used instead. + * + * Note that if `$LIBVA_DRIVERS_PATH` is set, all drivers outside that + * path will be treated as "extra", and omitted from the list unless + * %SRT_DRIVER_FLAGS_INCLUDE_ALL is used. + * + * Returns: (transfer full) (element-type SrtVaApiDriver) (nullable): A list of + * opaque #SrtVaApiDriver objects, or %NULL if nothing was found. Free with + * `g_list_free_full(list, g_object_unref)`. + */ +GList * +srt_system_info_list_va_api_drivers (SrtSystemInfo *self, + const char *multiarch_tuple, + SrtDriverFlags flags) +{ + Abi *abi = NULL; + GList *ret = NULL; + const GList *iter; + + g_return_val_if_fail (SRT_IS_SYSTEM_INFO (self), NULL); + g_return_val_if_fail (multiarch_tuple != NULL, NULL); + + abi = ensure_abi (self, multiarch_tuple); + + if (!abi->va_api_cache_available) + { + abi->cached_va_api_list = _srt_list_va_api_drivers (self->env, + self->helpers_path, + multiarch_tuple); + abi->va_api_cache_available = TRUE; + } + + for (iter = abi->cached_va_api_list; iter != NULL; iter = iter->next) + { + if ((flags & SRT_DRIVER_FLAGS_NONE) && srt_va_api_driver_is_extra (iter->data)) + continue; + ret = g_list_prepend (ret, g_object_ref (iter->data)); + } + + return g_list_reverse (ret); +} diff --git a/steam-runtime-tools/system-info.h b/steam-runtime-tools/system-info.h index 2c04e8e280e2efd8c4b387f3b2f7ef6e99706e31..9ae6ef71d28efa4289dacf3a8d459d4e30450379 100644 --- a/steam-runtime-tools/system-info.h +++ b/steam-runtime-tools/system-info.h @@ -53,6 +53,24 @@ typedef enum SRT_TEST_FLAGS_NONE = 0 } SrtTestFlags; +/** + * SrtDriverFlags: + * @SRT_DRIVER_FLAGS_NONE: Get just the drivers found in the canonical folders + * @SRT_DRIVER_FLAGS_INCLUDE_ALL: Get all the drivers that have been found, + * even if they are in directories that we do not believe will normally be + * loaded (srt_dri_driver_is_extra() or srt_va_api_driver_is_extra() will + * return %TRUE) + * + * A bitfield with flags representing filters, used when retrieving a + * list of drivers. Use %SRT_DRIVER_FLAGS_NONE for a list of the drivers that + * are believed to be on the search path that will be used in practice. + */ +typedef enum +{ + SRT_DRIVER_FLAGS_INCLUDE_ALL = (1 << 1), + SRT_DRIVER_FLAGS_NONE = (1 << 0) +} SrtDriverFlags; + typedef struct _SrtSystemInfo SrtSystemInfo; typedef struct _SrtSystemInfoClass SrtSystemInfoClass; @@ -91,6 +109,12 @@ GList *srt_system_info_list_egl_icds (SrtSystemInfo *self, const char * const *multiarch_tuples); GList *srt_system_info_list_vulkan_icds (SrtSystemInfo *self, const char * const *multiarch_tuples); +GList *srt_system_info_list_dri_drivers (SrtSystemInfo *self, + const char *multiarch_tuple, + SrtDriverFlags flags); +GList *srt_system_info_list_va_api_drivers (SrtSystemInfo *self, + const char *multiarch_tuple, + SrtDriverFlags flags); void srt_system_info_set_environ (SrtSystemInfo *self, gchar * const *env); diff --git a/steam-runtime-tools/utils.c b/steam-runtime-tools/utils.c index b8c05166e8bfc6ccafb22ac765735ff4c0d4fe5b..0ea2c03b8af07dd8db85aee2459ab5ffc1276fc6 100644 --- a/steam-runtime-tools/utils.c +++ b/steam-runtime-tools/utils.c @@ -296,6 +296,7 @@ _srt_get_helper (const char *helpers_path, gchar *path; gchar *prefixed; + g_return_val_if_fail (_srt_check_not_setuid (), NULL); g_return_val_if_fail (base != NULL, NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); diff --git a/tests/graphics.c b/tests/graphics.c index e34c21261e202e5739b1467cd16c5a70ce1f0c61..be7cfb9375a359781db980edd15ca5e61443bf02 100644 --- a/tests/graphics.c +++ b/tests/graphics.c @@ -1674,6 +1674,321 @@ test_icd_vulkan (Fixture *f, g_list_free_full (icds, g_object_unref); } +static void +check_list_suffixes (const GList *list, + const gchar *suffixes[], + SrtGraphicsModule module) +{ + const gchar *value = NULL; + gsize i = 0; + for (const GList *iter = list; iter != NULL; iter = iter->next, i++) + { + if (module == SRT_GRAPHICS_DRI_MODULE) + value = srt_dri_driver_get_library_path (iter->data); + else if (module == SRT_GRAPHICS_VAAPI_MODULE) + value = srt_va_api_driver_get_library_path (iter->data); + g_assert_nonnull (suffixes[i]); + g_assert_true (g_str_has_suffix (value, suffixes[i])); + } + g_assert_cmpstr (suffixes[i], ==, NULL); +} + +static void +check_list_extra (const GList *list, + gsize non_extra, + SrtGraphicsModule module) +{ + gsize i = 0; + for (const GList *iter = list; iter != NULL; iter = iter->next, i++) + { + gboolean is_extra = (i >= non_extra); + if (module == SRT_GRAPHICS_DRI_MODULE) + g_assert_cmpint (is_extra, ==, srt_dri_driver_is_extra (iter->data)); + else if (module == SRT_GRAPHICS_VAAPI_MODULE) + g_assert_cmpint (is_extra, ==, srt_va_api_driver_is_extra (iter->data)); + } +} + +static void +test_dri_debian10 (Fixture *f, + gconstpointer context) +{ + SrtSystemInfo *info; + gchar **envp; + gchar *sysroot; + GList *dri; + GList *va_api; + const gchar *multiarch_tuples[] = {"mock-debian-i386", "mock-debian-x86_64", NULL}; + const gchar *dri_suffixes_i386[] = {"/lib/i386-linux-gnu/dri/i965_dri.so", + "/lib/i386-linux-gnu/dri/r300_dri.so", + "/lib/i386-linux-gnu/dri/radeonsi_dri.so", + NULL}; + const gchar *dri_suffixes_x86_64[] = {"/lib/x86_64-linux-gnu/dri/i965_dri.so", + "/lib/x86_64-linux-gnu/dri/r600_dri.so", + "/lib/x86_64-linux-gnu/dri/radeon_dri.so", + NULL}; + const gchar *va_api_suffixes_i386[] = {"/lib/i386-linux-gnu/dri/r600_drv_video.so", + NULL}; + const gchar *va_api_suffixes_x86_64[] = {"/lib/x86_64-linux-gnu/dri/r600_drv_video.so", + "/lib/x86_64-linux-gnu/dri/radeonsi_drv_video.so", + NULL}; + + sysroot = g_build_filename (f->srcdir, "sysroots", "debian10", NULL); + envp = g_get_environ (); + envp = g_environ_setenv (envp, "SRT_TEST_SYSROOT", sysroot, TRUE); + envp = g_environ_unsetenv (envp, "LIBGL_DRIVERS_PATH"); + envp = g_environ_unsetenv (envp, "LIBVA_DRIVERS_PATH"); + + info = srt_system_info_new (NULL); + srt_system_info_set_environ (info, envp); + srt_system_info_set_helpers_path (info, f->builddir); + + /* The output is guaranteed to be in aphabetical order */ + dri = srt_system_info_list_dri_drivers (info, multiarch_tuples[0], SRT_DRIVER_FLAGS_NONE); + check_list_suffixes (dri, dri_suffixes_i386, SRT_GRAPHICS_DRI_MODULE); + g_list_free_full (dri, g_object_unref); + + dri = srt_system_info_list_dri_drivers (info, multiarch_tuples[1], SRT_DRIVER_FLAGS_NONE); + check_list_suffixes (dri, dri_suffixes_x86_64, SRT_GRAPHICS_DRI_MODULE); + g_list_free_full (dri, g_object_unref); + + /* The output is guaranteed to be in aphabetical order */ + va_api = srt_system_info_list_va_api_drivers (info, multiarch_tuples[0], SRT_DRIVER_FLAGS_NONE); + check_list_suffixes (va_api, va_api_suffixes_i386, SRT_GRAPHICS_VAAPI_MODULE); + g_list_free_full (va_api, g_object_unref); + + va_api = srt_system_info_list_va_api_drivers (info, multiarch_tuples[1], SRT_DRIVER_FLAGS_NONE); + check_list_suffixes (va_api, va_api_suffixes_x86_64, SRT_GRAPHICS_VAAPI_MODULE); + g_list_free_full (va_api, g_object_unref); + + /* Do it again, this time using the cached result. + * While doing it we also try to get the "extra" drivers. + * We expect to receive the same drivers list as before because we are using + * a multiarch tuple that is different from what we have in debian10/usr/lib + * so _srt_get_extra_modules_folder will fail to split the path. + * Anyway, even if the folder had the same name as the multiarch tuple, + * we still would be unable to get extras because the drivers that we are + * using (e.g. libGL.so.1) are just empty files, so `elf_begin` would fail. */ + dri = srt_system_info_list_dri_drivers (info, multiarch_tuples[0], SRT_DRIVER_FLAGS_INCLUDE_ALL); + check_list_suffixes (dri, dri_suffixes_i386, SRT_GRAPHICS_DRI_MODULE); + g_list_free_full (dri, g_object_unref); + + dri = srt_system_info_list_dri_drivers (info, multiarch_tuples[1], SRT_DRIVER_FLAGS_INCLUDE_ALL); + check_list_suffixes (dri, dri_suffixes_x86_64, SRT_GRAPHICS_DRI_MODULE); + g_list_free_full (dri, g_object_unref); + + va_api = srt_system_info_list_va_api_drivers (info, multiarch_tuples[0], SRT_DRIVER_FLAGS_INCLUDE_ALL); + check_list_suffixes (va_api, va_api_suffixes_i386, SRT_GRAPHICS_VAAPI_MODULE); + g_list_free_full (va_api, g_object_unref); + + va_api = srt_system_info_list_va_api_drivers (info, multiarch_tuples[1], SRT_DRIVER_FLAGS_INCLUDE_ALL); + check_list_suffixes (va_api, va_api_suffixes_x86_64, SRT_GRAPHICS_VAAPI_MODULE); + g_list_free_full (va_api, g_object_unref); + + g_object_unref (info); + g_free (sysroot); + g_strfreev (envp); +} + +static void +test_dri_fedora (Fixture *f, + gconstpointer context) +{ + SrtSystemInfo *info; + gchar **envp; + gchar *sysroot; + GList *dri; + GList *va_api; + const gchar *multiarch_tuples[] = {"mock-fedora-32-bit", "mock-fedora-64-bit", NULL}; + const gchar *dri_suffixes_32[] = {"/usr/lib/dri/i965_dri.so", + "/usr/lib/dri/r300_dri.so", + "/usr/lib/dri/radeonsi_dri.so", + NULL}; + const gchar *dri_suffixes_64[] = {"/usr/lib64/dri/i965_dri.so", + "/usr/lib64/dri/r600_dri.so", + "/usr/lib64/dri/radeon_dri.so", + NULL}; + const gchar *va_api_suffixes_32[] = {"/usr/lib/dri/r600_drv_video.so", + NULL}; + const gchar *va_api_suffixes_64[] = {"/usr/lib64/dri/r600_drv_video.so", + "/usr/lib64/dri/radeonsi_drv_video.so", + NULL}; + + sysroot = g_build_filename (f->srcdir, "sysroots", "fedora", NULL); + envp = g_get_environ (); + envp = g_environ_setenv (envp, "SRT_TEST_SYSROOT", sysroot, TRUE); + envp = g_environ_unsetenv (envp, "LIBGL_DRIVERS_PATH"); + envp = g_environ_unsetenv (envp, "LIBVA_DRIVERS_PATH"); + + info = srt_system_info_new (NULL); + srt_system_info_set_environ (info, envp); + srt_system_info_set_helpers_path (info, f->builddir); + + dri = srt_system_info_list_dri_drivers (info, multiarch_tuples[0], SRT_DRIVER_FLAGS_NONE); + check_list_suffixes (dri, dri_suffixes_32, SRT_GRAPHICS_DRI_MODULE); + g_list_free_full (dri, g_object_unref); + + dri = srt_system_info_list_dri_drivers (info, multiarch_tuples[1], SRT_DRIVER_FLAGS_NONE); + check_list_suffixes (dri, dri_suffixes_64, SRT_GRAPHICS_DRI_MODULE); + g_list_free_full (dri, g_object_unref); + + va_api = srt_system_info_list_va_api_drivers (info, multiarch_tuples[0], SRT_DRIVER_FLAGS_NONE); + check_list_suffixes (va_api, va_api_suffixes_32, SRT_GRAPHICS_VAAPI_MODULE); + g_list_free_full (va_api, g_object_unref); + + va_api = srt_system_info_list_va_api_drivers (info, multiarch_tuples[1], SRT_DRIVER_FLAGS_NONE); + check_list_suffixes (va_api, va_api_suffixes_64, SRT_GRAPHICS_VAAPI_MODULE); + g_list_free_full (va_api, g_object_unref); + + g_object_unref (info); + g_free (sysroot); + g_strfreev (envp); +} + +static void +test_dri_with_env (Fixture *f, + gconstpointer context) +{ + SrtSystemInfo *info; + gchar **envp; + gchar *sysroot; + gchar *libgl; + gchar *libgl2; + gchar *libgl3; + gchar *libva; + gchar *libva2; + gchar *libva3; + gchar *libgl_combined; + gchar *libva_combined; + GList *dri; + GList *va_api; + const gchar *multiarch_tuples[] = {"mock-fedora-32-bit", NULL}; + const gchar *dri_suffixes[] = {"/custom_path32/dri/r600_dri.so", + "/custom_path32/dri/radeon_dri.so", + "/custom_path32_2/dri/r300_dri.so", + NULL}; + const gchar *dri_suffixes_with_extras[] = {"/custom_path32/dri/r600_dri.so", + "/custom_path32/dri/radeon_dri.so", + "/custom_path32_2/dri/r300_dri.so", + "/usr/lib/dri/i965_dri.so", + "/usr/lib/dri/radeonsi_dri.so", + NULL}; + const gchar *va_api_suffixes[] = {"/custom_path32/va/r600_drv_video.so", + "/custom_path32/va/radeonsi_drv_video.so", + "/custom_path32_2/va/nouveau_drv_video.so", + NULL}; + const gchar *va_api_suffixes_with_extras[] = {"/custom_path32/va/r600_drv_video.so", + "/custom_path32/va/radeonsi_drv_video.so", + "/custom_path32_2/va/nouveau_drv_video.so", + "/usr/lib/dri/r600_drv_video.so", + NULL}; + + if (strcmp (_SRT_MULTIARCH, "") == 0) + { + g_test_skip ("Unsupported architecture"); + return; + } + + sysroot = g_build_filename (f->srcdir, "sysroots", "no-os-release", NULL); + + libgl = g_build_filename (sysroot, "custom_path32", "dri", NULL); + libva = g_build_filename (sysroot, "custom_path32", "va", NULL); + libgl2 = g_build_filename (sysroot, "custom_path32_2", "dri", NULL); + libva2 = g_build_filename (sysroot, "custom_path32_2", "va", NULL); + /* We have these two 64bit directories but we are using only one mock 32bit executable. + * So we expect to not receive the content of these directories because we should + * find 32bit only libraries. */ + libgl3 = g_build_filename (sysroot, "custom_path64", "dri", NULL); + libva3 = g_build_filename (sysroot, "custom_path64", "va", NULL); + + libgl_combined = g_strjoin (":", libgl, libgl2, libgl3, NULL); + libva_combined = g_strjoin (":", libva, libva2, libgl3, NULL); + + envp = g_get_environ (); + envp = g_environ_setenv (envp, "SRT_TEST_SYSROOT", sysroot, TRUE); + envp = g_environ_setenv (envp, "LIBGL_DRIVERS_PATH", libgl_combined, TRUE); + envp = g_environ_setenv (envp, "LIBVA_DRIVERS_PATH", libva_combined, TRUE); + + info = srt_system_info_new (NULL); + srt_system_info_set_environ (info, envp); + srt_system_info_set_helpers_path (info, f->builddir); + + /* The output is guaranteed to be in aphabetical order */ + dri = srt_system_info_list_dri_drivers (info, multiarch_tuples[0], SRT_DRIVER_FLAGS_NONE); + check_list_suffixes (dri, dri_suffixes, SRT_GRAPHICS_DRI_MODULE); + g_list_free_full (dri, g_object_unref); + + /* The output is guaranteed to be in aphabetical order */ + va_api = srt_system_info_list_va_api_drivers (info, multiarch_tuples[0], SRT_DRIVER_FLAGS_NONE); + check_list_suffixes (va_api, va_api_suffixes, SRT_GRAPHICS_VAAPI_MODULE); + g_list_free_full (va_api, g_object_unref); + + /* Do it again, this time including the extras */ + dri = srt_system_info_list_dri_drivers (info, multiarch_tuples[0], SRT_DRIVER_FLAGS_INCLUDE_ALL); + check_list_suffixes (dri, dri_suffixes_with_extras, SRT_GRAPHICS_DRI_MODULE); + /* Minus one to not count the NULL terminator */ + check_list_extra (dri, G_N_ELEMENTS(dri_suffixes)-1, SRT_GRAPHICS_DRI_MODULE); + g_list_free_full (dri, g_object_unref); + + va_api = srt_system_info_list_va_api_drivers (info, multiarch_tuples[0], SRT_DRIVER_FLAGS_INCLUDE_ALL); + check_list_suffixes (va_api, va_api_suffixes_with_extras, SRT_GRAPHICS_VAAPI_MODULE); + /* Minus one to not count the NULL terminator */ + check_list_extra (va_api, G_N_ELEMENTS(va_api_suffixes)-1, SRT_GRAPHICS_VAAPI_MODULE); + g_list_free_full (va_api, g_object_unref); + + g_object_unref (info); + g_free (sysroot); + g_free (libgl_combined); + g_free (libva_combined); + g_free (libgl); + g_free (libgl2); + g_free (libgl3); + g_free (libva); + g_free (libva2); + g_free (libva3); + g_strfreev (envp); +} + +static void +test_dri_flatpak (Fixture *f, + gconstpointer context) +{ + SrtSystemInfo *info; + gchar **envp; + gchar *sysroot; + GList *dri; + GList *va_api; + const gchar *multiarch_tuples[] = { "mock-abi", NULL }; + const gchar *dri_suffixes[] = {"/usr/lib/mock-abi/GL/lib/dri/i965_dri.so", + NULL}; + const gchar *va_api_suffixes[] = {"/usr/lib/mock-abi/dri/radeonsi_drv_video.so", + "/usr/lib/mock-abi/dri/intel-vaapi-driver/i965_drv_video.so", + "/usr/lib/mock-abi/GL/lib/dri/r600_drv_video.so", + NULL}; + + sysroot = g_build_filename (f->srcdir, "sysroots", "flatpak-example", NULL); + envp = g_get_environ (); + envp = g_environ_setenv (envp, "SRT_TEST_SYSROOT", sysroot, TRUE); + envp = g_environ_unsetenv (envp, "LIBGL_DRIVERS_PATH"); + envp = g_environ_unsetenv (envp, "LIBVA_DRIVERS_PATH"); + + info = srt_system_info_new (NULL); + srt_system_info_set_environ (info, envp); + srt_system_info_set_helpers_path (info, f->builddir); + + dri = srt_system_info_list_dri_drivers (info, multiarch_tuples[0], SRT_DRIVER_FLAGS_NONE); + check_list_suffixes (dri, dri_suffixes, SRT_GRAPHICS_DRI_MODULE); + g_list_free_full (dri, g_object_unref); + + va_api = srt_system_info_list_va_api_drivers (info, multiarch_tuples[0], SRT_DRIVER_FLAGS_NONE); + check_list_suffixes (va_api, va_api_suffixes, SRT_GRAPHICS_VAAPI_MODULE); + g_list_free_full (va_api, g_object_unref); + + g_object_unref (info); + g_free (sysroot); + g_strfreev (envp); +} + static const Config dir_config = { ICD_MODE_EXPLICIT_DIRS }; static const Config filename_config = { ICD_MODE_EXPLICIT_FILENAMES }; static const Config flatpak_config = { ICD_MODE_FLATPAK }; @@ -1734,5 +2049,14 @@ main (int argc, g_test_add ("/graphics/icd/vulkan/xdg", Fixture, &xdg_config, setup, test_icd_vulkan, teardown); + g_test_add ("/graphics/dri/debian10", Fixture, NULL, + setup, test_dri_debian10, teardown); + g_test_add ("/graphics/dri/fedora", Fixture, NULL, + setup, test_dri_fedora, teardown); + g_test_add ("/graphics/dri/with_env", Fixture, NULL, + setup, test_dri_with_env, teardown); + g_test_add ("/graphics/dri/flatpak", Fixture, NULL, + setup, test_dri_flatpak, teardown); + return g_test_run (); } diff --git a/tests/meson.build b/tests/meson.build index 98efe626dbd102d4bdb1ba9f6a46a8a534206b94..8a59c3c4d5ed42ec1dceb08cf5e42c611e5dd148 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -86,7 +86,7 @@ foreach test_name : tests c_args : [ '-D_SRT_MULTIARCH="' + multiarch + '"', ], - dependencies : [glib, gobject, libsteamrt_dep, json_glib], + dependencies : [glib, gobject, json_glib, libsteamrt_dep], include_directories : project_include_dirs, install : get_option('installed_tests'), install_dir : tests_dir, @@ -282,4 +282,49 @@ executable( install_dir: tests_dir ) +executable( + 'mock-debian-x86_64-inspect-library', + 'mock-debian-x86_64-inspect-library.c', + dependencies : [glib], + include_directories : project_include_dirs, + install: true, + install_dir: tests_dir +) + +executable( + 'mock-debian-i386-inspect-library', + 'mock-debian-i386-inspect-library.c', + dependencies : [glib], + include_directories : project_include_dirs, + install: true, + install_dir: tests_dir +) + +executable( + 'mock-fedora-64-bit-inspect-library', + 'mock-fedora-64-bit-inspect-library.c', + dependencies : [glib], + include_directories : project_include_dirs, + install: true, + install_dir: tests_dir +) + +executable( + 'mock-fedora-32-bit-inspect-library', + 'mock-fedora-32-bit-inspect-library.c', + dependencies : [glib], + include_directories : project_include_dirs, + install: true, + install_dir: tests_dir +) + +executable( + 'mock-abi-inspect-library', + 'mock-abi-inspect-library.c', + dependencies : [glib], + include_directories : project_include_dirs, + install: true, + install_dir: tests_dir +) + # vim:set sw=2 sts=2 et: diff --git a/tests/mock-abi-inspect-library.c b/tests/mock-abi-inspect-library.c new file mode 100644 index 0000000000000000000000000000000000000000..f04e71e1de3aa710ac8151ed09b8851f7a16d3d5 --- /dev/null +++ b/tests/mock-abi-inspect-library.c @@ -0,0 +1,47 @@ +/* + * Copyright © 2019 Collabora Ltd. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <glib.h> + +int +main (int argc, + char **argv) +{ + g_return_val_if_fail (argc == 2, EXIT_FAILURE); + + gchar **envp = g_get_environ (); + gchar *path = g_build_filename (g_environ_getenv (envp, "SRT_TEST_SYSROOT"), "usr", "lib", "mock-abi", argv[1], NULL); + + /* Return a JSON like if we found the given soname in a mock-abi lib folder */ + printf ("{\n\t\"%s\": {\n" + "\t\t\"path\": \"%s\"\n" + "\t}\n" + "}\n", argv[1], path); + g_free (path); + g_strfreev (envp); + return 0; +} diff --git a/tests/mock-debian-i386-inspect-library.c b/tests/mock-debian-i386-inspect-library.c new file mode 100644 index 0000000000000000000000000000000000000000..524bc6123c1e45bdede6afa428cbc4720e7d1e32 --- /dev/null +++ b/tests/mock-debian-i386-inspect-library.c @@ -0,0 +1,47 @@ +/* + * Copyright © 2019 Collabora Ltd. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <glib.h> + +int +main (int argc, + char **argv) +{ + g_return_val_if_fail (argc == 2, EXIT_FAILURE); + + gchar **envp = g_get_environ (); + gchar *path = g_build_filename (g_environ_getenv (envp, "SRT_TEST_SYSROOT"), "usr", "lib", "i386-linux-gnu", argv[1], NULL); + + /* Return a JSON like if we found the given soname in a canonical Debian style, i386 lib folder */ + printf ("{\n\t\"%s\": {\n" + "\t\t\"path\": \"%s\"\n" + "\t}\n" + "}\n", argv[1], path); + g_free (path); + g_strfreev (envp); + return 0; +} diff --git a/tests/mock-debian-x86_64-inspect-library.c b/tests/mock-debian-x86_64-inspect-library.c new file mode 100644 index 0000000000000000000000000000000000000000..a1be891940cd170fd024129b1f064fd178f1014b --- /dev/null +++ b/tests/mock-debian-x86_64-inspect-library.c @@ -0,0 +1,47 @@ +/* + * Copyright © 2019 Collabora Ltd. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <glib.h> + +int +main (int argc, + char **argv) +{ + g_return_val_if_fail (argc == 2, EXIT_FAILURE); + + gchar **envp = g_get_environ (); + gchar *path = g_build_filename (g_environ_getenv (envp, "SRT_TEST_SYSROOT"), "usr", "lib", "x86_64-linux-gnu", argv[1], NULL); + + /* Return a JSON like if we found the given soname in a canonical Debian style, x86_64 lib folder */ + printf ("{\n\t\"%s\": {\n" + "\t\t\"path\": \"%s\"\n" + "\t}\n" + "}\n", argv[1], path); + g_free (path); + g_strfreev (envp); + return 0; +} diff --git a/tests/mock-fedora-32-bit-inspect-library.c b/tests/mock-fedora-32-bit-inspect-library.c new file mode 100644 index 0000000000000000000000000000000000000000..f21e5f062552dc9a1e50cefa33c534855486a4aa --- /dev/null +++ b/tests/mock-fedora-32-bit-inspect-library.c @@ -0,0 +1,70 @@ +/* + * Copyright © 2019 Collabora Ltd. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <glib.h> + +int +main (int argc, + char **argv) +{ + g_return_val_if_fail (argc == 2, EXIT_FAILURE); + + /* If the first argument is an absolute path we assume it is a library loader. + * Because the loaders are mock objects we just check if they are located in + * the expected locations. */ + if (g_str_has_prefix (argv[1], "/")) + { + if (g_strstr_len (argv[1], -1, "/lib/i386-linux-gnu/") != NULL || + g_strstr_len (argv[1], -1, "/lib32/dri/") != NULL || + g_strstr_len (argv[1], -1, "/lib/dri/") != NULL || + g_strstr_len (argv[1], -1, "/custom_path32/") != NULL || + g_strstr_len (argv[1], -1, "/custom_path32_2/") != NULL) + { + printf ("{\n\t\"%s\": {\n" + "\t\t\"path\": \"%s\"\n" + "\t}\n" + "}\n", argv[1], argv[1]); + return EXIT_SUCCESS; + } + else + { + return EXIT_FAILURE; + } + } + + gchar **envp = g_get_environ (); + gchar *path = g_build_filename (g_environ_getenv (envp, "SRT_TEST_SYSROOT"), "usr", "lib", argv[1], NULL); + + /* Return a JSON like if we found the given soname in a canonical Fedora style, 32bit lib folder */ + printf ("{\n\t\"%s\": {\n" + "\t\t\"path\": \"%s\"\n" + "\t}\n" + "}\n", argv[1], path); + g_free (path); + g_strfreev (envp); + return EXIT_SUCCESS; +} diff --git a/tests/mock-fedora-64-bit-inspect-library.c b/tests/mock-fedora-64-bit-inspect-library.c new file mode 100644 index 0000000000000000000000000000000000000000..87fbb04aa32b81c3a5f73e85246b740665cf1757 --- /dev/null +++ b/tests/mock-fedora-64-bit-inspect-library.c @@ -0,0 +1,47 @@ +/* + * Copyright © 2019 Collabora Ltd. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <glib.h> + +int +main (int argc, + char **argv) +{ + g_return_val_if_fail (argc == 2, EXIT_FAILURE); + + gchar **envp = g_get_environ (); + gchar *path = g_build_filename (g_environ_getenv (envp, "SRT_TEST_SYSROOT"), "usr", "lib64", argv[1], NULL); + + /* Return a JSON like if we found the given soname in a canonical Fedora style, 64bit lib folder */ + printf ("{\n\t\"%s\": {\n" + "\t\t\"path\": \"%s\"\n" + "\t}\n" + "}\n", argv[1], path); + g_free (path); + g_strfreev (envp); + return 0; +} diff --git a/tests/sysroots/no-os-release/.gitignore b/tests/sysroots/debian10/usr/lib/i386-linux-gnu/dri/i965_dri.so similarity index 100% rename from tests/sysroots/no-os-release/.gitignore rename to tests/sysroots/debian10/usr/lib/i386-linux-gnu/dri/i965_dri.so diff --git a/tests/sysroots/debian10/usr/lib/i386-linux-gnu/dri/r300_dri.so b/tests/sysroots/debian10/usr/lib/i386-linux-gnu/dri/r300_dri.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/debian10/usr/lib/i386-linux-gnu/dri/r600_drv_video.so b/tests/sysroots/debian10/usr/lib/i386-linux-gnu/dri/r600_drv_video.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/debian10/usr/lib/i386-linux-gnu/dri/radeonsi_dri.so b/tests/sysroots/debian10/usr/lib/i386-linux-gnu/dri/radeonsi_dri.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/debian10/usr/lib/i386-linux-gnu/libEGL_mesa.so.0 b/tests/sysroots/debian10/usr/lib/i386-linux-gnu/libEGL_mesa.so.0 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/debian10/usr/lib/i386-linux-gnu/libva.so.2 b/tests/sysroots/debian10/usr/lib/i386-linux-gnu/libva.so.2 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/debian10/usr/lib/x86_64-linux-gnu/dri/i965_dri.so b/tests/sysroots/debian10/usr/lib/x86_64-linux-gnu/dri/i965_dri.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/debian10/usr/lib/x86_64-linux-gnu/dri/r600_dri.so b/tests/sysroots/debian10/usr/lib/x86_64-linux-gnu/dri/r600_dri.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/debian10/usr/lib/x86_64-linux-gnu/dri/r600_drv_video.so b/tests/sysroots/debian10/usr/lib/x86_64-linux-gnu/dri/r600_drv_video.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/debian10/usr/lib/x86_64-linux-gnu/dri/radeon_dri.so b/tests/sysroots/debian10/usr/lib/x86_64-linux-gnu/dri/radeon_dri.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/debian10/usr/lib/x86_64-linux-gnu/dri/radeonsi_drv_video.so b/tests/sysroots/debian10/usr/lib/x86_64-linux-gnu/dri/radeonsi_drv_video.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/debian10/usr/lib/x86_64-linux-gnu/libEGL_mesa.so.0 b/tests/sysroots/debian10/usr/lib/x86_64-linux-gnu/libEGL_mesa.so.0 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/debian10/usr/lib/x86_64-linux-gnu/libGL.so.1 b/tests/sysroots/debian10/usr/lib/x86_64-linux-gnu/libGL.so.1 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/debian10/usr/lib/x86_64-linux-gnu/libGLX_mesa.so.0 b/tests/sysroots/debian10/usr/lib/x86_64-linux-gnu/libGLX_mesa.so.0 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/debian10/usr/lib/x86_64-linux-gnu/libva.so.2 b/tests/sysroots/debian10/usr/lib/x86_64-linux-gnu/libva.so.2 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/fedora/usr/lib/dri/i965_dri.so b/tests/sysroots/fedora/usr/lib/dri/i965_dri.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/fedora/usr/lib/dri/r300_dri.so b/tests/sysroots/fedora/usr/lib/dri/r300_dri.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/fedora/usr/lib/dri/r600_drv_video.so b/tests/sysroots/fedora/usr/lib/dri/r600_drv_video.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/fedora/usr/lib/dri/radeonsi_dri.so b/tests/sysroots/fedora/usr/lib/dri/radeonsi_dri.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/fedora/usr/lib/libEGL_mesa.so.0 b/tests/sysroots/fedora/usr/lib/libEGL_mesa.so.0 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/fedora/usr/lib/libGL.so.1 b/tests/sysroots/fedora/usr/lib/libGL.so.1 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/fedora/usr/lib/libva.so.1 b/tests/sysroots/fedora/usr/lib/libva.so.1 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/fedora/usr/lib64/dri/i965_dri.so b/tests/sysroots/fedora/usr/lib64/dri/i965_dri.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/fedora/usr/lib64/dri/r600_dri.so b/tests/sysroots/fedora/usr/lib64/dri/r600_dri.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/fedora/usr/lib64/dri/r600_drv_video.so b/tests/sysroots/fedora/usr/lib64/dri/r600_drv_video.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/fedora/usr/lib64/dri/radeon_dri.so b/tests/sysroots/fedora/usr/lib64/dri/radeon_dri.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/fedora/usr/lib64/dri/radeonsi_drv_video.so b/tests/sysroots/fedora/usr/lib64/dri/radeonsi_drv_video.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/fedora/usr/lib64/libEGL_mesa.so.0 b/tests/sysroots/fedora/usr/lib64/libEGL_mesa.so.0 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/fedora/usr/lib64/libva.so.2 b/tests/sysroots/fedora/usr/lib64/libva.so.2 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/flatpak-example/.flatpak-info b/tests/sysroots/flatpak-example/.flatpak-info new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/flatpak-example/usr/lib/dri/r300_dri.so b/tests/sysroots/flatpak-example/usr/lib/dri/r300_dri.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/flatpak-example/usr/lib/dri/r600_drv_video.so b/tests/sysroots/flatpak-example/usr/lib/dri/r600_drv_video.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/flatpak-example/usr/lib/mock-abi/GL/lib/dri/i965_dri.so b/tests/sysroots/flatpak-example/usr/lib/mock-abi/GL/lib/dri/i965_dri.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/flatpak-example/usr/lib/mock-abi/GL/lib/dri/r600_drv_video.so b/tests/sysroots/flatpak-example/usr/lib/mock-abi/GL/lib/dri/r600_drv_video.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/flatpak-example/usr/lib/mock-abi/dri/intel-vaapi-driver/i965_drv_video.so b/tests/sysroots/flatpak-example/usr/lib/mock-abi/dri/intel-vaapi-driver/i965_drv_video.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/flatpak-example/usr/lib/mock-abi/dri/radeonsi_drv_video.so b/tests/sysroots/flatpak-example/usr/lib/mock-abi/dri/radeonsi_drv_video.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/flatpak-example/usr/lib/mock-abi/libEGL_mesa.so.0 b/tests/sysroots/flatpak-example/usr/lib/mock-abi/libEGL_mesa.so.0 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/flatpak-example/usr/lib/mock-abi/libva.so.2 b/tests/sysroots/flatpak-example/usr/lib/mock-abi/libva.so.2 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/no-os-release/custom_path32/dri/r600_dri.so b/tests/sysroots/no-os-release/custom_path32/dri/r600_dri.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/no-os-release/custom_path32/dri/radeon_dri.so b/tests/sysroots/no-os-release/custom_path32/dri/radeon_dri.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/no-os-release/custom_path32/va/r600_drv_video.so b/tests/sysroots/no-os-release/custom_path32/va/r600_drv_video.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/no-os-release/custom_path32/va/radeonsi_drv_video.so b/tests/sysroots/no-os-release/custom_path32/va/radeonsi_drv_video.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/no-os-release/custom_path32_2/dri/r300_dri.so b/tests/sysroots/no-os-release/custom_path32_2/dri/r300_dri.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/no-os-release/custom_path32_2/va/nouveau_drv_video.so b/tests/sysroots/no-os-release/custom_path32_2/va/nouveau_drv_video.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/no-os-release/custom_path64/dri/i965_dri.so b/tests/sysroots/no-os-release/custom_path64/dri/i965_dri.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/no-os-release/custom_path64/va/radeonsi_drv_video.so b/tests/sysroots/no-os-release/custom_path64/va/radeonsi_drv_video.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/no-os-release/usr/lib/dri/i965_dri.so b/tests/sysroots/no-os-release/usr/lib/dri/i965_dri.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/no-os-release/usr/lib/dri/r600_drv_video.so b/tests/sysroots/no-os-release/usr/lib/dri/r600_drv_video.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/no-os-release/usr/lib/dri/radeonsi_dri.so b/tests/sysroots/no-os-release/usr/lib/dri/radeonsi_dri.so new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/no-os-release/usr/lib/libGL.so.1 b/tests/sysroots/no-os-release/usr/lib/libGL.so.1 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/sysroots/no-os-release/usr/lib/libva.so.1 b/tests/sysroots/no-os-release/usr/lib/libva.so.1 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/system-info-cli.c b/tests/system-info-cli.c index 6d384f5e165f3714513e3608705a4850f1975271..769140c1be1680f17b45da996f7745f81477adf4 100644 --- a/tests/system-info-cli.c +++ b/tests/system-info-cli.c @@ -148,6 +148,8 @@ libraries_presence (Fixture *f, array = json_object_get_array_member (json_arch, "library-issues-summary"); g_assert_cmpint (json_array_get_length (array), ==, 0); } + g_assert_true (json_object_has_member (json_arch, "dri_drivers")); + g_assert_true (json_object_has_member (json_arch, "va-api_drivers")); } g_object_unref (parser); @@ -266,6 +268,8 @@ libraries_missing (Fixture *f, ==, srt_system_info_can_run (info, multiarch_tuples[i])); g_assert_cmpint (json_object_has_member (json_arch, "library-issues-summary"), ==, srt_system_info_can_run (info, multiarch_tuples[i])); + g_assert_true (json_object_has_member (json_arch, "dri_drivers")); + g_assert_true (json_object_has_member (json_arch, "va-api_drivers")); check_libraries_missing (json_arch); } @@ -381,6 +385,8 @@ libraries_presence_verbose (Fixture *f, ==, srt_system_info_can_run (info, multiarch_tuples[i])); g_assert_cmpint (json_object_has_member (json_arch, "library-issues-summary"), ==, srt_system_info_can_run (info, multiarch_tuples[i])); + g_assert_true (json_object_has_member (json_arch, "dri_drivers")); + g_assert_true (json_object_has_member (json_arch, "va-api_drivers")); check_libraries_verbose (json_arch); } @@ -446,6 +452,8 @@ no_arguments (Fixture *f, g_assert_true (json_object_has_member (json_arch, "can-run")); g_assert_cmpint (json_object_get_boolean_member (json_arch, "can-run"), ==, srt_system_info_can_run (info, multiarch_tuples[i])); + g_assert_true (json_object_has_member (json_arch, "dri_drivers")); + g_assert_true (json_object_has_member (json_arch, "va-api_drivers")); } g_object_unref (parser);