[PATCH 2/2] tests: add render_node tests
Ilija Hadzic
ihadzic at research.bell-labs.com
Thu Mar 29 09:46:46 PDT 2012
Add two simple programs (render_node_add and render_node_rm)
that can be used to add and remove render nodes from a shell
command or a script.
Signed-off-by: Ilija Hadzic <ihadzic at research.bell-labs.com>
---
.gitignore | 2 +
configure.ac | 1 +
tests/Makefile.am | 2 +-
tests/render_nodes/Makefile.am | 16 ++++
tests/render_nodes/render_node_add.c | 152 ++++++++++++++++++++++++++++++++++
tests/render_nodes/render_node_rm.c | 88 ++++++++++++++++++++
6 files changed, 260 insertions(+), 1 deletions(-)
create mode 100644 tests/render_nodes/Makefile.am
create mode 100644 tests/render_nodes/render_node_add.c
create mode 100644 tests/render_nodes/render_node_rm.c
diff --git a/.gitignore b/.gitignore
index 243457e..3d2afe8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -76,3 +76,5 @@ tests/modeprint/modeprint
tests/modetest/modetest
tests/kmstest/kmstest
tests/vbltest/vbltest
+tests/render_nodes/render_node_add
+tests/render_nodes/render_node_rm
diff --git a/configure.ac b/configure.ac
index 1ba7eba..797a4bf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -308,6 +308,7 @@ AC_CONFIG_FILES([
tests/kmstest/Makefile
tests/radeon/Makefile
tests/vbltest/Makefile
+ tests/render_nodes/Makefile
include/Makefile
include/drm/Makefile
libdrm.pc])
diff --git a/tests/Makefile.am b/tests/Makefile.am
index a3a59bd..f916a38 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -10,7 +10,7 @@ check_PROGRAMS = \
dristat \
drmstat
-SUBDIRS = modeprint
+SUBDIRS = modeprint render_nodes
if HAVE_LIBKMS
SUBDIRS += kmstest modetest
diff --git a/tests/render_nodes/Makefile.am b/tests/render_nodes/Makefile.am
new file mode 100644
index 0000000..133d792
--- /dev/null
+++ b/tests/render_nodes/Makefile.am
@@ -0,0 +1,16 @@
+AM_CFLAGS = \
+ -I$(top_srcdir)/include/drm \
+ -I$(top_srcdir)
+
+noinst_PROGRAMS = \
+ render_node_add render_node_rm
+
+render_node_add_SOURCES = \
+ render_node_add.c
+render_node_add_LDADD = \
+ $(top_builddir)/libdrm.la
+
+render_node_rm_SOURCES = \
+ render_node_rm.c
+render_node_rm_LDADD = \
+ $(top_builddir)/libdrm.la
diff --git a/tests/render_nodes/render_node_add.c b/tests/render_nodes/render_node_add.c
new file mode 100644
index 0000000..62c9a84
--- /dev/null
+++ b/tests/render_nodes/render_node_add.c
@@ -0,0 +1,152 @@
+/*
+ * Copyright 2012 Alcatel-Lucent, Inc.
+ *
+ * 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 (including the next
+ * paragraph) 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
+ * THE COPYRIGHT HOLDER(S) AND/OR ITS SUPPLIERS 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.
+ *
+ * Authors:
+ * Ilija Hadzic <ihadzic at research.bell-labs.com>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <string.h>
+#include <xf86drm.h>
+
+#include "config.h"
+
+void print_usage()
+{
+ fprintf(stderr, "Render Node Add\n");
+ fprintf(stderr, "Usage:\n");
+ fprintf(stderr, "\trender-node-add -? | [-n control_node_path] "
+ "[-c num_crtc] [-e num_encoders] [-p num_connectors] "
+ "[-l id_list]\n");
+}
+
+int parse_id_list(char *in_list, uint32_t *out_list, int list_size)
+{
+ int i;
+ char *list_elem;
+
+ if (!in_list)
+ return 0;
+ list_elem = strtok(in_list, ",");
+ out_list[0] = strtol(list_elem, NULL, 0);
+ for (i = 1; list_elem && i < list_size; i++) {
+ list_elem = strtok(NULL, ",");
+ if (!list_elem)
+ break;
+ out_list[i] = strtol(list_elem, NULL, 0);
+ }
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+ int r;
+ int i;
+ int minor;
+ int fd;
+ int num_crtc, num_encoder, num_connector;
+ uint32_t *id_list;
+ char *id_list_arg;
+ char *control_node;
+ int id_list_size;
+
+ num_crtc = 0;
+ num_encoder = 0;
+ num_connector = 0;
+ id_list = NULL;
+ id_list_arg = NULL;
+ control_node = NULL;
+ while ((r = getopt(argc, argv, "n:c:e:p:l:?")) != -1) {
+ switch (r) {
+ case 'n':
+ control_node = optarg;
+ break;
+ case 'c':
+ num_crtc = strtol(optarg, NULL, 0);
+ if (num_crtc < 0)
+ num_crtc = 0;
+ break;
+ case 'e':
+ num_encoder = strtol(optarg, NULL, 0);
+ if (num_encoder < 0)
+ num_encoder = 0;
+ break;
+ case 'p':
+ num_connector = strtol(optarg, NULL, 0);
+ if (num_connector < 0)
+ num_connector = 0;
+ break;
+ case 'l':
+ id_list_arg = optarg;
+ break;
+ case '?':
+ default:
+ print_usage();
+ return 0;
+ }
+ }
+ id_list_size = num_crtc + num_encoder + num_connector;
+ if (id_list_size) {
+ int s;
+
+ id_list = calloc(id_list_size, sizeof(uint32_t));
+ if (!id_list) {
+ perror(argv[0]);
+ exit(EXIT_FAILURE);
+ }
+ s = parse_id_list(id_list_arg, id_list, id_list_size);
+ if (s) {
+ fprintf(stderr, "id_list parse error\n");
+ free(id_list);
+ exit(EXIT_FAILURE);
+ }
+ }
+ if (!control_node)
+ control_node = "/dev/dri/controlD64";
+ printf("control_node = %s\n", control_node);
+ fd = open(control_node, 0);
+ if (fd == -1) {
+ perror(argv[0]);
+ exit(EXIT_FAILURE);
+ }
+ printf("id_list = ");
+ for (i = 0; i < id_list_size; i++)
+ printf("%d ", id_list[i]);
+ printf("\n");
+ r = drmCreateRenderNode(fd, &minor, num_crtc, num_encoder,
+ num_connector, id_list);
+ if (r) {
+ free(id_list);
+ close(fd);
+ perror(argv[0]);
+ exit(EXIT_FAILURE);
+ }
+ printf("minor = %d\n", minor);
+ free(id_list);
+ close(fd);
+ return 0;
+}
diff --git a/tests/render_nodes/render_node_rm.c b/tests/render_nodes/render_node_rm.c
new file mode 100644
index 0000000..f792ad9
--- /dev/null
+++ b/tests/render_nodes/render_node_rm.c
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2012 Alcatel-Lucent, Inc.
+ *
+ * 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 (including the next
+ * paragraph) 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
+ * THE COPYRIGHT HOLDER(S) AND/OR ITS SUPPLIERS 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.
+ *
+ * Authors:
+ * Ilija Hadzic <ihadzic at research.bell-labs.com>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <xf86drm.h>
+
+#include "config.h"
+
+void print_usage()
+{
+ fprintf(stderr, "Render Node Remove\n");
+ fprintf(stderr, "Usage:\n");
+ fprintf(stderr, "\trender-node-rm -? | ");
+ fprintf(stderr, "[-n control_node_path] -m <minor>\n");
+}
+
+int main(int argc, char **argv)
+{
+ int r;
+ char *control_node;
+ int minor;
+ int fd;
+
+ control_node = NULL;
+ minor = -1;
+ while ((r = getopt(argc, argv, "n:m:?")) != -1) {
+ switch (r) {
+ case 'n':
+ control_node = optarg;
+ break;
+ case 'm':
+ minor = strtol(optarg, NULL, 0);
+ break;
+ case '?':
+ default:
+ print_usage();
+ return 0;
+ }
+ }
+ if (minor < 0) {
+ fprintf(stderr, "missing or invalid minor number\n");
+ exit(EXIT_FAILURE);
+ }
+ if (!control_node)
+ control_node = "/dev/dri/controlD64";
+ printf("control_node = %s\n", control_node);
+ fd = open(control_node, 0);
+ if (fd == -1) {
+ perror(argv[0]);
+ exit(EXIT_FAILURE);
+ }
+ printf("minor = %d\n", minor);
+ r = drmRemoveRenderNode(fd, minor);
+ close(fd);
+ if (r) {
+ perror(argv[0]);
+ exit(EXIT_FAILURE);
+ }
+ return 0;
+}
--
1.7.8.5
More information about the dri-devel
mailing list