11 releases (breaking)

0.9.0 Sep 24, 2024
0.8.0 Apr 18, 2024
0.7.1 Jan 4, 2024
0.7.0 Nov 14, 2023
0.2.0 Jul 24, 2021

#497 in Unix APIs

Download history 15917/week @ 2024-12-01 14422/week @ 2024-12-08 17343/week @ 2024-12-15 14135/week @ 2024-12-22 14243/week @ 2024-12-29 22134/week @ 2025-01-05 25221/week @ 2025-01-12 22614/week @ 2025-01-19 20392/week @ 2025-01-26 25164/week @ 2025-02-02 25381/week @ 2025-02-09 29543/week @ 2025-02-16 25156/week @ 2025-02-23 23369/week @ 2025-03-02 24898/week @ 2025-03-09 24570/week @ 2025-03-16

101,911 downloads per month
Used in 29 crates (2 directly)

MIT license

100KB
3K SLoC

drm-rs

Crates.io docs.rs Build Status

A safe interface to the Direct Rendering Manager.

Direct Rendering Manager

The Direct Rendering Manager is a subsystem found on multiple Unix-based operating systems that provides a userspace API to graphics hardware. See the Wikipedia article for more details.

Usage

Basic

The DRM is accessed using ioctls on a file representing a graphics card. These can normally be found in /dev/dri, but can also be opened in other ways (ex. udev).

This crate does not provide a method of opening these files. Instead, the user program must provide a way to access the file descriptor representing the device through the AsFd trait. Here is a basic example using File as a backend:

/// A simple wrapper for a device node.
pub struct Card(std::fs::File);

/// Implementing [`AsFd`] is a prerequisite to implementing the traits found
/// in this crate. Here, we are just calling [`File::as_fd()`] on the inner
/// [`File`].
impl AsFd for Card {
    fn as_fd(&self) -> BorrowedFd<'_> {
        self.0.as_fd()
    }
}

/// Simple helper methods for opening a `Card`.
impl Card {
    pub fn open(path: &str) -> Self {
        let mut options = std::fs::OpenOptions::new();
        options.read(true);
        options.write(true);
        Card(options.open(path).unwrap())
    }
}

Finally, you can implement drm::Device to gain access to the basic DRM functionality:

impl drm::Device for Card {}

fn main() {
    let gpu = Card::open("/dev/dri/card0");
    println!("{:#?}", gpu.get_driver().unwrap());
}

Control (modesetting)

See drm::control::Device as well as our mode-setting examples: atomic_modeset and legacy_modeset

Rendering

Rendering is done by creating and attaching framebuffers to crtcs.

A framebuffer is created from anything implementing Buffer like the always available, but very limited, DumbBuffer.

For faster hardware-backed buffers, checkout gbm.rs.


lib.rs:

Foreign function interface

Dependencies

~2–10MB
~134K SLoC