diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c index 77671a4c..5a83fd09 100644 --- a/src/sna/gen6_render.c +++ b/src/sna/gen6_render.c @@ -2078,7 +2078,7 @@ gen6_composite_set_target(struct sna *sna, static Bool try_blt(struct sna *sna, - PicturePtr dst, PicturePtr src, + PicturePtr dst, PicturePtr src, int width, int height) { if (sna->kgem.ring == KGEM_BLT) { @@ -2295,6 +2295,19 @@ gen6_render_composite(struct sna *sna, break; } + /* Did we just switch rings to prepare the source? */ + if (sna->kgem.ring == KGEM_BLT && mask == NULL && + sna_blt_composite(sna, op, + src, dst, + src_x, src_y, + dst_x, dst_y, + width, height, tmp)) { + if (tmp->redirect.real_bo) + kgem_bo_destroy(&sna->kgem, tmp->redirect.real_bo); + kgem_bo_destroy(&sna->kgem, tmp->src.bo); + return TRUE; + } + tmp->is_affine = tmp->src.is_affine; tmp->has_component_alpha = FALSE; tmp->need_magic_ca_pass = FALSE; diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c index 20945bcc..aeef0ae4 100644 --- a/src/sna/gen7_render.c +++ b/src/sna/gen7_render.c @@ -2408,6 +2408,19 @@ gen7_render_composite(struct sna *sna, break; } + /* Did we just switch rings to prepare the source? */ + if (sna->kgem.ring == KGEM_BLT && mask == NULL && + sna_blt_composite(sna, op, + src, dst, + src_x, src_y, + dst_x, dst_y, + width, height, tmp)) { + if (tmp->redirect.real_bo) + kgem_bo_destroy(&sna->kgem, tmp->redirect.real_bo); + kgem_bo_destroy(&sna->kgem, tmp->src.bo); + return TRUE; + } + tmp->is_affine = tmp->src.is_affine; tmp->has_component_alpha = FALSE; tmp->need_magic_ca_pass = FALSE;