summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-07-08 17:44:58 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2011-07-08 18:59:05 +0100
commit649ebcef0938c7cde4f3172a639d39488454999a (patch)
tree117961de37988f48f13d2fa90fd832cc09b155d5
parent625e37b317e4d237bdc9f80d7ab86b5d2badddc7 (diff)
sna: A buffer only needs a flush if it remains dirty at the end of the batch
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/kgem.c7
-rw-r--r--src/sna/kgem.h3
-rw-r--r--src/sna/sna_dri.c2
3 files changed, 8 insertions, 4 deletions
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index dfac9763..afd2a09f 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -634,6 +634,7 @@ static void kgem_commit(struct kgem *kgem)
bo->src_bound = bo->dst_bound = 0;
bo->presumed_offset = bo->exec->offset;
bo->exec = NULL;
+ bo->needs_flush |= bo->dirty;
bo->dirty = false;
bo->gpu = true;
bo->cpu_read = false;
@@ -1581,7 +1582,7 @@ uint32_t kgem_add_reloc(struct kgem *kgem,
kgem->reloc[index].presumed_offset = bo->presumed_offset;
if (read_write_domain & 0x7fff)
- bo->needs_flush = bo->dirty = true;
+ bo->dirty = true;
delta += bo->presumed_offset;
} else {
@@ -1597,7 +1598,9 @@ uint32_t kgem_add_reloc(struct kgem *kgem,
void *kgem_bo_map(struct kgem *kgem, struct kgem_bo *bo, int prot)
{
- void *ptr = gem_mmap(kgem->fd, bo->handle, bo->size, prot);
+ void *ptr;
+
+ ptr = gem_mmap(kgem->fd, bo->handle, bo->size, prot);
if (ptr == NULL)
return NULL;
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 2ad975ae..9da47405 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -181,10 +181,11 @@ static inline void kgem_bo_submit(struct kgem *kgem, struct kgem_bo *bo)
void __kgem_flush(struct kgem *kgem, struct kgem_bo *bo);
static inline void kgem_bo_flush(struct kgem *kgem, struct kgem_bo *bo)
{
+ kgem_bo_submit(kgem, bo);
+
if (!bo->needs_flush)
return;
- kgem_bo_submit(kgem, bo);
__kgem_flush(kgem, bo);
bo->needs_flush = false;
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 2a8a8651..a6cc9ceb 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -862,7 +862,7 @@ sna_dri_flip(struct sna *sna, DrawablePtr draw, struct sna_dri_frame_event *info
return sna_dri_schedule_flip(sna, draw, info);
}
- DBG(("%s: chaining flip\n", __FUNCION__));
+ DBG(("%s: chaining flip\n", __FUNCTION__));
assert(pending->chain == NULL);
pending->chain = info;
return TRUE;