xf86-video-intel: 2 commits - src/sna/kgem.c src/sna/sna_accel.c src/sna/sna_display.c src/sna/sna_render.c
Chris Wilson
ickle at kemper.freedesktop.org
Fri Sep 12 08:58:16 PDT 2014
src/sna/kgem.c | 5 ++++-
src/sna/sna_accel.c | 6 +++---
src/sna/sna_display.c | 43 +++++++++++++++++++++++++------------------
src/sna/sna_render.c | 8 ++++----
4 files changed, 36 insertions(+), 26 deletions(-)
New commits:
commit a5a51b55ec07e03c87a9916eca6d023ccaf7d00b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Sep 12 14:31:22 2014 +0100
sna: Mark the CRTC as disabled when hiding the plane
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 f227acb..df6d384 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1479,24 +1479,8 @@ static void sna_crtc_disable_shadow(struct sna *sna, struct sna_crtc *crtc)
}
static void
-sna_crtc_disable(xf86CrtcPtr crtc)
+__sna_crtc_disable(struct sna *sna, struct sna_crtc *sna_crtc)
{
- struct sna *sna = to_sna(crtc->scrn);
- struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
- struct drm_mode_crtc arg;
-
- if (sna_crtc == NULL)
- return;
-
- DBG(("%s: disabling crtc [%d, pipe=%d]\n", __FUNCTION__,
- sna_crtc->id, sna_crtc->pipe));
-
- sna_crtc_force_outputs_off(crtc);
-
- memset(&arg, 0, sizeof(arg));
- arg.crtc_id = sna_crtc->id;
- (void)drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_SETCRTC, &arg);
-
sna_crtc->mode_serial++;
sna_crtc_disable_cursor(sna, sna_crtc);
@@ -1517,10 +1501,32 @@ sna_crtc_disable(xf86CrtcPtr crtc)
sna_crtc->transform = false;
- assert(sna_crtc->dpms_mode == DPMSModeOff);
assert(!sna_crtc->shadow);
}
+static void
+sna_crtc_disable(xf86CrtcPtr crtc)
+{
+ struct sna *sna = to_sna(crtc->scrn);
+ struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
+ struct drm_mode_crtc arg;
+
+ if (sna_crtc == NULL)
+ return;
+
+ DBG(("%s: disabling crtc [%d, pipe=%d]\n", __FUNCTION__,
+ sna_crtc->id, sna_crtc->pipe));
+
+ sna_crtc_force_outputs_off(crtc);
+ assert(sna_crtc->dpms_mode == DPMSModeOff);
+
+ memset(&arg, 0, sizeof(arg));
+ arg.crtc_id = sna_crtc->id;
+ (void)drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_SETCRTC, &arg);
+
+ __sna_crtc_disable(sna, sna_crtc);
+}
+
static void update_flush_interval(struct sna *sna)
{
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn);
@@ -6299,6 +6305,7 @@ sna_crtc_hide_planes(struct sna *sna, struct sna_crtc *crtc)
s.plane_id = crtc->sprite.id;
(void)drmIoctl(sna->kgem.fd, LOCAL_IOCTL_MODE_SETPLANE, &s);
+ __sna_crtc_disable(sna, crtc);
return true;
}
commit 5ce4b344e497364b16a507b39b7637a00daa957a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Sep 12 14:29:12 2014 +0100
sna: Avoid stalls when promoting to the GPU before an operation
In particular, the promotion of an active snooped bo into an uncached
linear GPU bo was being performed on a busy buffer and forcing a stall.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 66adae8..82ff619 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -5179,6 +5179,7 @@ struct kgem_bo *kgem_create_cpu_2d(struct kgem *kgem,
assert(bo->tiling == I915_TILING_NONE);
assert_tiling(kgem, bo);
+ assert(!__kgem_busy(kgem, bo->handle));
if (!gem_set_caching(kgem->fd, bo->handle, SNOOPED)) {
kgem_bo_destroy(kgem, bo);
return NULL;
@@ -6456,6 +6457,7 @@ create_snoopable_buffer(struct kgem *kgem, unsigned alloc)
assert(bo->base.refcnt == 1);
assert(bo->mmapped == MMAPPED_CPU);
assert(bo->need_io == false);
+ assert(!__kgem_busy(kgem, bo->base.handle));
if (!gem_set_caching(kgem->fd, bo->base.handle, SNOOPED))
goto free_caching;
@@ -7214,7 +7216,8 @@ bool kgem_bo_convert_to_gpu(struct kgem *kgem,
struct kgem_bo *bo,
unsigned flags)
{
- DBG(("%s: converting handle=%d from CPU to GPU, flags=%x\n", __FUNCTION__, bo->handle));
+ DBG(("%s: converting handle=%d from CPU to GPU, flags=%x, busy?=%d\n",
+ __FUNCTION__, bo->handle, flags, __kgem_bo_is_busy(kgem, bo)));
assert(bo->tiling == I915_TILING_NONE);
if (kgem->has_llc)
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 33dc5a2..e5382a2 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -3664,7 +3664,7 @@ sna_drawable_use_bo(DrawablePtr drawable, unsigned flags, const BoxRec *box,
}
create_gpu_bo:
- move = MOVE_WRITE | MOVE_READ;
+ move = MOVE_WRITE | MOVE_READ | MOVE_ASYNC_HINT;
if (flags & FORCE_GPU)
move |= __MOVE_FORCE;
if (!sna_pixmap_move_to_gpu(pixmap, move))
@@ -3697,7 +3697,7 @@ create_gpu_bo:
if (flags & IGNORE_DAMAGE)
move = MOVE_WRITE;
else
- move = MOVE_WRITE | MOVE_READ;
+ move = MOVE_WRITE | MOVE_READ | MOVE_ASYNC_HINT;
if (sna_pixmap_move_to_gpu(pixmap, move))
goto use_gpu_bo;
@@ -3905,7 +3905,7 @@ prefer_gpu_bo:
}
}
- if (!sna_pixmap_move_to_gpu(pixmap, MOVE_WRITE | MOVE_READ | __MOVE_FORCE))
+ if (!sna_pixmap_move_to_gpu(pixmap, MOVE_WRITE | MOVE_READ | MOVE_ASYNC_HINT | __MOVE_FORCE))
return NULL;
sna_damage_all(&priv->gpu_damage, pixmap);
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index 0200102..71330c1 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -461,7 +461,7 @@ move_to_gpu(PixmapPtr pixmap, const BoxRec *box, bool blt)
if (DBG_FORCE_UPLOAD < 0) {
if (!sna_pixmap_force_to_gpu(pixmap,
- blt ? MOVE_READ : MOVE_SOURCE_HINT | MOVE_READ))
+ blt ? MOVE_READ : MOVE_SOURCE_HINT | MOVE_ASYNC_HINT | MOVE_READ))
return NULL;
return priv->gpu_bo;
@@ -506,7 +506,7 @@ upload:
return NULL;
} else {
if (!sna_pixmap_move_to_gpu(pixmap,
- __MOVE_FORCE | MOVE_SOURCE_HINT | MOVE_READ))
+ __MOVE_FORCE | MOVE_ASYNC_HINT | MOVE_SOURCE_HINT | MOVE_READ))
return NULL;
}
@@ -774,7 +774,7 @@ static int sna_render_picture_downsample(struct sna *sna,
priv = sna_pixmap(tmp);
assert(priv && priv->gpu_bo);
- if (!sna_pixmap_move_to_gpu(pixmap, MOVE_SOURCE_HINT | MOVE_READ)) {
+ if (!sna_pixmap_move_to_gpu(pixmap, MOVE_ASYNC_HINT | MOVE_SOURCE_HINT | MOVE_READ)) {
fixup:
DBG(("%s: unable to create GPU bo for target or temporary pixmaps\n",
__FUNCTION__));
@@ -1037,7 +1037,7 @@ sna_render_picture_partial(struct sna *sna,
struct sna_pixmap *priv;
priv = sna_pixmap_force_to_gpu(pixmap,
- MOVE_READ | MOVE_SOURCE_HINT);
+ MOVE_READ | MOVE_ASYNC_HINT | MOVE_SOURCE_HINT);
if (priv == NULL)
return false;
More information about the xorg-commit
mailing list