clutter/frame-clock: Simplify next_presentation_time_us calculation
When more than one refresh interval has passed since last_presentation_time_us. I honestly can't tell if the previous calculation was correct or not, but I'm confident the new one is, and it's simpler. v2: * ASCII art diagram didn't make sense anymore, try to improve (Ivan Molodetskikh) Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3330>
This commit is contained in:
parent
c58312e249
commit
9f8283a95a
@ -511,48 +511,29 @@ calculate_next_update_time_us (ClutterFrameClock *frame_clock,
|
|||||||
*/
|
*/
|
||||||
if (next_presentation_time_us < now_us)
|
if (next_presentation_time_us < now_us)
|
||||||
{
|
{
|
||||||
int64_t presentation_phase_us;
|
|
||||||
int64_t current_phase_us;
|
int64_t current_phase_us;
|
||||||
int64_t current_refresh_interval_start_us;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Let's say we're just past next_presentation_time_us.
|
* Let's say we're just past next_presentation_time_us.
|
||||||
*
|
*
|
||||||
* First, we compute presentation_phase_us. Real presentation times don't
|
* First, we calculate current_phase_us, corresponding to the time since
|
||||||
* have to be exact multiples of refresh_interval_us and
|
* the last integer multiple of the refresh interval passed after the last
|
||||||
* presentation_phase_us represents this difference. Next, we compute
|
* presentation time. Subtracting this phase from now_us and adding a
|
||||||
* current phase and the refresh interval start corresponding to now_us.
|
* refresh interval gets us the next possible presentation time after
|
||||||
* Finally, add presentation_phase_us and a refresh interval to get the
|
* now_us.
|
||||||
* next presentation after now_us.
|
|
||||||
*
|
|
||||||
* last_presentation_time_us
|
|
||||||
* / next_presentation_time_us
|
|
||||||
* / / now_us
|
|
||||||
* / / / new next_presentation_time_us
|
|
||||||
* |--|-------|---o---|-------|--> presentation times
|
|
||||||
* | __|
|
|
||||||
* | |presentation_phase_us
|
|
||||||
* | |
|
|
||||||
* | | now_us - presentation_phase_us
|
|
||||||
* | | /
|
|
||||||
* |-------|---o---|-------|-----> integer multiples of refresh_interval_us
|
|
||||||
* | \__/
|
|
||||||
* | |current_phase_us
|
|
||||||
* | \
|
|
||||||
* | current_refresh_interval_start_us
|
|
||||||
* 0
|
|
||||||
*
|
*
|
||||||
|
* last_presentation_time_us
|
||||||
|
* / next_presentation_time_us
|
||||||
|
* / / now_us
|
||||||
|
* / / / new next_presentation_time_us
|
||||||
|
* |-------|---o---|-------|--> possible presentation times
|
||||||
|
* \_/ \_____/
|
||||||
|
* / \
|
||||||
|
* current_phase_us refresh_interval_us
|
||||||
*/
|
*/
|
||||||
|
|
||||||
presentation_phase_us = last_presentation_time_us % refresh_interval_us;
|
current_phase_us = (now_us - last_presentation_time_us) % refresh_interval_us;
|
||||||
current_phase_us = (now_us - presentation_phase_us) % refresh_interval_us;
|
next_presentation_time_us = now_us - current_phase_us + refresh_interval_us;
|
||||||
current_refresh_interval_start_us =
|
|
||||||
now_us - presentation_phase_us - current_phase_us;
|
|
||||||
|
|
||||||
next_presentation_time_us =
|
|
||||||
current_refresh_interval_start_us +
|
|
||||||
presentation_phase_us +
|
|
||||||
refresh_interval_us;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (frame_clock->is_next_presentation_time_valid)
|
if (frame_clock->is_next_presentation_time_valid)
|
||||||
|
Loading…
Reference in New Issue
Block a user