1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//!
//! Bindings to the Graphics Execution Manager
//!

use crate::ioctl;
use drm_sys::*;

use std::{
    io,
    os::unix::io::{AsRawFd, BorrowedFd},
};

/// Open a GEM object given it's 32-bit name, returning the handle.
pub fn open(fd: BorrowedFd<'_>, name: u32) -> io::Result<drm_gem_open> {
    let mut gem = drm_gem_open {
        name,
        ..Default::default()
    };

    unsafe {
        ioctl::gem::open(fd, &mut gem)?;
    }

    Ok(gem)
}

/// Closes a GEM object given it's handle.
pub fn close(fd: BorrowedFd<'_>, handle: u32) -> io::Result<drm_gem_close> {
    let gem = drm_gem_close {
        handle,
        ..Default::default()
    };

    unsafe {
        ioctl::gem::close(fd, &gem)?;
    }

    Ok(gem)
}

/// Converts a GEM object's handle to a PRIME file descriptor.
pub fn handle_to_fd(fd: BorrowedFd<'_>, handle: u32, flags: u32) -> io::Result<drm_prime_handle> {
    let mut prime = drm_prime_handle {
        handle,
        flags,
        ..Default::default()
    };

    unsafe {
        ioctl::gem::prime_handle_to_fd(fd, &mut prime)?;
    }

    Ok(prime)
}

/// Converts a PRIME file descriptor to a GEM object's handle.
pub fn fd_to_handle(fd: BorrowedFd<'_>, primefd: BorrowedFd<'_>) -> io::Result<drm_prime_handle> {
    let mut prime = drm_prime_handle {
        fd: primefd.as_raw_fd(),
        ..Default::default()
    };

    unsafe {
        ioctl::gem::prime_fd_to_handle(fd, &mut prime)?;
    }

    Ok(prime)
}