1
0
Fork 0
forked from wry/wry

vulkan: import wl_shm buffers as udmabuf

This commit is contained in:
Julian Orth 2025-09-30 18:52:57 +02:00
parent 47e15c6083
commit a3d3a62af3
14 changed files with 545 additions and 99 deletions

View file

@ -99,6 +99,7 @@ use {
TearingMode, ToplevelData, ToplevelNode, ToplevelNodeBase, VrrMode, WorkspaceNode,
generic_node_visitor,
},
udmabuf::{Udmabuf, UdmabufError},
utils::{
activation_token::ActivationToken,
asyncevent::AsyncEvent,
@ -111,6 +112,7 @@ use {
hash_map_ext::HashMapExt,
linkedlist::LinkedList,
numcell::NumCell,
oserror::OsError,
queue::AsyncQueue,
refcounted::RefCounted,
run_toplevel::RunToplevel,
@ -150,7 +152,7 @@ use {
time::Duration,
},
thiserror::Error,
uapi::OwnedFd,
uapi::{OwnedFd, c},
};
pub struct State {
@ -288,6 +290,7 @@ pub struct State {
pub xdg_surface_configure_events: AsyncQueue<XdgSurfaceConfigureEvent>,
pub workspace_display_order: Cell<WorkspaceDisplayOrder>,
pub outputs_without_hc: NumCell<usize>,
pub udmabuf: CloneCell<Option<Option<Rc<Udmabuf>>>>,
}
// impl Drop for State {
@ -1565,6 +1568,25 @@ impl State {
found_tree.clear();
node
}
pub fn udmabuf(&self) -> Option<Rc<Udmabuf>> {
if let Some(u) = self.udmabuf.get() {
return u;
}
match Udmabuf::new() {
Ok(u) => {
let u = Rc::new(u);
self.udmabuf.set(Some(Some(u.clone())));
Some(u)
}
Err(UdmabufError::Open(OsError(c::EPERM))) => None,
Err(e) => {
log::error!("Could not create udmabuf device: {}", ErrorFmt(e));
self.udmabuf.set(Some(None));
None
}
}
}
}
#[derive(Debug, Error)]