[Mesa-dev] [PATCH V2 06/11] loader: Use drirc device_id parameter in complement to DRI_PRIME

Axel Davy axel.davy at ens.fr
Wed May 28 20:22:00 PDT 2014


DRI_PRIME is not very handy, because you have to launch the executable
with it set, which is not always easy to do.
By using drirc, the user specifies the target executable
and the device to use. After that the program will be launched everytime
on the target device.

v2: fix compilation issue

Signed-off-by: Axel Davy <axel.davy at ens.fr>
---
I've tested to build with scons too, and it seems to work.

 src/Makefile.am                                 |  4 +++-
 src/loader/Makefile.am                          | 22 +++++++++++++++++---
 src/loader/loader.c                             | 27 +++++++++++++++++++++++++
 src/mesa/drivers/dri/common/xmlconfig.h         |  2 ++
 src/mesa/drivers/dri/common/xmlpool/t_options.h | 14 +++++++++++++
 5 files changed, 65 insertions(+), 4 deletions(-)

diff --git a/src/Makefile.am b/src/Makefile.am
index 9d1580f..d4a7090 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -19,12 +19,14 @@
 # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 # IN THE SOFTWARE.
 
-SUBDIRS = gtest loader mapi
+SUBDIRS = gtest mapi
 
 if NEED_OPENGL_COMMON
 SUBDIRS += glsl mesa
 endif
 
+SUBDIRS += loader
+
 if HAVE_DRI_GLX
 SUBDIRS += glx
 endif
diff --git a/src/loader/Makefile.am b/src/loader/Makefile.am
index bddf7ac..c60c092 100644
--- a/src/loader/Makefile.am
+++ b/src/loader/Makefile.am
@@ -29,6 +29,24 @@ libloader_la_CPPFLAGS = \
 	$(VISIBILITY_CFLAGS) \
 	$(LIBUDEV_CFLAGS)
 
+libloader_la_SOURCES = $(LOADER_C_FILES)
+libloader_la_LIBADD =
+
+if NEED_OPENGL_COMMON
+libloader_la_CPPFLAGS += \
+	-I$(top_srcdir)/src/mesa/drivers/dri/common/ \
+	-I$(top_builddir)/src/mesa/drivers/dri/common/ \
+	-I$(top_srcdir)/src/mesa/ \
+	-I$(top_srcdir)/src/mapi/ \
+	-DUSE_DRICONF
+
+libloader_la_SOURCES += \
+	$(top_srcdir)/src/mesa/drivers/dri/common/xmlconfig.c
+
+libloader_la_LIBADD += \
+	$(EXPAT_LIBS)
+endif
+
 if !HAVE_LIBDRM
 libloader_la_CPPFLAGS += \
 	-D__NOT_HAVE_DRM_H
@@ -36,8 +54,6 @@ else
 libloader_la_CPPFLAGS += \
 	$(LIBDRM_CFLAGS)
 
-libloader_la_LIBADD = \
+libloader_la_LIBADD += \
 	$(LIBDRM_LIBS)
 endif
-
-libloader_la_SOURCES = $(LOADER_C_FILES)
diff --git a/src/loader/loader.c b/src/loader/loader.c
index 7a4015c..a10da9d 100644
--- a/src/loader/loader.c
+++ b/src/loader/loader.c
@@ -74,6 +74,10 @@
 #include <unistd.h>
 #include <stdlib.h>
 #include <errno.h>
+#ifdef USE_DRICONF
+#include "xmlconfig.h"
+#include "xmlpool.h"
+#endif
 #endif
 #include "loader.h"
 
@@ -310,9 +314,22 @@ drm_open_device(const char *device_name)
    return fd;
 }
 
+#ifdef USE_DRICONF
+const char __driConfigOptionsLoader[] =
+DRI_CONF_BEGIN
+    DRI_CONF_SECTION_INITIALIZATION
+        DRI_CONF_DEVICE_ID_PATH_TAG()
+    DRI_CONF_SECTION_END
+DRI_CONF_END;
+#endif
+
 int loader_get_user_preferred_fd(int default_fd, int *different_device)
 {
    struct udev *udev;
+#ifdef USE_DRICONF
+   driOptionCache defaultInitOptions;
+   driOptionCache userInitOptions;
+#endif
    const char *dri_prime = getenv("DRI_PRIME");
    char *prime = NULL;
    int is_different_device = 0, fd = default_fd;
@@ -324,6 +341,16 @@ int loader_get_user_preferred_fd(int default_fd, int *different_device)
 
    if (dri_prime)
       prime = strdup(dri_prime);
+#ifdef USE_DRICONF
+   else {
+      driParseOptionInfo(&defaultInitOptions, __driConfigOptionsLoader);
+      driParseConfigFiles(&userInitOptions, &defaultInitOptions, 0, "loader");
+      if (driCheckOption(&userInitOptions, "device_id", DRI_STRING))
+         prime = strdup(driQueryOptionstr(&userInitOptions, "device_id"));
+      driDestroyOptionCache(&userInitOptions);
+      driDestroyOptionInfo(&defaultInitOptions);
+   }
+#endif
 
    if (prime == NULL) {
       *different_device = 0;
diff --git a/src/mesa/drivers/dri/common/xmlconfig.h b/src/mesa/drivers/dri/common/xmlconfig.h
index 786caae..a4daa6b 100644
--- a/src/mesa/drivers/dri/common/xmlconfig.h
+++ b/src/mesa/drivers/dri/common/xmlconfig.h
@@ -30,6 +30,8 @@
 #ifndef __XMLCONFIG_H
 #define __XMLCONFIG_H
 
+#include <GL/gl.h>
+
 #define STRING_CONF_MAXLEN 25
 
 /** \brief Option data types */
diff --git a/src/mesa/drivers/dri/common/xmlpool/t_options.h b/src/mesa/drivers/dri/common/xmlpool/t_options.h
index 3bf804a..fc9e104 100644
--- a/src/mesa/drivers/dri/common/xmlpool/t_options.h
+++ b/src/mesa/drivers/dri/common/xmlpool/t_options.h
@@ -321,3 +321,17 @@ DRI_CONF_SECTION_BEGIN \
 DRI_CONF_OPT_BEGIN_B(always_have_depth_buffer, def) \
         DRI_CONF_DESC(en,gettext("Create all visuals with a depth buffer")) \
 DRI_CONF_OPT_END
+
+
+
+/**
+ * \brief Initialization configuration options
+ */
+#define DRI_CONF_SECTION_INITIALIZATION \
+DRI_CONF_SECTION_BEGIN \
+        DRI_CONF_DESC(en,gettext("Initialization"))
+
+#define DRI_CONF_DEVICE_ID_PATH_TAG(def) \
+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
-- 
1.9.1



More information about the mesa-dev mailing list