From 74c7a216f5aa2a0e174bcd44aee631e908f1a60d Mon Sep 17 00:00:00 2001 From: Victoria Brekenfeld Date: Mon, 28 Apr 2025 17:51:30 +0200 Subject: [PATCH] kms: Skip overlay tests on fullscreen --- src/backend/kms/surface/mod.rs | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/backend/kms/surface/mod.rs b/src/backend/kms/surface/mod.rs index 100af290..11c166eb 100644 --- a/src/backend/kms/surface/mod.rs +++ b/src/backend/kms/surface/mod.rs @@ -974,10 +974,8 @@ impl SurfaceThreadState { self.timings.start_render(&self.clock); - let mut vrr = match self.vrr_mode { - AdaptiveSync::Force => true, - _ => false, - }; + let mut additional_frame_flags = FrameFlags::empty(); + let mut remove_frame_flags = FrameFlags::empty(); let has_active_fullscreen = { let shell = self.shell.read().unwrap(); @@ -989,6 +987,16 @@ impl SurfaceThreadState { } }; + if has_active_fullscreen { + // skip overlay plane assign if we have a fullscreen surface to save on tests + remove_frame_flags |= FrameFlags::ALLOW_OVERLAY_PLANE_SCANOUT; + } + + let mut vrr = match self.vrr_mode { + AdaptiveSync::Force => true, + _ => false, + }; + if self.vrr_mode == AdaptiveSync::Enabled { vrr = has_active_fullscreen; } @@ -1008,12 +1016,10 @@ impl SurfaceThreadState { .map_err(|err| { anyhow::format_err!("Failed to accumulate elements for rendering: {:?}", err) })?; - let additional_frame_flags = - if vrr && has_active_fullscreen && !self.timings.past_min_render_time(&self.clock) { - FrameFlags::SKIP_CURSOR_ONLY_UPDATES - } else { - FrameFlags::empty() - }; + + if vrr && has_active_fullscreen && !self.timings.past_min_render_time(&self.clock) { + additional_frame_flags |= FrameFlags::SKIP_CURSOR_ONLY_UPDATES; + }; self.timings.set_vrr(vrr); self.timings.elements_done(&self.clock); @@ -1382,7 +1388,9 @@ impl SurfaceThreadState { &mut renderer, &elements, [0.0, 0.0, 0.0, 0.0], - self.frame_flags.union(additional_frame_flags), + self.frame_flags + .union(additional_frame_flags) + .difference(remove_frame_flags), ) } else { if let Err(err) = compositor.with_compositor(|c| c.use_vrr(vrr)) { @@ -1392,7 +1400,9 @@ impl SurfaceThreadState { &mut renderer, &elements, CLEAR_COLOR, // TODO use a theme neutral color - self.frame_flags.union(additional_frame_flags), + self.frame_flags + .union(additional_frame_flags) + .difference(remove_frame_flags), ) }; self.timings.draw_done(&self.clock);