summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-01-10 20:06:51 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2012-01-10 20:06:51 +0000
commit3c26055639f789b211f7db982e65ec0b86b23d4a (patch)
treef099351e998b291ffe31812c60479f7c347ca649
parent7b077a4d3d549cde79d5b876289203788294493c (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.c12
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);