xf86-video-intel: 2 commits - src/sna/kgem.c
Chris Wilson
ickle at kemper.freedesktop.org
Tue Oct 29 16:42:44 CET 2013
src/sna/kgem.c | 28 +++++++++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
New commits:
commit 72544ad5d11c2563d544ef1f7b25de2b3ab21295
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Tue Oct 29 14:53:02 2013 +0000
sna: Perform an explicit retire for old active upload buffers
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 6e672a1..875dc53 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -5787,6 +5787,7 @@ struct kgem_bo *kgem_create_buffer(struct kgem *kgem,
assert(bo->base.refcnt >= 1);
assert(bo->mmapped);
assert(bo->mmapped == MMAPPED_GTT || kgem->has_llc || bo->base.snoop);
+ assert(bo->base.rq);
if ((bo->write & ~flags) & KGEM_BUFFER_INPLACE && !bo->base.snoop) {
DBG(("%s: skip write %x buffer, need %x\n",
@@ -5802,6 +5803,27 @@ struct kgem_bo *kgem_create_buffer(struct kgem *kgem,
list_move(&bo->base.list, &kgem->batch_buffers);
goto done;
}
+
+ if (size <= bytes(&bo->base) &&
+ !__kgem_busy(kgem, bo->base.handle)) {
+ DBG(("%s: reusing whole buffer? size=%d, total=%d\n",
+ __FUNCTION__, size, bytes(&bo->base)));
+ __kgem_bo_clear_busy(&bo->base);
+
+ switch (bo->mmapped) {
+ case MMAPPED_CPU:
+ kgem_bo_sync__cpu(kgem, &bo->base);
+ break;
+ case MMAPPED_GTT:
+ kgem_bo_sync__gtt(kgem, &bo->base);
+ break;
+ }
+
+ offset = 0;
+ bo->used = size;
+ list_move(&bo->base.list, &kgem->batch_buffers);
+ goto done;
+ }
}
}
#endif
commit d86b36dc41f2e6744a4dea9286634cdf7989fa71
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Tue Oct 29 15:12:17 2013 +0000
sna: Check for retired upload buffers after checking for an idle ring
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 3d661ec..6e672a1 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -2296,6 +2296,7 @@ bool __kgem_ring_is_idle(struct kgem *kgem, int ring)
{
struct kgem_request *rq;
+ assert(ring < ARRAY_SIZE(kgem->requests));
assert(!list_is_empty(&kgem->requests[ring]));
rq = list_last_entry(&kgem->requests[ring],
@@ -2309,7 +2310,9 @@ bool __kgem_ring_is_idle(struct kgem *kgem, int ring)
DBG(("%s: ring=%d idle (handle=%d)\n",
__FUNCTION__, ring, rq->bo->handle));
- kgem_retire__requests_ring(kgem, ring);
+ if (kgem_retire__requests_ring(kgem, ring))
+ kgem_retire__buffers(kgem);
+
assert(list_is_empty(&kgem->requests[ring]));
return true;
}
@@ -2436,6 +2439,7 @@ static void kgem_finish_buffers(struct kgem *kgem)
bo->used = used;
list_move(&bo->base.list,
&kgem->active_buffers);
+ kgem->need_retire = true;
continue;
}
DBG(("%s: discarding mmapped buffer, used=%d, map type=%d\n",
More information about the xorg-commit
mailing list