summaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
Diffstat (limited to 'hw')
-rw-r--r--hw/xfree86/exa/exa.c19
-rw-r--r--hw/xfree86/exa/exaPriv.h4
-rw-r--r--hw/xfree86/exa/exa_accel.c19
-rw-r--r--hw/xfree86/exa/exa_migration.c19
-rw-r--r--hw/xfree86/exa/exa_priv.h4
-rw-r--r--hw/xfree86/exa/exa_unaccel.c5
-rw-r--r--hw/xfree86/exa/exaasync.c5
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,