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(
surface,
render_element_states,
&feedback.render_feedback,
if is_fullscreen { if is_fullscreen {
feedback feedback
.primary_scanout_feedback .primary_scanout_feedback
.as_ref() .as_ref()
.unwrap_or(&feedback.render_feedback) .unwrap_or(&feedback.render_feedback)
} else { } else {
if frame_time_filter_fn(data) == Kind::ScanoutCandidate {
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,8 +151,7 @@ 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);
@ -163,8 +162,7 @@ pub const FRAME_TIME_FILTER: KindEvaluation = KindEvaluation::Dynamic({
} }
} }
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 {