diff options
author | Keith Packard <keithp@keithp.com> | 2014-07-20 18:53:52 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2014-07-31 00:03:53 -0700 |
commit | 627bce80894647c681b146a709aad4c390b4374e (patch) | |
tree | f8a0b6c6372d61d1dc940d6ec9bbfe8d42ed5861 | |
parent | bd4198b01f2baf2284e61ea7ebf4600f554800e9 (diff) |
present: Make window MSC offset 0 initially
The MSC offset used by a window is adjusted as the window moves
between screens, and between shown/unshown. The value shouldn't
matter, but it's helpful for debugging to have window MSC values be
the same as the CRTC MSC at first.
This patch introduces a unique CRTC value so that Present can detect
the first time a window is a PresentPixmap destination and set the MSC
offset to zero, rather than using the fake MSC value as the previous
window MSC.
Signed-off-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
-rw-r--r-- | present/present.c | 18 | ||||
-rw-r--r-- | present/present_priv.h | 2 | ||||
-rw-r--r-- | present/present_screen.c | 1 |
3 files changed, 14 insertions, 7 deletions
diff --git a/present/present.c b/present/present.c index 3aea0d7c6..f624e5b7b 100644 --- a/present/present.c +++ b/present/present.c @@ -291,14 +291,18 @@ present_window_to_crtc_msc(WindowPtr window, RRCrtcPtr crtc, uint64_t window_msc if (crtc != window_priv->crtc) { uint64_t old_ust, old_msc; - /* The old CRTC may have been turned off, in which case - * we'll just use whatever previous MSC we'd seen from this CRTC - */ + if (window_priv->crtc == PresentCrtcNeverSet) { + window_priv->msc_offset = 0; + } else { + /* The old CRTC may have been turned off, in which case + * we'll just use whatever previous MSC we'd seen from this CRTC + */ - if (present_get_ust_msc(window->drawable.pScreen, window_priv->crtc, &old_ust, &old_msc) != Success) - old_msc = window_priv->msc; + if (present_get_ust_msc(window->drawable.pScreen, window_priv->crtc, &old_ust, &old_msc) != Success) + old_msc = window_priv->msc; - window_priv->msc_offset += new_msc - old_msc; + window_priv->msc_offset += new_msc - old_msc; + } window_priv->crtc = crtc; } @@ -725,7 +729,7 @@ present_pixmap(WindowPtr window, if (!pixmap) target_crtc = window_priv->crtc; - if (!target_crtc) + if (!target_crtc || target_crtc == PresentCrtcNeverSet) target_crtc = present_get_crtc(window); } diff --git a/present/present_priv.h b/present/present_priv.h index d8569a2b6..f5c1652d1 100644 --- a/present/present_priv.h +++ b/present/present_priv.h @@ -134,6 +134,8 @@ typedef struct present_window_priv { struct xorg_list notifies; } present_window_priv_rec, *present_window_priv_ptr; +#define PresentCrtcNeverSet ((RRCrtcPtr) 1) + extern DevPrivateKeyRec present_window_private_key; static inline present_window_priv_ptr diff --git a/present/present_screen.c b/present/present_screen.c index 25ef6818d..2f91ac7dc 100644 --- a/present/present_screen.c +++ b/present/present_screen.c @@ -45,6 +45,7 @@ present_get_window_priv(WindowPtr window, Bool create) return NULL; xorg_list_init(&window_priv->vblank); xorg_list_init(&window_priv->notifies); + window_priv->crtc = PresentCrtcNeverSet; dixSetPrivate(&window->devPrivates, &present_window_private_key, window_priv); return window_priv; } |