xf86-video-intel: 2 commits - src/sna/sna_accel.c src/sna/sna_display.c src/sna/sna_driver.c src/sna/sna_present.c

Chris Wilson ickle at kemper.freedesktop.org
Sun Jul 26 11:06:15 PDT 2015


 src/sna/sna_accel.c   |    7 +++++--
 src/sna/sna_display.c |    1 +
 src/sna/sna_driver.c  |    3 ++-
 src/sna/sna_present.c |   25 +++++++++++++++++++++----
 4 files changed, 29 insertions(+), 7 deletions(-)

New commits:
commit e5f8f90f686879950766babbe805cd9d2412aca3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Jul 26 19:03:46 2015 +0100

    sna: Stall for outstanding TearFree flips when taking over with Present
    
    When juggling Present and TearFree, we have to hide the extra flips from
    Present as it cannot account for them. Preferrably we want to schedule
    the Present flip following completion of the TearFree flip, but for the
    moment simply block and wait until TearFree completes before starting
    Present.
    
    Reported-by: Andreas Reis <andreas.reis at gmail.com>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91467
    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 327ed21..2de5ddf 100644
--- a/src/sna/sna_present.c
+++ b/src/sna/sna_present.c
@@ -27,6 +27,7 @@
 #include <sys/types.h>
 #include <fcntl.h>
 #include <unistd.h>
+#include <sys/poll.h>
 #include <errno.h>
 #include <xf86drm.h>
 
@@ -697,8 +698,17 @@ sna_present_flip(RRCrtcPtr crtc,
 	assert(!sna->mode.shadow_enabled);
 
 	if (sna->mode.flip_active) {
-		DBG(("%s: flips still pending\n", __FUNCTION__));
-		return FALSE;
+		struct pollfd pfd;
+
+		DBG(("%s: flips still pending, stalling\n", __FUNCTION__));
+		pfd.fd = sna->kgem.fd;
+		pfd.events = POLLIN;
+		do {
+			if (poll(&pfd, 1, -1) != 1)
+				return FALSE;
+
+			sna_mode_wakeup(sna);
+		} while (sna->mode.flip_active);
 	}
 
 	bo = get_flip_bo(pixmap);
@@ -735,6 +745,7 @@ notify:
 		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);
@@ -742,7 +753,6 @@ notify:
 		return;
 	}
 
-	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"));
commit 7e5e006be496f338337ac9baea9be5fa5fbd8fd0
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Jul 26 18:40:41 2015 +0100

    sna: Add a few more DBG and assertions around Present/TearFree interactions
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=91467#c12
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 3150dd5..38ca366 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -17405,11 +17405,14 @@ static bool has_offload_slaves(struct sna *sna)
 
 static bool has_shadow(struct sna *sna)
 {
-	DamagePtr damage = sna->mode.shadow_damage;
+	DamagePtr damage;
 
-	if (damage == NULL)
+	if (!sna->mode.shadow_enabled)
 		return false;
 
+	damage = sna->mode.shadow_damage;
+	assert(damage);
+
 	DBG(("%s: has pending damage? %d, outstanding flips: %d\n",
 	     __FUNCTION__,
 	     RegionNotEmpty(DamageRegion(damage)),
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index d141b4c..9a66069 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1281,6 +1281,7 @@ 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;
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index de2bb77..43d2707 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -681,9 +681,10 @@ cleanup:
 
 static bool has_shadow(struct sna *sna)
 {
-	if (!sna->mode.shadow_damage)
+	if (!sna->mode.shadow_enabled)
 		return false;
 
+	assert(sna->mode.shadow_damage);
 	if (RegionNil(DamageRegion(sna->mode.shadow_damage)))
 		return false;
 
diff --git a/src/sna/sna_present.c b/src/sna/sna_present.c
index 1fb059a..327ed21 100644
--- a/src/sna/sna_present.c
+++ b/src/sna/sna_present.c
@@ -689,8 +689,11 @@ sna_present_flip(RRCrtcPtr crtc,
 
 	assert(sna->present.unflip == 0);
 
-	if (sna->flags & SNA_TEAR_FREE)
+	if (sna->flags & SNA_TEAR_FREE) {
+		DBG(("%s: disabling TearFree (was %s) in favour of Present flips\n",
+		     __FUNCTION__, sna->mode.shadow_enabled ? "enabled" : "disabled"));
 		sna->mode.shadow_enabled = false;
+	}
 	assert(!sna->mode.shadow_enabled);
 
 	if (sna->mode.flip_active) {
@@ -739,8 +742,12 @@ notify:
 		return;
 	}
 
-	if (sna->flags & SNA_TEAR_FREE)
+	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) {


More information about the xorg-commit mailing list