allocator: move buffer allocation traits into workspace crate
This commit is contained in:
parent
663cfb3ca3
commit
11940fb6a5
10 changed files with 141 additions and 67 deletions
95
allocator/src/lib.rs
Normal file
95
allocator/src/lib.rs
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
use {
|
||||
jay_formats::Format,
|
||||
jay_video_types::{
|
||||
Modifier,
|
||||
dmabuf::{DmaBuf, DmaBufIds},
|
||||
},
|
||||
std::{
|
||||
error::Error,
|
||||
ops::{BitOr, BitOrAssign, Not},
|
||||
rc::Rc,
|
||||
},
|
||||
thiserror::Error,
|
||||
uapi::{OwnedFd, c},
|
||||
};
|
||||
|
||||
#[derive(Debug, Error)]
|
||||
#[error(transparent)]
|
||||
pub struct AllocatorError(#[from] pub Box<dyn Error + Send>);
|
||||
|
||||
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
|
||||
pub struct BufferUsage(u32);
|
||||
|
||||
impl BufferUsage {
|
||||
pub fn none() -> Self {
|
||||
Self(0)
|
||||
}
|
||||
|
||||
pub fn contains(self, other: Self) -> bool {
|
||||
self.0 & other.0 == other.0
|
||||
}
|
||||
}
|
||||
|
||||
impl BitOr for BufferUsage {
|
||||
type Output = Self;
|
||||
|
||||
fn bitor(self, rhs: Self) -> Self::Output {
|
||||
Self(self.0 | rhs.0)
|
||||
}
|
||||
}
|
||||
|
||||
impl BitOrAssign for BufferUsage {
|
||||
fn bitor_assign(&mut self, rhs: Self) {
|
||||
self.0 |= rhs.0;
|
||||
}
|
||||
}
|
||||
|
||||
impl Not for BufferUsage {
|
||||
type Output = Self;
|
||||
|
||||
fn not(self) -> Self::Output {
|
||||
Self(!self.0)
|
||||
}
|
||||
}
|
||||
|
||||
pub const BO_USE_SCANOUT: BufferUsage = BufferUsage(1 << 0);
|
||||
pub const BO_USE_CURSOR: BufferUsage = BufferUsage(1 << 1);
|
||||
pub const BO_USE_RENDERING: BufferUsage = BufferUsage(1 << 2);
|
||||
pub const BO_USE_WRITE: BufferUsage = BufferUsage(1 << 3);
|
||||
pub const BO_USE_LINEAR: BufferUsage = BufferUsage(1 << 4);
|
||||
pub const BO_USE_PROTECTED: BufferUsage = BufferUsage(1 << 5);
|
||||
|
||||
pub trait Allocator {
|
||||
fn drm(&self) -> Option<&dyn AllocatorDrm>;
|
||||
fn create_bo(
|
||||
&self,
|
||||
dma_buf_ids: &DmaBufIds,
|
||||
width: i32,
|
||||
height: i32,
|
||||
format: &'static Format,
|
||||
modifiers: &[Modifier],
|
||||
usage: BufferUsage,
|
||||
) -> Result<Rc<dyn BufferObject>, AllocatorError>;
|
||||
fn import_dmabuf(
|
||||
&self,
|
||||
dmabuf: &DmaBuf,
|
||||
usage: BufferUsage,
|
||||
) -> Result<Rc<dyn BufferObject>, AllocatorError>;
|
||||
}
|
||||
|
||||
pub trait AllocatorDrm {
|
||||
fn dev(&self) -> c::dev_t;
|
||||
fn dup_render_fd(&self) -> Result<Rc<OwnedFd>, AllocatorError>;
|
||||
}
|
||||
|
||||
pub trait BufferObject {
|
||||
fn dmabuf(&self) -> &DmaBuf;
|
||||
fn map_read(self: Rc<Self>) -> Result<Box<dyn MappedBuffer>, AllocatorError>;
|
||||
fn map_write(self: Rc<Self>) -> Result<Box<dyn MappedBuffer>, AllocatorError>;
|
||||
}
|
||||
|
||||
pub trait MappedBuffer {
|
||||
unsafe fn data(&self) -> &[u8];
|
||||
fn data_ptr(&self) -> *mut u8;
|
||||
fn stride(&self) -> i32;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue