xf86-video-intel: 2 commits - src/sna/gen6_render.c src/sna/gen7_render.c src/sna/kgem.c src/sna/sna_accel.c src/sna/sna_damage.c src/sna/sna_display.c src/sna/sna_dri.c src/sna/sna_trapezoids.c src/sna/sna_video_overlay.c src/sna/sna_video_textured.c

Chris Wilson ickle at kemper.freedesktop.org
Thu Jun 6 08:43:39 PDT 2013


 src/sna/gen6_render.c        |    2 
 src/sna/gen7_render.c        |    2 
 src/sna/kgem.c               |    2 
 src/sna/sna_accel.c          |    4 -
 src/sna/sna_damage.c         |    5 -
 src/sna/sna_display.c        |    2 
 src/sna/sna_dri.c            |  142 ++++++++++++++++++++-----------------------
 src/sna/sna_trapezoids.c     |    7 +-
 src/sna/sna_video_overlay.c  |    2 
 src/sna/sna_video_textured.c |    2 
 10 files changed, 82 insertions(+), 88 deletions(-)

New commits:
commit 9b52c852aaf42dde3a7f29c065e4d5230eac7a64
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Jun 6 16:40:01 2013 +0100

    sna/dri: Handle fast double flips across mode changes
    
    The tricky nature of the double flip is that there is no SwapComplete
    pending and so we must avoid calling it under such circumstances.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 9c1bda0..038a53b 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -1502,6 +1502,70 @@ done:
 	sna_dri_frame_event_info_free(sna, draw, info);
 }
 
+static bool
+sna_dri_immediate_blit(struct sna *sna,
+		       struct sna_dri_frame_event *info,
+		       bool sync, bool event)
+{
+	DrawablePtr draw = info->draw;
+	bool ret = false;
+
+	if (!can_blit(sna, draw, info->front, info->back))
+		goto out;
+
+	if (sna->flags & SNA_NO_WAIT)
+		sync = false;
+
+	DBG(("%s: emitting immediate blit, throttling client, synced? %d, chained? %d\n",
+	     __FUNCTION__, sync, sna_dri_window_get_chain((WindowPtr)draw) == info));
+
+	if (sync) {
+		info->type = DRI2_SWAP_THROTTLE;
+		if (sna_dri_window_get_chain((WindowPtr)draw) == info) {
+			drmVBlank vbl;
+
+			DBG(("%s: no pending blit, starting chain\n",
+			     __FUNCTION__));
+
+			info->bo = sna_dri_copy_to_front(sna, draw, NULL,
+							 get_private(info->front)->bo,
+							 get_private(info->back)->bo,
+							 true);
+			if (event) {
+				DRI2SwapComplete(info->client, draw, 0, 0, 0,
+						 DRI2_BLIT_COMPLETE,
+						 info->event_complete,
+						 info->event_data);
+
+				VG_CLEAR(vbl);
+				vbl.request.type =
+					DRM_VBLANK_RELATIVE |
+					DRM_VBLANK_NEXTONMISS |
+					DRM_VBLANK_EVENT |
+					pipe_select(info->pipe);
+				vbl.request.sequence = 0;
+				vbl.request.signal = (unsigned long)info;
+				ret = !sna_wait_vblank(sna, &vbl);
+			}
+		}
+	} else {
+		info->bo = sna_dri_copy_to_front(sna, draw, NULL,
+						 get_private(info->front)->bo,
+						 get_private(info->back)->bo,
+						 false);
+out:
+		if (event) {
+			DRI2SwapComplete(info->client, draw, 0, 0, 0,
+					 DRI2_BLIT_COMPLETE,
+					 info->event_complete,
+					 info->event_data);
+		}
+	}
+
+	return ret;
+}
+
+
 static void
 sna_dri_flip_get_back(struct sna *sna, struct sna_dri_frame_event *info)
 {
@@ -1704,22 +1768,8 @@ static void sna_dri_flip_event(struct sna *sna,
 			sna_dri_frame_event_info_free(sna, flip->draw, flip);
 		} else if (!sna_dri_flip_continue(sna, flip)) {
 			DBG(("%s: no longer able to flip\n", __FUNCTION__));
-
-			if (flip->draw) {
-				if (can_blit(sna, flip->draw, flip->front, flip->back)) {
-					flip->bo = sna_dri_copy_to_front(sna, flip->draw, NULL,
-									 get_private(flip->front)->bo,
-									 get_private(flip->back)->bo,
-									 false);
-				}
-				DRI2SwapComplete(flip->client, flip->draw,
-						 0, 0, 0,
-						 DRI2_BLIT_COMPLETE,
-						 flip->client ? flip->event_complete : NULL,
-						 flip->event_data);
-			}
-
-			sna_dri_frame_event_info_free(sna, flip->draw, flip);
+			if (flip->draw || !sna_dri_immediate_blit(sna, flip, true, flip->mode == 1))
+				sna_dri_frame_event_info_free(sna, flip->draw, flip);
 		}
 		break;
 
@@ -1755,59 +1805,6 @@ sna_dri_page_flip_handler(struct sna *sna,
 	sna_dri_flip_event(sna, info);
 }
 
-static void
-sna_dri_immediate_blit(struct sna *sna,
-		       DrawablePtr draw,
-		       struct sna_dri_frame_event *info,
-		       bool sync)
-{
-	if (sna->flags & SNA_NO_WAIT)
-		sync = false;
-
-	DBG(("%s: emitting immediate blit, throttling client, synced? %d, chained? %d\n",
-	     __FUNCTION__, sync, sna_dri_window_get_chain((WindowPtr)draw) == info));
-
-	if (sync) {
-		info->type = DRI2_SWAP_THROTTLE;
-		if (sna_dri_window_get_chain((WindowPtr)draw) == info) {
-			drmVBlank vbl;
-
-			DBG(("%s: no pending blit, starting chain\n",
-			     __FUNCTION__));
-
-			info->bo = sna_dri_copy_to_front(sna, draw, NULL,
-							 get_private(info->front)->bo,
-							 get_private(info->back)->bo,
-							 true);
-			DRI2SwapComplete(info->client, draw, 0, 0, 0,
-					 DRI2_BLIT_COMPLETE,
-					 info->event_complete,
-					 info->event_data);
-
-			VG_CLEAR(vbl);
-			vbl.request.type =
-				DRM_VBLANK_RELATIVE |
-				DRM_VBLANK_NEXTONMISS |
-				DRM_VBLANK_EVENT |
-				pipe_select(info->pipe);
-			vbl.request.sequence = 0;
-			vbl.request.signal = (unsigned long)info;
-			if (sna_wait_vblank(sna, &vbl))
-				sna_dri_frame_event_info_free(sna, draw, info);
-		}
-	} else {
-		info->bo = sna_dri_copy_to_front(sna, draw, NULL,
-						 get_private(info->front)->bo,
-						 get_private(info->back)->bo,
-						 false);
-		DRI2SwapComplete(info->client, draw, 0, 0, 0,
-				 DRI2_BLIT_COMPLETE,
-				 info->event_complete,
-				 info->event_data);
-		sna_dri_frame_event_info_free(sna, draw, info);
-	}
-}
-
 static CARD64
 get_current_msc_for_target(struct sna *sna, CARD64 target_msc, int pipe)
 {
@@ -2105,13 +2102,8 @@ sna_dri_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 
 	if (divisor == 0 && current_msc >= *target_msc - 1) {
 		bool sync = current_msc < *target_msc;
-		if (can_blit(sna, draw, front, back)) {
-			sna_dri_immediate_blit(sna, draw, info, sync);
-		} else {
-			DRI2SwapComplete(client, draw, 0, 0, 0,
-					 DRI2_BLIT_COMPLETE, func, data);
+		if (!sna_dri_immediate_blit(sna, info, sync, true))
 			sna_dri_frame_event_info_free(sna, draw, info);
-		}
 		*target_msc = current_msc + sync;
 		return TRUE;
 	}
commit 0da5cc23b18d4e2473a3b6a571fb49d08bb1dd2d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Jun 6 14:11:50 2013 +0100

    sna: Fix format specifier for mismatching int/long in DBG
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 187cc15..4279538 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -1591,7 +1591,7 @@ gen6_render_video(struct sna *sna,
 	unsigned filter;
 	BoxPtr box;
 
-	DBG(("%s: src=(%d, %d), dst=(%d, %d), %dx[(%d, %d), (%d, %d)...]\n",
+	DBG(("%s: src=(%d, %d), dst=(%d, %d), %ldx[(%d, %d), (%d, %d)...]\n",
 	     __FUNCTION__,
 	     src_width, src_height, dst_width, dst_height,
 	     REGION_NUM_RECTS(dstRegion),
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 3e3da48..901a12c 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -1751,7 +1751,7 @@ gen7_render_video(struct sna *sna,
 	unsigned filter;
 	BoxPtr box;
 
-	DBG(("%s: src=(%d, %d), dst=(%d, %d), %dx[(%d, %d), (%d, %d)...]\n",
+	DBG(("%s: src=(%d, %d), dst=(%d, %d), %ldx[(%d, %d), (%d, %d)...]\n",
 	     __FUNCTION__,
 	     src_width, src_height, dst_width, dst_height,
 	     REGION_NUM_RECTS(dstRegion),
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index fefaa8b..4c5686f 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1775,7 +1775,7 @@ void kgem_bo_undo(struct kgem *kgem, struct kgem_bo *bo)
 	if (kgem->nexec != 1 || bo->exec == NULL)
 		return;
 
-	DBG(("%s: only handle in batch, discarding last operations for handle=%ld\n",
+	DBG(("%s: only handle in batch, discarding last operations for handle=%d\n",
 	     __FUNCTION__, bo->handle));
 
 	assert(bo->exec == &kgem->exec[0]);
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 7e0ca6d..42f1fa2 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1548,7 +1548,7 @@ sna_pixmap_undo_cow(struct sna *sna, struct sna_pixmap *priv, unsigned flags)
 {
 	struct sna_cow *cow = COW(priv->cow);
 
-	DBG(("%s: pixmap=%ld, handle=%ld, flags=%x\n",
+	DBG(("%s: pixmap=%ld, handle=%d, flags=%x\n",
 	     __FUNCTION__,
 	     priv->pixmap->drawable.serialNumber,
 	     priv->gpu_bo->handle,
@@ -1668,7 +1668,7 @@ sna_pixmap_make_cow(struct sna *sna,
 	if (src_priv->gpu_bo->proxy)
 		return false;
 
-	DBG(("%s: make cow src=%ld, dst=%ld, handle=%ld (already cow? src=%d, dst=%d)\n",
+	DBG(("%s: make cow src=%ld, dst=%ld, handle=%d (already cow? src=%d, dst=%d)\n",
 	     __FUNCTION__,
 	     src_priv->pixmap->drawable.serialNumber,
 	     dst_priv->pixmap->drawable.serialNumber,
diff --git a/src/sna/sna_damage.c b/src/sna/sna_damage.c
index ab693af..d1ab903 100644
--- a/src/sna/sna_damage.c
+++ b/src/sna/sna_damage.c
@@ -415,7 +415,7 @@ static void __sna_damage_reduce(struct sna_damage *damage)
 	assert(damage->mode != DAMAGE_ALL);
 	assert(damage->dirty);
 
-	DBG(("    reduce: before region.n=%d\n", REGION_NUM_RECTS(region)));
+	DBG(("    reduce: before region.n=%ld\n", REGION_NUM_RECTS(region)));
 
 	nboxes = damage->embedded_box.size;
 	list_for_each_entry(iter, &damage->embedded_box.list, list)
@@ -529,7 +529,7 @@ done:
 	free_list(&damage->embedded_box.list);
 	reset_embedded_box(damage);
 
-	DBG(("    reduce: after region.n=%d\n", REGION_NUM_RECTS(region)));
+	DBG(("    reduce: after region.n=%ld\n", REGION_NUM_RECTS(region)));
 }
 
 static void damage_union(struct sna_damage *damage, const BoxRec *box)
@@ -1251,7 +1251,6 @@ fastcall struct sna_damage *_sna_damage_subtract_boxes(struct sna_damage *damage
 						       int dx, int dy)
 {
 	char damage_buf[1000];
-	char region_buf[120];
 
 	ErrorF("%s(%s - [(%d,%d), (%d,%d)...x%d])...\n", __FUNCTION__,
 	       _debug_describe_damage(damage_buf, sizeof(damage_buf), damage),
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 99e7311..2a5e1c3 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -3471,7 +3471,7 @@ sna_crtc_redisplay(xf86CrtcPtr crtc, RegionPtr region)
 	struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
 	int16_t tx, ty;
 
-	DBG(("%s: crtc %d [pipe=%d], damage (%d, %d), (%d, %d) x %d\n",
+	DBG(("%s: crtc %d [pipe=%d], damage (%d, %d), (%d, %d) x %ld\n",
 	     __FUNCTION__, sna_crtc->id, sna_crtc->pipe,
 	     region->extents.x1, region->extents.y1,
 	     region->extents.x2, region->extents.y2,
diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index 5af7d41..e07ff2c 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -100,8 +100,11 @@ static void _assert_pixmap_contains_box(PixmapPtr pixmap, BoxPtr box, const char
 
 static void apply_damage(struct sna_composite_op *op, RegionPtr region)
 {
-	DBG(("%s: damage=%p, region=%d\n",
-	     __FUNCTION__, op->damage, REGION_NUM_RECTS(region)));
+	DBG(("%s: damage=%p, region=%ldx[(%d, %d), (%d, %d)]\n",
+	     __FUNCTION__, op->damage,
+	     REGION_NUM_RECTS(region),
+	     region->extents.x1, region->extents.y1,
+	     region->extents.x2, region->extents.y2));
 
 	if (op->damage == NULL)
 		return;
diff --git a/src/sna/sna_video_overlay.c b/src/sna/sna_video_overlay.c
index e3140b3..26b30e2 100644
--- a/src/sna/sna_video_overlay.c
+++ b/src/sna/sna_video_overlay.c
@@ -495,7 +495,7 @@ sna_video_overlay_put_image(ClientPtr client,
 	     drw_x, drw_y, drw_w, drw_h,
 	     format->id, width, height, sync));
 
-	DBG(("%s: region %d:(%d, %d), (%d, %d)\n", __FUNCTION__,
+	DBG(("%s: region %ld:(%d, %d), (%d, %d)\n", __FUNCTION__,
 	     RegionNumRects(&clip),
 	     clip.extents.x1, clip.extents.y1,
 	     clip.extents.x2, clip.extents.y2));
diff --git a/src/sna/sna_video_textured.c b/src/sna/sna_video_textured.c
index 47f4e5d..70f1f6e 100644
--- a/src/sna/sna_video_textured.c
+++ b/src/sna/sna_video_textured.c
@@ -192,7 +192,7 @@ sna_video_textured_put_image(ClientPtr client,
 	     drw_x, drw_y, drw_w, drw_h,
 	     format->id, width, height, sync));
 
-	DBG(("%s: region %d:(%d, %d), (%d, %d)\n", __FUNCTION__,
+	DBG(("%s: region %ld:(%d, %d), (%d, %d)\n", __FUNCTION__,
 	     RegionNumRects(&clip),
 	     clip.extents.x1, clip.extents.y1,
 	     clip.extents.x2, clip.extents.y2));


More information about the xorg-commit mailing list