summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/sna/sna_blt.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 54cf4f82..796aa63e 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -2301,12 +2301,18 @@ static void convert_done(struct sna *sna, const struct sna_composite_op *op)
struct kgem *kgem = &sna->kgem;
assert(kgem->nbatch <= KGEM_BATCH_SIZE(kgem));
- if (kgem->nreloc && __kgem_ring_empty(kgem)) {
+ if (kgem->nreloc && __kgem_ring_empty(kgem))
_kgem_submit(kgem);
- return;
- }
- if (kgem->gen >= 060 && op->src.bo == op->dst.bo && kgem_check_batch(kgem, 3)) {
+ kgem_bo_destroy(kgem, op->src.bo);
+ sna_render_composite_redirect_done(sna, op);
+}
+
+static void gen6_convert_done(struct sna *sna, const struct sna_composite_op *op)
+{
+ struct kgem *kgem = &sna->kgem;
+
+ if (kgem_check_batch(kgem, 3)) {
uint32_t *b = kgem->batch + kgem->nbatch;
b[0] = XY_SETUP_CLIP;
b[1] = b[2] = 0;
@@ -2314,8 +2320,7 @@ static void convert_done(struct sna *sna, const struct sna_composite_op *op)
assert(kgem->nbatch < kgem->surface);
}
- kgem_bo_destroy(kgem, op->src.bo);
- sna_render_composite_redirect_done(sna, op);
+ convert_done(sna, op);
}
bool
@@ -2446,6 +2451,9 @@ sna_blt_composite__convert(struct sna *sna,
}
tmp->done = convert_done;
+ if (sna->kgem.gen >= 060 && tmp->src.bo == tmp->dst.bo)
+ tmp->done = gen6_convert_done;
+
return true;
}