drirc implementation of MESA_LOADER_DRIVER_OVERRIDE which can be used to override dri driver to load.
Usage: override dri driver for device with spec kernel driver name: <device driver="k:kernel_driver_name"> <option name="dri_driver" value="new_dri_driver" /> </device> Signed-off-by: Qiang Yu <qiang...@amd.com> --- src/loader/loader.c | 75 ++++++++++++++++++++++++++++++++++---------- src/util/xmlpool/t_options.h | 5 +++ 2 files changed, 64 insertions(+), 16 deletions(-) diff --git a/src/loader/loader.c b/src/loader/loader.c index 4327548..8c78096 100644 --- a/src/loader/loader.c +++ b/src/loader/loader.c @@ -82,15 +82,65 @@ loader_open_device(const char *device_name) return fd; } -#if defined(HAVE_LIBDRM) +static char *loader_get_kernel_driver_name(int fd) +{ +#if HAVE_LIBDRM + char *driver; + drmVersionPtr version = drmGetVersion(fd); + + if (!version) { + log_(_LOADER_WARNING, "failed to get driver name for fd %d\n", fd); + return NULL; + } + + driver = strndup(version->name, version->name_len); + + drmFreeVersion(version); + return driver; +#else + return NULL; +#endif +} + #ifdef USE_DRICONF static const char __driConfigOptionsLoader[] = DRI_CONF_BEGIN DRI_CONF_SECTION_INITIALIZATION DRI_CONF_DEVICE_ID_PATH_TAG() + DRI_CONF_DRI_DRIVER() DRI_CONF_SECTION_END DRI_CONF_END; +static char *loader_get_dri_config_driver(int fd) +{ + driOptionCache defaultInitOptions; + driOptionCache userInitOptions; + char driver[32] = "k:null"; + char *dri_driver = NULL; + char *kernel_driver = loader_get_kernel_driver_name(fd); + + if (kernel_driver) { + snprintf(driver, 32, "k:%s", kernel_driver); + free(kernel_driver); + } + + driParseOptionInfo(&defaultInitOptions, __driConfigOptionsLoader); + driParseConfigFiles(&userInitOptions, &defaultInitOptions, 0, driver); + if (driCheckOption(&userInitOptions, "dri_driver", DRI_STRING)) { + char *opt = driQueryOptionstr(&userInitOptions, "dri_driver"); + /* not an empty string */ + if (*opt) + dri_driver = strdup(opt); + } + driDestroyOptionCache(&userInitOptions); + driDestroyOptionInfo(&defaultInitOptions); + + return dri_driver; +} +#endif + +#if defined(HAVE_LIBDRM) +#ifdef USE_DRICONF static char *loader_get_dri_config_device_id(void) { driOptionCache defaultInitOptions; @@ -338,23 +388,16 @@ loader_get_driver_for_fd(int fd) return strdup(driver); } - if (!loader_get_pci_id_for_fd(fd, &vendor_id, &chip_id)) { - -#if HAVE_LIBDRM - /* fallback to drmGetVersion(): */ - drmVersionPtr version = drmGetVersion(fd); - - if (!version) { - log_(_LOADER_WARNING, "failed to get driver name for fd %d\n", fd); - return NULL; - } - - driver = strndup(version->name, version->name_len); - log_(_LOADER_INFO, "using driver %s for %d\n", driver, fd); - - drmFreeVersion(version); +#ifdef USE_DRICONF + driver = loader_get_dri_config_driver(fd); + if (driver) + return driver; #endif + if (!loader_get_pci_id_for_fd(fd, &vendor_id, &chip_id)) { + driver = loader_get_kernel_driver_name(fd); + if (driver) + log_(_LOADER_INFO, "using driver %s for %d\n", driver, fd); return driver; } diff --git a/src/util/xmlpool/t_options.h b/src/util/xmlpool/t_options.h index f0537e9..d4881b3 100644 --- a/src/util/xmlpool/t_options.h +++ b/src/util/xmlpool/t_options.h @@ -411,6 +411,11 @@ DRI_CONF_OPT_BEGIN(device_id, string, def) \ DRI_CONF_DESC(en,gettext("Define the graphic device to use if possible")) \ DRI_CONF_OPT_END +#define DRI_CONF_DRI_DRIVER(def) \ +DRI_CONF_OPT_BEGIN(dri_driver, string, def) \ + DRI_CONF_DESC(en,gettext("Override the DRI driver to load")) \ +DRI_CONF_OPT_END + /** * \brief Gallium-Nine specific configuration options */ -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev