xf86-video-intel: src/sna/sna_display.c src/sna/sna.h src/sna/sna_present.c

Chris Wilson ickle at kemper.freedesktop.org
Wed Apr 6 07:56:42 UTC 2016


 src/sna/sna.h         |    1 +
 src/sna/sna_display.c |   20 ++++++++++++++++++++
 src/sna/sna_present.c |    4 ++++
 3 files changed, 25 insertions(+)

New commits:
commit 9ce7d47a867880b7b43eded7ef8e2d09c5dc21ea
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Apr 6 08:55:14 2016 +0100

    sna/present: Skip the unflip if a no-op
    
    If the screen is already scanning out from the desired framebuffer
    (because we failed when flipping and already restored the mode), skip
    the unflip.
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=94829
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index e5ca906..4c50947 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -467,6 +467,7 @@ extern bool sna_cursors_init(ScreenPtr screen, struct sna *sna);
 typedef void (*sna_flip_handler_t)(struct drm_event_vblank *e,
 				   void *data);
 
+extern bool sna_needs_page_flip(struct sna *sna, struct kgem_bo *bo);
 extern int sna_page_flip(struct sna *sna,
 			 struct kgem_bo *bo,
 			 sna_flip_handler_t handler,
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 8de65dc..6d1d446 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -6396,6 +6396,26 @@ static void sna_mode_restore(struct sna *sna)
 			   "Failed to restore display configuration\n");
 }
 
+bool sna_needs_page_flip(struct sna *sna, struct kgem_bo *bo)
+{
+	xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn);
+	int i;
+
+	for (i = 0; i < sna->mode.num_real_crtc; i++) {
+		struct sna_crtc *crtc = config->crtc[i]->driver_private;
+
+		if (crtc->bo == NULL)
+			continue;
+
+		if (crtc->bo == bo)
+			continue;
+
+		return true;
+	}
+
+	return false;
+}
+
 int
 sna_page_flip(struct sna *sna,
 	      struct kgem_bo *bo,
diff --git a/src/sna/sna_present.c b/src/sna/sna_present.c
index b880aac..5cc34d7 100644
--- a/src/sna/sna_present.c
+++ b/src/sna/sna_present.c
@@ -830,6 +830,10 @@ reset_mode:
 
 	assert(sna_pixmap(screen->GetScreenPixmap(screen))->pinned & PIN_SCANOUT);
 
+	/* Are we unflipping after a failure that left our ScreenP in place? */
+	if (!sna_needs_page_flip(sna, bo))
+		goto notify;
+
 	if (sna->flags & SNA_HAS_ASYNC_FLIP) {
 		DBG(("%s: trying async flip restore\n", __FUNCTION__));
 		if (flip__async(sna, NULL, event_id, 0, bo))


More information about the xorg-commit mailing list