use drm::Device;
use drm::control::Device as ControlDevice;
#[derive(Debug)]
pub struct Card(std::fs::File);
impl std::os::unix::io::AsFd for Card {
fn as_fd(&self) -> std::os::unix::io::BorrowedFd<'_> {
self.0.as_fd()
}
}
impl Device for Card {}
impl ControlDevice for Card {}
impl Card {
pub fn open(path: &str) -> Result<Self, std::io::Error> {
let mut options = std::fs::OpenOptions::new();
options.read(true);
options.write(true);
Ok(Card(options.open(path)?))
}
pub fn open_global(device: &str) -> Result<Self, std::io::Error> {
Self::open(device)
}
}
#[allow(dead_code)]
pub mod capabilities {
use drm::ClientCapability as CC;
pub const CLIENT_CAP_ENUMS: &[CC] = &[CC::Stereo3D, CC::UniversalPlanes, CC::Atomic];
use drm::DriverCapability as DC;
pub const DRIVER_CAP_ENUMS: &[DC] = &[
DC::DumbBuffer,
DC::VBlankHighCRTC,
DC::DumbPreferredDepth,
DC::DumbPreferShadow,
DC::Prime,
DC::MonotonicTimestamp,
DC::ASyncPageFlip,
DC::CursorWidth,
DC::CursorHeight,
DC::AddFB2Modifiers,
DC::PageFlipTarget,
DC::CRTCInVBlankEvent,
DC::SyncObj,
DC::TimelineSyncObj,
];
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_capabilities_constants() {
assert!(!capabilities::CLIENT_CAP_ENUMS.is_empty());
assert!(!capabilities::DRIVER_CAP_ENUMS.is_empty());
assert!(capabilities::CLIENT_CAP_ENUMS.contains(&drm::ClientCapability::Stereo3D));
assert!(capabilities::CLIENT_CAP_ENUMS.contains(&drm::ClientCapability::UniversalPlanes));
assert!(capabilities::CLIENT_CAP_ENUMS.contains(&drm::ClientCapability::Atomic));
assert!(capabilities::DRIVER_CAP_ENUMS.contains(&drm::DriverCapability::DumbBuffer));
assert!(capabilities::DRIVER_CAP_ENUMS.contains(&drm::DriverCapability::Prime));
}
#[test]
fn test_trait_impls_compile() {
fn assert_device<T: Device>() {}
fn assert_control_device<T: ControlDevice>() {}
assert_device::<Card>();
assert_control_device::<Card>();
}
#[test]
#[ignore = "This test would attempt to open a real file"]
fn test_open_error_handling() {
let non_existent_path = "/path/that/definitely/does/not/exist";
let _ = Card::open(non_existent_path);
}
#[test]
#[ignore = "This test would attempt to open a real device"]
fn test_open_global() {
let device_path = "/dev/dri/card0";
let _ = Card::open_global(device_path);
}
#[test]
fn test_card_debug() {
fn assert_debug<T: std::fmt::Debug>() {}
assert_debug::<Card>();
}
}