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