diff --git a/exa/exa.c b/exa/exa.c index 77d97dd96..7937f3856 100644 --- a/exa/exa.c +++ b/exa/exa.c @@ -605,12 +605,21 @@ exaCopyNtoN (DrawablePtr pSrcDrawable, int dst_off_x, dst_off_y; STRACE; - /* Migrate pixmaps to same place as destination */ - if (pSrcDrawable->type == DRAWABLE_PIXMAP) { - if (exaDrawableIsOffscreen (pDstDrawable)) + /* If either drawable is already in framebuffer, try to get both of them + * there. Otherwise, be happy with where they are. + */ + if (exaDrawableIsOffscreen(pDstDrawable) || + exaDrawableIsOffscreen(pSrcDrawable)) + { + if (pSrcDrawable->type == DRAWABLE_PIXMAP) exaPixmapUseScreen ((PixmapPtr) pSrcDrawable); - else + if (pDstDrawable->type == DRAWABLE_PIXMAP) + exaPixmapUseScreen ((PixmapPtr) pDstDrawable); + } else { + if (pSrcDrawable->type == DRAWABLE_PIXMAP) exaPixmapUseMemory ((PixmapPtr) pSrcDrawable); + if (pDstDrawable->type == DRAWABLE_PIXMAP) + exaPixmapUseMemory ((PixmapPtr) pDstDrawable); } if ((pSrcPixmap = exaGetOffscreenPixmap (pSrcDrawable, &src_off_x, &src_off_y)) && @@ -645,7 +654,7 @@ exaCopyNtoN (DrawablePtr pSrcDrawable, exaDrawableDirty (pDstDrawable); } -static RegionPtr +RegionPtr exaCopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC, int srcx, int srcy, int width, int height, int dstx, int dsty) { diff --git a/exa/exa_accel.c b/exa/exa_accel.c index 77d97dd96..7937f3856 100644 --- a/exa/exa_accel.c +++ b/exa/exa_accel.c @@ -605,12 +605,21 @@ exaCopyNtoN (DrawablePtr pSrcDrawable, int dst_off_x, dst_off_y; STRACE; - /* Migrate pixmaps to same place as destination */ - if (pSrcDrawable->type == DRAWABLE_PIXMAP) { - if (exaDrawableIsOffscreen (pDstDrawable)) + /* If either drawable is already in framebuffer, try to get both of them + * there. Otherwise, be happy with where they are. + */ + if (exaDrawableIsOffscreen(pDstDrawable) || + exaDrawableIsOffscreen(pSrcDrawable)) + { + if (pSrcDrawable->type == DRAWABLE_PIXMAP) exaPixmapUseScreen ((PixmapPtr) pSrcDrawable); - else + if (pDstDrawable->type == DRAWABLE_PIXMAP) + exaPixmapUseScreen ((PixmapPtr) pDstDrawable); + } else { + if (pSrcDrawable->type == DRAWABLE_PIXMAP) exaPixmapUseMemory ((PixmapPtr) pSrcDrawable); + if (pDstDrawable->type == DRAWABLE_PIXMAP) + exaPixmapUseMemory ((PixmapPtr) pDstDrawable); } if ((pSrcPixmap = exaGetOffscreenPixmap (pSrcDrawable, &src_off_x, &src_off_y)) && @@ -645,7 +654,7 @@ exaCopyNtoN (DrawablePtr pSrcDrawable, exaDrawableDirty (pDstDrawable); } -static RegionPtr +RegionPtr exaCopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC, int srcx, int srcy, int width, int height, int dstx, int dsty) { diff --git a/exa/exa_migration.c b/exa/exa_migration.c index 77d97dd96..7937f3856 100644 --- a/exa/exa_migration.c +++ b/exa/exa_migration.c @@ -605,12 +605,21 @@ exaCopyNtoN (DrawablePtr pSrcDrawable, int dst_off_x, dst_off_y; STRACE; - /* Migrate pixmaps to same place as destination */ - if (pSrcDrawable->type == DRAWABLE_PIXMAP) { - if (exaDrawableIsOffscreen (pDstDrawable)) + /* If either drawable is already in framebuffer, try to get both of them + * there. Otherwise, be happy with where they are. + */ + if (exaDrawableIsOffscreen(pDstDrawable) || + exaDrawableIsOffscreen(pSrcDrawable)) + { + if (pSrcDrawable->type == DRAWABLE_PIXMAP) exaPixmapUseScreen ((PixmapPtr) pSrcDrawable); - else + if (pDstDrawable->type == DRAWABLE_PIXMAP) + exaPixmapUseScreen ((PixmapPtr) pDstDrawable); + } else { + if (pSrcDrawable->type == DRAWABLE_PIXMAP) exaPixmapUseMemory ((PixmapPtr) pSrcDrawable); + if (pDstDrawable->type == DRAWABLE_PIXMAP) + exaPixmapUseMemory ((PixmapPtr) pDstDrawable); } if ((pSrcPixmap = exaGetOffscreenPixmap (pSrcDrawable, &src_off_x, &src_off_y)) && @@ -645,7 +654,7 @@ exaCopyNtoN (DrawablePtr pSrcDrawable, exaDrawableDirty (pDstDrawable); } -static RegionPtr +RegionPtr exaCopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC, int srcx, int srcy, int width, int height, int dstx, int dsty) { diff --git a/exa/exa_priv.h b/exa/exa_priv.h index 724796306..3d0904375 100644 --- a/exa/exa_priv.h +++ b/exa/exa_priv.h @@ -261,6 +261,10 @@ exaGetOffscreenPixmap (DrawablePtr pDrawable, int *xp, int *yp); void exaMoveInPixmap (PixmapPtr pPixmap); +RegionPtr +exaCopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC, + int srcx, int srcy, int width, int height, int dstx, int dsty); + void exaCopyNtoN (DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, diff --git a/exa/exa_unaccel.c b/exa/exa_unaccel.c index 9925f354f..c0927751b 100644 --- a/exa/exa_unaccel.c +++ b/exa/exa_unaccel.c @@ -280,13 +280,14 @@ ExaCheckComposite (CARD8 op, } /* - * Only need to stall for copyarea/copyplane + * Only need to stall for CopyArea/CopyPlane, but we want to have the chance to + * do migration for CopyArea. */ const GCOps exaAsyncPixmapGCOps = { fbFillSpans, fbSetSpans, fbPutImage, - ExaCheckCopyArea, + exaCopyArea, ExaCheckCopyPlane, fbPolyPoint, fbPolyLine, diff --git a/hw/xfree86/exa/exa.c b/hw/xfree86/exa/exa.c index 77d97dd96..7937f3856 100644 --- a/hw/xfree86/exa/exa.c +++ b/hw/xfree86/exa/exa.c @@ -605,12 +605,21 @@ exaCopyNtoN (DrawablePtr pSrcDrawable, int dst_off_x, dst_off_y; STRACE; - /* Migrate pixmaps to same place as destination */ - if (pSrcDrawable->type == DRAWABLE_PIXMAP) { - if (exaDrawableIsOffscreen (pDstDrawable)) + /* If either drawable is already in framebuffer, try to get both of them + * there. Otherwise, be happy with where they are. + */ + if (exaDrawableIsOffscreen(pDstDrawable) || + exaDrawableIsOffscreen(pSrcDrawable)) + { + if (pSrcDrawable->type == DRAWABLE_PIXMAP) exaPixmapUseScreen ((PixmapPtr) pSrcDrawable); - else + if (pDstDrawable->type == DRAWABLE_PIXMAP) + exaPixmapUseScreen ((PixmapPtr) pDstDrawable); + } else { + if (pSrcDrawable->type == DRAWABLE_PIXMAP) exaPixmapUseMemory ((PixmapPtr) pSrcDrawable); + if (pDstDrawable->type == DRAWABLE_PIXMAP) + exaPixmapUseMemory ((PixmapPtr) pDstDrawable); } if ((pSrcPixmap = exaGetOffscreenPixmap (pSrcDrawable, &src_off_x, &src_off_y)) && @@ -645,7 +654,7 @@ exaCopyNtoN (DrawablePtr pSrcDrawable, exaDrawableDirty (pDstDrawable); } -static RegionPtr +RegionPtr exaCopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC, int srcx, int srcy, int width, int height, int dstx, int dsty) { diff --git a/hw/xfree86/exa/exaPriv.h b/hw/xfree86/exa/exaPriv.h index 724796306..3d0904375 100644 --- a/hw/xfree86/exa/exaPriv.h +++ b/hw/xfree86/exa/exaPriv.h @@ -261,6 +261,10 @@ exaGetOffscreenPixmap (DrawablePtr pDrawable, int *xp, int *yp); void exaMoveInPixmap (PixmapPtr pPixmap); +RegionPtr +exaCopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC, + int srcx, int srcy, int width, int height, int dstx, int dsty); + void exaCopyNtoN (DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, diff --git a/hw/xfree86/exa/exa_accel.c b/hw/xfree86/exa/exa_accel.c index 77d97dd96..7937f3856 100644 --- a/hw/xfree86/exa/exa_accel.c +++ b/hw/xfree86/exa/exa_accel.c @@ -605,12 +605,21 @@ exaCopyNtoN (DrawablePtr pSrcDrawable, int dst_off_x, dst_off_y; STRACE; - /* Migrate pixmaps to same place as destination */ - if (pSrcDrawable->type == DRAWABLE_PIXMAP) { - if (exaDrawableIsOffscreen (pDstDrawable)) + /* If either drawable is already in framebuffer, try to get both of them + * there. Otherwise, be happy with where they are. + */ + if (exaDrawableIsOffscreen(pDstDrawable) || + exaDrawableIsOffscreen(pSrcDrawable)) + { + if (pSrcDrawable->type == DRAWABLE_PIXMAP) exaPixmapUseScreen ((PixmapPtr) pSrcDrawable); - else + if (pDstDrawable->type == DRAWABLE_PIXMAP) + exaPixmapUseScreen ((PixmapPtr) pDstDrawable); + } else { + if (pSrcDrawable->type == DRAWABLE_PIXMAP) exaPixmapUseMemory ((PixmapPtr) pSrcDrawable); + if (pDstDrawable->type == DRAWABLE_PIXMAP) + exaPixmapUseMemory ((PixmapPtr) pDstDrawable); } if ((pSrcPixmap = exaGetOffscreenPixmap (pSrcDrawable, &src_off_x, &src_off_y)) && @@ -645,7 +654,7 @@ exaCopyNtoN (DrawablePtr pSrcDrawable, exaDrawableDirty (pDstDrawable); } -static RegionPtr +RegionPtr exaCopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC, int srcx, int srcy, int width, int height, int dstx, int dsty) { diff --git a/hw/xfree86/exa/exa_migration.c b/hw/xfree86/exa/exa_migration.c index 77d97dd96..7937f3856 100644 --- a/hw/xfree86/exa/exa_migration.c +++ b/hw/xfree86/exa/exa_migration.c @@ -605,12 +605,21 @@ exaCopyNtoN (DrawablePtr pSrcDrawable, int dst_off_x, dst_off_y; STRACE; - /* Migrate pixmaps to same place as destination */ - if (pSrcDrawable->type == DRAWABLE_PIXMAP) { - if (exaDrawableIsOffscreen (pDstDrawable)) + /* If either drawable is already in framebuffer, try to get both of them + * there. Otherwise, be happy with where they are. + */ + if (exaDrawableIsOffscreen(pDstDrawable) || + exaDrawableIsOffscreen(pSrcDrawable)) + { + if (pSrcDrawable->type == DRAWABLE_PIXMAP) exaPixmapUseScreen ((PixmapPtr) pSrcDrawable); - else + if (pDstDrawable->type == DRAWABLE_PIXMAP) + exaPixmapUseScreen ((PixmapPtr) pDstDrawable); + } else { + if (pSrcDrawable->type == DRAWABLE_PIXMAP) exaPixmapUseMemory ((PixmapPtr) pSrcDrawable); + if (pDstDrawable->type == DRAWABLE_PIXMAP) + exaPixmapUseMemory ((PixmapPtr) pDstDrawable); } if ((pSrcPixmap = exaGetOffscreenPixmap (pSrcDrawable, &src_off_x, &src_off_y)) && @@ -645,7 +654,7 @@ exaCopyNtoN (DrawablePtr pSrcDrawable, exaDrawableDirty (pDstDrawable); } -static RegionPtr +RegionPtr exaCopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC, int srcx, int srcy, int width, int height, int dstx, int dsty) { diff --git a/hw/xfree86/exa/exa_priv.h b/hw/xfree86/exa/exa_priv.h index 724796306..3d0904375 100644 --- a/hw/xfree86/exa/exa_priv.h +++ b/hw/xfree86/exa/exa_priv.h @@ -261,6 +261,10 @@ exaGetOffscreenPixmap (DrawablePtr pDrawable, int *xp, int *yp); void exaMoveInPixmap (PixmapPtr pPixmap); +RegionPtr +exaCopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC, + int srcx, int srcy, int width, int height, int dstx, int dsty); + void exaCopyNtoN (DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, diff --git a/hw/xfree86/exa/exa_unaccel.c b/hw/xfree86/exa/exa_unaccel.c index 9925f354f..c0927751b 100644 --- a/hw/xfree86/exa/exa_unaccel.c +++ b/hw/xfree86/exa/exa_unaccel.c @@ -280,13 +280,14 @@ ExaCheckComposite (CARD8 op, } /* - * Only need to stall for copyarea/copyplane + * Only need to stall for CopyArea/CopyPlane, but we want to have the chance to + * do migration for CopyArea. */ const GCOps exaAsyncPixmapGCOps = { fbFillSpans, fbSetSpans, fbPutImage, - ExaCheckCopyArea, + exaCopyArea, ExaCheckCopyPlane, fbPolyPoint, fbPolyLine, diff --git a/hw/xfree86/exa/exaasync.c b/hw/xfree86/exa/exaasync.c index 9925f354f..c0927751b 100644 --- a/hw/xfree86/exa/exaasync.c +++ b/hw/xfree86/exa/exaasync.c @@ -280,13 +280,14 @@ ExaCheckComposite (CARD8 op, } /* - * Only need to stall for copyarea/copyplane + * Only need to stall for CopyArea/CopyPlane, but we want to have the chance to + * do migration for CopyArea. */ const GCOps exaAsyncPixmapGCOps = { fbFillSpans, fbSetSpans, fbPutImage, - ExaCheckCopyArea, + exaCopyArea, ExaCheckCopyPlane, fbPolyPoint, fbPolyLine,