diff options
author | Nicolai Hähnle <[email protected]> | 2017-06-30 11:06:06 +0200 |
---|---|---|
committer | Nicolai Hähnle <[email protected]> | 2017-08-02 09:50:58 +0200 |
commit | b4ff5e90e9ab3471a5f5c7a403826c9af952b594 (patch) | |
tree | e7b62510bd9f95398b0c09ecebfcc3bf53a22d5c /src/gallium/auxiliary | |
parent | aa222e21c288887348cf52e14696559a58dec13c (diff) |
st/dri: implement v2 of DRI_ConfigOptions
Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/gallium/auxiliary')
-rw-r--r-- | src/gallium/auxiliary/pipe-loader/pipe_loader.c | 13 | ||||
-rw-r--r-- | src/gallium/auxiliary/pipe-loader/pipe_loader.h | 16 | ||||
-rw-r--r-- | src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c | 23 |
3 files changed, 52 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader.c b/src/gallium/auxiliary/pipe-loader/pipe_loader.c index cb37f30c02e..39d33d848af 100644 --- a/src/gallium/auxiliary/pipe-loader/pipe_loader.c +++ b/src/gallium/auxiliary/pipe-loader/pipe_loader.c @@ -34,6 +34,8 @@ #include "util/xmlconfig.h" #include "util/xmlpool.h" +#include <string.h> + #ifdef _MSC_VER #include <stdlib.h> #define PATH_MAX _MAX_PATH @@ -107,6 +109,17 @@ pipe_loader_load_options(struct pipe_loader_device *dev) dev->driver_name); } +char * +pipe_loader_get_driinfo_xml(const char *driver_name) +{ + char *xml = pipe_loader_drm_get_driinfo_xml(driver_name); + + if (!xml) + xml = strdup(gallium_driinfo_xml); + + return xml; +} + struct pipe_screen * pipe_loader_create_screen(struct pipe_loader_device *dev, struct pipe_screen_config *config) diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader.h b/src/gallium/auxiliary/pipe-loader/pipe_loader.h index a4502ae2586..b6e81cf3915 100644 --- a/src/gallium/auxiliary/pipe-loader/pipe_loader.h +++ b/src/gallium/auxiliary/pipe-loader/pipe_loader.h @@ -114,6 +114,14 @@ void pipe_loader_load_options(struct pipe_loader_device *dev); /** + * Get the driinfo XML string used by the given driver. + * + * The returned string is heap-allocated. + */ +char * +pipe_loader_get_driinfo_xml(const char *driver_name); + +/** * Release resources allocated for a list of devices. * * Should be called when the specified devices are no longer in use to @@ -197,6 +205,14 @@ pipe_loader_drm_probe(struct pipe_loader_device **devs, int ndev); bool pipe_loader_drm_probe_fd(struct pipe_loader_device **dev, int fd); +/** + * Get the driinfo XML used for the DRM driver of the given name, if any. + * + * The returned string is heap-allocated. + */ +char * +pipe_loader_drm_get_driinfo_xml(const char *driver_name); + extern const char gallium_driinfo_xml[]; #ifdef __cplusplus diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c index 92b242178d5..5c8c7509e08 100644 --- a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c +++ b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c @@ -32,6 +32,7 @@ #include <fcntl.h> #include <stdio.h> +#include <string.h> #include <xf86drm.h> #include <unistd.h> @@ -299,6 +300,28 @@ pipe_loader_drm_create_screen(struct pipe_loader_device *dev, return ddev->dd->create_screen(ddev->fd, config); } +char * +pipe_loader_drm_get_driinfo_xml(const char *driver_name) +{ + char *xml = NULL; + struct util_dl_library *lib = NULL; + const struct drm_driver_descriptor *dd = + get_driver_descriptor(driver_name, &lib); + if (!dd) + goto out; + + const struct drm_conf_ret *conf = dd->configuration(DRM_CONF_XML_OPTIONS); + if (!conf) + goto out; + + xml = strdup((const char *)conf->val.val_pointer); + +out: + if (lib) + util_dl_close(lib); + return xml; +} + static const struct pipe_loader_ops pipe_loader_drm_ops = { .create_screen = pipe_loader_drm_create_screen, .configuration = pipe_loader_drm_configuration, |