From f00599f971cdde1c5006764f4b6ef08ad4a4eb17 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Wed, 1 Apr 2015 17:45:31 +0100 Subject: [PATCH] sna/dri: Avoid using the BLT for DRI2CopyRegion if no semaphores We expect mesa nowadays to preferentially use the render pipeline for doing its clears and so want to avoid handing it back an active BLT bo if we don't have semaphores (as that would cause a sync). Signed-off-by: Chris Wilson --- src/sna/gen6_render.c | 3 +++ src/sna/gen7_render.c | 4 ++++ src/sna/gen8_render.c | 4 ++++ src/sna/sna_dri2.c | 4 ++-- src/sna/sna_render.h | 1 + 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c index afebab40..7878e7bc 100644 --- a/src/sna/gen6_render.c +++ b/src/sna/gen6_render.c @@ -2684,6 +2684,9 @@ static inline bool prefer_blt_copy(struct sna *sna, if (sna->kgem.ring == KGEM_BLT) return true; + if (flags & COPY_DRI && !sna->kgem.has_semaphores) + return false; + if ((flags & COPY_SMALL || src_bo == dst_bo) && can_switch_to_blt(sna, dst_bo, flags)) return true; diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c index 87807860..39f0d385 100644 --- a/src/sna/gen7_render.c +++ b/src/sna/gen7_render.c @@ -2890,6 +2890,9 @@ prefer_blt_copy(struct sna *sna, untiled_tlb_miss(dst_bo)) return true; + if (flags & COPY_DRI && !sna->kgem.has_semaphores) + return false; + if (force_blt_ring(sna)) return true; @@ -2903,6 +2906,7 @@ prefer_blt_copy(struct sna *sna, return false; if (flags & COPY_LAST && + sna->render_state.gt < 3 && can_switch_to_blt(sna, dst_bo, flags)) return true; diff --git a/src/sna/gen8_render.c b/src/sna/gen8_render.c index 043e268d..ebabb2e5 100644 --- a/src/sna/gen8_render.c +++ b/src/sna/gen8_render.c @@ -2713,6 +2713,9 @@ prefer_blt_copy(struct sna *sna, untiled_tlb_miss(dst_bo)) return true; + if (flags & COPY_DRI && !sna->kgem.has_semaphores) + return false; + if (force_blt_ring(sna)) return true; @@ -2726,6 +2729,7 @@ prefer_blt_copy(struct sna *sna, return false; if (flags & COPY_LAST && + sna->render_state.gt < 3 && can_switch_to_blt(sna, dst_bo, flags)) return true; diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c index 83e652da..7868d037 100644 --- a/src/sna/sna_dri2.c +++ b/src/sna/sna_dri2.c @@ -246,7 +246,7 @@ sna_dri2_get_back(struct sna *sna, if (sna->render.copy_boxes(sna, GXcopy, draw, get_private(back)->bo, 0, 0, draw, bo, 0, 0, - &box, 1, 0)) + &box, 1, COPY_LAST | COPY_DRI)) flags = back->flags; } } @@ -1155,7 +1155,7 @@ __sna_dri2_copy_region(struct sna *sna, DrawablePtr draw, RegionPtr region, boxes[0].x2, boxes[0].y2, n, sx, sy, dx, dy)); - hint = COPY_LAST; + hint = COPY_LAST | COPY_DRI; if (flags & DRI2_SYNC) hint |= COPY_SYNC; if (!sna->render.copy_boxes(sna, GXcopy, diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h index dcc0ddd4..f59a9283 100644 --- a/src/sna/sna_render.h +++ b/src/sna/sna_render.h @@ -287,6 +287,7 @@ struct sna_render { #define COPY_SYNC 0x2 #define COPY_NO_OVERLAP 0x4 #define COPY_SMALL 0x8 +#define COPY_DRI 0x10 bool (*copy)(struct sna *sna, uint8_t alu, PixmapPtr src, struct kgem_bo *src_bo,