#include #include #include #include #include #include #include #include "drm.h" #include "vgem_drm.h" #include "libvgem.h" int drm_open_vgem(void) { char *name; int i, fd; for (i = 0; i < 16; i++) { struct stat _stat; int ret; ret = asprintf(&name, "/sys/bus/platform/devices/vgem/drm/card%d", i); assert(ret != -1); if (stat(name, &_stat) == -1) { free(name); continue; } free(name); ret = asprintf(&name, "/dev/dri/card%d", i); assert(ret != -1); fd = open(name, O_RDWR); free(name); if (fd == -1) { perror("Couldn't open drm device read/write\n"); return -1; } return fd; } fprintf(stderr, "failed to open any drm device. retry as root?\n"); abort(); } int create_vgem_bo(int fd, size_t size) { struct drm_mode_create_dumb create; int ret; if (size == 0) size = 4096; memset(&create, 0, sizeof(create)); create.height = size; create.width = 1; create.bpp = 1; ret = drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &create); if (ret) { fprintf(stderr, "DRM_IOCTL_MODE_CREATE_DUMB, failed with " "%d\n", ret); abort(); } assert(create.size == size); return create.handle; } void * mmap_vgem_bo(int fd, int handle, size_t size) { struct drm_mode_map_dumb mmap_arg; void *ptr; int ret; memset(&mmap_arg, 0, sizeof(mmap_arg)); mmap_arg.handle = handle; ret = drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &mmap_arg); assert(ret == 0); assert(mmap_arg.offset != 0); ptr = mmap(NULL, size, (PROT_READ|PROT_WRITE), MAP_PRIVATE, fd, mmap_arg.offset); assert(ptr != MAP_FAILED); return ptr; }