From 9d9a46d4efc00b256d2c0d04dda6c4ee3f0dc47a Mon Sep 17 00:00:00 2001 From: Gurchetan Singh Date: Mon, 2 Oct 2017 13:48:24 -0700 Subject: [PATCH] egl/surfaceless: Use KMS swrast fallback 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 Reviewed-by: Eric Engestrom --- src/egl/drivers/dri2/platform_surfaceless.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/egl/drivers/dri2/platform_surfaceless.c b/src/egl/drivers/dri2/platform_surfaceless.c index f6aa217d39c..2af4a40b1a6 100644 --- a/src/egl/drivers/dri2/platform_surfaceless.c +++ b/src/egl/drivers/dri2/platform_surfaceless.c @@ -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; } -- 2.30.2