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

Chris Wilson ickle at kemper.freedesktop.org
Tue Apr 19 07:05:24 UTC 2016


 src/sna/sna_display.c |   17 ++++++++++++++---
 src/sna/sna_present.c |    3 +--
 2 files changed, 15 insertions(+), 5 deletions(-)

New commits:
commit 562ae1f29fd4946c5204bacc9eaa4ee13e809753
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Apr 18 20:56:05 2016 +0100

    sna/present: Postpone recursed vblank during TearFree by 1ms
    
    Avoid postponing until the next vblank to avoid continually recursing
    every TearFree update, and to minimise the presentation delay.
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=94982
    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 2f181a9..f5d1515 100644
--- a/src/sna/sna_present.c
+++ b/src/sna/sna_present.c
@@ -394,8 +394,7 @@ sna_present_vblank_handler(struct drm_event_vblank *event)
 
 	if (info->sna->mode.shadow_wait) {
 		DBG(("%s: recursed from TearFree\n", __FUNCTION__));
-		info->target_msc = msc + 1;
-		if (sna_present_queue(info, msc))
+		if (TimerSet(NULL, 0, 1, sna_fake_vblank_handler, info))
 			return;
 	}
 
commit 680ae24ea9ae050a126d7e31054f04a6182c2aa4
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Apr 17 18:58:09 2016 +0100

    sna: Block SIGIO when we are trying to flip
    
    Temporarily stopping the pointer whilst we try to queue the flip should
    help keep the output latency down.
    
    Reported-by: Rafael Ristovski <rafael.ristovski at gmail.com>
    References: https://bugs.freedesktop.org/show_bug.cgi?id=94980
    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 3b5ae87..80b658a 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -6438,6 +6438,7 @@ sna_page_flip(struct sna *sna,
 	xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn);
 	const int width = sna->scrn->virtualX;
 	const int height = sna->scrn->virtualY;
+	int sigio;
 	int count = 0;
 	int i;
 
@@ -6455,6 +6456,7 @@ sna_page_flip(struct sna *sna,
 
 	kgem_bo_submit(&sna->kgem, bo);
 
+	sigio = sigio_block();
 	for (i = 0; i < sna->mode.num_real_crtc; i++) {
 		struct sna_crtc *crtc = config->crtc[i]->driver_private;
 		struct drm_mode_crtc_page_flip arg;
@@ -6478,7 +6480,7 @@ sna_page_flip(struct sna *sna,
 		arg.fb_id = get_fb(sna, bo, width, height);
 		if (arg.fb_id == 0) {
 			assert(count == 0);
-			return 0;
+			break;
 		}
 
 		fixup = 0;
@@ -6551,7 +6553,7 @@ retry_flip:
 					goto fixup_flip;
 
 				if (count == 0)
-					return 0;
+					break;
 
 				DBG(("%s: throttling on busy flip / waiting for kernel to catch up\n", __FUNCTION__));
 				drmIoctl(sna->kgem.fd, DRM_IOCTL_I915_GEM_THROTTLE, 0);
@@ -6572,7 +6574,8 @@ error:
 				sna_mode_restore(sna);
 
 			sna->flags &= ~(data ? SNA_HAS_FLIP : SNA_HAS_ASYNC_FLIP);
-			return 0;
+			count = 0;
+			break;
 		}
 
 		if (data) {
@@ -6593,6 +6596,7 @@ error:
 next_crtc:
 		count++;
 	}
+	sigio_unblock(sigio);
 
 	DBG(("%s: page flipped %d crtcs\n", __FUNCTION__, count));
 	return count;
@@ -8741,6 +8745,7 @@ void sna_mode_redisplay(struct sna *sna)
 		xf86CrtcPtr crtc = config->crtc[i];
 		struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
 		RegionRec damage;
+		int sigio;
 
 		assert(sna_crtc != NULL);
 		DBG(("%s: crtc[%d] transformed? %d\n",
@@ -8762,6 +8767,7 @@ void sna_mode_redisplay(struct sna *sna)
 		     region_num_rects(&damage),
 		     damage.extents.x1, damage.extents.y1,
 		     damage.extents.x2, damage.extents.y2));
+		sigio = sigio_block();
 		if (!box_empty(&damage.extents)) {
 			if (sna->flags & SNA_TEAR_FREE) {
 				struct drm_mode_crtc_page_flip arg;
@@ -8861,6 +8867,7 @@ disable1:
 			}
 		}
 		RegionUninit(&damage);
+		sigio_unblock(sigio);
 
 		if (sna_crtc->slave_damage)
 			DamageEmpty(sna_crtc->slave_damage);
@@ -8871,6 +8878,7 @@ disable1:
 		struct kgem_bo *old = sna->mode.shadow;
 		struct drm_mode_crtc_page_flip arg;
 		uint32_t fb = 0;
+		int sigio;
 
 		DBG(("%s: flipping TearFree outputs, current scanout handle=%d [active?=%d], new handle=%d [active=%d]\n",
 		     __FUNCTION__, old->handle, old->active_scanout, new->handle, new->active_scanout));
@@ -8883,6 +8891,7 @@ disable1:
 
 		kgem_bo_submit(&sna->kgem, new);
 
+		sigio = sigio_block();
 		for (i = 0; i < sna->mode.num_real_crtc; i++) {
 			struct sna_crtc *crtc = config->crtc[i]->driver_private;
 			struct kgem_bo *flip_bo;
@@ -8930,6 +8939,7 @@ fixup_shadow:
 						}
 					}
 
+					sigio_unblock(sigio);
 					return;
 				}
 
@@ -9021,6 +9031,7 @@ fixup_flip:
 				}
 			}
 		}
+		sigio_unblock(sigio);
 
 		DBG(("%s: flipped %d outputs, shadow active? %d\n",
 		     __FUNCTION__,


More information about the xorg-commit mailing list