sna: Check number of boxes to migrate during move-to-cpu

When reducing the damage we may find that it is actually empty and so
sna_damage_get_boxes() returns 0, be prepared.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2012-01-18 20:53:55 +00:00
parent 334f3f70a8
commit efce896e1d
1 changed files with 42 additions and 36 deletions

View File

@ -1235,21 +1235,24 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
if (region_subsumes_damage(r, priv->gpu_damage)) {
BoxPtr box;
int n;
Bool ok;
ok = FALSE;
n = sna_damage_get_boxes(priv->gpu_damage,
&box);
if (priv->cpu_bo && sna->kgem.gen >= 30)
ok = sna->render.copy_boxes(sna, GXcopy,
pixmap, priv->gpu_bo, 0, 0,
pixmap, priv->cpu_bo, 0, 0,
box, n);
if (!ok)
sna_read_boxes(sna,
priv->gpu_bo, 0, 0,
pixmap, 0, 0,
box, n);
if (n) {
Bool ok = FALSE;
if (priv->cpu_bo && sna->kgem.gen >= 30)
ok = sna->render.copy_boxes(sna, GXcopy,
pixmap, priv->gpu_bo, 0, 0,
pixmap, priv->cpu_bo, 0, 0,
box, n);
if (!ok)
sna_read_boxes(sna,
priv->gpu_bo, 0, 0,
pixmap, 0, 0,
box, n);
}
sna_damage_destroy(&priv->gpu_damage);
priv->undamaged = true;
@ -1430,33 +1433,36 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, BoxPtr box)
region_set(&r, box);
if (MIGRATE_ALL || region_subsumes_damage(&r, priv->cpu_damage)) {
Bool ok;
int n;
n = sna_damage_get_boxes(priv->cpu_damage, &box);
ok = FALSE;
if (priv->cpu_bo)
ok = sna->render.copy_boxes(sna, GXcopy,
pixmap, priv->cpu_bo, 0, 0,
pixmap, priv->gpu_bo, 0, 0,
box, n);
if (!ok) {
if (n == 1 && !priv->pinned &&
box->x1 <= 0 && box->y1 <= 0 &&
box->x2 >= pixmap->drawable.width &&
box->y2 >= pixmap->drawable.height) {
priv->gpu_bo =
sna_replace(sna, pixmap,
priv->gpu_bo,
pixmap->devPrivate.ptr,
pixmap->devKind);
} else {
sna_write_boxes(sna, pixmap,
priv->gpu_bo, 0, 0,
pixmap->devPrivate.ptr,
pixmap->devKind,
0, 0,
box, n);
if (n) {
Bool ok;
ok = FALSE;
if (priv->cpu_bo)
ok = sna->render.copy_boxes(sna, GXcopy,
pixmap, priv->cpu_bo, 0, 0,
pixmap, priv->gpu_bo, 0, 0,
box, n);
if (!ok) {
if (n == 1 && !priv->pinned &&
box->x1 <= 0 && box->y1 <= 0 &&
box->x2 >= pixmap->drawable.width &&
box->y2 >= pixmap->drawable.height) {
priv->gpu_bo =
sna_replace(sna, pixmap,
priv->gpu_bo,
pixmap->devPrivate.ptr,
pixmap->devKind);
} else {
sna_write_boxes(sna, pixmap,
priv->gpu_bo, 0, 0,
pixmap->devPrivate.ptr,
pixmap->devKind,
0, 0,
box, n);
}
}
}