kms/surface: Only skip cursor updates if the application renders consistently

This commit is contained in:
Victoria Brekenfeld 2025-07-22 17:18:55 +02:00 • committed by Victoria Brekenfeld
parent a2dda33abe
commit 66712009fb

View file

@ -11,7 +11,10 @@ use crate::{
state::SurfaceDmabufFeedback, state::SurfaceDmabufFeedback,
utils::prelude::*, utils::prelude::*,
wayland::{ wayland::{
handlers::screencopy::{submit_buffer, FrameHolder, SessionData}, handlers::{
compositor::recursive_frame_time_estimation,
screencopy::{submit_buffer, FrameHolder, SessionData},
},
protocols::screencopy::{ protocols::screencopy::{
FailureReason, Frame as ScreencopyFrame, SessionRef as ScreencopySessionRef, FailureReason, Frame as ScreencopyFrame, SessionRef as ScreencopySessionRef,
}, },
@ -969,13 +972,24 @@ impl SurfaceThreadState {
let mut additional_frame_flags = FrameFlags::empty(); let mut additional_frame_flags = FrameFlags::empty();
let mut remove_frame_flags = FrameFlags::empty(); let mut remove_frame_flags = FrameFlags::empty();
let has_active_fullscreen = { let (has_active_fullscreen, fullscreen_drives_refresh_rate) = {
let shell = self.shell.read(); let shell = self.shell.read();
let output = self.mirroring.as_ref().unwrap_or(&self.output); let output = self.mirroring.as_ref().unwrap_or(&self.output);
if let Some((_, workspace)) = shell.workspaces.active(output) { if let Some((_, workspace)) = shell.workspaces.active(output) {
workspace.get_fullscreen().is_some() if let Some(fullscreen_surface) = workspace.get_fullscreen() {
const _30_FPS: Duration = Duration::from_nanos(1_000_000_000 / 30);
(
true,
fullscreen_surface.wl_surface().is_some_and(|surface| {
recursive_frame_time_estimation(&self.clock, &*surface)
.is_some_and(|dur| dur <= _30_FPS)
}),
)
} else {
(false, false)
}
} else { } else {
false (false, false)
} }
}; };
@ -1009,7 +1023,8 @@ impl SurfaceThreadState {
anyhow::format_err!("Failed to accumulate elements for rendering: {:?}", err) anyhow::format_err!("Failed to accumulate elements for rendering: {:?}", err)
})?; })?;
if vrr && has_active_fullscreen && !self.timings.past_min_render_time(&self.clock) { if vrr && fullscreen_drives_refresh_rate && !self.timings.past_min_render_time(&self.clock)
{
additional_frame_flags |= FrameFlags::SKIP_CURSOR_ONLY_UPDATES; additional_frame_flags |= FrameFlags::SKIP_CURSOR_ONLY_UPDATES;
}; };
self.timings.set_vrr(vrr); self.timings.set_vrr(vrr);