aboutsummaryrefslogtreecommitdiff
path: root/src/backend/winit.rs
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2023-09-30 17:13:56 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2023-09-30 17:13:56 +0400
commita3aa5fca12b59df0c1ee421b482a51a425e25abd (patch)
tree3a94f1624912216a3a7e056c4de5d4fcb82b5b4f /src/backend/winit.rs
parent21737abbfdb78698e323c0a9490759b427370a74 (diff)
downloadniri-a3aa5fca12b59df0c1ee421b482a51a425e25abd.tar.gz
niri-a3aa5fca12b59df0c1ee421b482a51a425e25abd.tar.bz2
niri-a3aa5fca12b59df0c1ee421b482a51a425e25abd.zip
Refactor frame scheduling
Combine the redraw state variables into one enum, and refactor to get rid of the requirement that a VBlank must queue a subsequent redraw. Also fix the bug where ongoing animations that produced no damage could stall the redrawing.
Diffstat (limited to 'src/backend/winit.rs')
-rw-r--r--src/backend/winit.rs14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/backend/winit.rs b/src/backend/winit.rs
index e0fbf272..7639b568 100644
--- a/src/backend/winit.rs
+++ b/src/backend/winit.rs
@@ -1,5 +1,6 @@
use std::cell::RefCell;
use std::collections::HashMap;
+use std::mem;
use std::rc::Rc;
use std::sync::{Arc, Mutex};
use std::time::Duration;
@@ -18,7 +19,7 @@ use smithay::utils::Transform;
use smithay::wayland::dmabuf::DmabufFeedback;
use crate::config::Config;
-use crate::niri::{OutputRenderElements, State};
+use crate::niri::{OutputRenderElements, RedrawState, State};
use crate::utils::get_monotonic_time;
use crate::Niri;
@@ -182,7 +183,18 @@ impl Winit {
0,
wp_presentation_feedback::Kind::empty(),
);
+ }
+
+ let output_state = niri.output_state.get_mut(output).unwrap();
+ match mem::replace(&mut output_state.redraw_state, RedrawState::Idle) {
+ RedrawState::Idle => unreachable!(),
+ RedrawState::Queued(_) => (),
+ RedrawState::WaitingForVBlank { .. } => unreachable!(),
+ RedrawState::WaitingForEstimatedVBlank(_) => unreachable!(),
+ RedrawState::WaitingForEstimatedVBlankAndQueued(_) => unreachable!(),
+ }
+ if output_state.unfinished_animations_remain {
self.backend.window().request_redraw();
}