diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2016-06-22 07:21:09 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2016-07-12 21:52:41 +0100 |
commit | 93256e3e548c14117afb7e8178f56b0e0f520d10 (patch) | |
tree | 03cf740ee5c520c2b04f64e1e17e69871197c37f /lib/igt_vgem.c | |
parent | 36ffa375d33e4e0b9ce05e8d62df04cda8591903 (diff) |
vgem: Add basic dma-buf fence interop
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'lib/igt_vgem.c')
-rw-r--r-- | lib/igt_vgem.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/lib/igt_vgem.c b/lib/igt_vgem.c index 4fe166ad..95731d9b 100644 --- a/lib/igt_vgem.c +++ b/lib/igt_vgem.c @@ -80,3 +80,73 @@ void *vgem_mmap(int fd, struct vgem_bo *bo, unsigned prot) return ptr; } +#define LOCAL_VGEM_FENCE_ATTACH 0x1 +#define LOCAL_VGEM_FENCE_SIGNAL 0x2 + +#define LOCAL_IOCTL_VGEM_FENCE_ATTACH DRM_IOWR( DRM_COMMAND_BASE + LOCAL_VGEM_FENCE_ATTACH, struct local_vgem_fence_attach) +#define LOCAL_IOCTL_VGEM_FENCE_SIGNAL DRM_IOW( DRM_COMMAND_BASE + LOCAL_VGEM_FENCE_SIGNAL, struct local_vgem_fence_signal) + +struct local_vgem_fence_attach { + uint32_t handle; + uint32_t flags; +#define VGEM_FENCE_WRITE 0x1 + uint32_t out_fence; + uint32_t pad; +}; + +struct local_vgem_fence_signal { + uint32_t fence; + uint32_t flags; +}; + +bool vgem_has_fences(int fd) +{ + struct local_vgem_fence_signal arg; + int err; + + err = 0; + memset(&arg, 0, sizeof(arg)); + if (drmIoctl(fd, LOCAL_IOCTL_VGEM_FENCE_SIGNAL, &arg)) + err = -errno; + errno = 0; + return err == -ENOENT; +} + +static int __vgem_fence_attach(int fd, struct local_vgem_fence_attach *arg) +{ + int err = 0; + if (igt_ioctl(fd, LOCAL_IOCTL_VGEM_FENCE_ATTACH, arg)) + err = -errno; + errno = 0; + return err; +} + +uint32_t vgem_fence_attach(int fd, struct vgem_bo *bo, bool write) +{ + struct local_vgem_fence_attach arg; + + memset(&arg, 0, sizeof(arg)); + arg.handle = bo->handle; + if (write) + arg.flags |= VGEM_FENCE_WRITE; + igt_assert_eq(__vgem_fence_attach(fd, &arg), 0); + return arg.out_fence; +} + +static int __vgem_fence_signal(int fd, struct local_vgem_fence_signal *arg) +{ + int err = 0; + if (igt_ioctl(fd, LOCAL_IOCTL_VGEM_FENCE_SIGNAL, arg)) + err = -errno; + errno = 0; + return err; +} + +void vgem_fence_signal(int fd, uint32_t fence) +{ + struct local_vgem_fence_signal arg; + + memset(&arg, 0, sizeof(arg)); + arg.fence = fence; + igt_assert_eq(__vgem_fence_signal(fd, &arg), 0); +} |