st/dri: implement v2 of DRI_ConfigOptions
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Fri, 30 Jun 2017 09:06:06 +0000 (11:06 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 2 Aug 2017 07:50:58 +0000 (09:50 +0200)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/auxiliary/pipe-loader/pipe_loader.c
src/gallium/auxiliary/pipe-loader/pipe_loader.h
src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
src/gallium/state_trackers/dri/dri_screen.c

index cb37f30c02e93505ade6b3c17fba19161f1b8f77..39d33d848af5ed26c4bc13a3d1578ffbdc28bba4 100644 (file)
@@ -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)
index a4502ae25861d69629fddf646ea6f09d5ed65abb..b6e81cf39153b736977522cd3a2ad3ed1c6ff48b 100644 (file)
@@ -113,6 +113,14 @@ pipe_loader_configuration(struct pipe_loader_device *dev,
 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.
  *
@@ -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
index 92b242178d5c593b2e67a4a5b2e23d070f724743..5c8c7509e085af6a0facf2891d07c4f3da04c4c7 100644 (file)
@@ -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,
index 1fa0347d644c16b26ae2cdcf4538bea9d38505d0..f888abd6e7047c675368f43bfed5e8cdfc9a6b06 100644 (file)
@@ -49,8 +49,9 @@
 #undef false
 
 const __DRIconfigOptionsExtension gallium_config_options = {
-   .base = { __DRI_CONFIG_OPTIONS, 1 },
-   .xml = gallium_driinfo_xml
+   .base = { __DRI_CONFIG_OPTIONS, 2 },
+   .xml = gallium_driinfo_xml,
+   .getXml = pipe_loader_get_driinfo_xml
 };
 
 #define false 0