aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile5
-rw-r--r--meson.build7
-rw-r--r--virtiotest.c113
3 files changed, 125 insertions, 0 deletions
diff --git a/Makefile b/Makefile
index c1b7ca6..f7f0a1f 100644
--- a/Makefile
+++ b/Makefile
@@ -33,6 +33,10 @@ drmtest : CFLAGS += $(shell pkg-config --cflags libdrm gbm epoxy cairo pixman-1)
drmtest : LDLIBS += $(shell pkg-config --libs libdrm gbm epoxy cairo pixman-1)
drmtest : LDLIBS += -ljpeg
+virtiotest : CFLAGS += $(shell pkg-config --cflags libdrm gbm epoxy cairo pixman-1)
+virtiotest : LDLIBS += $(shell pkg-config --libs libdrm gbm epoxy cairo pixman-1)
+virtiotest : LDLIBS += -ljpeg
+
gtktest : CFLAGS += $(shell pkg-config --cflags gtk+-3.0 cairo pixman-1)
gtktest : LDLIBS += $(shell pkg-config --libs gtk+-3.0 cairo pixman-1)
gtktest : LDLIBS += -ljpeg
@@ -45,6 +49,7 @@ clean:
drminfo: drminfo.o drmtools.o
drmtest: drmtest.o drmtools.o ttytools.o render.o image.o
+virtiotest: virtiotest.o drmtools.o
gtktest: gtktest.o render.o image.o
endif
diff --git a/meson.build b/meson.build
index 6d6b208..7ec5cd1 100644
--- a/meson.build
+++ b/meson.build
@@ -13,11 +13,14 @@ jpeg_dep = declare_dependency(link_args : '-ljpeg')
drminfo_srcs = [ 'drminfo.c', 'drmtools.c' ]
drmtest_srcs = [ 'drmtest.c', 'drmtools.c', 'ttytools.c', 'render.c', 'image.c' ]
+viotest_srcs = [ 'virtiotest.c', 'drmtools.c' ]
gtktest_srcs = [ 'gtktest.c', 'render.c', 'image.c' ]
drminfo_deps = [ libdrm_dep, cairo_dep, pixman_dep ]
drmtest_deps = [ libdrm_dep, gbm_dep, epoxy_dep,
cairo_dep, pixman_dep, jpeg_dep ]
+viotest_deps = [ libdrm_dep, gbm_dep, epoxy_dep,
+ cairo_dep, pixman_dep, jpeg_dep ]
gtktest_deps = [ gtk3_dep,
cairo_dep, pixman_dep, jpeg_dep ]
@@ -29,6 +32,10 @@ executable('drmtest',
sources : drmtest_srcs,
dependencies : drmtest_deps,
install : true)
+executable('virtiotest',
+ sources : viotest_srcs,
+ dependencies : viotest_deps,
+ install : true)
executable('gtktest',
sources : gtktest_srcs,
dependencies : gtktest_deps,
diff --git a/virtiotest.c b/virtiotest.c
new file mode 100644
index 0000000..bd87073
--- /dev/null
+++ b/virtiotest.c
@@ -0,0 +1,113 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <inttypes.h>
+#include <getopt.h>
+
+#include <sys/ioctl.h>
+#include "virtgpu_drm.h"
+
+#include <xf86drm.h>
+#include <xf86drmMode.h>
+
+#include <cairo.h>
+#include <pixman.h>
+
+#include "drmtools.h"
+
+/* ------------------------------------------------------------------ */
+
+static struct {
+ uint64_t cap;
+ const char *name;
+} virtio_caps[] = {
+ { .cap = VIRTGPU_PARAM_3D_FEATURES, .name = "virgl-3d" },
+#ifdef VIRTGPU_PARAM_CAPSET_QUERY_FIX
+ { .cap = VIRTGPU_PARAM_CAPSET_QUERY_FIX, .name = "capset-fix" },
+#endif
+};
+
+static uint64_t virtio_get_cap(uint64_t cap)
+{
+ struct drm_virtgpu_getparam param = {
+ .param = cap,
+ .value = 0,
+ };
+ int ret;
+
+ ret = ioctl(fd, DRM_VIRTGPU_GETPARAM, &param);
+ if (ret != 0) {
+ fprintf(stderr, "ioctl DRM_VIRTGPU_GETPARAM(%" PRId64 "): %s\n",
+ cap, strerror(errno));
+ exit(1);
+ }
+ return param.value;
+}
+
+static void virtio_print_caps(void)
+{
+ uint64_t value;
+ int i;
+
+ printf("virtio capabilities\n");
+ for (i = 0; i < sizeof(virtio_caps)/sizeof(virtio_caps[0]); i++) {
+ value = virtio_get_cap(virtio_caps[i].cap);
+ printf(" %s: %" PRId64 "\n", virtio_caps[i].name, value);
+ }
+}
+
+/* ------------------------------------------------------------------ */
+
+static void usage(FILE *fp)
+{
+ fprintf(fp,
+ "\n"
+ "usage: virtiotest [ options ]\n"
+ "\n"
+ "options:\n"
+ " -h print this\n"
+ " -c <nr> pick card\n"
+ " -i print device info\n"
+ "\n");
+}
+
+int main(int argc, char **argv)
+{
+ int card = 0;
+ char *output = NULL;
+ char *modename = NULL;
+ bool printinfo = false;
+ int c;
+
+ for (;;) {
+ c = getopt(argc, argv, "hic:");
+ if (c == -1)
+ break;
+ switch (c) {
+ case 'c':
+ card = atoi(optarg);
+ break;
+ case 'i':
+ printinfo = true;
+ break;
+ case 'h':
+ usage(stdout);
+ exit(0);
+ default:
+ usage(stderr);
+ exit(1);
+ }
+ }
+
+ drm_init_dev(card, output, modename, false);
+
+ if (printinfo) {
+ virtio_print_caps();
+ }
+
+ drm_fini_dev();
+ return 0;
+}