From 0711502f1847ed461672b9842218b9afa9d349ed Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 24 Aug 2005 23:48:11 +0000 Subject: [PATCH] Bugzilla #4226: Change the pixmap migration strategy for the CopyNtoN case. Now, if either source or dest were in framebuffer, try to get both there, but prefer system memory for both otherwise. Required making exaasync.c go through the try-acceleration path. This significantly improves window resizing under composite, because previously the pattern of creating a new pixmap and copying default contents from the screen caused a fallback every time due to the new destination pixmap being in system memory. --- exa/exa.c | 19 ++++++++++++++----- exa/exa_accel.c | 19 ++++++++++++++----- exa/exa_migration.c | 19 ++++++++++++++----- exa/exa_priv.h | 4 ++++ exa/exa_unaccel.c | 5 +++-- hw/xfree86/exa/exa.c | 19 ++++++++++++++----- hw/xfree86/exa/exaPriv.h | 4 ++++ hw/xfree86/exa/exa_accel.c | 19 ++++++++++++++----- hw/xfree86/exa/exa_migration.c | 19 ++++++++++++++----- hw/xfree86/exa/exa_priv.h | 4 ++++ hw/xfree86/exa/exa_unaccel.c | 5 +++-- hw/xfree86/exa/exaasync.c | 5 +++-- 12 files changed, 105 insertions(+), 36 deletions(-) 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,