exa: avoid doing prepare/done without intervening copies in exaFillRegionTiled

This does a precursor check to make sure the copies are required before
entering the prepare/done code.
This commit is contained in:
Dave Airlie 2008-11-17 10:28:48 +10:00
parent 8f8a9c19ad
commit 08cd361234

View File

@ -1233,36 +1233,53 @@ exaFillRegionTiled (DrawablePtr pDrawable,
*/
if (alu != GXcopy)
ret = TRUE;
else if ((*pExaScr->info->PrepareCopy) (pPixmap, pPixmap, 1, 1, alu,
planemask)) {
for (i = 0; i < nbox; i++)
{
else {
Bool more_copy = FALSE;
for (i = 0; i < nbox; i++) {
int dstX = pBox[i].x1 + tileWidth;
int dstY = pBox[i].y1 + tileHeight;
int width = min(pBox[i].x2 - dstX, tileWidth);
int height = min(pBox[i].y2 - pBox[i].y1, tileHeight);
while (dstX < pBox[i].x2) {
(*pExaScr->info->Copy) (pPixmap, pBox[i].x1, pBox[i].y1,
dstX, pBox[i].y1, width, height);
dstX += width;
width = min(pBox[i].x2 - dstX, width * 2);
}
width = pBox[i].x2 - pBox[i].x1;
height = min(pBox[i].y2 - dstY, tileHeight);
while (dstY < pBox[i].y2) {
(*pExaScr->info->Copy) (pPixmap, pBox[i].x1, pBox[i].y1,
pBox[i].x1, dstY, width, height);
dstY += height;
height = min(pBox[i].y2 - dstY, height * 2);
if ((dstX < pBox[i].x2) || (dstY < pBox[i].y2)) {
more_copy = TRUE;
break;
}
}
(*pExaScr->info->DoneCopy) (pPixmap);
if (more_copy == FALSE)
ret = TRUE;
ret = TRUE;
if (more_copy && (*pExaScr->info->PrepareCopy) (pPixmap, pPixmap,
1, 1, alu, planemask)) {
for (i = 0; i < nbox; i++)
{
int dstX = pBox[i].x1 + tileWidth;
int dstY = pBox[i].y1 + tileHeight;
int width = min(pBox[i].x2 - dstX, tileWidth);
int height = min(pBox[i].y2 - pBox[i].y1, tileHeight);
while (dstX < pBox[i].x2) {
(*pExaScr->info->Copy) (pPixmap, pBox[i].x1, pBox[i].y1,
dstX, pBox[i].y1, width, height);
dstX += width;
width = min(pBox[i].x2 - dstX, width * 2);
}
width = pBox[i].x2 - pBox[i].x1;
height = min(pBox[i].y2 - dstY, tileHeight);
while (dstY < pBox[i].y2) {
(*pExaScr->info->Copy) (pPixmap, pBox[i].x1, pBox[i].y1,
pBox[i].x1, dstY, width, height);
dstY += height;
height = min(pBox[i].y2 - dstY, height * 2);
}
}
(*pExaScr->info->DoneCopy) (pPixmap);
ret = TRUE;
}
}
exaMarkSync(pDrawable->pScreen);