sna: Optimise kgem_clear_dirty() by keeping dirty buffers at the front

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2012-05-13 11:01:35 +01:00
parent b0dfd8223a
commit 12e340c4b8
1 changed files with 9 additions and 3 deletions

View File

@ -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,