summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King <rmk@arm.linux.org.uk>2016-01-28 00:28:53 +0000
committerRussell King <rmk@arm.linux.org.uk>2016-01-28 15:27:20 +0000
commitc6b0e2d894eaa3d5c4db6116a4c43caa1b197977 (patch)
treeabe365f37a7188fd743d435e086dc3b49de9b4d0
parent52b37c6528cce5d53f132406e5e3f4054fbb1bfe (diff)
src: dri2: pass drawable to MSC functions
Pass the drawable into the common_drm MSC functions, so we can better calculate a monotonic MSC value for each drawable. Signed-off-by: Russell King <rmk@arm.linux.org.uk>
-rw-r--r--etnaviv/etnaviv_dri2.c10
-rw-r--r--src/common_drm.c16
-rw-r--r--src/common_drm_dri2.c10
-rw-r--r--src/common_drm_helper.h5
-rw-r--r--vivante/vivante_dri2.c10
5 files changed, 39 insertions, 12 deletions
diff --git a/etnaviv/etnaviv_dri2.c b/etnaviv/etnaviv_dri2.c
index 5f52e50..1ecd28b 100644
--- a/etnaviv/etnaviv_dri2.c
+++ b/etnaviv/etnaviv_dri2.c
@@ -225,7 +225,8 @@ static int etnaviv_dri2_ScheduleSwap(ClientPtr client, DrawablePtr draw,
common_dri2_buffer_reference(front);
common_dri2_buffer_reference(back);
- if (common_drm_get_msc(crtc, &cur_ust, &cur_msc) != Success)
+ if (common_drm_get_drawable_msc(crtc, draw, &cur_ust, &cur_msc) !=
+ Success)
goto blit_free;
/* Flips need to be submitted one frame before */
@@ -285,9 +286,10 @@ static int etnaviv_dri2_ScheduleSwap(ClientPtr client, DrawablePtr draw,
tgt_msc -= 1;
}
- ret = common_drm_queue_msc_event(pScrn, crtc, &tgt_msc, __FUNCTION__,
- wait->type != DRI2_FLIP,
- &wait->base);
+ ret = common_drm_queue_drawable_msc_event(pScrn, crtc, draw, &tgt_msc,
+ __FUNCTION__,
+ wait->type != DRI2_FLIP,
+ &wait->base);
if (ret)
goto blit_free;
diff --git a/src/common_drm.c b/src/common_drm.c
index a3c017e..b8c2250 100644
--- a/src/common_drm.c
+++ b/src/common_drm.c
@@ -1440,6 +1440,13 @@ int common_drm_get_msc(xf86CrtcPtr crtc, uint64_t *ust, uint64_t *msc)
}
_X_EXPORT
+int common_drm_get_drawable_msc(xf86CrtcPtr crtc, DrawablePtr pDraw,
+ uint64_t *ust, uint64_t *msc)
+{
+ return common_drm_get_msc(crtc, ust, msc);
+}
+
+_X_EXPORT
int common_drm_queue_msc_event(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
uint64_t *msc, const char *func, Bool nextonmiss,
struct common_drm_event *event)
@@ -1468,6 +1475,15 @@ int common_drm_queue_msc_event(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
}
_X_EXPORT
+int common_drm_queue_drawable_msc_event(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
+ DrawablePtr pDraw, uint64_t *msc, const char *func, Bool nextonmiss,
+ struct common_drm_event *event)
+{
+ return common_drm_queue_msc_event(pScrn, crtc, msc, func, nextonmiss,
+ event);
+}
+
+_X_EXPORT
int common_drm_vblank_wait(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
drmVBlank *vbl, const char *func, Bool nextonmiss)
{
diff --git a/src/common_drm_dri2.c b/src/common_drm_dri2.c
index 4f3063c..dcf019e 100644
--- a/src/common_drm_dri2.c
+++ b/src/common_drm_dri2.c
@@ -278,7 +278,7 @@ int common_dri2_GetMSC(DrawablePtr draw, CARD64 *ust, CARD64 *msc)
return TRUE;
}
- return common_drm_get_msc(crtc, ust, msc) == Success;
+ return common_drm_get_drawable_msc(crtc, draw, ust, msc) == Success;
}
static void common_dri2_waitmsc(struct common_dri2_wait *wait,
@@ -310,7 +310,8 @@ Bool common_dri2_ScheduleWaitMSC(ClientPtr client, DrawablePtr draw,
wait->event_func = common_dri2_waitmsc;
/* Get current count */
- if (common_drm_get_msc(crtc, &cur_ust, &cur_msc) != Success)
+ if (common_drm_get_drawable_msc(crtc, draw, &cur_ust, &cur_msc) !=
+ Success)
goto del_wait;
/*
@@ -338,8 +339,9 @@ Bool common_dri2_ScheduleWaitMSC(ClientPtr client, DrawablePtr draw,
target_msc += divisor;
}
- ret = common_drm_queue_msc_event(pScrn, crtc, &target_msc, __FUNCTION__,
- FALSE, &wait->base);
+ ret = common_drm_queue_drawable_msc_event(pScrn, crtc, draw,
+ &target_msc, __FUNCTION__,
+ FALSE, &wait->base);
if (ret)
goto del_wait;
diff --git a/src/common_drm_helper.h b/src/common_drm_helper.h
index e8704c6..978cb18 100644
--- a/src/common_drm_helper.h
+++ b/src/common_drm_helper.h
@@ -14,10 +14,15 @@ int common_drm_vblank_get(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
drmVBlank *vbl, const char *func);
int common_drm_get_msc(xf86CrtcPtr crtc, uint64_t *ust, uint64_t *msc);
+int common_drm_get_drawable_msc(xf86CrtcPtr crtc, DrawablePtr pDraw,
+ uint64_t *ust, uint64_t *msc);
int common_drm_queue_msc_event(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
uint64_t *msc, const char *func, Bool nextonmiss,
struct common_drm_event *event);
+int common_drm_queue_drawable_msc_event(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
+ DrawablePtr pDraw, uint64_t *msc, const char *func, Bool nextonmiss,
+ struct common_drm_event *event);
int common_drm_vblank_wait(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
drmVBlank *vbl, const char *func, Bool nextonmiss);
diff --git a/vivante/vivante_dri2.c b/vivante/vivante_dri2.c
index 3d26f57..21756a2 100644
--- a/vivante/vivante_dri2.c
+++ b/vivante/vivante_dri2.c
@@ -229,7 +229,8 @@ vivante_dri2_ScheduleSwap(ClientPtr client, DrawablePtr draw,
common_dri2_buffer_reference(front);
common_dri2_buffer_reference(back);
- if (common_drm_get_msc(crtc, &cur_ust, &cur_msc) != Success)
+ if (common_drm_get_drawable_msc(crtc, draw, &cur_ust, &cur_msc) !=
+ Success)
goto blit_free;
/* Flips need to be submitted one frame before */
@@ -289,9 +290,10 @@ vivante_dri2_ScheduleSwap(ClientPtr client, DrawablePtr draw,
tgt_msc -= 1;
}
- ret = common_drm_queue_msc_event(pScrn, crtc, &tgt_msc, __FUNCTION__,
- wait->type != DRI2_FLIP,
- &wait->base);
+ ret = common_drm_queue_drawable_msc_event(pScrn, crtc, draw, &tgt_msc,
+ __FUNCTION__,
+ wait->type != DRI2_FLIP,
+ &wait->base);
if (ret)
goto blit_free;