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);