gbm: handle render nodes that cannot allocate buffers
This commit is contained in:
parent
31f865441b
commit
8ff205a266
2 changed files with 33 additions and 15 deletions
|
|
@ -168,11 +168,13 @@ fn reopen(fd: c::c_int, need_primary: bool) -> Result<Rc<OwnedFd>, DrmError> {
|
||||||
return Ok(Rc::new(fd));
|
return Ok(Rc::new(fd));
|
||||||
}
|
}
|
||||||
let path = 'path: {
|
let path = 'path: {
|
||||||
if get_node_type_from_fd(fd).map_err(DrmError::GetDeviceType)? == NodeType::Render {
|
if !need_primary {
|
||||||
break 'path uapi::format_ustr!("/proc/self/fd/{}", fd);
|
if get_node_type_from_fd(fd).map_err(DrmError::GetDeviceType)? == NodeType::Render {
|
||||||
}
|
break 'path uapi::format_ustr!("/proc/self/fd/{}", fd);
|
||||||
if !need_primary && let Ok(path) = render_node_name(fd) {
|
}
|
||||||
break 'path path;
|
if let Ok(path) = render_node_name(fd) {
|
||||||
|
break 'path path;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
device_node_name(fd)?
|
device_node_name(fd)?
|
||||||
};
|
};
|
||||||
|
|
@ -212,6 +214,10 @@ impl Drm {
|
||||||
self.fd.raw()
|
self.fd.raw()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn dup_primary(&self) -> Result<Self, DrmError> {
|
||||||
|
Self::reopen(self.fd.raw(), true)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn dup_render(&self) -> Result<Self, DrmError> {
|
pub fn dup_render(&self) -> Result<Self, DrmError> {
|
||||||
Self::reopen(self.fd.raw(), false)
|
Self::reopen(self.fd.raw(), false)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,8 @@ use {
|
||||||
BO_USE_RENDERING, BO_USE_SCANOUT, BO_USE_WRITE, BufferObject, BufferUsage,
|
BO_USE_RENDERING, BO_USE_SCANOUT, BO_USE_WRITE, BufferObject, BufferUsage,
|
||||||
MappedBuffer,
|
MappedBuffer,
|
||||||
},
|
},
|
||||||
format::{Format, formats},
|
format::{Format, XRGB8888, formats},
|
||||||
utils::oserror::OsError,
|
utils::{errorfmt::ErrorFmt, oserror::OsError},
|
||||||
video::{
|
video::{
|
||||||
INVALID_MODIFIER, Modifier,
|
INVALID_MODIFIER, Modifier,
|
||||||
dmabuf::{DmaBuf, DmaBufIds, DmaBufPlane, PlaneVec},
|
dmabuf::{DmaBuf, DmaBufIds, DmaBufPlane, PlaneVec},
|
||||||
|
|
@ -214,14 +214,26 @@ unsafe fn export_bo(dmabuf_ids: &DmaBufIds, bo: *mut Bo) -> Result<DmaBuf, GbmEr
|
||||||
|
|
||||||
impl GbmDevice {
|
impl GbmDevice {
|
||||||
pub fn new(drm: &Drm) -> Result<Self, GbmError> {
|
pub fn new(drm: &Drm) -> Result<Self, GbmError> {
|
||||||
let drm = drm.dup_render()?;
|
let open = |drm: Drm| {
|
||||||
let dev = unsafe { gbm_create_device(drm.raw()) };
|
let dev = unsafe { gbm_create_device(drm.raw()) };
|
||||||
if dev.is_null() {
|
if dev.is_null() {
|
||||||
Err(GbmError::CreateDevice)
|
Err(GbmError::CreateDevice)
|
||||||
} else {
|
} else {
|
||||||
let dev = Rc::new(DeviceHolder { dev });
|
let dev = Rc::new(DeviceHolder { dev });
|
||||||
Ok(Self { drm, dev })
|
Ok(Self { drm, dev })
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
let dma_buf_ids = DmaBufIds::default();
|
||||||
|
let create_bo =
|
||||||
|
|gbm: &GbmDevice| gbm.create_bo(&dma_buf_ids, 1, 1, XRGB8888, &[INVALID_MODIFIER], 0);
|
||||||
|
let gbm = open(drm.dup_render()?)?;
|
||||||
|
match create_bo(&gbm) {
|
||||||
|
Ok(..) => return Ok(gbm),
|
||||||
|
Err(e) => log::warn!("Render node cannot allocate buffers: {}", ErrorFmt(e)),
|
||||||
|
};
|
||||||
|
let gbm = open(drm.dup_primary()?)?;
|
||||||
|
create_bo(&gbm)?;
|
||||||
|
Ok(gbm)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn raw(&self) -> *mut Device {
|
pub fn raw(&self) -> *mut Device {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue