summaryrefslogtreecommitdiff
path: root/exa/exa_migration.c
diff options
context:
space:
mode:
authorMaarten Maathuis <madman2003@gmail.com>2009-02-17 19:40:59 +0100
committerMaarten Maathuis <madman2003@gmail.com>2009-02-17 19:40:59 +0100
commitb2ceea3635ec05dca9d4aa2f823b96ae9fce7fe8 (patch)
tree13a996df07595a8bd4725d0ec10be4a3f3fd4a5e /exa/exa_migration.c
parent3175646b10c602d17d5dd37bdace7c1c7ee92b3d (diff)
Revert "exa: the extent of the valid region is probably much larger than that of the pending damage."
This reverts commit 97c1cbc70216366e92b9371de608ce94e60aa874. - Sorry for the thinko, pending damage is often not fragmentated. - Should the dst region become fragmentated, you actually want to copy more to unfragmentate it.
Diffstat (limited to 'exa/exa_migration.c')
-rw-r--r--exa/exa_migration.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/exa/exa_migration.c b/exa/exa_migration.c
index 36b1a8c08..9d0eda0de 100644
--- a/exa/exa_migration.c
+++ b/exa/exa_migration.c
@@ -174,13 +174,23 @@ exaCopyDirty(ExaMigrationPtr migrate, RegionPtr pValidDst, RegionPtr pValidSrc,
#endif
/* Try to prevent destination valid region from growing too many
- * rects by filling it up to the extents of the pending damage region.
+ * rects by filling it up to the extents of the union of the
+ * destination valid region and the pending damage region.
*/
if (REGION_NUM_RECTS(pValidDst) > 10) {
- BoxPtr pDamageExt = REGION_EXTENTS(pScreen, pending_damage);
+ BoxRec box;
+ BoxPtr pValidExt, pDamageExt;
RegionRec closure;
- REGION_INIT(pScreen, &closure, pDamageExt, 0);
+ pValidExt = REGION_EXTENTS(pScreen, pValidDst);
+ pDamageExt = REGION_EXTENTS(pScreen, pending_damage);
+
+ box.x1 = min(pValidExt->x1, pDamageExt->x1);
+ box.y1 = min(pValidExt->y1, pDamageExt->y1);
+ box.x2 = max(pValidExt->x2, pDamageExt->x2);
+ box.y2 = max(pValidExt->y2, pDamageExt->y2);
+
+ REGION_INIT(pScreen, &closure, &box, 0);
REGION_INTERSECT(pScreen, &CopyReg, &CopyReg, &closure);
} else
REGION_INTERSECT(pScreen, &CopyReg, &CopyReg, pending_damage);