sna: Be a little more lenient wrt damage migration if we have CPU bo

The idea being that they facilitate copying to and from the CPU, but
also we want to avoid stalling on any pixels help by the CPU bo.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2012-01-15 15:35:57 +00:00
parent e3732a6f7f
commit 37ced44a53
1 changed files with 34 additions and 8 deletions

View File

@ -1505,15 +1505,32 @@ _sna_drawable_use_gpu_bo(DrawablePtr drawable,
return FALSE;
}
if (DAMAGE_IS_ALL(priv->gpu_damage)) {
*damage = NULL;
return TRUE;
}
if (DAMAGE_IS_ALL(priv->cpu_damage))
return FALSE;
if (priv->gpu_bo == NULL &&
(sna_pixmap_choose_tiling(pixmap) == I915_TILING_NONE ||
(priv->cpu_damage && !box_inplace(pixmap, box)) ||
!sna_pixmap_move_to_gpu(pixmap, MOVE_WRITE | MOVE_READ))) {
DBG(("%s: no GPU bo allocated\n", __FUNCTION__));
return FALSE;
if (priv->gpu_bo == NULL) {
if (sna_pixmap_choose_tiling(pixmap) == I915_TILING_NONE) {
DBG(("%s: untiled, will not force allocation\n",
__FUNCTION__));
return FALSE;
}
if (priv->cpu_damage && !box_inplace(pixmap, box)) {
DBG(("%s: damaged with a small operation, will not force allocation\n",
__FUNCTION__));
return FALSE;
}
if (!sna_pixmap_move_to_gpu(pixmap, MOVE_WRITE | MOVE_READ))
return FALSE;
DBG(("%s: allocated GPU bo for operation\n", __FUNCTION__));
goto done;
}
get_drawable_deltas(drawable, pixmap, &dx, &dy);
@ -1536,13 +1553,20 @@ _sna_drawable_use_gpu_bo(DrawablePtr drawable,
return TRUE;
}
if (ret != PIXMAN_REGION_OUT && kgem_bo_is_busy(priv->gpu_bo)) {
if (ret != PIXMAN_REGION_OUT &&
(priv->cpu_bo || kgem_bo_is_busy(priv->gpu_bo))) {
DBG(("%s: region partially contained within busy GPU damage\n",
__FUNCTION__));
goto move_to_gpu;
}
}
if (priv->cpu_bo && kgem_bo_is_busy(priv->cpu_bo)) {
DBG(("%s: busy CPU bo, prefer to use GPU\n",
__FUNCTION__));
goto move_to_gpu;
}
if (priv->cpu_damage) {
int ret = sna_damage_contains_box(priv->cpu_damage, &extents);
if (ret == PIXMAN_REGION_IN) {
@ -1556,7 +1580,8 @@ _sna_drawable_use_gpu_bo(DrawablePtr drawable,
goto move_to_gpu;
}
if (ret != PIXMAN_REGION_OUT && !kgem_bo_is_busy(priv->gpu_bo)) {
if (ret != PIXMAN_REGION_OUT &&
(priv->cpu_bo || !kgem_bo_is_busy(priv->gpu_bo))) {
DBG(("%s: region partially contained within idle CPU damage\n",
__FUNCTION__));
return FALSE;
@ -1569,6 +1594,7 @@ move_to_gpu:
return FALSE;
}
done:
*damage = DAMAGE_IS_ALL(priv->gpu_damage) ? NULL : &priv->gpu_damage;
return TRUE;
}