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