gbm: allow to import dmabufs
This commit is contained in:
parent
58f22afa40
commit
bcf6a5c4b9
|
@ -15,10 +15,10 @@ pub(crate) struct DmabufInternal {
|
|||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Dmabuf(Arc<DmabufInternal>);
|
||||
pub struct Dmabuf(pub(crate) Arc<DmabufInternal>);
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct WeakDmabuf(Weak<DmabufInternal>);
|
||||
pub struct WeakDmabuf(pub(crate) Weak<DmabufInternal>);
|
||||
|
||||
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],
|
||||
|
|
|
@ -80,4 +80,32 @@ impl<T> std::convert::TryFrom<GbmBuffer<T>> for Dmabuf {
|
|||
|
||||
Ok(Dmabuf::new(buf, planes as usize, &offsets, &strides, &fds).unwrap())
|
||||
}
|
||||
}
|
||||
|
||||
impl Dmabuf {
|
||||
pub fn import<A: AsRawFd + 'static, T>(&self, gbm: &GbmDevice<A>, usage: BufferObjectFlags) -> std::io::Result<GbmBuffer<T>> {
|
||||
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 },
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue