egl/surfaceless: Use KMS swrast fallback
authorGurchetan Singh <gurchetansingh@chromium.org>
Mon, 2 Oct 2017 20:48:24 +0000 (13:48 -0700)
committerEric Engestrom <eric.engestrom@imgtec.com>
Tue, 3 Oct 2017 16:56:15 +0000 (17:56 +0100)
The kms_swrast extension is an actively developed software fallback,
and platform_surfaceless can use it if there are no available
hardware drivers.

v2: Split into 2 patches, use booleans, check LIBGL_ALWAYS_SOFTWARE,
    and modify the eglLog level (Emil, Eric, Tomasz).

Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
Reviewed-by: Eric Engestrom <eric.engestrom@imgtec.com>
src/egl/drivers/dri2/platform_surfaceless.c

index f6aa217d39c08032cc37faf4ce4248812bef5054..2af4a40b1a6b87edb9d20edc66e8150f4ae03f29 100644 (file)
@@ -36,6 +36,7 @@
 #include "egl_dri2.h"
 #include "egl_dri2_fallbacks.h"
 #include "loader.h"
+#include "util/debug.h"
 
 static __DRIimage*
 surfaceless_alloc_image(struct dri2_egl_display *dri2_dpy,
@@ -268,7 +269,7 @@ static const __DRIextension *image_loader_extensions[] = {
 };
 
 static bool
-surfaceless_probe_device(_EGLDisplay *dpy)
+surfaceless_probe_device(_EGLDisplay *dpy, bool swrast)
 {
    struct dri2_egl_display *dri2_dpy = dpy->DriverData;
    const int limit = 64;
@@ -286,7 +287,10 @@ surfaceless_probe_device(_EGLDisplay *dpy)
       if (fd < 0)
          continue;
 
-      dri2_dpy->driver_name = loader_get_driver_for_fd(fd);
+      if (swrast)
+         dri2_dpy->driver_name = strdup("kms_swrast");
+      else
+         dri2_dpy->driver_name = loader_get_driver_for_fd(fd);
       if (!dri2_dpy->driver_name) {
          close(fd);
          continue;
@@ -310,7 +314,7 @@ dri2_initialize_surfaceless(_EGLDriver *drv, _EGLDisplay *disp)
 {
    struct dri2_egl_display *dri2_dpy;
    const char* err;
-   int driver_loaded = 0;
+   bool driver_loaded = false;
 
    loader_set_logger(_eglLog);
 
@@ -320,7 +324,15 @@ dri2_initialize_surfaceless(_EGLDriver *drv, _EGLDisplay *disp)
 
    dri2_dpy->fd = -1;
    disp->DriverData = (void *) dri2_dpy;
-   if (!surfaceless_probe_device(disp)) {
+
+   if (!env_var_as_boolean("LIBGL_ALWAYS_SOFTWARE", false)) {
+      driver_loaded = surfaceless_probe_device(disp, false);
+      if (!driver_loaded)
+         _eglLog(_EGL_WARNING,
+                 "No hardware driver found, falling back to software rendering");
+   }
+
+   if (!driver_loaded && !surfaceless_probe_device(disp, true)) {
       err = "DRI2: failed to load driver";
       goto cleanup;
    }