diff options
-rw-r--r-- | Makefile | 5 | ||||
-rw-r--r-- | meson.build | 7 | ||||
-rw-r--r-- | virtiotest.c | 113 |
3 files changed, 125 insertions, 0 deletions
@@ -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, ¶m); + 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; +} |