loader: add dri_driver option to override dri driver to load

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 kernel_driver="kernel_driver_name">
  <option name="dri_driver" value="new_dri_driver" />
</device>

or

<device driver="loader" kernel_driver="kernel_driver_name">
  <option name="dri_driver" value="new_dri_driver" />
</device>

v2:
  add kernel_driver device attribute to specify kernel
  driver name instead of reuse driver attribute

v3:
  seperate loader_get_kernel_driver_name into another patch
  seperate add kernel_driver attribute into another patch

Suggested-by: Michel Dänzer <michel@daenzer.net>
Signed-off-by: Qiang Yu <Qiang.Yu@amd.com>
Acked-by: Michel Dänzer <michel.daenzer@amd.com>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
[v4 Emil: add HAVE_LIBDRM guard around __driConfigOptionsLoader and
loader_get_dri_config_driver]
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
This commit is contained in:
Qiang Yu 2018-08-06 11:19:27 +08:00 committed by Emil Velikov
parent 3bbe180b98
commit 0aa80abf25
2 changed files with 35 additions and 0 deletions

View File

@ -108,9 +108,33 @@ 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 *dri_driver = NULL;
char *kernel_driver = loader_get_kernel_driver_name(fd);
driParseOptionInfo(&defaultInitOptions, __driConfigOptionsLoader);
driParseConfigFiles(&userInitOptions, &defaultInitOptions, 0,
"loader", kernel_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);
free(kernel_driver);
return dri_driver;
}
static char *loader_get_dri_config_device_id(void)
{
driOptionCache defaultInitOptions;
@ -358,6 +382,12 @@ loader_get_driver_for_fd(int fd)
return strdup(driver);
}
#if defined(HAVE_LIBDRM) && defined(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)

View File

@ -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
*/