summaryrefslogtreecommitdiff
path: root/present
diff options
context:
space:
mode:
authorRoman Gilg <subdiff@gmail.com>2018-03-13 16:00:41 +0100
committerAdam Jackson <ajax@redhat.com>2018-03-28 14:36:25 -0400
commit6a338b5959ca5a9e5260d71b6a739a5c672d77e7 (patch)
treec79f46533f1491e941d28aa09ba120bbda8566c8 /present
parent84112a1d0b221c00d7d3c23fd5b97687e6e3749a (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>
Diffstat (limited to 'present')
-rw-r--r--present/present.c38
-rw-r--r--present/present_priv.h7
-rw-r--r--present/present_scmd.c34
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