egl/surfaceless: Allow DRMless fallback.
authorDavid Riley <davidriley@chromium.org>
Wed, 18 Jul 2018 00:12:05 +0000 (17:12 -0700)
committerChad Versace <chadversary@chromium.org>
Tue, 31 Jul 2018 02:40:45 +0000 (19:40 -0700)
Allow platform_surfaceless to use swrast even if DRM is not available.
To be used to allow a fuzzer for virgl to be run on a jailed VM without
hardware GL or DRM support.

Reviewed-by: Eric Engestrom <eric.engestrom@intel.com>
Reviewed-by: Chad Versace <chadversary@chromium.org>
Signed-off-by: David Riley <davidriley@chromium.org>
src/egl/drivers/dri2/platform_surfaceless.c

index 54bafaee0ef26533229ece3a0c1376418a3de604..bfc8fb99eabee02bb359ec10268858d292a2555e 100644 (file)
@@ -293,6 +293,7 @@ surfaceless_probe_device(_EGLDisplay *dpy, bool swrast)
    int fd;
    int i;
 
+   /* Attempt to find DRM device. */
    for (i = 0; i < limit; ++i) {
       char *card_path;
       if (asprintf(&card_path, DRM_RENDER_DEV_NAME, DRM_DIR_NAME, base + i) < 0)
@@ -326,6 +327,24 @@ surfaceless_probe_device(_EGLDisplay *dpy, bool swrast)
       dri2_dpy->loader_extensions = NULL;
    }
 
+   /* No DRM device, so attempt to fall back to software path w/o DRM. */
+   if (swrast) {
+      _eglLog(_EGL_DEBUG, "Falling back to surfaceless swrast without DRM.");
+      dri2_dpy->fd = -1;
+      dri2_dpy->driver_name = strdup("swrast");
+      if (!dri2_dpy->driver_name) {
+         return false;
+      }
+
+      if (dri2_load_driver_swrast(dpy)) {
+         dri2_dpy->loader_extensions = swrast_loader_extensions;
+         return true;
+      }
+
+      free(dri2_dpy->driver_name);
+      dri2_dpy->driver_name = NULL;
+   }
+
    return false;
 }