summaryrefslogtreecommitdiff
path: root/exa
diff options
context:
space:
mode:
authorEric Anholt <anholt@freebsd.org>2005-08-24 23:48:11 +0000
committerEric Anholt <anholt@freebsd.org>2005-08-24 23:48:11 +0000
commit0711502f1847ed461672b9842218b9afa9d349ed (patch)
tree42d2a91a3195969fb290260f922099cb395cfd14 /exa
parent2261710fe0dffd60433e3362ac12adf4db570fe5 (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 'exa')
-rw-r--r--exa/exa.c19
-rw-r--r--exa/exa_accel.c19
-rw-r--r--exa/exa_migration.c19
-rw-r--r--exa/exa_priv.h4
-rw-r--r--exa/exa_unaccel.c5
5 files changed, 49 insertions, 17 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,