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