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:
parent
8f8a9c19ad
commit
08cd361234
|
@ -1233,36 +1233,53 @@ exaFillRegionTiled (DrawablePtr pDrawable,
|
||||||
*/
|
*/
|
||||||
if (alu != GXcopy)
|
if (alu != GXcopy)
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
else if ((*pExaScr->info->PrepareCopy) (pPixmap, pPixmap, 1, 1, alu,
|
else {
|
||||||
planemask)) {
|
Bool more_copy = FALSE;
|
||||||
for (i = 0; i < nbox; i++)
|
|
||||||
{
|
for (i = 0; i < nbox; i++) {
|
||||||
int dstX = pBox[i].x1 + tileWidth;
|
int dstX = pBox[i].x1 + tileWidth;
|
||||||
int dstY = pBox[i].y1 + tileHeight;
|
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) {
|
if ((dstX < pBox[i].x2) || (dstY < pBox[i].y2)) {
|
||||||
(*pExaScr->info->Copy) (pPixmap, pBox[i].x1, pBox[i].y1,
|
more_copy = TRUE;
|
||||||
dstX, pBox[i].y1, width, height);
|
break;
|
||||||
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);
|
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);
|
exaMarkSync(pDrawable->pScreen);
|
||||||
|
|
Loading…
Reference in New Issue