aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2023-08-27 17:44:22 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2023-08-27 17:44:22 +0400
commit1575753b69cabf7f4d84f765a025ce1d7672b522 (patch)
treec69768d4c35f06602c402f27c04a7eb39caa5d5c
parentc3d2505487900b5c224b6a6e2171c2164713dec5 (diff)
downloadniri-1575753b69cabf7f4d84f765a025ce1d7672b522.tar.gz
niri-1575753b69cabf7f4d84f765a025ce1d7672b522.tar.bz2
niri-1575753b69cabf7f4d84f765a025ce1d7672b522.zip
Extract different parts of rendering into functions
-rw-r--r--src/layout.rs8
-rw-r--r--src/niri.rs46
2 files changed, 40 insertions, 14 deletions
diff --git a/src/layout.rs b/src/layout.rs
index fbb0e801..24a51b42 100644
--- a/src/layout.rs
+++ b/src/layout.rs
@@ -582,6 +582,14 @@ impl<W: LayoutElement> MonitorSet<W> {
Some(&mut monitors[*active_monitor_idx])
}
+ pub fn monitor_for_output(&self, output: &Output) -> Option<&Monitor<W>> {
+ let MonitorSet::Normal { monitors, .. } = self else {
+ return None;
+ };
+
+ monitors.iter().find(|monitor| &monitor.output == output)
+ }
+
pub fn monitor_for_output_mut(&mut self, output: &Output) -> Option<&mut Monitor<W>> {
let MonitorSet::Normal { monitors, .. } = self else {
return None;
diff --git a/src/niri.rs b/src/niri.rs
index 9b6e3a17..d8f53e00 100644
--- a/src/niri.rs
+++ b/src/niri.rs
@@ -542,19 +542,15 @@ impl Niri {
pointer_elements
}
- fn redraw(&mut self, backend: &mut dyn Backend, output: &Output) {
- let _span = tracy_client::span!("redraw");
- let state = self.output_state.get_mut(output).unwrap();
- let presentation_time = state.frame_clock.next_presentation_time();
-
- assert!(state.queued_redraw.take().is_some());
- assert!(!state.waiting_for_vblank);
-
- let renderer = backend.renderer();
+ fn render(
+ &mut self,
+ renderer: &mut GlesRenderer,
+ output: &Output,
+ ) -> Vec<OutputRenderElements<GlesRenderer>> {
+ let _span = tracy_client::span!("Niri::render");
- let mon = self.monitor_set.monitor_for_output_mut(output).unwrap();
- mon.advance_animations(presentation_time);
// Get monitor elements.
+ let mon = self.monitor_set.monitor_for_output(output).unwrap();
let monitor_elements = mon.render_elements(renderer);
// Get layer-shell elements.
@@ -614,13 +610,35 @@ impl Niri {
}),
);
- // backend.render() uses this.
- drop(layer_map);
+ elements
+ }
+
+ fn redraw(&mut self, backend: &mut dyn Backend, output: &Output) {
+ let _span = tracy_client::span!("Niri::redraw");
+
+ let state = self.output_state.get_mut(output).unwrap();
+ let presentation_time = state.frame_clock.next_presentation_time();
+
+ assert!(state.queued_redraw.take().is_some());
+ assert!(!state.waiting_for_vblank);
+
+ // Advance the animations.
+ let mon = self.monitor_set.monitor_for_output_mut(output).unwrap();
+ mon.advance_animations(presentation_time);
+
+ // Render the elements.
+ let elements = self.render(backend.renderer(), output);
// Hand it over to the backend.
backend.render(self, output, &elements);
- // Send frame callbacks.
+ // Send the frame callbacks.
+ self.send_frame_callbacks(output);
+ }
+
+ fn send_frame_callbacks(&self, output: &Output) {
+ let _span = tracy_client::span!("Niri::send_frame_callbacks");
+
let frame_callback_time = self.start_time.elapsed();
self.monitor_set.send_frame(output, frame_callback_time);