element/surface: Simplify surface feedback selection using the frame_time_filter

This commit is contained in:
Victoria Brekenfeld 2026-01-06 17:21:04 +01:00 committed by Victoria Brekenfeld
parent d17a4ead68
commit dc5a9fac66
2 changed files with 26 additions and 27 deletions

View file

@ -1,5 +1,8 @@
use crate::{ use crate::{
shell::focus::target::PointerFocusTarget, wayland::protocols::corner_radius::CacheableCorners, shell::focus::target::PointerFocusTarget,
wayland::{
handlers::compositor::frame_time_filter_fn, protocols::corner_radius::CacheableCorners,
},
}; };
use std::{ use std::{
borrow::Cow, borrow::Cow,
@ -16,7 +19,6 @@ use smithay::{
element::{ element::{
AsRenderElements, Kind, RenderElementStates, AsRenderElements, Kind, RenderElementStates,
surface::{WaylandSurfaceRenderElement, render_elements_from_surface_tree}, surface::{WaylandSurfaceRenderElement, render_elements_from_surface_tree},
utils::select_dmabuf_feedback,
}, },
}, },
desktop::{ desktop::{
@ -674,7 +676,7 @@ impl CosmicSurface {
&self, &self,
output: &Output, output: &Output,
feedback: &SurfaceDmabufFeedback, feedback: &SurfaceDmabufFeedback,
render_element_states: &RenderElementStates, _render_element_states: &RenderElementStates,
primary_scan_out_output: F1, primary_scan_out_output: F1,
) where ) where
F1: FnMut(&WlSurface, &SurfaceData) -> Option<Output> + Copy, F1: FnMut(&WlSurface, &SurfaceData) -> Option<Output> + Copy,
@ -682,23 +684,22 @@ impl CosmicSurface {
let is_fullscreen = self.is_fullscreen(false); let is_fullscreen = self.is_fullscreen(false);
self.0 self.0
.send_dmabuf_feedback(output, primary_scan_out_output, |surface, _| { .send_dmabuf_feedback(output, primary_scan_out_output, |_, data| {
select_dmabuf_feedback( if is_fullscreen {
surface, feedback
render_element_states, .primary_scanout_feedback
&feedback.render_feedback, .as_ref()
if is_fullscreen { .unwrap_or(&feedback.render_feedback)
feedback } else {
.primary_scanout_feedback if frame_time_filter_fn(data) == Kind::ScanoutCandidate {
.as_ref()
.unwrap_or(&feedback.render_feedback)
} else {
feedback feedback
.overlay_scanout_feedback .overlay_scanout_feedback
.as_ref() .as_ref()
.unwrap_or(&feedback.render_feedback) .unwrap_or(&feedback.render_feedback)
}, } else {
) &feedback.render_feedback
}
}
}) })
} }

View file

@ -151,20 +151,18 @@ pub fn recursive_frame_time_estimation(
overall_estimate overall_estimate
} }
pub const FRAME_TIME_FILTER: KindEvaluation = KindEvaluation::Dynamic({ pub fn frame_time_filter_fn(states: &SurfaceData) -> Kind {
fn frame_time_filter_fn(states: &SurfaceData) -> Kind { let clock = Clock::<Monotonic>::new();
let clock = Clock::<Monotonic>::new(); const _20_FPS: Duration = Duration::from_nanos(1_000_000_000 / 20);
const _20_FPS: Duration = Duration::from_nanos(1_000_000_000 / 20);
if frame_time_estimation(&clock, states).is_some_and(|dur| dur <= _20_FPS) { if frame_time_estimation(&clock, states).is_some_and(|dur| dur <= _20_FPS) {
Kind::ScanoutCandidate Kind::ScanoutCandidate
} else { } else {
Kind::Unspecified Kind::Unspecified
}
} }
}
frame_time_filter_fn pub const FRAME_TIME_FILTER: KindEvaluation = KindEvaluation::Dynamic(frame_time_filter_fn);
});
impl CompositorHandler for State { impl CompositorHandler for State {
fn compositor_state(&mut self) -> &mut CompositorState { fn compositor_state(&mut self) -> &mut CompositorState {