xf86-video-intel: 4 commits - configure.ac Makefile.am src/sna/sna_display.c src/sna/sna.h src/sna/sna_present.c

Chris Wilson ickle at kemper.freedesktop.org
Thu Mar 24 11:05:33 UTC 2016


 Makefile.am           |    4 ++
 configure.ac          |    3 --
 src/sna/sna.h         |    2 +
 src/sna/sna_display.c |    2 +
 src/sna/sna_present.c |   73 ++++++++++++++++++++++++++++++++++++++------------
 5 files changed, 63 insertions(+), 21 deletions(-)

New commits:
commit f6316fb6f04a61857995aa9fb757249fe3fbaebd
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Mar 24 11:03:07 2016 +0000

    configure: Remove ACLOCAL_FLAGS passthrough
    
    Still not working right, remove it to keep the standard build working.
    Sorry if you have been relying on ACLOCAL_FLAGS.
    
    Reported-by: Sedat Dilek <sedat.dilek at gmail.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/Makefile.am b/Makefile.am
index c60e8a7..de5fbe1 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -18,7 +18,9 @@
 #  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 #  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-ACLOCAL_AMFLAGS = $(ACLOCAL_FLAGS) -I m4
+#Having problems passing through user flags as libtool complains
+#ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS} -I m4
+ACLOCAL_AMFLAGS = -I m4
 
 SUBDIRS = man libobj xvmc src tools
 
commit e4e469a0ede6974e1f916843f9317244516f7674
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Mar 24 11:01:52 2016 +0000

    configure: Remove test for strlcat
    
    There's no point in testing for functions we don't use and seem to cause
    problems for Clang.
    
    Reported-by: Sedat Dilek <sedat.dilek at gmail.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/configure.ac b/configure.ac
index c18ad96..b121515 100644
--- a/configure.ac
+++ b/configure.ac
@@ -62,9 +62,6 @@ AC_DISABLE_STATIC
 AC_PROG_LIBTOOL
 AC_SYS_LARGEFILE
 
-# Check for common libc routines redefined by os.h
-AC_CHECK_FUNCS([strlcpy strlcat strndup], [], [])
-
 # Platform specific settings
 case $host_os in
   *linux*)
commit 02f535e8f3659f1147c6f2e698bd5d8730dec19b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Mar 24 09:39:06 2016 +0000

    sna/present: Requeue early vblank completions
    
    If the vblank completes too early (e.g. due to a modeset), try
    requeueing it so that it fires at the expected time (and so after the
    modeset).
    
    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 ab07894..93c7f06 100644
--- a/src/sna/sna_present.c
+++ b/src/sna/sna_present.c
@@ -48,6 +48,8 @@ struct sna_present_event {
 };
 
 static void sna_present_unflip(ScreenPtr screen, uint64_t event_id);
+static bool sna_present_queue(struct sna_present_event *info,
+			      uint64_t last_msc);
 
 static inline struct sna_present_event *
 to_present_event(uintptr_t  data)
@@ -111,6 +113,13 @@ static void vblank_complete(struct sna_present_event *info,
 {
 	int n;
 
+	if (msc < info->target_msc) {
+		DBG(("%s: %d too early, now %lld, expected %lld\n",
+		     __FUNCTION__, (long long)msc, (long long)info->target_msc));
+		if (sna_present_queue(info, msc))
+			return;
+	}
+
 	DBG(("%s: %d events complete\n", __FUNCTION__, info->n_event_id));
 	for (n = 0; n < info->n_event_id; n++) {
 		DBG(("%s: pipe=%d tv=%d.%06d msc=%lld (target=%lld), event=%lld complete%s\n", __FUNCTION__,
@@ -228,6 +237,36 @@ static bool sna_fake_vblank(struct sna_present_event *info)
 	return TimerSet(NULL, 0, delay, sna_fake_vblank_handler, info);
 }
 
+static bool sna_present_queue(struct sna_present_event *info,
+			      uint64_t last_msc)
+{
+	union drm_wait_vblank vbl;
+
+	DBG(("%s: target msc=%llu, seq=%u (last_msc=%llu)\n",
+	     __FUNCTION__,
+	     (long long)info->target_msc,
+	     (unsigned)info->target_msc,
+	     (long long)last_msc));
+	assert(info->target_msc - last_msc < 1ull<<32);
+
+	VG_CLEAR(vbl);
+	vbl.request.type = DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT;
+	vbl.request.sequence = info->target_msc;
+	vbl.request.signal = (uintptr_t)MARK_PRESENT(info);
+	if (sna_wait_vblank(info->sna, &vbl, sna_crtc_pipe(info->crtc))) {
+		DBG(("%s: vblank enqueue failed, faking\n", __FUNCTION__));
+		if (!sna_fake_vblank(info))
+			return false;
+	} else {
+		if (info->target_msc - last_msc == 1) {
+			sna_crtc_set_vblank(info->crtc);
+			info->crtc = mark_crtc(info->crtc);
+		}
+	}
+
+	return true;
+}
+
 static RRCrtcPtr
 sna_present_get_crtc(WindowPtr window)
 {
@@ -306,7 +345,6 @@ sna_present_queue_vblank(RRCrtcPtr crtc, uint64_t event_id, uint64_t msc)
 	struct sna *sna = to_sna_from_screen(crtc->pScreen);
 	struct sna_present_event *info, *tmp;
 	const struct ust_msc *swap;
-	union drm_wait_vblank vbl;
 
 	swap = sna_crtc_last_swap(crtc->devPrivate);
 	DBG(("%s(pipe=%d, event=%lld, msc=%lld, last swap=%lld)\n",
@@ -367,22 +405,10 @@ sna_present_queue_vblank(RRCrtcPtr crtc, uint64_t event_id, uint64_t msc)
 	info->n_event_id = 1;
 	list_add_tail(&info->link, &tmp->link);
 
-	VG_CLEAR(vbl);
-	vbl.request.type = DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT;
-	vbl.request.sequence = msc;
-	vbl.request.signal = (uintptr_t)MARK_PRESENT(info);
-	if (sna_wait_vblank(sna, &vbl, sna_crtc_pipe(info->crtc))) {
-		DBG(("%s: vblank enqueue failed, faking\n", __FUNCTION__));
-		if (!sna_fake_vblank(info)) {
-			list_del(&info->link);
-			free(info);
-			return BadAlloc;
-		}
-	} else {
-		if (msc - swap->msc == 1) {
-			sna_crtc_set_vblank(info->crtc);
-			info->crtc = mark_crtc(info->crtc);
-		}
+	if (!sna_present_queue(info, swap->msc)) {
+		list_del(&info->link);
+		free(info);
+		return BadAlloc;
 	}
 
 	return Success;
commit 1b82b7b48d17b4b3401e9d82b0fe86df06c8d451
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Mar 24 10:31:02 2016 +0000

    sna/present: Cancel pending unflips when resizing the screen
    
    Otherwise we try to flip back before we complete the mode change.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index 3c19aa5..755bd8e 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -599,11 +599,13 @@ bool sna_present_open(struct sna *sna, ScreenPtr pScreen);
 void sna_present_update(struct sna *sna);
 void sna_present_close(struct sna *sna, ScreenPtr pScreen);
 void sna_present_vblank_handler(struct drm_event_vblank *event);
+void sna_present_cancel_flip(struct sna *sna);
 #else
 static inline bool sna_present_open(struct sna *sna, ScreenPtr pScreen) { return false; }
 static inline void sna_present_update(struct sna *sna) { }
 static inline void sna_present_close(struct sna *sna, ScreenPtr pScreen) { }
 static inline void sna_present_vblank_handler(struct drm_event_vblank *event) { }
+void sna_present_cancel_flip(struct sna *sna) { }
 #endif
 
 extern bool sna_crtc_set_sprite_rotation(xf86CrtcPtr crtc, uint32_t rotation);
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index ad8690e..6ceb515 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -5346,6 +5346,8 @@ sna_mode_resize(ScrnInfoPtr scrn, int width, int height)
 	assert(sna->mode.shadow_damage == NULL);
 	assert(sna->mode.shadow == NULL);
 
+	/* Cancel a pending [un]flip (as the pixmaps no longer match) */
+	sna_present_cancel_flip(sna);
 	copy_front(sna, sna->front, new_front);
 
 	screen->SetScreenPixmap(new_front);
diff --git a/src/sna/sna_present.c b/src/sna/sna_present.c
index 1624063..ab07894 100644
--- a/src/sna/sna_present.c
+++ b/src/sna/sna_present.c
@@ -790,6 +790,19 @@ reset_mode:
 		goto reset_mode;
 }
 
+void sna_present_cancel_flip(struct sna *sna)
+{
+	if (sna->present.unflip) {
+		const struct ust_msc *swap;
+
+		swap = sna_crtc_last_swap(sna_primary_crtc(sna));
+		present_event_notify(sna->present.unflip,
+				     swap_ust(swap), swap->msc);
+
+		sna->present.unflip = 0;
+	}
+}
+
 static present_screen_info_rec present_info = {
 	.version = PRESENT_SCREEN_INFO_VERSION,
 


More information about the xorg-commit mailing list