diff --git a/bin/system-info.c b/bin/system-info.c
index 7bd36df9bef41f0c8e60dbeb86f35fea51226054..903dde23ed6a9a4c2f8ec63e1fafcf8bc8442f94 100644
--- a/bin/system-info.c
+++ b/bin/system-info.c
@@ -449,6 +449,7 @@ print_graphics_details(JsonBuilder *builder,
       gchar *parameters = srt_graphics_dup_parameters_string (g->data);
       const char *messages;
       SrtGraphicsLibraryVendor library_vendor;
+      SrtRenderingInterface rendering_interface;
 
       json_builder_set_member_name (builder, parameters);
       json_builder_begin_object (builder);
@@ -465,7 +466,11 @@ print_graphics_details(JsonBuilder *builder,
       json_builder_add_string_value (builder, srt_graphics_get_renderer_string (g->data));
       json_builder_set_member_name (builder, "version");
       json_builder_add_string_value (builder, srt_graphics_get_version_string (g->data));
-      if (srt_graphics_get_rendering_interface (g->data) != SRT_RENDERING_INTERFACE_VULKAN)
+
+      rendering_interface = srt_graphics_get_rendering_interface (g->data);
+      if (rendering_interface != SRT_RENDERING_INTERFACE_VULKAN &&
+          rendering_interface != SRT_RENDERING_INTERFACE_VDPAU &&
+          rendering_interface != SRT_RENDERING_INTERFACE_VAAPI)
         {
           json_builder_set_member_name (builder, "library-vendor");
           srt_graphics_library_is_vendor_neutral (g->data, &library_vendor);
diff --git a/bin/system-info.md b/bin/system-info.md
index 12a745421276ccba1695eb73ac0fb95615f11362..c0ee32e986c3e193084f379e69a961408b1b10e7 100644
--- a/bin/system-info.md
+++ b/bin/system-info.md
@@ -411,6 +411,12 @@ keys:
         **vulkan**
         :   Vulkan
 
+        **vdpau**
+        :   VDPAU
+
+        **va-api**
+        :   VA-API
+
         The values are objects with the following string keys:
 
         **renderer**
diff --git a/helpers/check-va-api.c b/helpers/check-va-api.c
index 67a8512adce5de03a02adf4dad9cfbc5fa2ba513..b7ccc506e7ad0f5718fe8cbd53a5d5236923629c 100644
--- a/helpers/check-va-api.c
+++ b/helpers/check-va-api.c
@@ -40,12 +40,14 @@
 enum
 {
   OPTION_HELP = 1,
+  OPTION_VERBOSE,
   OPTION_VERSION,
 };
 
 struct option long_options[] =
 {
   { "help", no_argument, NULL, OPTION_HELP },
+  { "verbose", no_argument, NULL, OPTION_VERBOSE },
   { "version", no_argument, NULL, OPTION_VERSION },
   { NULL, 0, NULL, 0 }
 };
@@ -89,6 +91,7 @@ main (int argc,
 
 #define do_vaapi_or_exit(expr) if (! _do_vaapi (#expr, expr)) goto out;
 
+  bool verbose = false;
   int opt;
   int surfaces_count = 2;
   int ret = 1;
@@ -123,6 +126,10 @@ main (int argc,
             usage (0);
             break;
 
+          case OPTION_VERBOSE:
+            verbose = true;
+            break;
+
           case OPTION_VERSION:
             /* Output version number as YAML for machine-readability,
              * inspired by `ostree --version` and `docker version` */
@@ -180,6 +187,9 @@ main (int argc,
 
   do_vaapi_or_exit (vaInitialize (va_display, &major_version, &minor_version));
 
+  if (verbose)
+    printf ("%s\n", vaQueryVendorString (va_display));
+
   /* Test the ability to get the supported profiles and that they are not more than
    * the maximum number from the implementation */
   max_profiles = vaMaxNumProfiles (va_display);
diff --git a/helpers/check-vdpau.c b/helpers/check-vdpau.c
index 9480f943320603fb49e037f41f39b9125964b32c..8f9519a1b3e6a2d0d3953a3c6f24aa484b7ab6bf 100644
--- a/helpers/check-vdpau.c
+++ b/helpers/check-vdpau.c
@@ -27,6 +27,7 @@
  */
 
 #include <assert.h>
+#include <stdbool.h>
 #include <errno.h>
 #include <getopt.h>
 #include <stdio.h>
@@ -37,6 +38,7 @@
 #include <vdpau/vdpau.h>
 #include <vdpau/vdpau_x11.h>
 
+static VdpGetInformationString *vdp_get_information_string;
 static VdpGetProcAddress *vdp_get_proc_address;
 static VdpDeviceDestroy *vdp_device_destroy;
 static VdpGetErrorString *vdp_get_error_string;
@@ -48,12 +50,14 @@ static VdpOutputSurfaceRenderOutputSurface *vdp_output_surface_render_output_sur
 enum
 {
   OPTION_HELP = 1,
+  OPTION_VERBOSE,
   OPTION_VERSION,
 };
 
 struct option long_options[] =
 {
   { "help", no_argument, NULL, OPTION_HELP },
+  { "verbose", no_argument, NULL, OPTION_VERBOSE },
   { "version", no_argument, NULL, OPTION_VERSION },
   { NULL, 0, NULL, 0 }
 };
@@ -103,12 +107,13 @@ load_vdpau (VdpDevice dev)
 {
 #define GET_POINTER(fid, fn) do_vdpau_or_exit (vdp_get_proc_address (dev, fid, (void**)&fn))
 
-   GET_POINTER(VDP_FUNC_ID_DEVICE_DESTROY,                       vdp_device_destroy);
-   GET_POINTER(VDP_FUNC_ID_GET_ERROR_STRING,                     vdp_get_error_string);
-   GET_POINTER(VDP_FUNC_ID_OUTPUT_SURFACE_CREATE,                vdp_output_surface_create);
-   GET_POINTER(VDP_FUNC_ID_OUTPUT_SURFACE_GET_BITS_NATIVE,       vdp_output_surface_get_bits_native);
-   GET_POINTER(VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_NATIVE,       vdp_output_surface_put_bits_native);
-   GET_POINTER(VDP_FUNC_ID_OUTPUT_SURFACE_RENDER_OUTPUT_SURFACE, vdp_output_surface_render_output_surface);
+  GET_POINTER(VDP_FUNC_ID_GET_INFORMATION_STRING,               vdp_get_information_string);
+  GET_POINTER(VDP_FUNC_ID_DEVICE_DESTROY,                       vdp_device_destroy);
+  GET_POINTER(VDP_FUNC_ID_GET_ERROR_STRING,                     vdp_get_error_string);
+  GET_POINTER(VDP_FUNC_ID_OUTPUT_SURFACE_CREATE,                vdp_output_surface_create);
+  GET_POINTER(VDP_FUNC_ID_OUTPUT_SURFACE_GET_BITS_NATIVE,       vdp_output_surface_get_bits_native);
+  GET_POINTER(VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_NATIVE,       vdp_output_surface_put_bits_native);
+  GET_POINTER(VDP_FUNC_ID_OUTPUT_SURFACE_RENDER_OUTPUT_SURFACE, vdp_output_surface_render_output_surface);
 }
 
 int
@@ -119,8 +124,10 @@ main (int argc,
   VdpDevice device;
   VdpOutputSurface out_surface_1;
   VdpOutputSurface out_surface_2;
+  bool verbose = false;
   int screen;
   int opt;
+  const char* information = NULL;
 
   /* Arbitrarily declare two 4x4 source images */
   uint32_t black_box[] =
@@ -151,6 +158,10 @@ main (int argc,
             usage (0);
             break;
 
+          case OPTION_VERBOSE:
+            verbose = true;
+            break;
+
           case OPTION_VERSION:
             /* Output version number as YAML for machine-readability,
              * inspired by `ostree --version` and `docker version` */
@@ -180,6 +191,12 @@ main (int argc,
 
   load_vdpau (device);
 
+  if (verbose)
+    {
+      do_vdpau_or_exit (vdp_get_information_string (&information));
+      printf ("%s\n", information);
+    }
+
   do_vdpau_or_exit (vdp_output_surface_create (device, VDP_RGBA_FORMAT_B8G8R8A8, 4, 4, &out_surface_1));
   do_vdpau_or_exit (vdp_output_surface_create (device, VDP_RGBA_FORMAT_B8G8R8A8, 4, 4, &out_surface_2));
 
diff --git a/steam-runtime-tools/graphics-test-defines.h b/steam-runtime-tools/graphics-test-defines.h
index 83832ad50c6e56645a502bacc6743881d6413c59..a53de0fd34e269a02f3f1d67d3e66cf903b12843 100644
--- a/steam-runtime-tools/graphics-test-defines.h
+++ b/steam-runtime-tools/graphics-test-defines.h
@@ -33,4 +33,9 @@
 #define SRT_TEST_SOFTWARE_GRAPHICS_VERSION "3.1 Mesa 19.1.3"
 #define SRT_TEST_GOOD_VULKAN_DRIVER_VERSION "79695877"
 #define SRT_TEST_GOOD_VULKAN_VERSION "1.1.102 (device 8086:0412) (driver 19.1.5)"
-
+#define SRT_TEST_GOOD_VDPAU_RENDERER "G3DVL VDPAU Driver Shared Library version 1.0\n"
+#define SRT_TEST_BAD_VDPAU_MESSAGES "Failed to open VDPAU backend libvdpau_nvidia.so: cannot open shared object file: No such file or directory\n\
+vdp_device_create_x11 (display, screen, &device, &vdp_get_proc_address) failed: 1\n"
+#define SRT_TEST_GOOD_VAAPI_RENDERER "Mesa Gallium driver 20.0.4 for AMD Radeon RX 5700 XT (NAVI10, DRM 3.36.0, 5.6.3-arch1-1, LLVM 9.0.1)\n"
+#define SRT_TEST_BAD_VAAPI_MESSAGES "libva error: vaGetDriverNameByIndex() failed with unknown libva error, driver_name = (null)\n\
+vaInitialize (va_display, &major_version, &minor_version) failed: unknown libva error (-1)\n"
diff --git a/steam-runtime-tools/graphics.c b/steam-runtime-tools/graphics.c
index 256d70988a4f3257664c8e49c32073af089e395f..cc971ebbf160fab1a7302903418b5e2d8c4653b8 100644
--- a/steam-runtime-tools/graphics.c
+++ b/steam-runtime-tools/graphics.c
@@ -504,6 +504,8 @@ _argv_for_graphics_test (const char *helpers_path,
 
           case SRT_RENDERING_INTERFACE_GLESV2:
           case SRT_RENDERING_INTERFACE_VULKAN:
+          case SRT_RENDERING_INTERFACE_VDPAU:
+          case SRT_RENDERING_INTERFACE_VAAPI:
           default:
             g_critical ("GLX window system only makes sense with GL "
                         "rendering interface, not %d",
@@ -527,6 +529,8 @@ _argv_for_graphics_test (const char *helpers_path,
             break;
 
           case SRT_RENDERING_INTERFACE_VULKAN:
+          case SRT_RENDERING_INTERFACE_VDPAU:
+          case SRT_RENDERING_INTERFACE_VAAPI:
             /* They don't set platformstring, just set argv later. */
             break;
 
@@ -544,6 +548,8 @@ _argv_for_graphics_test (const char *helpers_path,
             break;
 
           case SRT_RENDERING_INTERFACE_VULKAN:
+          case SRT_RENDERING_INTERFACE_VDPAU:
+          case SRT_RENDERING_INTERFACE_VAAPI:
           default:
             g_critical ("EGL window system only makes sense with a GL-based "
                         "rendering interface, not %d",
@@ -589,6 +595,26 @@ _argv_for_graphics_test (const char *helpers_path,
         g_ptr_array_add (argv, g_strdup ("-j"));
         break;
 
+      case SRT_RENDERING_INTERFACE_VDPAU:
+        argv = _srt_get_helper (helpers_path, multiarch_tuple, "check-vdpau",
+                                flags, error);
+
+        if (argv == NULL)
+          goto out;
+
+        g_ptr_array_add (argv, g_strdup ("--verbose"));
+        break;
+
+      case SRT_RENDERING_INTERFACE_VAAPI:
+        argv = _srt_get_helper (helpers_path, multiarch_tuple, "check-va-api",
+                                flags, error);
+
+        if (argv == NULL)
+          goto out;
+
+        g_ptr_array_add (argv, g_strdup ("--verbose"));
+        break;
+
       default:
         g_return_val_if_reached (NULL);
         break;
@@ -782,9 +808,11 @@ _srt_check_library_vendor (const char *multiarch_tuple,
   SrtLibraryIssues issues;
   const char * const *dependencies;
 
-  /* Vulkan is always vendor-neutral, so it doesn't make sense to check it. We simply return
-   * SRT_GRAPHICS_LIBRARY_VENDOR_UNKNOWN */
-  if (rendering_interface == SRT_RENDERING_INTERFACE_VULKAN)
+  /* Vulkan, VDPAU and VA-API are always vendor-neutral, so it doesn't make sense to check it.
+   * We simply return SRT_GRAPHICS_LIBRARY_VENDOR_UNKNOWN */
+  if (rendering_interface == SRT_RENDERING_INTERFACE_VULKAN ||
+      rendering_interface == SRT_RENDERING_INTERFACE_VDPAU ||
+      rendering_interface == SRT_RENDERING_INTERFACE_VAAPI)
     goto out;
 
   switch (window_system)
@@ -954,6 +982,7 @@ _srt_check_graphics (const char *helpers_path,
   const gchar *renderer_string = NULL;
   GError *error = NULL;
   SrtGraphicsIssues issues = SRT_GRAPHICS_ISSUES_NONE;
+  SrtGraphicsIssues non_zero_wait_status_issue = SRT_GRAPHICS_ISSUES_CANNOT_LOAD;
   GStrv my_environ = NULL;
   const gchar *ld_preload;
   gchar *filtered_preload = NULL;
@@ -989,6 +1018,24 @@ _srt_check_graphics (const char *helpers_path,
 
   library_vendor = _srt_check_library_vendor (multiarch_tuple, window_system, rendering_interface);
 
+  switch (rendering_interface)
+    {
+      case SRT_RENDERING_INTERFACE_GL:
+      case SRT_RENDERING_INTERFACE_GLESV2:
+      case SRT_RENDERING_INTERFACE_VULKAN:
+        non_zero_wait_status_issue = SRT_GRAPHICS_ISSUES_CANNOT_LOAD;
+        break;
+
+      case SRT_RENDERING_INTERFACE_VDPAU:
+      case SRT_RENDERING_INTERFACE_VAAPI:
+        /* The test here tries to draw an offscreen X11 window */
+        non_zero_wait_status_issue = SRT_GRAPHICS_ISSUES_CANNOT_DRAW;
+        break;
+
+      default:
+        g_return_val_if_reached (SRT_GRAPHICS_ISSUES_INTERNAL_ERROR);
+    }
+
   issues |= _srt_run_helper (&my_environ,
                              &output,
                              &child_stderr,
@@ -997,7 +1044,7 @@ _srt_check_graphics (const char *helpers_path,
                              &exit_status,
                              &terminating_signal,
                              FALSE,
-                             SRT_GRAPHICS_ISSUES_CANNOT_LOAD);
+                             non_zero_wait_status_issue);
 
   if (issues != SRT_GRAPHICS_ISSUES_NONE)
     {
@@ -1010,7 +1057,7 @@ _srt_check_graphics (const char *helpers_path,
                                  &exit_status,
                                  &terminating_signal,
                                  TRUE,
-                                 SRT_GRAPHICS_ISSUES_CANNOT_LOAD);
+                                 non_zero_wait_status_issue);
 
       goto out;
     }
@@ -1044,6 +1091,11 @@ _srt_check_graphics (const char *helpers_path,
           }
         break;
 
+      case SRT_RENDERING_INTERFACE_VDPAU:
+      case SRT_RENDERING_INTERFACE_VAAPI:
+        /* The output is in plan text, nothing to do here */
+        break;
+
       default:
         g_return_val_if_reached (SRT_GRAPHICS_ISSUES_INTERNAL_ERROR);
     }
@@ -1151,6 +1203,12 @@ _srt_check_graphics (const char *helpers_path,
                                    SRT_GRAPHICS_ISSUES_CANNOT_DRAW);
         break;
 
+      case SRT_RENDERING_INTERFACE_VDPAU:
+      case SRT_RENDERING_INTERFACE_VAAPI:
+        if (output != NULL)
+          renderer_string = output;
+        break;
+
       default:
         g_return_val_if_reached (SRT_GRAPHICS_ISSUES_INTERNAL_ERROR);
     }
@@ -1217,7 +1275,7 @@ srt_graphics_get_issues (SrtGraphics *self)
  *  or vendor-specific, and if vendor-specific, attempt to guess the vendor
  *
  * Return whether the entry-point library for this graphics stack is vendor-neutral or vendor-specific.
- * Vulkan is always vendor-neutral, so this function will always return %TRUE for it.
+ * Vulkan, VDPAU and VA-API are always vendor-neutral, so this function will always return %TRUE for them.
  *
  * Returns: %TRUE if the graphics library is vendor-neutral, %FALSE otherwise.
  */
@@ -1231,6 +1289,8 @@ srt_graphics_library_is_vendor_neutral (SrtGraphics *self,
     *vendor_out = self->library_vendor;
 
   return (self->rendering_interface == SRT_RENDERING_INTERFACE_VULKAN ||
+          self->rendering_interface == SRT_RENDERING_INTERFACE_VDPAU ||
+          self->rendering_interface == SRT_RENDERING_INTERFACE_VAAPI ||
           self->library_vendor == SRT_GRAPHICS_LIBRARY_VENDOR_GLVND);
 }
 
diff --git a/steam-runtime-tools/graphics.h b/steam-runtime-tools/graphics.h
index 3f30c60eb468b6ec0c596db2022f89c1ca321c51..31400d7505cd8a5e41282d884dc65878f5febe64 100644
--- a/steam-runtime-tools/graphics.h
+++ b/steam-runtime-tools/graphics.h
@@ -109,16 +109,19 @@ typedef enum
  * @SRT_RENDERING_INTERFACE_GL: GL rendering interface
  * @SRT_RENDERING_INTERFACE_GLESV2: GLESv2 rendering interfaces
  * @SRT_RENDERING_INTERFACE_VULKAN: Vulkan rendering interface
+ * @SRT_RENDERING_INTERFACE_VDPAU: VDPAU rendering interface
  */
 typedef enum
 {
   SRT_RENDERING_INTERFACE_GL,
   SRT_RENDERING_INTERFACE_GLESV2,
   SRT_RENDERING_INTERFACE_VULKAN,
+  SRT_RENDERING_INTERFACE_VDPAU,
+  SRT_RENDERING_INTERFACE_VAAPI,
   /* ... possible future additions: GLESV1, GLESV3? */
 } SrtRenderingInterface;
 
-#define SRT_N_RENDERING_INTERFACES (SRT_RENDERING_INTERFACE_VULKAN + 1)
+#define SRT_N_RENDERING_INTERFACES (SRT_RENDERING_INTERFACE_VAAPI + 1)
 
 const char *srt_graphics_get_multiarch_tuple (SrtGraphics *self);
 SrtGraphicsIssues srt_graphics_get_issues (SrtGraphics *self);
diff --git a/steam-runtime-tools/system-info.c b/steam-runtime-tools/system-info.c
index 19c5208e7f5949a183e44a3be1970510f3009a6b..93b4c7f011eb1cde717b8a56a0da153cf8246f20 100644
--- a/steam-runtime-tools/system-info.c
+++ b/steam-runtime-tools/system-info.c
@@ -1538,7 +1538,7 @@ GList * srt_system_info_check_all_graphics (SrtSystemInfo *self,
       return list;
     }
 
-  // Try each of glx and gles
+  // Try each rendering interface
   // Try each window system
 
   abi->cached_combined_issues |=
@@ -1569,6 +1569,13 @@ GList * srt_system_info_check_all_graphics (SrtSystemInfo *self,
                                     SRT_RENDERING_INTERFACE_VULKAN,
                                     NULL);
 
+  abi->cached_combined_issues |=
+    srt_system_info_check_graphics (self,
+                                    multiarch_tuple,
+                                    SRT_WINDOW_SYSTEM_X11,
+                                    SRT_RENDERING_INTERFACE_VDPAU,
+                                    NULL);
+
   abi->graphics_cache_available = TRUE;
 
   list = g_list_sort (g_hash_table_get_values (abi->cached_graphics_results),
diff --git a/tests/graphics.c b/tests/graphics.c
index 4087d294e4bbcb72e83733a60b8929068d3ec09b..d04c84213425c4a93a503b0a23fe4f89afba0638 100644
--- a/tests/graphics.c
+++ b/tests/graphics.c
@@ -259,64 +259,6 @@ test_object (Fixture *f,
   g_object_unref (graphics);
 }
 
-/*
- * Test a mock system with hardware graphics stack
- */
-static void
-test_good_graphics (Fixture *f,
-                    gconstpointer context)
-{
-  SrtGraphics *graphics = NULL;
-  SrtGraphicsIssues issues;
-  gchar *messages;
-  gchar *tuple;
-  gchar *renderer;
-  gchar *version;
-  int exit_status;
-  int terminating_signal;
-
-  SrtSystemInfo *info = srt_system_info_new (NULL);
-  srt_system_info_set_helpers_path (info, f->builddir);
-
-  issues = srt_system_info_check_graphics (info,
-                                           "mock-good",
-                                           SRT_WINDOW_SYSTEM_GLX,
-                                           SRT_RENDERING_INTERFACE_GL,
-                                           &graphics);
-  g_assert_cmpint (issues, ==, SRT_GRAPHICS_ISSUES_NONE);
-  g_assert_cmpstr (srt_graphics_get_messages (graphics), ==,
-                   NULL);
-  g_assert_cmpstr (srt_graphics_get_renderer_string (graphics), ==,
-                   SRT_TEST_GOOD_GRAPHICS_RENDERER);
-  g_assert_cmpstr (srt_graphics_get_version_string (graphics), ==,
-                   SRT_TEST_GOOD_GRAPHICS_VERSION);
-  g_assert_cmpint (srt_graphics_get_exit_status (graphics), ==, 0);
-  g_assert_cmpint (srt_graphics_get_terminating_signal (graphics), ==, 0);
-  g_object_get (graphics,
-                "messages", &messages,
-                "multiarch-tuple", &tuple,
-                "issues", &issues,
-                "renderer-string", &renderer,
-                "version-string", &version,
-                "exit-status", &exit_status,
-                "terminating-signal", &terminating_signal,
-                NULL);
-  g_assert_cmpstr (messages, ==, NULL);
-  g_assert_cmpint (issues, ==, SRT_GRAPHICS_ISSUES_NONE);
-  g_assert_cmpstr (tuple, ==, "mock-good");
-  g_assert_cmpstr (renderer, ==, SRT_TEST_GOOD_GRAPHICS_RENDERER);
-  g_assert_cmpstr (version, ==, SRT_TEST_GOOD_GRAPHICS_VERSION);
-  g_assert_cmpint (exit_status, ==, 0);
-  g_assert_cmpint (terminating_signal, ==, 0);
-  g_free (tuple);
-  g_free (renderer);
-  g_free (version);
-  g_free (messages);
-
-  g_object_unref (graphics);
-  g_object_unref (info);
-}
-
 /*
  * Test that the X11 window system is normalized correctly.
  */
@@ -443,412 +385,6 @@ test_normalize_window_system (Fixture *f,
   g_object_unref (info);
 }
 
-/*
- * Test a mock system with no graphics stack
- */
-static void
-test_bad_graphics (Fixture *f,
-                   gconstpointer context)
-{
-  SrtGraphics *graphics = NULL;
-  SrtGraphicsIssues issues;
-  SrtGraphicsLibraryVendor library_vendor;
-  gboolean vendor_neutral;
-  gchar *messages;
-  gchar *tuple;
-  gchar *renderer;
-  gchar *version;
-  int exit_status;
-  int terminating_signal;
-
-  SrtSystemInfo *info = srt_system_info_new (NULL);
-  srt_system_info_set_helpers_path (info, f->builddir);
-
-  issues = srt_system_info_check_graphics (info,
-                                           "mock-bad",
-                                           SRT_WINDOW_SYSTEM_GLX,
-                                           SRT_RENDERING_INTERFACE_GL,
-                                           &graphics);
-  g_assert_cmpint (issues, ==, SRT_GRAPHICS_ISSUES_CANNOT_LOAD);
-  g_assert_cmpstr (srt_graphics_get_renderer_string (graphics), ==,
-                   NULL);
-  g_assert_cmpstr (srt_graphics_get_version_string (graphics), ==,
-                   NULL);
-  g_assert_cmpstr (srt_graphics_get_messages (graphics), ==,
-                   "warning: this warning should always be logged\n"
-                   "Waffle error: 0x2 WAFFLE_ERROR_UNKNOWN: XOpenDisplay failed\n"
-                  "info: you used LIBGL_DEBUG=verbose\n");
-  g_assert_cmpint (srt_graphics_get_exit_status (graphics), ==, 1);
-  g_assert_cmpint (srt_graphics_get_terminating_signal (graphics), ==, 0);
-
-  /* We used "mock-bad" for the architecture so, when checking the library vendor,
-   * we will not be able to call the helper `mock-bad-check-library`.
-   * For this reason we expect %SRT_GRAPHICS_LIBRARY_VENDOR_UNKNOWN */
-  vendor_neutral = srt_graphics_library_is_vendor_neutral (graphics, &library_vendor);
-  g_assert_cmpint (library_vendor, ==, SRT_GRAPHICS_LIBRARY_VENDOR_UNKNOWN);
-  g_assert_false (vendor_neutral);
-  g_object_get (graphics,
-                "messages", &messages,
-                "multiarch-tuple", &tuple,
-                "issues", &issues,
-                "library-vendor", &library_vendor,
-                "renderer-string", &renderer,
-                "version-string", &version,
-                "exit-status", &exit_status,
-                "terminating-signal", &terminating_signal,
-                NULL);
-  g_assert_cmpint (issues, ==, SRT_GRAPHICS_ISSUES_CANNOT_LOAD);
-  g_assert_cmpint (library_vendor, ==, SRT_GRAPHICS_LIBRARY_VENDOR_UNKNOWN);
-  g_assert_cmpstr (messages, ==,
-                   "warning: this warning should always be logged\n"
-                   "Waffle error: 0x2 WAFFLE_ERROR_UNKNOWN: XOpenDisplay failed\n"
-                  "info: you used LIBGL_DEBUG=verbose\n");
-  g_assert_cmpstr (tuple, ==, "mock-bad");
-  g_assert_cmpstr (renderer, ==, NULL);
-  g_assert_cmpstr (version, ==, NULL);
-  g_assert_cmpint (exit_status, ==, 1);
-  g_assert_cmpint (terminating_signal, ==, 0);
-  g_free (messages);
-  g_free (tuple);
-  g_free (renderer);
-  g_free (version);
-
-  g_object_unref (graphics);
-  g_object_unref (info);
-}
-
-/*
- * Test a mock system with timeout
- */
-static void
-test_timeout_graphics (Fixture *f,
-                   gconstpointer context)
-{
-  SrtGraphics *graphics = NULL;
-  SrtGraphicsIssues issues;
-  gchar *tuple;
-  gchar *renderer;
-  gchar *version;
-  int exit_status;
-  int terminating_signal;
-
-  SrtSystemInfo *info = srt_system_info_new (NULL);
-  srt_system_info_set_helpers_path (info, f->builddir);
-  srt_system_info_set_test_flags (info, SRT_TEST_FLAGS_TIME_OUT_SOONER);
-
-  issues = srt_system_info_check_graphics (info,
-                                           "mock-hanging",
-                                           SRT_WINDOW_SYSTEM_GLX,
-                                           SRT_RENDERING_INTERFACE_GL,
-                                           &graphics);
-  g_debug ("issues is 0x%x", issues);
-  g_assert_cmphex ((issues & SRT_GRAPHICS_ISSUES_CANNOT_LOAD), ==, SRT_GRAPHICS_ISSUES_CANNOT_LOAD);
-  g_assert_cmphex ((issues & SRT_GRAPHICS_ISSUES_TIMEOUT), ==, SRT_GRAPHICS_ISSUES_TIMEOUT);
-  g_assert_cmpstr (srt_graphics_get_renderer_string (graphics), ==,
-                   NULL);
-  g_assert_cmpstr (srt_graphics_get_version_string (graphics), ==,
-                   NULL);
-  // Timeout has exit code 124
-  g_assert_cmpint (srt_graphics_get_exit_status (graphics), ==, 124);
-  g_assert_cmpint (srt_graphics_get_terminating_signal (graphics), ==, 0);
-  g_object_get (graphics,
-                "multiarch-tuple", &tuple,
-                "issues", &issues,
-                "renderer-string", &renderer,
-                "version-string", &version,
-                "exit-status", &exit_status,
-                "terminating-signal", &terminating_signal,
-                NULL);
-  g_assert_cmphex ((issues & SRT_GRAPHICS_ISSUES_CANNOT_LOAD), ==, SRT_GRAPHICS_ISSUES_CANNOT_LOAD);
-  g_assert_cmphex ((issues & SRT_GRAPHICS_ISSUES_TIMEOUT), ==, SRT_GRAPHICS_ISSUES_TIMEOUT);
-  g_assert_cmpstr (tuple, ==, "mock-hanging");
-  g_assert_cmpstr (renderer, ==, NULL);
-  g_assert_cmpstr (version, ==, NULL);
-  g_assert_cmpint (exit_status, ==, 124);
-  g_assert_cmpint (terminating_signal, ==, 0);
-  g_free (tuple);
-  g_free (renderer);
-  g_free (version);
-
-  g_object_unref (graphics);
-  g_object_unref (info);
-}
-
-/*
- * Test a mock system with software rendering
- */
-static void
-test_software_rendering (Fixture *f,
-                         gconstpointer context)
-{
-  SrtGraphics *graphics = NULL;
-  SrtGraphicsIssues issues;
-  gchar *messages;
-  gchar *tuple;
-  gchar *renderer;
-  gchar *version;
-  int exit_status;
-  int terminating_signal;
-
-  SrtSystemInfo *info = srt_system_info_new (NULL);
-  srt_system_info_set_helpers_path (info, f->builddir);
-
-  issues = srt_system_info_check_graphics (info,
-                                           "mock-software",
-                                           SRT_WINDOW_SYSTEM_GLX,
-                                           SRT_RENDERING_INTERFACE_GL,
-                                           &graphics);
-  g_assert_cmpint (issues, ==, SRT_GRAPHICS_ISSUES_SOFTWARE_RENDERING);
-  g_assert_cmpstr (srt_graphics_get_messages (graphics), ==,
-                   "warning: this warning should always be logged\n"
-                   "info: you used LIBGL_DEBUG=verbose\n");
-  g_assert_cmpstr (srt_graphics_get_renderer_string (graphics), ==,
-                   SRT_TEST_SOFTWARE_GRAPHICS_RENDERER);
-  g_assert_cmpstr (srt_graphics_get_version_string (graphics), ==,
-                   SRT_TEST_SOFTWARE_GRAPHICS_VERSION);
-  g_assert_cmpint (srt_graphics_get_exit_status (graphics), ==, 0);
-  g_assert_cmpint (srt_graphics_get_terminating_signal (graphics), ==, 0);
-
-  g_object_get (graphics,
-                "messages", &messages,
-                "multiarch-tuple", &tuple,
-                "issues", &issues,
-                "renderer-string", &renderer,
-                "version-string", &version,
-                "exit-status", &exit_status,
-                "terminating-signal", &terminating_signal,
-                NULL);
-  g_assert_cmpint (issues, ==, SRT_GRAPHICS_ISSUES_SOFTWARE_RENDERING);
-  g_assert_cmpstr (tuple, ==, "mock-software");
-  g_assert_cmpstr (renderer, ==, SRT_TEST_SOFTWARE_GRAPHICS_RENDERER);
-  g_assert_cmpstr (version, ==, SRT_TEST_SOFTWARE_GRAPHICS_VERSION);
-  g_assert_cmpint (exit_status, ==, 0);
-  g_assert_cmpint (terminating_signal, ==, 0);
-  g_assert_cmpstr (messages, ==,
-                   "warning: this warning should always be logged\n"
-                   "info: you used LIBGL_DEBUG=verbose\n");
-
-  g_free (tuple);
-  g_free (renderer);
-  g_free (version);
-  g_free (messages);
-
-  g_object_unref (graphics);
-  g_object_unref (info);
-}
-
-/*
- * Test a mock system with good vulkan drivers
- */
-static void
-test_good_vulkan (Fixture *f,
-                  gconstpointer context)
-{
-  SrtGraphics *graphics = NULL;
-  SrtGraphicsIssues issues;
-  gchar *tuple;
-  gchar *renderer;
-  gchar *version;
-  int exit_status;
-  int terminating_signal;
-
-  SrtSystemInfo *info = srt_system_info_new (NULL);
-  srt_system_info_set_helpers_path (info, f->builddir);
-
-  issues = srt_system_info_check_graphics (info,
-                                           "mock-good",
-                                           SRT_WINDOW_SYSTEM_X11,
-                                           SRT_RENDERING_INTERFACE_VULKAN,
-                                           &graphics);
-  g_assert_cmpint (issues, ==, SRT_GRAPHICS_ISSUES_NONE);
-  g_assert_cmpstr (srt_graphics_get_renderer_string (graphics), ==,
-                   SRT_TEST_GOOD_GRAPHICS_RENDERER);
-  g_assert_cmpstr (srt_graphics_get_version_string (graphics), ==,
-                   SRT_TEST_GOOD_VULKAN_VERSION);
-  g_assert_cmpint (srt_graphics_get_exit_status (graphics), ==, 0);
-  g_assert_cmpint (srt_graphics_get_terminating_signal (graphics), ==, 0);
-
-  g_object_get (graphics,
-                "multiarch-tuple", &tuple,
-                "issues", &issues,
-                "renderer-string", &renderer,
-                "version-string", &version,
-                "exit-status", &exit_status,
-                "terminating-signal", &terminating_signal,
-                NULL);
-  g_assert_cmpint (issues, ==, SRT_GRAPHICS_ISSUES_NONE);
-  g_assert_cmpstr (tuple, ==, "mock-good");
-  g_assert_cmpstr (renderer, ==, SRT_TEST_GOOD_GRAPHICS_RENDERER);
-  g_assert_cmpstr (version, ==, SRT_TEST_GOOD_VULKAN_VERSION);
-  g_assert_cmpint (exit_status, ==, 0);
-  g_assert_cmpint (terminating_signal, ==, 0);
-  g_free (tuple);
-  g_free (renderer);
-  g_free (version);
-
-  g_object_unref (graphics);
-  g_object_unref (info);
-}
-
-/*
- * Test a mock system with no vulkan graphics driver
- */
-static void
-test_bad_vulkan (Fixture *f,
-                 gconstpointer context)
-{
-  SrtGraphics *graphics = NULL;
-  SrtGraphicsIssues issues;
-  gchar *tuple;
-  gchar *renderer;
-  gchar *version;
-  int exit_status;
-  int terminating_signal;
-
-  SrtSystemInfo *info = srt_system_info_new (NULL);
-  srt_system_info_set_helpers_path (info, f->builddir);
-
-  issues = srt_system_info_check_graphics (info,
-                                           "mock-bad",
-                                           SRT_WINDOW_SYSTEM_X11,
-                                           SRT_RENDERING_INTERFACE_VULKAN,
-                                           &graphics);
-  g_assert_cmpint (issues, ==, SRT_GRAPHICS_ISSUES_CANNOT_LOAD);
-  g_assert_cmpstr (srt_graphics_get_renderer_string (graphics), ==,
-                   NULL);
-  g_assert_cmpstr (srt_graphics_get_version_string (graphics), ==,
-                   NULL);
-  g_assert_cmpint (srt_graphics_get_exit_status (graphics), ==, 1);
-  g_assert_cmpint (srt_graphics_get_terminating_signal (graphics), ==, 0);
-
-  g_object_get (graphics,
-                "multiarch-tuple", &tuple,
-                "issues", &issues,
-                "renderer-string", &renderer,
-                "version-string", &version,
-                "exit-status", &exit_status,
-                "terminating-signal", &terminating_signal,
-                NULL);
-  g_assert_cmpint (issues, ==, SRT_GRAPHICS_ISSUES_CANNOT_LOAD);
-  g_assert_cmpstr (tuple, ==, "mock-bad");
-  g_assert_cmpstr (renderer, ==, NULL);
-  g_assert_cmpstr (version, ==, NULL);
-  g_assert_cmpint (exit_status, ==, 1);
-  g_assert_cmpint (terminating_signal, ==, 0);
-  g_free (tuple);
-  g_free (renderer);
-  g_free (version);
-
-  g_object_unref (graphics);
-  g_object_unref (info);
-}
-
-/*
- * Test a mock system with vulkan driver but check-vulkan failure
- */
-static void
-test_mixed_vulkan (Fixture *f,
-                 gconstpointer context)
-{
-  SrtGraphics *graphics = NULL;
-  SrtGraphicsIssues issues;
-  gchar *tuple;
-  gchar *renderer;
-  gchar *version;
-  int exit_status;
-  int terminating_signal;
-
-  SrtSystemInfo *info = srt_system_info_new (NULL);
-  srt_system_info_set_helpers_path (info, f->builddir);
-
-  issues = srt_system_info_check_graphics (info,
-                                           "mock-mixed",
-                                           SRT_WINDOW_SYSTEM_X11,
-                                           SRT_RENDERING_INTERFACE_VULKAN,
-                                           &graphics);
-  g_assert_cmpint (issues, ==, SRT_GRAPHICS_ISSUES_CANNOT_DRAW);
-  g_assert_cmpstr (srt_graphics_get_renderer_string (graphics), ==,
-                   SRT_TEST_GOOD_GRAPHICS_RENDERER);
-  g_assert_cmpstr (srt_graphics_get_version_string (graphics), ==,
-                   SRT_TEST_GOOD_VULKAN_VERSION);
-  g_assert_cmpint (srt_graphics_get_exit_status (graphics), ==, 1);
-  g_assert_cmpint (srt_graphics_get_terminating_signal (graphics), ==, 0);
-
-  g_object_get (graphics,
-                "multiarch-tuple", &tuple,
-                "issues", &issues,
-                "renderer-string", &renderer,
-                "version-string", &version,
-                "exit-status", &exit_status,
-                "terminating-signal", &terminating_signal,
-                NULL);
-  g_assert_cmpstr (srt_graphics_get_messages (graphics), ==,
-                   "failed to create window surface!\n");
-
-  g_assert_cmpint (issues, ==, SRT_GRAPHICS_ISSUES_CANNOT_DRAW);
-  g_assert_cmpstr (tuple, ==, "mock-mixed");
-  g_assert_cmpstr (renderer, ==, SRT_TEST_GOOD_GRAPHICS_RENDERER);
-  g_assert_cmpstr (version, ==, SRT_TEST_GOOD_VULKAN_VERSION);
-  g_assert_cmpint (exit_status, ==, 1);
-  g_assert_cmpint (terminating_signal, ==, 0);
-
-  g_free (tuple);
-  g_free (renderer);
-  g_free (version);
-
-  g_object_unref (graphics);
-  g_object_unref (info);
-}
-
-/*
- * Test a mock system with gl driver but check-gl failure
- */
-static void
-test_mixed_gl (Fixture *f,
-               gconstpointer context)
-{
-  SrtGraphics *graphics = NULL;
-  SrtGraphicsIssues issues;
-  gchar *tuple;
-  gchar *renderer;
-  gchar *version;
-
-  SrtSystemInfo *info = srt_system_info_new (NULL);
-  srt_system_info_set_helpers_path (info, f->builddir);
-
-  issues = srt_system_info_check_graphics (info,
-                                           "mock-mixed",
-                                           SRT_WINDOW_SYSTEM_GLX,
-                                           SRT_RENDERING_INTERFACE_GL,
-                                           &graphics);
-  g_assert_cmpint (issues, ==, SRT_GRAPHICS_ISSUES_CANNOT_DRAW);
-  g_assert_cmpstr (srt_graphics_get_renderer_string (graphics), ==,
-                   SRT_TEST_GOOD_GRAPHICS_RENDERER);
-  g_assert_cmpstr (srt_graphics_get_version_string (graphics), ==,
-                   SRT_TEST_GOOD_GRAPHICS_VERSION);
-  g_object_get (graphics,
-                "multiarch-tuple", &tuple,
-                "issues", &issues,
-                "renderer-string", &renderer,
-                "version-string", &version,
-                NULL);
-  g_assert_cmpint (issues, ==, SRT_GRAPHICS_ISSUES_CANNOT_DRAW);
-  g_assert_cmpstr (tuple, ==, "mock-mixed");
-  g_assert_cmpstr (renderer, ==, SRT_TEST_GOOD_GRAPHICS_RENDERER);
-  g_assert_cmpstr (version, ==, SRT_TEST_GOOD_GRAPHICS_VERSION);
-  g_assert_cmpstr (srt_graphics_get_messages (graphics), ==,
-                   "warning: this warning should always be logged\n"
-                   "Waffle error: 0x2 WAFFLE_ERROR_UNKNOWN: XOpenDisplay failed\n"
-                   "info: you used LIBGL_DEBUG=verbose\n");
-
-  g_free (tuple);
-  g_free (renderer);
-  g_free (version);
-
-  g_object_unref (graphics);
-  g_object_unref (info);
-}
-
 /*
  * Test a mock system with sigusr terminating signal
  */
@@ -2493,6 +2029,231 @@ test_vdpau (Fixture *f,
     }
 }
 
+typedef struct
+{
+  const gchar *description;
+  SrtWindowSystem window_system;
+  SrtRenderingInterface rendering_interface;
+  SrtGraphicsLibraryVendor library_vendor;
+  SrtGraphicsIssues issues;
+  SrtTestFlags test_flags;
+  const gchar *multiarch_tuple;
+  const gchar *renderer_string;
+  const gchar *version_string;
+  const gchar *messages;
+  int exit_status;
+  gboolean vendor_neutral;
+} GraphicsTest;
+
+static const GraphicsTest graphics_test[] =
+{
+  {
+    .description = "good vdpau",
+    .window_system = SRT_WINDOW_SYSTEM_X11,
+    .rendering_interface = SRT_RENDERING_INTERFACE_VDPAU,
+    .issues = SRT_GRAPHICS_ISSUES_NONE,
+    .multiarch_tuple = "mock-good",
+    .renderer_string = SRT_TEST_GOOD_VDPAU_RENDERER,
+    .vendor_neutral = TRUE,
+  },
+
+  {
+    .description = "bad vdpau",
+    .window_system = SRT_WINDOW_SYSTEM_X11,
+    .rendering_interface = SRT_RENDERING_INTERFACE_VDPAU,
+    .issues = SRT_GRAPHICS_ISSUES_CANNOT_DRAW,
+    .multiarch_tuple = "mock-bad",
+    .messages = SRT_TEST_BAD_VDPAU_MESSAGES,
+    .exit_status = 1,
+    .vendor_neutral = TRUE,
+  },
+
+  {
+    .description = "good gl",
+    .window_system = SRT_WINDOW_SYSTEM_GLX,
+    .rendering_interface = SRT_RENDERING_INTERFACE_GL,
+    .issues = SRT_GRAPHICS_ISSUES_NONE,
+    .multiarch_tuple = "mock-good",
+    .renderer_string = SRT_TEST_GOOD_GRAPHICS_RENDERER,
+    .version_string = SRT_TEST_GOOD_GRAPHICS_VERSION,
+  },
+
+  {
+    .description = "no graphics stack",
+    .window_system = SRT_WINDOW_SYSTEM_GLX,
+    .rendering_interface = SRT_RENDERING_INTERFACE_GL,
+    .issues = SRT_GRAPHICS_ISSUES_CANNOT_LOAD,
+    .multiarch_tuple = "mock-bad",
+    .messages = "warning: this warning should always be logged\n"
+                "Waffle error: 0x2 WAFFLE_ERROR_UNKNOWN: XOpenDisplay failed\n"
+                "info: you used LIBGL_DEBUG=verbose\n",
+    /* We used "mock-bad" for the architecture so, when checking the library vendor,
+     * we will not be able to call the helper `mock-bad-check-library`.
+     * For this reason we expect %SRT_GRAPHICS_LIBRARY_VENDOR_UNKNOWN */
+    .library_vendor = SRT_GRAPHICS_LIBRARY_VENDOR_UNKNOWN,
+    .exit_status = 1,
+  },
+
+  {
+    .description = "graphics timeout",
+    .window_system = SRT_WINDOW_SYSTEM_GLX,
+    .rendering_interface = SRT_RENDERING_INTERFACE_GL,
+    .issues = (SRT_GRAPHICS_ISSUES_CANNOT_LOAD | SRT_GRAPHICS_ISSUES_TIMEOUT),
+    .test_flags = SRT_TEST_FLAGS_TIME_OUT_SOONER,
+    .multiarch_tuple = "mock-hanging",
+    // Timeout has exit code 124
+    .exit_status = 124,
+  },
+
+  {
+    .description = "software rendering",
+    .window_system = SRT_WINDOW_SYSTEM_GLX,
+    .rendering_interface = SRT_RENDERING_INTERFACE_GL,
+    .issues = SRT_GRAPHICS_ISSUES_SOFTWARE_RENDERING,
+    .multiarch_tuple = "mock-software",
+    .renderer_string = SRT_TEST_SOFTWARE_GRAPHICS_RENDERER,
+    .version_string = SRT_TEST_SOFTWARE_GRAPHICS_VERSION,
+    .messages = "warning: this warning should always be logged\n"
+                "info: you used LIBGL_DEBUG=verbose\n",
+  },
+
+  {
+    .description = "gl driver ok but check-gl fails",
+    .window_system = SRT_WINDOW_SYSTEM_GLX,
+    .rendering_interface = SRT_RENDERING_INTERFACE_GL,
+    .issues = SRT_GRAPHICS_ISSUES_CANNOT_DRAW,
+    .multiarch_tuple = "mock-mixed",
+    .renderer_string = SRT_TEST_GOOD_GRAPHICS_RENDERER,
+    .version_string = SRT_TEST_GOOD_GRAPHICS_VERSION,
+    .messages = "warning: this warning should always be logged\n"
+                "Waffle error: 0x2 WAFFLE_ERROR_UNKNOWN: XOpenDisplay failed\n"
+                "info: you used LIBGL_DEBUG=verbose\n",
+    .exit_status = 1,
+  },
+
+  {
+    .description = "good vulkan",
+    .window_system = SRT_WINDOW_SYSTEM_X11,
+    .rendering_interface = SRT_RENDERING_INTERFACE_VULKAN,
+    .issues = SRT_GRAPHICS_ISSUES_NONE,
+    .multiarch_tuple = "mock-good",
+    .renderer_string = SRT_TEST_GOOD_GRAPHICS_RENDERER,
+    .version_string = SRT_TEST_GOOD_VULKAN_VERSION,
+    .vendor_neutral = TRUE,
+  },
+
+  {
+    .description = "bad vulkan",
+    .window_system = SRT_WINDOW_SYSTEM_X11,
+    .rendering_interface = SRT_RENDERING_INTERFACE_VULKAN,
+    .issues = SRT_GRAPHICS_ISSUES_CANNOT_LOAD,
+    .multiarch_tuple = "mock-bad",
+    .messages = "/build/vulkan-tools/src/Vulkan-Tools-1.1.114/vulkaninfo/vulkaninfo.c:5884: failed with VK_ERROR_INITIALIZATION_FAILED\n",
+    .exit_status = 1,
+    .vendor_neutral = TRUE,
+  },
+
+  {
+    .description = "good vulkan driver but check-vulkan failure",
+    .window_system = SRT_WINDOW_SYSTEM_X11,
+    .rendering_interface = SRT_RENDERING_INTERFACE_VULKAN,
+    .issues = SRT_GRAPHICS_ISSUES_CANNOT_DRAW,
+    .multiarch_tuple = "mock-mixed",
+    .renderer_string = SRT_TEST_GOOD_GRAPHICS_RENDERER,
+    .version_string = SRT_TEST_GOOD_VULKAN_VERSION,
+    .messages = "failed to create window surface!\n",
+    .exit_status = 1,
+    .vendor_neutral = TRUE,
+  },
+
+  {
+    .description = "good va-api",
+    .window_system = SRT_WINDOW_SYSTEM_X11,
+    .rendering_interface = SRT_RENDERING_INTERFACE_VAAPI,
+    .issues = SRT_GRAPHICS_ISSUES_NONE,
+    .multiarch_tuple = "mock-good",
+    .renderer_string = SRT_TEST_GOOD_VAAPI_RENDERER,
+    .vendor_neutral = TRUE,
+  },
+
+  {
+    .description = "bad va-api",
+    .window_system = SRT_WINDOW_SYSTEM_X11,
+    .rendering_interface = SRT_RENDERING_INTERFACE_VAAPI,
+    .issues = SRT_GRAPHICS_ISSUES_CANNOT_DRAW,
+    .multiarch_tuple = "mock-bad",
+    .messages = SRT_TEST_BAD_VAAPI_MESSAGES,
+    .exit_status = 1,
+    .vendor_neutral = TRUE,
+  },
+};
+
+static void
+test_check_graphics (Fixture *f,
+                     gconstpointer context)
+{
+  for (gsize i = 0; i < G_N_ELEMENTS (graphics_test); i++)
+    {
+      const GraphicsTest *test = &graphics_test[i];
+      SrtGraphics *graphics = NULL;
+      SrtGraphicsIssues issues;
+      gchar *tuple;
+      gchar *renderer;
+      gchar *version;
+      gchar *messages;
+      int exit_status;
+      int terminating_signal;
+      gboolean vendor_neutral;
+      SrtGraphicsLibraryVendor library_vendor;
+
+      g_test_message ("%s", test->description);
+
+      SrtSystemInfo *info = srt_system_info_new (NULL);
+      srt_system_info_set_helpers_path (info, f->builddir);
+      srt_system_info_set_test_flags (info, test->test_flags);
+
+      issues = srt_system_info_check_graphics (info,
+                                               test->multiarch_tuple,
+                                               test->window_system,
+                                               test->rendering_interface,
+                                               &graphics);
+      g_assert_cmpint (issues, ==, test->issues);
+      g_assert_cmpstr (srt_graphics_get_renderer_string (graphics), ==, test->renderer_string);
+      g_assert_cmpstr (srt_graphics_get_version_string (graphics), ==, test->version_string);
+      g_assert_cmpstr (srt_graphics_get_messages (graphics), ==, test->messages);
+      g_assert_cmpint (srt_graphics_get_exit_status (graphics), ==, test->exit_status);
+      g_assert_cmpint (srt_graphics_get_terminating_signal (graphics), ==, 0);
+
+      vendor_neutral = srt_graphics_library_is_vendor_neutral (graphics, &library_vendor);
+      g_assert_cmpint (library_vendor, ==, test->library_vendor);
+      g_assert_cmpint (vendor_neutral, ==, test->vendor_neutral);
+
+      g_object_get (graphics,
+                    "multiarch-tuple", &tuple,
+                    "issues", &issues,
+                    "renderer-string", &renderer,
+                    "version-string", &version,
+                    "messages", &messages,
+                    "exit-status", &exit_status,
+                    "terminating-signal", &terminating_signal,
+                    NULL);
+      g_assert_cmpint (issues, ==, test->issues);
+      g_assert_cmpstr (tuple, ==, test->multiarch_tuple);
+      g_assert_cmpstr (renderer, ==, test->renderer_string);
+      g_assert_cmpstr (version, ==, test->version_string);
+      g_assert_cmpstr (messages, ==, test->messages);
+      g_assert_cmpint (exit_status, ==, test->exit_status);
+      g_assert_cmpint (terminating_signal, ==, 0);
+      g_free (tuple);
+      g_free (renderer);
+      g_free (version);
+      g_free (messages);
+
+      g_object_unref (graphics);
+      g_object_unref (info);
+    }
+}
+
 static gint
 glx_icd_compare (SrtGlxIcd *a, SrtGlxIcd *b)
 {
@@ -2614,28 +2375,11 @@ main (int argc,
   g_test_init (&argc, &argv, NULL);
   g_test_add ("/graphics/object", Fixture, NULL,
               setup, test_object, teardown);
-  g_test_add ("/graphics/good", Fixture, NULL,
-              setup, test_good_graphics, teardown);
-  g_test_add ("/graphics/bad", Fixture, NULL,
-              setup, test_bad_graphics, teardown);
-  g_test_add ("/graphics/hanging", Fixture, NULL,
-              setup, test_timeout_graphics, teardown);
-  g_test_add ("/graphics/software", Fixture, NULL,
-              setup, test_software_rendering, teardown);
   g_test_add ("/graphics/normalize_window_system", Fixture, NULL,
               setup, test_normalize_window_system, teardown);
-  g_test_add ("/graphics/gl-mixed", Fixture, NULL,
-              setup, test_mixed_gl, teardown);
   g_test_add ("/graphics/sigusr", Fixture, NULL,
               setup, test_sigusr, teardown);
 
-  g_test_add ("/graphics/vulkan", Fixture, NULL,
-              setup, test_good_vulkan, teardown);
-  g_test_add ("/graphics/vulkan-bad", Fixture, NULL,
-              setup, test_bad_vulkan, teardown);
-  g_test_add ("/graphics/vulkan-mixed", Fixture, NULL,
-              setup, test_mixed_vulkan, teardown);
-
   g_test_add ("/graphics/icd/egl/basic", Fixture, NULL,
               setup, test_icd_egl, teardown);
   g_test_add ("/graphics/icd/egl/dirs", Fixture, &dir_config,
@@ -2670,9 +2414,12 @@ main (int argc,
   g_test_add ("/graphics/dri/flatpak", Fixture, NULL,
               setup, test_dri_flatpak, teardown);
 
-  g_test_add ("/graphics/vdpau", Fixture, NULL,
+  g_test_add ("/graphics/vdpau/basic", Fixture, NULL,
               setup, test_vdpau, teardown);
 
+  g_test_add ("/graphics/check", Fixture, NULL,
+              setup, test_check_graphics, teardown);
+
   g_test_add ("/graphics/glx/debian", Fixture, NULL,
               setup, test_glx_debian, teardown);
   g_test_add ("/graphics/glx/container", Fixture, NULL,
diff --git a/tests/meson.build b/tests/meson.build
index 7e2e59a8d09f19a78c2b6fc39e60773d4b923232..f45f8bee9d2a3a62ad2fe1f84f3a8c5528489395 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -179,8 +179,12 @@ executable(
 # Helpers with no dependencies and one source file of the same name
 # as the helper itself.
 foreach helper : [
+  'mock-bad-check-va-api',
+  'mock-bad-check-vdpau',
   'mock-bad-check-vulkan',
   'mock-bad-vulkaninfo',
+  'mock-good-check-va-api',
+  'mock-good-check-vdpau',
   'mock-good-vulkaninfo',
   'mock-hanging-wflinfo',
   'mock-sigusr-wflinfo',
diff --git a/tests/mock-bad-check-va-api.c b/tests/mock-bad-check-va-api.c
new file mode 100644
index 0000000000000000000000000000000000000000..cca06c1697878b469509a3180585bb67de1850f8
--- /dev/null
+++ b/tests/mock-bad-check-va-api.c
@@ -0,0 +1,37 @@
+/*
+ * Copyright © 2020 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>
+
+int
+main (int argc,
+      char **argv)
+{
+  // Give bad output
+  fprintf (stderr, "libva error: vaGetDriverNameByIndex() failed with unknown libva error, driver_name = (null)\n");
+  fprintf (stderr, "vaInitialize (va_display, &major_version, &minor_version) failed: unknown libva error (-1)\n");
+  return 1;
+}
+
diff --git a/tests/mock-bad-check-vdpau.c b/tests/mock-bad-check-vdpau.c
new file mode 100644
index 0000000000000000000000000000000000000000..d9904229b414c2504131e02bc7804dc809a603a1
--- /dev/null
+++ b/tests/mock-bad-check-vdpau.c
@@ -0,0 +1,37 @@
+/*
+ * Copyright © 2020 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>
+
+int
+main (int argc,
+      char **argv)
+{
+  // Give bad output
+  fprintf (stderr, "Failed to open VDPAU backend libvdpau_nvidia.so: cannot open shared object file: No such file or directory\n");
+  fprintf (stderr, "vdp_device_create_x11 (display, screen, &device, &vdp_get_proc_address) failed: 1\n");
+  return 1;
+}
+
diff --git a/tests/mock-good-check-va-api.c b/tests/mock-good-check-va-api.c
new file mode 100644
index 0000000000000000000000000000000000000000..fd73038c0427709631eaf6ebba9c86d847a4454f
--- /dev/null
+++ b/tests/mock-good-check-va-api.c
@@ -0,0 +1,36 @@
+/*
+ * Copyright © 2020 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>
+
+int
+main (int argc,
+      char **argv)
+{
+  // Give good output
+  printf ("Mesa Gallium driver 20.0.4 for AMD Radeon RX 5700 XT (NAVI10, DRM 3.36.0, 5.6.3-arch1-1, LLVM 9.0.1)\n");
+  return 0;
+}
+
diff --git a/tests/mock-good-check-vdpau.c b/tests/mock-good-check-vdpau.c
new file mode 100644
index 0000000000000000000000000000000000000000..ebc90fc5d047d4f64055854d94ec80151754fe39
--- /dev/null
+++ b/tests/mock-good-check-vdpau.c
@@ -0,0 +1,36 @@
+/*
+ * Copyright © 2020 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>
+
+int
+main (int argc,
+      char **argv)
+{
+  // Give good output
+  printf ("G3DVL VDPAU Driver Shared Library version 1.0\n");
+  return 0;
+}
+