Use EGL_MESA_device_software as fallback for screen capture
Previously, screenshots and screencopy panicked if no DRM render nodes are present. Instead, create a `GlowRenderer` using llvmpipe, if available. This should work as a fallback until pixman is integrated.
This commit is contained in:
parent
87020c79ba
commit
5537fa4822
2 changed files with 48 additions and 12 deletions
27
src/state.rs
27
src/state.rs
|
|
@ -389,23 +389,28 @@ impl BackendData {
|
|||
/// Get an offscreen renderer for screen capture / screenshot rendering
|
||||
///
|
||||
/// `kms_node_cb` callback use used to determine nodes to render with when using kms backend.
|
||||
/// Panics if this returns `None`.
|
||||
/// If this returns `None`, it will attempt to use llvmpipe, then panic if no renderer is
|
||||
/// found.
|
||||
pub fn offscreen_renderer<N: Into<KmsNodes>, F: FnOnce(&mut KmsState) -> Option<N>>(
|
||||
&mut self,
|
||||
kms_node_cb: F,
|
||||
) -> Result<RendererRef, GlMultiError> {
|
||||
match self {
|
||||
BackendData::Kms(kms) => {
|
||||
let KmsNodes {
|
||||
render_node,
|
||||
target_node,
|
||||
copy_format,
|
||||
} = kms_node_cb(kms).expect("No Software Rendering").into();
|
||||
Ok(RendererRef::GlMulti(kms.api.renderer(
|
||||
&render_node,
|
||||
&target_node,
|
||||
copy_format,
|
||||
)?))
|
||||
if let Some(nodes) = kms_node_cb(kms) {
|
||||
let nodes = nodes.into();
|
||||
Ok(RendererRef::GlMulti(kms.api.renderer(
|
||||
&nodes.render_node,
|
||||
&nodes.target_node,
|
||||
nodes.copy_format,
|
||||
)?))
|
||||
} else {
|
||||
Ok(RendererRef::Glow(
|
||||
kms.software_renderer
|
||||
.as_mut()
|
||||
.expect("No Software Rendering"),
|
||||
))
|
||||
}
|
||||
}
|
||||
BackendData::Winit(winit) => Ok(RendererRef::Glow(winit.backend.renderer())),
|
||||
BackendData::X11(x11) => Ok(RendererRef::Glow(&mut x11.renderer)),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue