#include #include #include #include #include #include #include #include #include #include "virtgpu_drm.h" #include #include #include #include #include "drmtools.h" /* ------------------------------------------------------------------ */ #define ARRAY_SIZE(_x) (sizeof(_x)/sizeof(_x[0])) /* ------------------------------------------------------------------ */ 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 < ARRAY_SIZE(virtio_caps); 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 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; }