diff --git a/src/backend/allocator/dmabuf.rs b/src/backend/allocator/dmabuf.rs index 55341b0..5220d79 100644 --- a/src/backend/allocator/dmabuf.rs +++ b/src/backend/allocator/dmabuf.rs @@ -15,10 +15,10 @@ pub(crate) struct DmabufInternal { } #[derive(Clone)] -pub struct Dmabuf(Arc); +pub struct Dmabuf(pub(crate) Arc); #[derive(Clone)] -pub struct WeakDmabuf(Weak); +pub struct WeakDmabuf(pub(crate) Weak); impl PartialEq for Dmabuf { fn eq(&self, other: &Self) -> bool { @@ -60,9 +60,8 @@ impl Buffer for Dmabuf { } impl Dmabuf { - pub fn new( - src: impl Buffer + 'static, - + pub(crate) fn new( + src: impl Buffer, planes: usize, offsets: &[u32], strides: &[u32], diff --git a/src/backend/allocator/gbm.rs b/src/backend/allocator/gbm.rs index 2e0ae69..9927ac4 100644 --- a/src/backend/allocator/gbm.rs +++ b/src/backend/allocator/gbm.rs @@ -80,4 +80,32 @@ impl std::convert::TryFrom> for Dmabuf { Ok(Dmabuf::new(buf, planes as usize, &offsets, &strides, &fds).unwrap()) } +} + +impl Dmabuf { + pub fn import(&self, gbm: &GbmDevice, usage: BufferObjectFlags) -> std::io::Result> { + let buf = &*self.0; + if self.has_modifier() || buf.num_planes > 1 || buf.offsets[0] != 0 { + gbm.import_buffer_object_from_dma_buf_with_modifiers( + buf.num_planes as u32, + buf.fds, + buf.width, + buf.height, + buf.format.code, + usage, + unsafe { std::mem::transmute::<[u32; 4], [i32; 4]>(buf.strides) }, + unsafe { std::mem::transmute::<[u32; 4], [i32; 4]>(buf.offsets) }, + buf.format.modifier, + ) + } else { + gbm.import_buffer_object_from_dma_buf( + buf.fds[0], + buf.width, + buf.height, + buf.strides[0], + buf.format.code, + if buf.format.modifier == Modifier::Linear { usage | BufferObjectFlags::LINEAR } else { usage }, + ) + } + } } \ No newline at end of file