From 21ce1ca846698527093b0f8b95a57c550f984ab1 Mon Sep 17 00:00:00 2001 From: James Jones Date: Thu, 18 Mar 2021 15:36:07 -0700 Subject: [PATCH] gbm: Load backend based on DRM device driver name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After attempting to use the GBM backend specified by the user via an environment variable, if any, but before falling back to the built-in GBM backends, attempt to dlopen libg_gbm.so in the GBM backend library search path (Defaults to "$libdir/gbm") and initialize a device using it. This enables automatic backend discovery for devices that do not provide a DRI driver. Signed-off-by: James Jones Reviewed-by: Michel Dänzer Reviewed-by: Emil Velikov Part-of: --- src/gbm/main/backend.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/gbm/main/backend.c b/src/gbm/main/backend.c index b628c403faa..974d0a76a4e 100644 --- a/src/gbm/main/backend.c +++ b/src/gbm/main/backend.c @@ -34,6 +34,7 @@ #include #include #include +#include #include "loader.h" #include "backend.h" @@ -53,6 +54,7 @@ static const struct gbm_backend_desc builtin_backends[] = { { "dri", &gbm_dri_backend }, }; +#define BACKEND_LIB_SUFFIX "_gbm" static const char *backend_search_path_vars[] = { "GBM_BACKENDS_PATH", NULL @@ -161,7 +163,7 @@ find_backend(const char *name, int fd) } if (name && !dev) { - lib = loader_open_driver_lib(name, "_gbm", + lib = loader_open_driver_lib(name, BACKEND_LIB_SUFFIX, backend_search_path_vars, DEFAULT_BACKENDS_PATH, true); @@ -186,6 +188,29 @@ override_backend(int fd) return dev; } +static struct gbm_device * +backend_from_driver_name(int fd) +{ + struct gbm_device *dev = NULL; + drmVersionPtr v = drmGetVersion(fd); + void *lib; + + if (!v) + return NULL; + + lib = loader_open_driver_lib(v->name, BACKEND_LIB_SUFFIX, + backend_search_path_vars, + DEFAULT_BACKENDS_PATH, + false); + + if (lib) + dev = load_backend(lib, fd, v->name); + + drmFreeVersion(v); + + return dev; +} + struct gbm_device * _gbm_create_device(int fd) { @@ -193,6 +218,9 @@ _gbm_create_device(int fd) dev = override_backend(fd); + if (!dev) + dev = backend_from_driver_name(fd); + if (!dev) dev = find_backend(NULL, fd);