xf86-video-intel: 2 commits - src/sna/sna_display.c src/sna/sna_dri2.c src/sna/sna.h

Chris Wilson ickle at kemper.freedesktop.org
Tue Nov 10 01:59:16 PST 2015


 src/sna/sna.h         |    1 +
 src/sna/sna_display.c |    8 ++++++--
 src/sna/sna_dri2.c    |    7 +++----
 3 files changed, 10 insertions(+), 6 deletions(-)

New commits:
commit 64dbcdd4de1fe1941196265d054272d7d93e5d59
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Nov 10 09:56:07 2015 +0000

    sna/dri2: Add a specific recursion indicator for TearFree/DRI2
    
    Avoid conflating the DRI3/Present flag for controlling TearFree by
    adding a separate flag to indicate when we are waiting inside the
    TearFree shadow handler to avoid recursion in DRI2.
    
    Reported-by: Andreas Reis <andreas.reis at gmail.com>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=92873
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index 7592f7b..3c19aa5 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -304,6 +304,7 @@ struct sna {
 		unsigned flip_active;
 		unsigned hidden;
 		bool shadow_enabled;
+		bool shadow_wait;
 		bool dirty;
 
 		int max_crtc_width, max_crtc_height;
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 997150e..a7dcb6b 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1379,6 +1379,7 @@ static bool wait_for_shadow(struct sna *sna,
 	}
 
 	assert(sna->mode.shadow_active);
+	sna->mode.shadow_wait = true;
 	sna->mode.shadow_enabled = false;
 
 	flip_active = sna->mode.flip_active;
@@ -1432,6 +1433,8 @@ static bool wait_for_shadow(struct sna *sna,
 		}
 	}
 	assert(!sna->mode.shadow_enabled);
+	assert(sna->mode.shadow_wait);
+	sna->mode.shadow_wait = false;
 	sna->mode.shadow_enabled = true;
 
 	if (bo->refcnt > 1) {
diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c
index dae1e77..e9d9159 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -2464,8 +2464,7 @@ static void chain_swap(struct sna_dri2_event *chain)
 	switch (chain->type) {
 	case SWAP_COMPLETE:
 		DBG(("%s: emitting chained vsync'ed blit\n", __FUNCTION__));
-		if (chain->sna->mode.shadow &&
-		    !chain->sna->mode.shadow_enabled) {
+		if (chain->sna->mode.shadow && !chain->sna->mode.shadow_wait) {
 			/* recursed from wait_for_shadow(), simply requeue */
 			DBG(("%s -- recursed from wait_for_shadow(), requeuing\n", __FUNCTION__));
 			if (sna_next_vblank(chain))
@@ -2562,7 +2561,7 @@ void sna_dri2_vblank_handler(struct drm_event_vblank *event)
 		/* else fall through to blit */
 	case SWAP:
 		assert(info->signal);
-		if (sna->mode.shadow && !sna->mode.shadow_enabled) {
+		if (sna->mode.shadow && !sna->mode.shadow_wait) {
 			/* recursed from wait_for_shadow(), simply requeue */
 			DBG(("%s -- recursed from wait_for_shadow(), requeuing\n", __FUNCTION__));
 		} else if (can_xchg(info->sna, draw, info->front, info->back)) {
@@ -2600,7 +2599,7 @@ void sna_dri2_vblank_handler(struct drm_event_vblank *event)
 		}
 
 		if (info->pending.bo) {
-			if (sna->mode.shadow && !sna->mode.shadow_enabled) {
+			if (sna->mode.shadow && !sna->mode.shadow_wait) {
 				/* recursed from wait_for_shadow(), simply requeue */
 				DBG(("%s -- recursed from wait_for_shadow(), requeuing\n", __FUNCTION__));
 				if (sna_next_vblank(info))
commit 47f6c5b211c0458f2bf1e05a736e466bd8b64763
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Nov 10 09:50:43 2015 +0000

    sna: Tweak TearFree interaction with Present flipping
    
    When Present takes over we mark the TearFree shadow as disabled. Before
    Present relinquishes its flip sequence, it copies from its pixmap to the
    screen triggering the shadow wait, even though the screeen Pixmap is not
    current bound (and still marked as disabled). Tweak the conditionals to
    properly skip this wait.
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=92873
    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 cb77b6f..997150e 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1334,9 +1334,11 @@ static bool wait_for_shadow(struct sna *sna,
 	assert(priv->move_to_gpu_data == sna);
 	assert(sna->mode.shadow != priv->gpu_bo);
 
-	if (flags == 0 || pixmap != sna->front || !sna->mode.shadow_damage)
+	if (flags == 0 || pixmap != sna->front || !sna->mode.shadow_enabled)
 		goto done;
 
+	assert(sna->mode.shadow_damage);
+
 	if ((flags & MOVE_WRITE) == 0) {
 		if ((flags & __MOVE_SCANOUT) == 0) {
 			struct sna_crtc *crtc;
@@ -1377,7 +1379,6 @@ static bool wait_for_shadow(struct sna *sna,
 	}
 
 	assert(sna->mode.shadow_active);
-	assert(sna->mode.shadow_enabled);
 	sna->mode.shadow_enabled = false;
 
 	flip_active = sna->mode.flip_active;


More information about the xorg-commit mailing list