diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-01-10 20:06:51 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-01-10 20:06:51 +0000 |
commit | 3c26055639f789b211f7db982e65ec0b86b23d4a (patch) | |
tree | f099351e998b291ffe31812c60479f7c347ca649 | |
parent | 7b077a4d3d549cde79d5b876289203788294493c (diff) |
sna: Shrink the partial upload buffers before compacting the batch
So that the relocation entries point into the contiguous surface/batch
and can be trivially fixed up.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | src/sna/kgem.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/sna/kgem.c b/src/sna/kgem.c index 4ecb5074..c30c79be 100644 --- a/src/sna/kgem.c +++ b/src/sna/kgem.c @@ -1159,19 +1159,20 @@ static void kgem_finish_partials(struct kgem *kgem) assert(bo->base.rq == kgem->next_request); if (bo->need_io && bo->used < bo->base.size / 2) { - int size = PAGE_ALIGN(bo->used); struct kgem_bo *shrink; - shrink = search_linear_cache(kgem, size, + shrink = search_linear_cache(kgem, + PAGE_ALIGN(bo->used), CREATE_INACTIVE); if (shrink) { int n; - DBG(("%s: shrnking %d to %d, handle %d to %d\n", + DBG(("%s: used=%d, shrinking %d to %d, handle %d to %d\n", __FUNCTION__, - bo->base.size, shrink->size, + bo->used, bo->base.size, shrink->size, bo->base.handle, shrink->handle)); + assert(bo->used <= shrink->size); gem_write(kgem->fd, shrink->handle, 0, bo->used, bo->mem); @@ -1388,6 +1389,8 @@ void _kgem_submit(struct kgem *kgem) assert(kgem->nexec < ARRAY_SIZE(kgem->exec)); assert(kgem->nfence <= kgem->fence_max); + kgem_finish_partials(kgem); + rq = kgem->next_request; if (kgem->surface != kgem->max_batch_size) size = compact_batch_surface(kgem); @@ -1414,7 +1417,6 @@ void _kgem_submit(struct kgem *kgem) list_add(&rq->bo->request, &rq->buffers); kgem_fixup_self_relocs(kgem, rq->bo); - kgem_finish_partials(kgem); #if DEBUG_BATCH __kgem_batch_debug(kgem, batch_end); |