pipe-loader: add pipe_loader_ops::configuration()
authorEmil Velikov <emil.l.velikov@gmail.com>
Sat, 17 May 2014 14:31:32 +0000 (15:31 +0100)
committerEmil Velikov <emil.l.velikov@gmail.com>
Thu, 19 Jun 2014 11:37:14 +0000 (12:37 +0100)
Required for the dri state-tracker. Will be used to retrieve
driver specific configuration parameters:
 - share_fd (dmabuf) capability
 - throttle

Signed-off-by: Emil Velikov <emil.l.velikov@gmail.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/auxiliary/pipe-loader/pipe_loader_priv.h
src/gallium/auxiliary/pipe-loader/pipe_loader_sw.c

index 2639763c2634d1ee3b3269eff657be8763f7a3f5..8e79f853b0a722357237df5707e51ea63a05821b 100644 (file)
@@ -61,6 +61,13 @@ pipe_loader_release(struct pipe_loader_device **devs, int ndev)
       devs[i]->ops->release(&devs[i]);
 }
 
+const struct drm_conf_ret *
+pipe_loader_configuration(struct pipe_loader_device *dev,
+                          enum drm_conf conf)
+{
+   return dev->ops->configuration(dev, conf);
+}
+
 struct pipe_screen *
 pipe_loader_create_screen(struct pipe_loader_device *dev,
                           const char *library_paths)
index caef6c16bec9957a3da85d49c91e75266307f46b..8ff00b1e1e1aab537adad6751e8d1176e9a908cc 100644 (file)
@@ -34,6 +34,7 @@
 #define PIPE_LOADER_H
 
 #include "pipe/p_compiler.h"
+#include "state_tracker/drm_driver.h"
 
 #ifdef HAVE_PIPE_LOADER_XLIB
 #include <X11/Xlib.h>
@@ -93,6 +94,16 @@ struct pipe_screen *
 pipe_loader_create_screen(struct pipe_loader_device *dev,
                           const char *library_paths);
 
+/**
+ * Query the configuration parameters for the specified device.
+ *
+ * \param dev Device that will be queried.
+ * \param conf The drm_conf id of the option to be queried.
+ */
+const struct drm_conf_ret *
+pipe_loader_configuration(struct pipe_loader_device *dev,
+                          enum drm_conf conf);
+
 /**
  * Release resources allocated for a list of devices.
  *
index 2e5b74bacdc46e19ed399cbaeea59f371eb36988..1bbaf190c5bb1fe888e73e3b087c22938140749b 100644 (file)
@@ -261,6 +261,29 @@ pipe_loader_drm_release(struct pipe_loader_device **dev)
    *dev = NULL;
 }
 
+static const struct drm_conf_ret *
+pipe_loader_drm_configuration(struct pipe_loader_device *dev,
+                              enum drm_conf conf)
+{
+   struct pipe_loader_drm_device *ddev = pipe_loader_drm_device(dev);
+   const struct drm_driver_descriptor *dd;
+
+   if (!ddev->lib)
+      return NULL;
+
+   dd = (const struct drm_driver_descriptor *)
+      util_dl_get_proc_address(ddev->lib, "driver_descriptor");
+
+   /* sanity check on the name */
+   if (!dd || strcmp(dd->name, ddev->base.driver_name) != 0)
+      return NULL;
+
+   if (!dd->configuration)
+      return NULL;
+
+   return dd->configuration(conf);
+}
+
 static struct pipe_screen *
 pipe_loader_drm_create_screen(struct pipe_loader_device *dev,
                               const char *library_paths)
@@ -285,5 +308,6 @@ pipe_loader_drm_create_screen(struct pipe_loader_device *dev,
 
 static struct pipe_loader_ops pipe_loader_drm_ops = {
    .create_screen = pipe_loader_drm_create_screen,
+   .configuration = pipe_loader_drm_configuration,
    .release = pipe_loader_drm_release
 };
index 476c0ad042e9871341a2dbbfcfb2e4d64ef4433f..d3b025221c5b84b85613c5a5187eafc07f860cd7 100644 (file)
@@ -34,6 +34,9 @@ struct pipe_loader_ops {
    struct pipe_screen *(*create_screen)(struct pipe_loader_device *dev,
                                         const char *library_paths);
 
+   const struct drm_conf_ret *(*configuration)(struct pipe_loader_device *dev,
+                                               enum drm_conf conf);
+
    void (*release)(struct pipe_loader_device **dev);
 };
 
index fa317f22aaeb6424aff56e9180cbb05360253cee..b1b1ca61f7bf0d6ae8551838bb379c88638df588 100644 (file)
@@ -152,6 +152,13 @@ pipe_loader_sw_release(struct pipe_loader_device **dev)
    *dev = NULL;
 }
 
+static const struct drm_conf_ret *
+pipe_loader_sw_configuration(struct pipe_loader_device *dev,
+                             enum drm_conf conf)
+{
+   return NULL;
+}
+
 static struct pipe_screen *
 pipe_loader_sw_create_screen(struct pipe_loader_device *dev,
                              const char *library_paths)
@@ -176,5 +183,6 @@ pipe_loader_sw_create_screen(struct pipe_loader_device *dev,
 
 static struct pipe_loader_ops pipe_loader_sw_ops = {
    .create_screen = pipe_loader_sw_create_screen,
+   .configuration = pipe_loader_sw_configuration,
    .release = pipe_loader_sw_release
 };