//! //! # DumbBuffer //! //! Memory-supported, slow, but easy & cross-platform buffer implementation //! use crate::buffer; use std::borrow::{Borrow, BorrowMut}; use std::ops::{Deref, DerefMut}; #[derive(Debug, Copy, Clone, PartialEq, Eq)] /// Slow, but generic [`buffer::Buffer`] implementation pub struct DumbBuffer { pub(crate) size: (u32, u32), pub(crate) length: usize, pub(crate) format: buffer::DrmFourcc, pub(crate) pitch: u32, pub(crate) handle: buffer::Handle, } /// Mapping of a [`DumbBuffer`] pub struct DumbMapping<'a> { pub(crate) _phantom: core::marker::PhantomData<&'a ()>, pub(crate) map: &'a mut [u8], } impl AsRef<[u8]> for DumbMapping<'_> { fn as_ref(&self) -> &[u8] { self.map } } impl AsMut<[u8]> for DumbMapping<'_> { fn as_mut(&mut self) -> &mut [u8] { self.map } } impl Borrow<[u8]> for DumbMapping<'_> { fn borrow(&self) -> &[u8] { self.map } } impl BorrowMut<[u8]> for DumbMapping<'_> { fn borrow_mut(&mut self) -> &mut [u8] { self.map } } impl Deref for DumbMapping<'_> { type Target = [u8]; fn deref(&self) -> &Self::Target { self.map } } impl DerefMut for DumbMapping<'_> { fn deref_mut(&mut self) -> &mut Self::Target { self.map } } impl<'a> Drop for DumbMapping<'a> { fn drop(&mut self) { unsafe { rustix::mm::munmap(self.map.as_mut_ptr() as *mut _, self.map.len()) .expect("Unmap failed"); } } } impl buffer::Buffer for DumbBuffer { fn size(&self) -> (u32, u32) { self.size } fn format(&self) -> buffer::DrmFourcc { self.format } fn pitch(&self) -> u32 { self.pitch } fn handle(&self) -> buffer::Handle { self.handle } }