kms: Also try other nodes for dmabuf import

This commit is contained in:
Victoria Brekenfeld 2024-02-01 18:42:26 +01:00 • committed by Victoria Brekenfeld
parent ef3486f7e0
commit 3d3864b357

View file

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