kms: Fix VRR check having already missed the deadline
This commit is contained in:
parent
db25cc4b0b
commit
8aaaa12d5c
2 changed files with 27 additions and 13 deletions
|
|
@ -1008,14 +1008,12 @@ impl SurfaceThreadState {
|
||||||
.map_err(|err| {
|
.map_err(|err| {
|
||||||
anyhow::format_err!("Failed to accumulate elements for rendering: {:?}", err)
|
anyhow::format_err!("Failed to accumulate elements for rendering: {:?}", err)
|
||||||
})?;
|
})?;
|
||||||
let additional_frame_flags = if vrr
|
let additional_frame_flags =
|
||||||
&& has_active_fullscreen
|
if vrr && has_active_fullscreen && !self.timings.past_min_render_time(&self.clock) {
|
||||||
&& !self.timings.past_min_presentation_time(&self.clock)
|
FrameFlags::SKIP_CURSOR_ONLY_UPDATES
|
||||||
{
|
} else {
|
||||||
FrameFlags::SKIP_CURSOR_ONLY_UPDATES
|
FrameFlags::empty()
|
||||||
} else {
|
};
|
||||||
FrameFlags::empty()
|
|
||||||
};
|
|
||||||
self.timings.set_vrr(vrr);
|
self.timings.set_vrr(vrr);
|
||||||
self.timings.elements_done(&self.clock);
|
self.timings.elements_done(&self.clock);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -320,9 +320,9 @@ impl Timings {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn past_min_presentation_time(&self, clock: &Clock<Monotonic>) -> bool {
|
pub fn past_min_render_time(&self, clock: &Clock<Monotonic>) -> bool {
|
||||||
let now: Duration = clock.now().into();
|
let now: Duration = clock.now().into();
|
||||||
let Some(refresh_interval_ns) = self.min_refresh_interval_ns else {
|
let Some(min_refresh_interval_ns) = self.min_refresh_interval_ns else {
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
let Some(last_presentation_time): Option<Duration> = self
|
let Some(last_presentation_time): Option<Duration> = self
|
||||||
|
|
@ -333,13 +333,29 @@ impl Timings {
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
let refresh_interval_ns = refresh_interval_ns.get();
|
let min_refresh_interval_ns = min_refresh_interval_ns.get();
|
||||||
if now <= last_presentation_time {
|
if now <= last_presentation_time {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
let next = last_presentation_time + Duration::from_nanos(refresh_interval_ns);
|
const MIN_MARGIN: Duration = Duration::from_millis(3);
|
||||||
now >= next
|
let baseline = if let Some(refresh_interval_ns) = self.refresh_interval_ns {
|
||||||
|
MIN_MARGIN.max(Duration::from_nanos(refresh_interval_ns.get() / 2))
|
||||||
|
} else {
|
||||||
|
MIN_MARGIN
|
||||||
|
};
|
||||||
|
|
||||||
|
let next_presentation_time =
|
||||||
|
last_presentation_time + Duration::from_nanos(min_refresh_interval_ns);
|
||||||
|
let deadline = next_presentation_time.saturating_sub(
|
||||||
|
if let Some(avg_submittime) = self.avg_submittime(SAMPLE_TIME_WINDOW) {
|
||||||
|
avg_submittime
|
||||||
|
} else {
|
||||||
|
baseline
|
||||||
|
} + BASE_SAFETY_MARGIN,
|
||||||
|
);
|
||||||
|
|
||||||
|
now >= deadline
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn next_render_time(&self, clock: &Clock<Monotonic>) -> Duration {
|
pub fn next_render_time(&self, clock: &Clock<Monotonic>) -> Duration {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue