diff --git a/bin/system-info.c b/bin/system-info.c
index e198914d202d0c30cb717e78d4dd3674f172fdc4..903dde23ed6a9a4c2f8ec63e1fafcf8bc8442f94 100644
--- a/bin/system-info.c
+++ b/bin/system-info.c
@@ -469,7 +469,8 @@ print_graphics_details(JsonBuilder *builder,
 
       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_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 a9d8a2593c260a3f788cfb40e5ec499968abca2e..c0ee32e986c3e193084f379e69a961408b1b10e7 100644
--- a/bin/system-info.md
+++ b/bin/system-info.md
@@ -414,6 +414,9 @@ keys:
         **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 d0467d74b32ca00a768d6ff2392cca0ff2194c44..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;
@@ -105,7 +108,7 @@ main (int argc,
   VASurfaceID *surfaces = NULL;
   VAImageFormat image_format;
   VAProfile *profiles = NULL;
-  VAConfigID config;
+  VAConfigID config = VA_INVALID_ID;
   VAContextID context = VA_INVALID_ID;
   VABufferID misc_buf_id = VA_INVALID_ID;
   VABufferID pipeline_param_buf_id = VA_INVALID_ID;
@@ -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/steam-runtime-tools/graphics-test-defines.h b/steam-runtime-tools/graphics-test-defines.h
index e0cbaf6fbebe3433ded10731fe8670117803beb0..a53de0fd34e269a02f3f1d67d3e66cf903b12843 100644
--- a/steam-runtime-tools/graphics-test-defines.h
+++ b/steam-runtime-tools/graphics-test-defines.h
@@ -36,3 +36,6 @@
 #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 44f8e165b0cc1fba33ef71825268fe29b1e35c14..b53eaa20a5360db08c77c5396bb830676ce6574d 100644
--- a/steam-runtime-tools/graphics.c
+++ b/steam-runtime-tools/graphics.c
@@ -505,6 +505,7 @@ _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",
@@ -529,6 +530,7 @@ _argv_for_graphics_test (const char *helpers_path,
 
           case SRT_RENDERING_INTERFACE_VULKAN:
           case SRT_RENDERING_INTERFACE_VDPAU:
+          case SRT_RENDERING_INTERFACE_VAAPI:
             /* They don't set platfomstring, just set argv later. */
             break;
 
@@ -547,6 +549,7 @@ _argv_for_graphics_test (const char *helpers_path,
 
           case SRT_RENDERING_INTERFACE_VULKAN:
           case SRT_RENDERING_INTERFACE_VDPAU:
+          case SRT_RENDERING_INTERFACE_VAAPI:
           default:
             /* e.g. Vulkan (when implemented) */
             g_critical ("EGL window system only makes sense with a GL-based "
@@ -603,6 +606,16 @@ _argv_for_graphics_test (const char *helpers_path,
         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;
@@ -796,10 +809,11 @@ _srt_check_library_vendor (const char *multiarch_tuple,
   SrtLibraryIssues issues;
   const char * const *dependencies;
 
-  /* Vulkan and VDPAU are always vendor-neutral, so it doesn't make sense to check it.
+  /* 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_VDPAU ||
+      rendering_interface == SRT_RENDERING_INTERFACE_VAAPI)
     goto out;
 
   switch (window_system)
@@ -1014,6 +1028,7 @@ _srt_check_graphics (const char *helpers_path,
         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;
@@ -1078,6 +1093,7 @@ _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;
 
@@ -1189,6 +1205,7 @@ _srt_check_graphics (const char *helpers_path,
         break;
 
       case SRT_RENDERING_INTERFACE_VDPAU:
+      case SRT_RENDERING_INTERFACE_VAAPI:
         if (output != NULL)
           renderer_string = output;
         break;
@@ -1259,7 +1276,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 and VDPAU are always vendor-neutral, so this function will always return %TRUE for them.
+ * 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.
  */
@@ -1274,6 +1291,7 @@ srt_graphics_library_is_vendor_neutral (SrtGraphics *self,
 
   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 e74c20786b7699784e05e4813172b397276be471..31400d7505cd8a5e41282d884dc65878f5febe64 100644
--- a/steam-runtime-tools/graphics.h
+++ b/steam-runtime-tools/graphics.h
@@ -117,10 +117,11 @@ typedef enum
   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_VDPAU + 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/tests/graphics.c b/tests/graphics.c
index 0f63ee26a338b876940d19ecece95ee0d2931547..d04c84213425c4a93a503b0a23fe4f89afba0638 100644
--- a/tests/graphics.c
+++ b/tests/graphics.c
@@ -2166,6 +2166,26 @@ static const GraphicsTest graphics_test[] =
     .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
diff --git a/tests/meson.build b/tests/meson.build
index 260adff8f1e7ff0a3078e1f419dd58a9d0c4c4e4..f45f8bee9d2a3a62ad2fe1f84f3a8c5528489395 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -179,9 +179,11 @@ 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',
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-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;
+}
+