diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2014-09-12 14:29:12 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2014-09-12 16:57:16 +0100 |
commit | 5ce4b344e497364b16a507b39b7637a00daa957a (patch) | |
tree | 189e303b1d8aaf1d1c1687d698c146975d256338 | |
parent | fc4bc3cde9e35ecde5b2c8eeecdbbb6ba29f32ae (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.c | 5 | ||||
-rw-r--r-- | src/sna/sna_accel.c | 6 | ||||
-rw-r--r-- | src/sna/sna_render.c | 8 |
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; |