summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2014-06-01 08:44:13 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2014-06-02 08:32:11 +0100
commitc95a4002d1d27937731c59e84254ccb3b1246ccd (patch)
tree252915e3e71106aed959ea66bf6e829a2d03f4fb
parentb1c07c20a371795a8dc4102f83fe542d62d8a4e6 (diff)
sna/dri2: Hide MSC reported as going backwards
OML_sync_control mandates that MSC must be monotonic, so if the kernel reports that they go backwards, lie. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/sna_display.c16
-rw-r--r--src/sna/sna_dri2.c40
2 files changed, 27 insertions, 29 deletions
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 1761be60..2a887176 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -233,11 +233,17 @@ int sna_crtc_is_on(xf86CrtcPtr crtc)
static inline uint64_t msc64(struct sna_crtc *sna_crtc, uint32_t seq)
{
- if ((int32_t)(seq - sna_crtc->last_seq) < -0x40000000) {
- sna_crtc->wrap_seq++;
- DBG(("%s: pipe=%d wrapped was %u, now %u, wraps=%u\n",
- __FUNCTION__, sna_crtc->pipe,
- sna_crtc->last_seq, seq, sna_crtc->wrap_seq));
+ if (seq < sna_crtc->last_seq) {
+ if (sna_crtc->last_seq - seq > 0x40000000) {
+ sna_crtc->wrap_seq++;
+ DBG(("%s: pipe=%d wrapped; was %u, now %u, wraps=%u\n",
+ __FUNCTION__, sna_crtc->pipe,
+ sna_crtc->last_seq, seq, sna_crtc->wrap_seq));
+ } else {
+ ERR(("%s: pipe=%d msc went backwards; was %u, now %u\n",
+ __FUNCTION__, sna_crtc->pipe, sna_crtc->last_seq, seq));
+ seq = sna_crtc->last_seq;
+ }
}
sna_crtc->last_seq = seq;
return (uint64_t)sna_crtc->wrap_seq << 32 | seq;
diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c
index 117f8795..f6d2fea0 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -2410,37 +2410,29 @@ static int
sna_dri2_get_msc(DrawablePtr draw, CARD64 *ust, CARD64 *msc)
{
struct sna *sna = to_sna_from_drawable(draw);
- union drm_wait_vblank vbl;
xf86CrtcPtr crtc = sna_dri2_get_crtc(draw);
+ const struct ust_msc *swap;
DBG(("%s(draw=%ld, pipe=%d)\n", __FUNCTION__, draw->id,
crtc ? sna_crtc_to_pipe(crtc) : -1));
- if (crtc == NULL) {
- const struct ust_msc *swap;
- crtc = sna_mode_first_crtc(sna);
-fail:
- /* Drawable not displayed, make up a *monotonic* value */
- swap = sna_crtc_last_swap(crtc);
- *msc = draw_current_msc(draw, crtc, swap->msc);
- *ust = ust64(swap->tv_sec, swap->tv_usec);
- return TRUE;
- }
+ if (crtc != NULL) {
+ union drm_wait_vblank vbl;
- VG_CLEAR(vbl);
- vbl.request.type = _DRM_VBLANK_RELATIVE;
- vbl.request.sequence = 0;
- if (sna_wait_vblank(sna, &vbl, sna_crtc_to_pipe(crtc)) == 0) {
- *ust = ust64(vbl.reply.tval_sec, vbl.reply.tval_usec);
- *msc = draw_current_msc(draw, crtc, sna_crtc_record_vblank(crtc, &vbl));
- DBG(("%s: msc=%llu, ust=%llu\n", __FUNCTION__,
- (long long)*msc, (long long)*ust));
- } else {
- DBG(("%s: query failed on pipe %d, ret=%d\n",
- __FUNCTION__, sna_crtc_to_pipe(crtc), errno));
- goto fail;
- }
+ VG_CLEAR(vbl);
+ vbl.request.type = _DRM_VBLANK_RELATIVE;
+ vbl.request.sequence = 0;
+ if (sna_wait_vblank(sna, &vbl, sna_crtc_to_pipe(crtc)) == 0)
+ sna_crtc_record_vblank(crtc, &vbl);
+ } else
+ /* Drawable not displayed, make up a *monotonic* value */
+ crtc = sna_mode_first_crtc(sna);
+ swap = sna_crtc_last_swap(crtc);
+ *msc = draw_current_msc(draw, crtc, swap->msc);
+ *ust = ust64(swap->tv_sec, swap->tv_usec);
+ DBG(("%s: msc=%llu, ust=%llu\n", __FUNCTION__,
+ (long long)*msc, (long long)*ust));
return TRUE;
}