diff options
author | Qiang Yu <[email protected]> | 2018-08-06 11:19:27 +0800 |
---|---|---|
committer | Emil Velikov <[email protected]> | 2018-08-17 17:16:32 +0100 |
commit | 0aa80abf257edde027378b6826e60fa8088ac3df (patch) | |
tree | 874b616bdd6078d775106f58a70c99b34eb9f737 /src/loader | |
parent | 3bbe180b982639554685c997ff51a7cbbf3247e6 (diff) |
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 <[email protected]>
Signed-off-by: Qiang Yu <[email protected]>
Acked-by: Michel Dänzer <[email protected]>
Reviewed-by: Emil Velikov <[email protected]>
[v4 Emil: add HAVE_LIBDRM guard around __driConfigOptionsLoader and
loader_get_dri_config_driver]
Signed-off-by: Emil Velikov <[email protected]>
Diffstat (limited to 'src/loader')
-rw-r--r-- | src/loader/loader.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/loader/loader.c b/src/loader/loader.c index 9480be97fd0..2e37d113b8d 100644 --- a/src/loader/loader.c +++ b/src/loader/loader.c @@ -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) |