diff options
author | Roman Gilg <subdiff@gmail.com> | 2018-03-13 16:00:41 +0100 |
---|---|---|
committer | Adam Jackson <ajax@redhat.com> | 2018-03-28 14:36:25 -0400 |
commit | 6a338b5959ca5a9e5260d71b6a739a5c672d77e7 (patch) | |
tree | c79f46533f1491e941d28aa09ba120bbda8566c8 | |
parent | 84112a1d0b221c00d7d3c23fd5b97687e6e3749a (diff) |
present: Move timings adjustment in common part of flip mode API
To reduce future code duplication refactor timings adjustment out
as a separate function.
Signed-off-by: Roman Gilg <subdiff@gmail.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
-rw-r--r-- | present/present.c | 38 | ||||
-rw-r--r-- | present/present_priv.h | 7 | ||||
-rw-r--r-- | present/present_scmd.c | 34 |
3 files changed, 50 insertions, 29 deletions
diff --git a/present/present.c b/present/present.c index da4549197..8ba864772 100644 --- a/present/present.c +++ b/present/present.c @@ -28,6 +28,17 @@ #include <gcstruct.h> /* + * Returns: + * TRUE if the first MSC value is equal to or after the second one + * FALSE if the first MSC value is before the second one + */ +static Bool +msc_is_equal_or_after(uint64_t test, uint64_t reference) +{ + return (int64_t)(test - reference) >= 0; +} + +/* * Copies the update region from a pixmap to the target drawable */ void @@ -118,6 +129,33 @@ present_can_window_flip(WindowPtr window) return screen_priv->can_window_flip(window); } +void +present_adjust_timings(uint32_t options, + uint64_t *crtc_msc, + uint64_t *target_msc, + uint64_t divisor, + uint64_t remainder) +{ + /* Adjust target_msc to match modulus + */ + if (msc_is_equal_or_after(*crtc_msc, *target_msc)) { + if (divisor != 0) { + *target_msc = *crtc_msc - (*crtc_msc % divisor) + remainder; + if (options & PresentOptionAsync) { + if (msc_is_after(*crtc_msc, *target_msc)) + *target_msc += divisor; + } else { + if (msc_is_equal_or_after(*crtc_msc, *target_msc)) + *target_msc += divisor; + } + } else { + *target_msc = *crtc_msc; + if (!(options & PresentOptionAsync)) + (*target_msc)++; + } + } +} + int present_pixmap(WindowPtr window, PixmapPtr pixmap, diff --git a/present/present_priv.h b/present/present_priv.h index aee3e57d2..261f0e4fa 100644 --- a/present/present_priv.h +++ b/present/present_priv.h @@ -239,6 +239,13 @@ present_set_tree_pixmap(WindowPtr window, PixmapPtr expected, PixmapPtr pixmap); +void +present_adjust_timings(uint32_t options, + uint64_t *crtc_msc, + uint64_t *target_msc, + uint64_t divisor, + uint64_t remainder); + int present_pixmap(WindowPtr window, PixmapPtr pixmap, diff --git a/present/present_scmd.c b/present/present_scmd.c index 7fd27ac9d..71c8fb9cc 100644 --- a/present/present_scmd.c +++ b/present/present_scmd.c @@ -46,17 +46,6 @@ static struct xorg_list present_flip_queue; static void present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc); -/* - * Returns: - * TRUE if the first MSC value is equal to or after the second one - * FALSE if the first MSC value is before the second one - */ -static Bool -msc_is_equal_or_after(uint64_t test, uint64_t reference) -{ - return (int64_t)(test - reference) >= 0; -} - static void present_scmd_create_event_id(present_vblank_ptr vblank) { @@ -714,24 +703,11 @@ present_scmd_pixmap(WindowPtr window, window_priv->msc = crtc_msc; } - /* Adjust target_msc to match modulus - */ - if (msc_is_equal_or_after(crtc_msc, target_msc)) { - if (divisor != 0) { - target_msc = crtc_msc - (crtc_msc % divisor) + remainder; - if (options & PresentOptionAsync) { - if (msc_is_after(crtc_msc, target_msc)) - target_msc += divisor; - } else { - if (msc_is_equal_or_after(crtc_msc, target_msc)) - target_msc += divisor; - } - } else { - target_msc = crtc_msc; - if (!(options & PresentOptionAsync)) - target_msc++; - } - } + present_adjust_timings(options, + &crtc_msc, + &target_msc, + divisor, + remainder); /* * Look for a matching presentation already on the list and |