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 <emil.velikov@collabora.com>
Reviewed-by: Eric Engestrom <eric.engestrom@imgtec.com>
This commit is contained in:
committed by
Eric Engestrom
parent
540c804297
commit
9d9a46d4ef
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user