tty: Improve reselience to rendering errors

This commit is contained in:
Ivan Molodetskikh
2023-08-09 14:20:59 +04:00
parent c50e22d415
commit 7527cad200
+22 -9
View File
@@ -33,6 +33,7 @@ use smithay_drm_extras::edid::EdidInfo;
use crate::backend::Backend; use crate::backend::Backend;
use crate::{LoopData, Niri}; use crate::{LoopData, Niri};
const BACKGROUND_COLOR: [f32; 4] = [0.1, 0.1, 0.1, 1.];
const SUPPORTED_COLOR_FORMATS: &[Fourcc] = &[Fourcc::Argb8888, Fourcc::Abgr8888]; const SUPPORTED_COLOR_FORMATS: &[Fourcc] = &[Fourcc::Argb8888, Fourcc::Abgr8888];
pub struct Tty { pub struct Tty {
@@ -68,18 +69,31 @@ impl Backend for Tty {
elements: &[SpaceRenderElements<GlesRenderer, WaylandSurfaceRenderElement<GlesRenderer>>], elements: &[SpaceRenderElements<GlesRenderer, WaylandSurfaceRenderElement<GlesRenderer>>],
) { ) {
let output_device = self.output_device.as_mut().unwrap(); let output_device = self.output_device.as_mut().unwrap();
let res = output_device let drm_compositor = &mut output_device.drm_compositor;
.drm_compositor
.render_frame::<_, _, GlesRenderbuffer>( match drm_compositor.render_frame::<_, _, GlesRenderbuffer>(
&mut output_device.gles, &mut output_device.gles,
elements, elements,
[0.1, 0.1, 0.1, 1.], BACKGROUND_COLOR,
) ) {
.unwrap(); Ok(res) => {
assert!(!res.needs_sync()); assert!(!res.needs_sync());
if res.damage.is_some() { if res.damage.is_some() {
output_device.drm_compositor.queue_frame(()).unwrap(); match output_device.drm_compositor.queue_frame(()) {
} else { Ok(()) => return,
Err(err) => {
error!("error queueing frame: {err}");
}
}
}
}
Err(err) => {
// Can fail if we switched to a different TTY.
error!("error rendering frame: {err}");
}
}
// FIXME: render on demand instead of busy looping.
niri.event_loop niri.event_loop
.insert_source( .insert_source(
Timer::from_duration(Duration::from_millis(6)), Timer::from_duration(Duration::from_millis(6)),
@@ -91,7 +105,6 @@ impl Backend for Tty {
.unwrap(); .unwrap();
} }
} }
}
impl Tty { impl Tty {
pub fn new(event_loop: LoopHandle<LoopData>) -> Self { pub fn new(event_loop: LoopHandle<LoopData>) -> Self {