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.
This commit is contained in:
Eric Anholt 2005-08-24 23:48:11 +00:00
parent 2261710fe0
commit 0711502f18
12 changed files with 105 additions and 36 deletions

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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,

View File

@ -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,

View File

@ -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)
{

View File

@ -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,

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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,

View File

@ -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,

View File

@ -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,