summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2014-09-12 14:29:12 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2014-09-12 16:57:16 +0100
commit5ce4b344e497364b16a507b39b7637a00daa957a (patch)
tree189e303b1d8aaf1d1c1687d698c146975d256338
parentfc4bc3cde9e35ecde5b2c8eeecdbbb6ba29f32ae (diff)
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@chris-wilson.co.uk>
-rw-r--r--src/sna/kgem.c5
-rw-r--r--src/sna/sna_accel.c6
-rw-r--r--src/sna/sna_render.c8
3 files changed, 11 insertions, 8 deletions
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 66adae84..82ff619f 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 33dc5a2f..e5382a2a 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 02001025..71330c1f 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;