summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xdriinfo.c184
-rw-r--r--xdriinfo.man33
2 files changed, 217 insertions, 0 deletions
diff --git a/xdriinfo.c b/xdriinfo.c
new file mode 100644
index 0000000..7d788e3
--- /dev/null
+++ b/xdriinfo.c
@@ -0,0 +1,184 @@
+/*
+ * Client application for querying drivers' configuration information
+ * Copyright (C) 2003 Felix Kuehling
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * FELIX KUEHLING, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#include <GL/glx.h>
+#include <X11/Xlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+
+typedef const char * glXGetScreenDriver_t (Display *dpy, int scrNum);
+typedef const char * glXGetDriverConfig_t (const char *driverName);
+
+glXGetScreenDriver_t *GetScreenDriver;
+glXGetDriverConfig_t *GetDriverConfig;
+
+enum INFO_FUNC {
+ LIST, NSCREENS, DRIVER, OPTIONS
+};
+
+void printUsage (void);
+
+void printUsage (void) {
+ fprintf (stderr,
+"Usage: xdriinfo [-display <dpy>] [command]\n"
+"Commands:\n"
+" nscreens print the number of screens on display\n"
+" driver screen print the DRI driver name of screen\n"
+" options screen|driver print configuration information about screen or driver\n"
+"If no command is given then the DRI drivers for all screens are listed.\n");
+}
+
+int main (int argc, char *argv[]) {
+ Display *dpy;
+ int nScreens, screenNum, i;
+ enum INFO_FUNC func = LIST;
+ char *funcArg = NULL;
+ char *dpyName = NULL;
+
+ GetScreenDriver = (glXGetScreenDriver_t *)glXGetProcAddress ("glXGetScreenDriver");
+ GetDriverConfig = (glXGetDriverConfig_t *)glXGetProcAddress ("glXGetDriverConfig");
+ if (!GetScreenDriver || !GetDriverConfig) {
+ fprintf (stderr, "libGL is too old.\n");
+ return 1;
+ }
+
+ /* parse the command line */
+ for (i = 1; i < argc; ++i) {
+ char **argPtr = NULL;
+ if (!strcmp (argv[i], "-display"))
+ argPtr = &dpyName;
+ else if (!strcmp (argv[i], "nscreens"))
+ func = NSCREENS;
+ else if (!strcmp (argv[i], "driver")) {
+ func = DRIVER;
+ argPtr = &funcArg;
+ } else if (!strcmp (argv[i], "options")) {
+ func = OPTIONS;
+ argPtr = &funcArg;
+ } else {
+ printUsage ();
+ return 1;
+ }
+ if (argPtr) {
+ if (++i == argc) {
+ printUsage ();
+ return 1;
+ }
+ *argPtr = argv[i];
+ }
+ }
+
+ /* parse screen number argument */
+ if (func == DRIVER || func == OPTIONS) {
+ if (sscanf (funcArg, "%i", &screenNum) != 1)
+ screenNum = -1;
+ else if (screenNum < 0) {
+ fprintf (stderr, "Negative screen number \"%s\".\n", funcArg);
+ return 1;
+ }
+ }
+ /* if the argument to the options command is a driver name, we can handle
+ * it without opening an X connection */
+ if (func == OPTIONS && screenNum == -1) {
+ const char *options = (*GetDriverConfig) (funcArg);
+ if (!options) {
+ fprintf (stderr,
+ "Driver \"%s\" is not installed or does not support configuration.\n",
+ funcArg);
+ return 1;
+ }
+ printf ("%s", options);
+ if (isatty (STDOUT_FILENO))
+ printf ("\n");
+ return 0;
+ }
+ /* driver command needs a valid screen number */
+ else if (func == DRIVER && screenNum == -1) {
+ fprintf (stderr, "Invalid screen number \"%s\".\n", funcArg);
+ return 1;
+ }
+
+ /* open display and count the number of screens */
+ if (!(dpy = XOpenDisplay (dpyName))) {
+ fprintf (stderr, "Error: Couldn't open display\n");
+ return 1;
+ }
+ nScreens = ScreenCount (dpy);
+
+ /* final check on the screen number argument (if any)*/
+ if ((func == DRIVER || func == OPTIONS) && screenNum >= nScreens) {
+ fprintf (stderr, "Screen number \"%d\" out of range.\n", screenNum);
+ return 1;
+ }
+
+ switch (func) {
+ case NSCREENS:
+ printf ("%d", nScreens);
+ if (isatty (STDOUT_FILENO))
+ printf ("\n");
+ break;
+ case DRIVER: {
+ const char *name = (*GetScreenDriver) (dpy, screenNum);
+ if (!name) {
+ fprintf (stderr, "Screen \"%d\" is not direct rendering capable.\n",
+ screenNum);
+ return 1;
+ }
+ printf ("%s", name);
+ if (isatty (STDOUT_FILENO))
+ printf ("\n");
+ break;
+ }
+ case OPTIONS: {
+ const char *name = (*GetScreenDriver) (dpy, screenNum), *options;
+ if (!name) {
+ fprintf (stderr, "Screen \"%d\" is not direct rendering capable.\n",
+ screenNum);
+ return 1;
+ }
+ options = (*GetDriverConfig) (name);
+ if (!options) {
+ fprintf (stderr,
+ "Driver \"%s\" is not installed or does not support configuration.\n",
+ name);
+ return 1;
+ }
+ printf ("%s", options);
+ if (isatty (STDOUT_FILENO))
+ printf ("\n");
+ break;
+ }
+ case LIST:
+ for (i = 0; i < nScreens; ++i) {
+ const char *name = (*GetScreenDriver) (dpy, i);
+ if (name)
+ printf ("Screen %d: %s\n", i, name);
+ else
+ printf ("Screen %d: not direct rendering capable.\n", i);
+ }
+ }
+
+ return 0;
+}
diff --git a/xdriinfo.man b/xdriinfo.man
new file mode 100644
index 0000000..efe5e51
--- /dev/null
+++ b/xdriinfo.man
@@ -0,0 +1,33 @@
+.\" $XFree86$
+.TH xdriinfo 1 __vendorversion__
+.SH NAME
+xdriinfo \- query configuration information of DRI drivers
+.SH SYNOPSIS
+.B xdriinfo
+[\-display \fIdisplayname\fP] [command]
+.SH DESCRIPTION
+\fIxdriinfo\fP can be used to query configuration information of
+direct rendering drivers. If no command argument is specified it lists
+the names of the direct rendering drivers for all screens.
+.PP
+Valid commands are:
+.TP
+.B nscreens
+Print the number of screens.
+.TP
+.B driver \fIscreen\fP
+Print the name of the direct rendering driver for \fIscreen\fP.
+.TP
+.B options \fIscreen|driver\fP
+Print the XML document describing the configuration options of a
+driver. The driver can be specified directly by \fIdriver\fP name or
+indirectly by \fIscreen\fP number. If the driver name is specified
+directly then no X connection is needed.
+.SH ENVIRONMENT
+.TP
+.B DISPLAY
+The default display.
+.SH "SEE ALSO"
+.IR glxinfo (1x)
+.SH AUTHOR
+Felix Kuehling