From 12e340c4b8efa70f3305f489af30461b7c0e5edd Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Sun, 13 May 2012 11:01:35 +0100 Subject: [PATCH] sna: Optimise kgem_clear_dirty() by keeping dirty buffers at the front Signed-off-by: Chris Wilson --- src/sna/kgem.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/sna/kgem.c b/src/sna/kgem.c index 2abf9d5b..04adbf47 100644 --- a/src/sna/kgem.c +++ b/src/sna/kgem.c @@ -974,7 +974,7 @@ void _kgem_add_bo(struct kgem *kgem, struct kgem_bo *bo) bo->exec = kgem_add_handle(kgem, bo); bo->rq = kgem->next_request; - list_move(&bo->request, &kgem->next_request->buffers); + list_move_tail(&bo->request, &kgem->next_request->buffers); /* XXX is it worth working around gcc here? */ kgem->flush |= bo->flush; @@ -3164,7 +3164,8 @@ uint32_t kgem_add_reloc(struct kgem *kgem, delta += bo->delta; assert(bo->handle == bo->proxy->handle); /* need to release the cache upon batch submit */ - list_move(&bo->request, &kgem->next_request->buffers); + list_move_tail(&bo->request, + &kgem->next_request->buffers); bo->exec = &_kgem_dummy_exec; bo = bo->proxy; } @@ -3193,6 +3194,7 @@ uint32_t kgem_add_reloc(struct kgem *kgem, DBG(("%s: marking handle=%d dirty\n", __FUNCTION__, bo->handle)); bo->needs_flush = bo->dirty = true; + list_move(&bo->request, &kgem->next_request->buffers); } delta += bo->presumed_offset; @@ -3582,8 +3584,12 @@ void kgem_clear_dirty(struct kgem *kgem) struct kgem_request *rq = kgem->next_request; struct kgem_bo *bo; - list_for_each_entry(bo, &rq->buffers, request) + list_for_each_entry(bo, &rq->buffers, request) { + if (!bo->dirty) + break; + bo->dirty = false; + } } struct kgem_bo *kgem_create_proxy(struct kgem_bo *target,