use drm_ffi as ffi; use std::fs::{File, OpenOptions}; use std::os::unix::io::{AsFd, BorrowedFd}; #[derive(Debug)] // This is our customized struct that implements the traits in drm. struct Card(File); // Need to implement AsRawFd before we can implement drm::Device impl AsFd for Card { fn as_fd(&self) -> BorrowedFd<'_> { self.0.as_fd() } } impl Card { fn open(path: &str) -> Self { let mut options = OpenOptions::new(); options.read(true); options.write(true); Card(options.open(path).unwrap()) } fn open_global() -> Self { Self::open("/dev/dri/card0") } } fn print_busid(fd: BorrowedFd<'_>) { let mut buffer = Vec::new(); let busid = ffi::get_bus_id(fd, Some(&mut buffer)); println!("{:#?}", busid); } fn print_client(fd: BorrowedFd<'_>) { let client = ffi::get_client(fd, 0); println!("{:#?}", client); } fn print_version(fd: BorrowedFd<'_>) { let mut name = Vec::new(); let mut date = Vec::new(); let mut desc = Vec::new(); let version = ffi::get_version(fd, Some(&mut name), Some(&mut date), Some(&mut desc)); println!("{:#?}", version); } fn print_capabilities(fd: BorrowedFd<'_>) { for cty in 1.. { let cap = ffi::get_capability(fd, cty); match cap { Ok(_) => println!("{:#?}", cap), Err(_) => break, } } } fn print_token(fd: BorrowedFd<'_>) { let token = ffi::auth::get_magic_token(fd); println!("{:#?}", token); } fn main() { let card = Card::open_global(); let fd = card.as_fd(); print_busid(fd); print_client(fd); print_version(fd); print_capabilities(fd); print_token(fd); //print_stats(fd); }