kms: Also try other nodes for dmabuf import
This commit is contained in:
parent
ef3486f7e0
commit
3d3864b357
1 changed files with 46 additions and 30 deletions
|
|
@ -1584,40 +1584,56 @@ impl KmsState {
|
||||||
global: &DmabufGlobal,
|
global: &DmabufGlobal,
|
||||||
dmabuf: Dmabuf,
|
dmabuf: Dmabuf,
|
||||||
) -> Result<DrmNode> {
|
) -> Result<DrmNode> {
|
||||||
for device in self.devices.values_mut() {
|
let (expected_node, other_nodes) =
|
||||||
if device
|
self.devices.values_mut().partition::<Vec<_>, _>(|device| {
|
||||||
.socket
|
device
|
||||||
.as_ref()
|
.socket
|
||||||
.map(|s| &s.dmabuf_global == global)
|
.as_ref()
|
||||||
.unwrap_or(false)
|
.map(|s| &s.dmabuf_global == global)
|
||||||
{
|
.unwrap_or(false)
|
||||||
if device.render_node != self.primary_node {
|
});
|
||||||
if !device.in_use(&self.primary_node) {
|
|
||||||
self.api
|
|
||||||
.as_mut()
|
|
||||||
.add_node(device.render_node, device.gbm.clone())
|
|
||||||
.context("Failed to initialize device")?;
|
|
||||||
|
|
||||||
let mut renderer = match self.api.single_renderer(&device.render_node) {
|
let mut last_err = anyhow::anyhow!("Dmabuf cannot be imported on any gpu");
|
||||||
Ok(renderer) => renderer,
|
for device in expected_node.into_iter().chain(other_nodes.into_iter()) {
|
||||||
Err(err) => {
|
if device.render_node != self.primary_node {
|
||||||
self.api.as_mut().remove_node(&device.render_node);
|
if !device.in_use(&self.primary_node) {
|
||||||
return Err(err).context("Failed to initialize renderer");
|
self.api
|
||||||
}
|
.as_mut()
|
||||||
};
|
.add_node(device.render_node, device.gbm.clone())
|
||||||
init_shaders(&mut renderer).context("Failed to initialize shaders")?;
|
.context("Failed to initialize device")?;
|
||||||
|
|
||||||
|
let mut renderer = match self.api.single_renderer(&device.render_node) {
|
||||||
|
Ok(renderer) => renderer,
|
||||||
|
Err(err) => {
|
||||||
|
self.api.as_mut().remove_node(&device.render_node);
|
||||||
|
return Err(err).context("Failed to initialize renderer");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
init_shaders(&mut renderer).context("Failed to initialize shaders")?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let result = self
|
||||||
|
.api
|
||||||
|
.single_renderer(&device.render_node)?
|
||||||
|
.import_dmabuf(&dmabuf, None)
|
||||||
|
.map(|_| device.render_node)
|
||||||
|
.map_err(Into::into);
|
||||||
|
|
||||||
|
match result {
|
||||||
|
Ok(node) => return Ok(node),
|
||||||
|
Err(err) => {
|
||||||
|
trace!(?err, "Failed to import dmabuf on {:?}", device.render_node);
|
||||||
|
last_err = err;
|
||||||
|
|
||||||
|
if !device.in_use(&self.primary_node) {
|
||||||
|
self.api.as_mut().remove_node(&device.render_node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
};
|
||||||
return self
|
|
||||||
.api
|
|
||||||
.single_renderer(&device.render_node)?
|
|
||||||
.import_dmabuf(&dmabuf, None)
|
|
||||||
.map(|_| device.render_node)
|
|
||||||
.map_err(Into::into);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
unreachable!()
|
|
||||||
|
Err(last_err)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn schedule_render(
|
pub fn schedule_render(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue