diff options
author | Eric Anholt <anholt@freebsd.org> | 2005-08-24 23:48:11 +0000 |
---|---|---|
committer | Eric Anholt <anholt@freebsd.org> | 2005-08-24 23:48:11 +0000 |
commit | 0711502f1847ed461672b9842218b9afa9d349ed (patch) | |
tree | 42d2a91a3195969fb290260f922099cb395cfd14 /hw | |
parent | 2261710fe0dffd60433e3362ac12adf4db570fe5 (diff) |
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.
Diffstat (limited to 'hw')
-rw-r--r-- | hw/xfree86/exa/exa.c | 19 | ||||
-rw-r--r-- | hw/xfree86/exa/exaPriv.h | 4 | ||||
-rw-r--r-- | hw/xfree86/exa/exa_accel.c | 19 | ||||
-rw-r--r-- | hw/xfree86/exa/exa_migration.c | 19 | ||||
-rw-r--r-- | hw/xfree86/exa/exa_priv.h | 4 | ||||
-rw-r--r-- | hw/xfree86/exa/exa_unaccel.c | 5 | ||||
-rw-r--r-- | hw/xfree86/exa/exaasync.c | 5 |
7 files changed, 56 insertions, 19 deletions
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, |