diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c index 17e3db17..880e9f6a 100644 --- a/src/sna/sna_dri.c +++ b/src/sna/sna_dri.c @@ -808,6 +808,22 @@ sna_dri_copy(struct sna *sna, DrawablePtr draw, RegionPtr region, pixman_region_fini(&clip); } +static bool +can_blit(struct sna * sna, + DrawablePtr draw, + DRI2BufferPtr front, + DRI2BufferPtr back) +{ + PixmapPtr pixmap; + + if (draw->type == DRAWABLE_PIXMAP) + return true; + + pixmap = get_drawable_pixmap(draw); + return (get_private(front)->serial == pixmap->drawable.serialNumber && + get_private(back)->serial == pixmap->drawable.serialNumber); +} + static void sna_dri_copy_region(DrawablePtr draw, RegionPtr region, @@ -820,6 +836,9 @@ sna_dri_copy_region(DrawablePtr draw, void (*copy)(struct sna *, DrawablePtr, RegionPtr, struct kgem_bo *, struct kgem_bo *, bool) = sna_dri_copy; + if (!can_blit(sna, draw, dst_buffer, src_buffer)) + return; + if (dst_buffer->attachment == DRI2BufferFrontLeft) { dst = sna_pixmap_get_bo(pixmap); copy = (void *)sna_dri_copy_to_front; @@ -1179,22 +1198,6 @@ can_exchange(struct sna * sna, return true; } -static bool -can_blit(struct sna * sna, - DrawablePtr draw, - DRI2BufferPtr front, - DRI2BufferPtr back) -{ - PixmapPtr pixmap; - - if (draw->type == DRAWABLE_PIXMAP) - return true; - - pixmap = get_drawable_pixmap(draw); - return (get_private(front)->serial == pixmap->drawable.serialNumber && - get_private(back)->serial == pixmap->drawable.serialNumber); -} - inline static uint32_t pipe_select(int pipe) { /* The third pipe was introduced with IvyBridge long after