1
0
Fork 0
forked from wry/wry

gbm: handle render nodes that cannot allocate buffers

This commit is contained in:
Julian Orth 2026-03-14 14:04:58 +01:00
parent 31f865441b
commit 8ff205a266
2 changed files with 33 additions and 15 deletions

View file

@ -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)
} }

View file

@ -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 {