summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2014-05-31 13:21:04 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2014-06-02 08:32:10 +0100
commit0ee1940a4ffc1901534fa3bf15adb427527a8c20 (patch)
tree3abdc7e6d02c0edb0ac342f216fc9c222549939c
parent2df4466adae7f299eac3f7fd3e5f33ee4b22e53f (diff)
sna/dri2: Mark queued flip MSC as the one after next
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/sna_dri2.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c
index 72f34d6a..a832099c 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -1275,7 +1275,7 @@ sna_dri2_page_flip(struct sna *sna, struct sna_dri2_frame_event *info)
struct kgem_bo *bo = get_private(info->back)->bo;
struct dri_bo tmp;
- DBG(("%s()\n", __FUNCTION__));
+ DBG(("%s(type=%d)\n", __FUNCTION__, info->type));
assert(sna_pixmap_get_buffer(sna->front) == info->front);
assert(get_drawable_pixmap(info->draw)->drawable.height * bo->pitch <= kgem_bo_size(bo));
@@ -1820,7 +1820,8 @@ static void chain_flip(struct sna *sna)
struct sna_dri2_frame_event *chain = sna->dri2.flip_pending;
assert(chain->type == FLIP);
- DBG(("%s: chaining type=%d\n", __FUNCTION__, chain->type));
+ DBG(("%s: chaining type=%d, cancelled?=%d\n",
+ __FUNCTION__, chain->type, chain->draw == NULL));
sna->dri2.flip_pending = NULL;
if (chain->draw == NULL) {
@@ -1830,8 +1831,7 @@ static void chain_flip(struct sna *sna)
assert(chain == sna_dri2_window_get_chain((WindowPtr)chain->draw));
- if (chain->type == FLIP &&
- can_flip(sna, chain->draw, chain->front, chain->back, chain->crtc) &&
+ if (can_flip(sna, chain->draw, chain->front, chain->back, chain->crtc) &&
sna_dri2_page_flip(sna, chain)) {
DBG(("%s: performing chained flip\n", __FUNCTION__));
} else {
@@ -1839,8 +1839,8 @@ static void chain_flip(struct sna *sna)
chain->bo = __sna_dri2_copy_region(sna, chain->draw, NULL,
chain->back, chain->front,
true);
-#if XORG_CAN_TRIPLE_BUFFER
- {
+
+ if (XORG_CAN_TRIPLE_BUFFER) {
union drm_wait_vblank vbl;
VG_CLEAR(vbl);
@@ -1857,7 +1857,7 @@ static void chain_flip(struct sna *sna)
return;
}
}
-#endif
+
DBG(("%s: fake triple buffering (or vblank wait failed), unblocking client\n", __FUNCTION__));
frame_swap_complete(sna, chain, DRI2_BLIT_COMPLETE);
sna_dri2_frame_event_info_free(sna, chain->draw, chain);
@@ -2080,8 +2080,10 @@ sna_dri2_schedule_flip(ClientPtr client, DrawablePtr draw, xf86CrtcPtr crtc,
int type;
info = sna->dri2.flip_pending;
- DBG(("%s: performing immediate swap on pipe %d, pending? %d, mode: %d\n",
- __FUNCTION__, sna_crtc_to_pipe(crtc), info != NULL, info ? info->mode : 0));
+ DBG(("%s: performing immediate swap on pipe %d, pending? %d, mode: %d, continuation? %d\n",
+ __FUNCTION__, sna_crtc_to_pipe(crtc),
+ info != NULL, info ? info->mode : 0,
+ info && info->draw == draw));
if (info && info->draw == draw) {
assert(info->type != FLIP);
@@ -2135,6 +2137,7 @@ sna_dri2_schedule_flip(ClientPtr client, DrawablePtr draw, xf86CrtcPtr crtc,
__FUNCTION__));
info->type = type = FLIP;
sna->dri2.flip_pending = info;
+ current_msc++;
} else {
info->type = type = use_triple_buffer(sna, client, *target_msc == 0);
if (!sna_dri2_page_flip(sna, info)) {