summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--etnaviv/etnaviv_dri2.c4
-rw-r--r--src/common_drm.c15
-rw-r--r--src/common_drm.h2
-rw-r--r--src/common_drm_dri2.c8
-rw-r--r--vivante/vivante_dri2.c4
5 files changed, 15 insertions, 18 deletions
diff --git a/etnaviv/etnaviv_dri2.c b/etnaviv/etnaviv_dri2.c
index ba88636..82538b1 100644
--- a/etnaviv/etnaviv_dri2.c
+++ b/etnaviv/etnaviv_dri2.c
@@ -211,10 +211,6 @@ static int etnaviv_dri2_ScheduleSwap(ClientPtr client, DrawablePtr draw,
if (!crtc)
goto blit;
- *target_msc &= 0xffffffff;
- divisor &= 0xffffffff;
- remainder &= 0xffffffff;
-
wait = common_dri2_wait_alloc(client, draw, crtc, DRI2_SWAP);
if (!wait)
goto blit;
diff --git a/src/common_drm.c b/src/common_drm.c
index b641a14..1523694 100644
--- a/src/common_drm.c
+++ b/src/common_drm.c
@@ -114,12 +114,23 @@ static void drmmode_ConvertFromKMode(ScrnInfoPtr pScrn,
static uint64_t common_drm_frame_to_msc(xf86CrtcPtr crtc, uint32_t seq)
{
- return seq;
+ struct common_crtc_info *drmc = common_crtc(crtc);
+
+ if (seq < drmc->last_seq) {
+ if ((int32_t)(drmc->last_seq - seq) > 0x40000000)
+ drmc->last_msc += 0x100000000ULL;
+ else
+ seq = drmc->last_seq;
+ }
+ drmc->last_seq = seq;
+ return drmc->last_msc + seq;
}
static uint32_t common_drm_msc_to_frame(xf86CrtcPtr crtc, uint64_t msc)
{
- return msc;
+ struct common_crtc_info *drmc = common_crtc(crtc);
+
+ return msc - drmc->last_msc;
}
static drmModePropertyPtr common_drm_conn_find_property(
diff --git a/src/common_drm.h b/src/common_drm.h
index f187c32..605ab5c 100644
--- a/src/common_drm.h
+++ b/src/common_drm.h
@@ -14,6 +14,8 @@ struct common_crtc_info {
void *cursor_data;
uint32_t cursor_handle;
uint32_t rotate_fb_id;
+ uint32_t last_seq;
+ uint64_t last_msc;
};
#define common_crtc(crtc) \
((struct common_crtc_info *)(crtc)->driver_private)
diff --git a/src/common_drm_dri2.c b/src/common_drm_dri2.c
index 30fbf80..4f3063c 100644
--- a/src/common_drm_dri2.c
+++ b/src/common_drm_dri2.c
@@ -299,14 +299,6 @@ Bool common_dri2_ScheduleWaitMSC(ClientPtr client, DrawablePtr draw,
CARD64 cur_msc, cur_ust;
int ret;
- /*
- * Truncate to match kernel interfaces; means occasional
- * overflow misses, but that's generally not a big deal.
- */
- target_msc &= 0xffffffff;
- divisor &= 0xffffffff;
- remainder &= 0xffffffff;
-
crtc = common_drm_drawable_covering_crtc(draw);
if (!crtc)
goto complete;
diff --git a/vivante/vivante_dri2.c b/vivante/vivante_dri2.c
index 9c64256..3d26f57 100644
--- a/vivante/vivante_dri2.c
+++ b/vivante/vivante_dri2.c
@@ -216,10 +216,6 @@ vivante_dri2_ScheduleSwap(ClientPtr client, DrawablePtr draw,
if (!crtc)
goto blit;
- *target_msc &= 0xffffffff;
- divisor &= 0xffffffff;
- remainder &= 0xffffffff;
-
wait = common_dri2_wait_alloc(client, draw, crtc, DRI2_SWAP);
if (!wait)
goto blit;