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

Chris Wilson ickle at kemper.freedesktop.org
Sun Feb 8 01:39:49 PST 2015


 src/sna/sna_display.c |   14 ++++++++++----
 src/sna/sna_present.c |   44 ++++++++++++++++++++++++++++----------------
 2 files changed, 38 insertions(+), 20 deletions(-)

New commits:
commit bc8c1618011e8050ab1b66384a608c8c5a33de28
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Feb 7 15:57:48 2015 +0000

    sna/present: Always store sna backpointer in vblank event closure
    
    This is primarily defensive paranoia in case we see multiple unflip
    requests.
    
    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 55adca4..845267d 100644
--- a/src/sna/sna_present.c
+++ b/src/sna/sna_present.c
@@ -40,6 +40,7 @@ static present_screen_info_rec present_info;
 struct sna_present_event {
 	uint64_t event_id;
 	xf86CrtcPtr crtc;
+	struct sna *sna;
 };
 
 static void sna_present_unflip(ScreenPtr screen, uint64_t event_id);
@@ -157,6 +158,7 @@ sna_present_queue_vblank(RRCrtcPtr crtc, uint64_t event_id, uint64_t msc)
 
 	event->event_id = event_id;
 	event->crtc = crtc->devPrivate;
+	event->sna = sna;
 
 	VG_CLEAR(vbl);
 	vbl.request.type = DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT;
@@ -315,9 +317,8 @@ present_flip_handler(struct drm_event_vblank *event, void *data)
 {
 	struct sna_present_event *info = data;
 	struct ust_msc swap;
-	struct sna *sna;
 
-	DBG(("%s(sequence=%d)\n", __FUNCTION__, event->sequence));
+	DBG(("%s(sequence=%d): event=%lld\n", __FUNCTION__, event->sequence, (long long)info->event_id));
 
 	if (info->crtc == NULL) {
 		swap.tv_sec = event->tv_sec;
@@ -332,12 +333,11 @@ present_flip_handler(struct drm_event_vblank *event, void *data)
 	     (long long)info->event_id));
 	present_event_notify(info->event_id, ust64(swap.tv_sec, swap.tv_usec), swap.msc);
 
-	sna = info->crtc ? to_sna(info->crtc->scrn) : NULL;
-	if (sna && sna->present.unflip) {
-		DBG(("%s: executing queued unflip\n", __FUNCTION__));
-		sna_present_unflip(xf86ScrnToScreen(sna->scrn),
-				   sna->present.unflip);
-		sna->present.unflip = 0;
+	if (info->sna->present.unflip) {
+		DBG(("%s: executing queued unflip (event=%lld)\n", __FUNCTION__, info->sna->present.unflip));
+		sna_present_unflip(xf86ScrnToScreen(info->sna->scrn),
+				   info->sna->present.unflip);
+		info->sna->present.unflip = 0;
 	}
 	free(info);
 }
@@ -362,6 +362,8 @@ page_flip(struct sna *sna,
 
 	event->event_id = event_id;
 	event->crtc = crtc ? crtc->devPrivate : NULL;
+	event->sna = sna;
+
 	if (!sna_page_flip(sna, bo, present_flip_handler, event)) {
 		DBG(("%s: pageflip failed\n", __FUNCTION__));
 		free(event);
@@ -468,7 +470,7 @@ notify:
 	}
 
 	if (sna->mode.flip_active) {
-		DBG(("%s: outstanding flips, queueing unflip\n", __FUNCTION__));
+		DBG(("%s: %d outstanding flips, queueing unflip\n", __FUNCTION__, sna->mode.flip_active));
 		assert(sna->present.unflip == 0);
 		sna->present.unflip = event_id;
 		return;
commit ae05f74e4efc69be05d53b7e419b66c2ff36f4bd
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Feb 7 15:48:50 2015 +0000

    sna/present: Try to use async flips for unflip
    
    If possible, we want the restoration of the Screen Pixmap to be fast,
    and so we want to preferably use the immediate asynchronous flip.
    
    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 96d43c8..55adca4 100644
--- a/src/sna/sna_present.c
+++ b/src/sna/sna_present.c
@@ -283,7 +283,8 @@ static uint64_t gettime_ust64(void)
 }
 
 static Bool
-page_flip__async(RRCrtcPtr crtc,
+page_flip__async(struct sna *sna,
+		 RRCrtcPtr crtc,
 		 uint64_t event_id,
 		 uint64_t target_msc,
 		 struct kgem_bo *bo)
@@ -294,7 +295,7 @@ page_flip__async(RRCrtcPtr crtc,
 	     (long long)event_id,
 	     bo->handle));
 
-	if (!sna_page_flip(to_sna_from_screen(crtc->pScreen), bo, NULL, NULL)) {
+	if (!sna_page_flip(sna, bo, NULL, NULL)) {
 		DBG(("%s: async pageflip failed\n", __FUNCTION__));
 		present_info.capabilities &= ~PresentCapabilityAsync;
 		return FALSE;
@@ -342,12 +343,11 @@ present_flip_handler(struct drm_event_vblank *event, void *data)
 }
 
 static Bool
-page_flip(ScreenPtr screen,
+page_flip(struct sna *sna,
 	  RRCrtcPtr crtc,
 	  uint64_t event_id,
 	  struct kgem_bo *bo)
 {
-	struct sna *sna = to_sna_from_screen(screen);
 	struct sna_present_event *event;
 
 	DBG(("%s(pipe=%d, event=%lld, handle=%d)\n",
@@ -438,9 +438,9 @@ sna_present_flip(RRCrtcPtr crtc,
 	}
 
 	if (sync_flip)
-		return page_flip(crtc->pScreen, crtc, event_id, bo);
+		return page_flip(sna, crtc, event_id, bo);
 	else
-		return page_flip__async(crtc, event_id, target_msc, bo);
+		return page_flip__async(sna, crtc, event_id, target_msc, bo);
 }
 
 static void
@@ -475,11 +475,21 @@ notify:
 	}
 
 	bo = get_flip_bo(screen->GetScreenPixmap(screen));
-	if (bo == NULL || !page_flip(screen, NULL, event_id, bo)) {
+	if (bo == NULL) {
+reset_mode:
 		DBG(("%s: failed, trying to restore original mode\n", __FUNCTION__));
 		xf86SetDesiredModes(sna->scrn);
 		goto notify;
 	}
+
+	if (sna->flags & SNA_HAS_ASYNC_FLIP) {
+		DBG(("%s: trying async flip restore\n", __FUNCTION__));
+		if (page_flip__async(sna, NULL, event_id, 0, bo))
+			return;
+	}
+
+	if (!page_flip(sna, NULL, event_id, bo))
+		goto reset_mode;
 }
 
 static present_screen_info_rec present_info = {
commit 6e3f45e028b36f5c1c95fe4f7e01d41d0887134d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Feb 7 10:21:03 2015 +0000

    sna: Use PrimaryOutput as CRTC source when drawable is offscreen
    
    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 080ee19..31a0ae9 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -357,11 +357,17 @@ const struct ust_msc *sna_crtc_last_swap(xf86CrtcPtr crtc)
 
 xf86CrtcPtr sna_mode_first_crtc(struct sna *sna)
 {
-	xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn);
+	rrScrPrivPtr rr = rrGetScrPriv(xf86ScrnToScreen(sna->scrn));
+	if (rr && rr->primaryOutput) {
+		xf86OutputPtr output = rr->primaryOutput->devPrivate;
+		if (output->crtc && to_sna_crtc(output->crtc))
+			return output->crtc;
+	}
+
 	if (sna->mode.num_real_crtc)
-		return config->crtc[0];
-	else
-		return NULL;
+		return XF86_CRTC_CONFIG_PTR(sna->scrn)->crtc[0];
+
+	return NULL;
 }
 
 #ifndef NDEBUG


More information about the xorg-commit mailing list