xf86-video-intel: 4 commits - src/sna/sna_display.c src/sna/sna_dri2.c src/sna/sna_present.c

Chris Wilson ickle at kemper.freedesktop.org
Wed Jun 7 08:51:52 UTC 2017


 src/sna/sna_display.c |   19 +++++++++++--------
 src/sna/sna_dri2.c    |   12 ++++++++++--
 src/sna/sna_present.c |   15 +++++++++------
 3 files changed, 30 insertions(+), 16 deletions(-)

New commits:
commit 405ca1e74cf531bc7ca111fb7dd4fec6b7a10761
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jun 7 09:21:45 2017 +0100

    sna/present: Move too-late unflip check earlier
    
    Present only unflips after a resize, after it has lost control of the
    Screen. It's unflip request is stale and triggers an assert about the
    graphical glitch - just reorder the assert to ignore the snafu.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_present.c b/src/sna/sna_present.c
index 2796d972..64f4f008 100644
--- a/src/sna/sna_present.c
+++ b/src/sna/sna_present.c
@@ -899,10 +899,11 @@ notify:
 		     swap->tv_sec, swap->tv_usec, (long long)swap->msc,
 		     (long long)event_id));
 		present_event_notify(event_id, swap_ust(swap), swap->msc);
+		assert(!(sna->flags & SNA_TEAR_FREE) ||
+		       sna->mode.shadow_enabled);
 		return;
 	}
 
-	assert(!sna->mode.shadow_enabled);
 	if (sna->mode.flip_active) {
 		DBG(("%s: %d outstanding flips, queueing unflip\n", __FUNCTION__, sna->mode.flip_active));
 		assert(sna->present.unflip == 0);
@@ -910,13 +911,19 @@ notify:
 		return;
 	}
 
+	bo = get_flip_bo(screen->GetScreenPixmap(screen));
+
+	/* Are we unflipping after a failure that left our ScreenP in place? */
+	if (!sna_needs_page_flip(sna, bo))
+		goto notify;
+
+	assert(!sna->mode.shadow_enabled);
 	if (sna->flags & SNA_TEAR_FREE) {
 		DBG(("%s: %s TearFree after Present flips\n",
 		     __FUNCTION__, sna->mode.shadow_damage != NULL ? "enabling" : "disabling"));
 		sna->mode.shadow_enabled = sna->mode.shadow_damage != NULL;
 	}
 
-	bo = get_flip_bo(screen->GetScreenPixmap(screen));
 	if (bo == NULL) {
 reset_mode:
 		DBG(("%s: failed, trying to restore original mode\n", __FUNCTION__));
@@ -924,10 +931,6 @@ reset_mode:
 		goto notify;
 	}
 
-	/* Are we unflipping after a failure that left our ScreenP in place? */
-	if (!sna_needs_page_flip(sna, bo))
-		goto notify;
-
 	assert(sna_pixmap(screen->GetScreenPixmap(screen))->pinned & PIN_SCANOUT);
 
 	if (sna->flags & SNA_HAS_ASYNC_FLIP) {
commit 1fc7841c792008bfbf18643f5fd4e16a29d6041b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jun 7 09:28:26 2017 +0100

    sna: Check active_scanout flag across TearFree exchange
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 201d224f..d1f01218 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1885,6 +1885,7 @@ static bool wait_for_shadow(struct sna *sna,
 	sna_pixmap_unmap(pixmap, priv);
 
 	DBG(("%s: setting front pixmap to handle=%d\n", __FUNCTION__, bo->handle));
+	assert(sna->mode.shadow->active_scanout);
 	sna->mode.shadow->active_scanout--;
 	tmp = priv->gpu_bo;
 	priv->gpu_bo = bo;
@@ -1892,6 +1893,7 @@ static bool wait_for_shadow(struct sna *sna,
 		kgem_bo_destroy(&sna->kgem, sna->mode.shadow);
 	sna->mode.shadow = tmp;
 	sna->mode.shadow->active_scanout++;
+	assert(sna->mode.shadow->active_scanout);
 
 	sna_dri2_pixmap_update_bo(sna, pixmap, bo);
 
@@ -1906,6 +1908,7 @@ done:
 	assert(!sna->mode.shadow_wait);
 	flush_events(sna);
 
+	assert(sna->mode.shadow->active_scanout);
 	return ret;
 }
 
commit 8eed38e03a057bb1a7517b22a3b5557bcc4d3b84
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jun 7 09:20:53 2017 +0100

    sna/dri2: Check active state on front/back before swap
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c
index d89525cc..714595d8 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -3295,7 +3295,7 @@ sna_dri2_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 	CARD64 current_msc;
 	bool immediate;
 
-	DBG(("%s: draw=%lu %dx%d, pixmap=%ld %dx%d, back=%u (refs=%d/%d, flush=%d) , front=%u (refs=%d/%d, flush=%d)\n",
+	DBG(("%s: draw=%lu %dx%d, pixmap=%ld %dx%d, back=%u (refs=%d/%d, flush=%d, active=%d) , front=%u (refs=%d/%d, flush=%d, active=%d)\n",
 	     __FUNCTION__,
 	     (long)draw->id, draw->width, draw->height,
 	     get_drawable_pixmap(draw)->drawable.serialNumber,
@@ -3305,10 +3305,12 @@ sna_dri2_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 	     get_private(back)->refcnt,
 	     get_private(back)->bo->refcnt,
 	     get_private(back)->bo->flush,
+	     get_private(back)->bo->active_scanout,
 	     get_private(front)->bo->handle,
 	     get_private(front)->refcnt,
 	     get_private(front)->bo->refcnt,
-	     get_private(front)->bo->flush));
+	     get_private(front)->bo->flush,
+	     get_private(front)->bo->active_scanout));
 
 	DBG(("%s(target_msc=%llu, divisor=%llu, remainder=%llu)\n",
 	     __FUNCTION__,
@@ -3316,6 +3318,9 @@ sna_dri2_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 	     (long long)divisor,
 	     (long long)remainder));
 
+	assert(front != back);
+	assert(get_private(front) != get_private(back));
+
 	assert(get_private(front)->refcnt);
 	assert(get_private(back)->refcnt);
 
@@ -3323,6 +3328,9 @@ sna_dri2_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 	assert(get_private(front)->bo->refcnt);
 	assert(get_private(back)->bo->refcnt);
 
+	assert(get_private(front)->bo->active_scanout);
+	assert(!get_private(back)->bo->active_scanout);
+
 	if (get_private(front)->pixmap != get_drawable_pixmap(draw)) {
 		DBG(("%s: decoupled DRI2 front pixmap=%ld, actual pixmap=%ld\n",
 		     __FUNCTION__,
commit abbc59087995fd6394003c67d4eb2bd55b74b778
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jun 7 09:28:48 2017 +0100

    sna: Squash compiler warning for mismatched pointers
    
    No harm, just noise about a missing cast.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 795d099b..201d224f 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -3294,9 +3294,9 @@ static int plane_details(struct sna *sna, struct plane *p)
 {
 #define N_STACK_PROPS 32 /* must be a multiple of 2 */
 	struct local_mode_obj_get_properties arg;
-	uint64_t stack_props[N_STACK_PROPS + N_STACK_PROPS/2];
-	uint32_t *props = (uint32_t *)stack_props;
-	uint64_t *values = props + N_STACK_PROPS;
+	uint64_t stack[N_STACK_PROPS + N_STACK_PROPS/2];
+	uint64_t *values = stack;
+	uint32_t *props = (uint32_t *)(values + N_STACK_PROPS);
 	int i, type = DRM_PLANE_TYPE_OVERLAY;
 
 	memset(&arg, 0, sizeof(struct local_mode_obj_get_properties));
@@ -3314,11 +3314,11 @@ static int plane_details(struct sna *sna, struct plane *p)
 	     p->id, LOCAL_MODE_OBJECT_PLANE, arg.count_props));
 
 	if (arg.count_props > N_STACK_PROPS) {
-		props = malloc(2*sizeof(uint64_t)*arg.count_props);
-		if (props == NULL)
+		values = malloc(2*sizeof(uint64_t)*arg.count_props);
+		if (values == NULL)
 			return -1;
 
-		values = (uint64_t *)props + arg.count_props;
+		props = (uint32_t *)(values + arg.count_props);
 
 		arg.props_ptr = (uintptr_t)props;
 		arg.prop_values_ptr = (uintptr_t)values;
@@ -3381,8 +3381,8 @@ static int plane_details(struct sna *sna, struct plane *p)
 	if (!xf86ReturnOptValBool(sna->Options, OPTION_ROTATION, TRUE))
 		p->rotation.supported = RR_Rotate_0;
 
-	if (props != (uint32_t *)stack_props)
-		free(props);
+	if (values != stack)
+		free(values);
 
 	DBG(("%s: plane=%d type=%d\n", __FUNCTION__, p->id, type));
 	return type;


More information about the xorg-commit mailing list