sna: Do make a clone of a GPU bo that is itself a cache

As we do not attempt to undo the cache status upon the clone.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2013-05-24 11:46:36 +01:00
parent dbe2b5896e
commit 2b97237676
1 changed files with 7 additions and 0 deletions

View File

@ -1663,6 +1663,9 @@ sna_pixmap_make_cow(struct sna *sna,
if (!USE_COW)
return false;
if (src_priv->gpu_bo->proxy)
return false;
DBG(("%s: make cow src=%ld, dst=%ld, handle=%ld\n",
__FUNCTION__,
src_priv->pixmap->drawable.serialNumber,
@ -1795,6 +1798,7 @@ _sna_pixmap_move_to_cpu(PixmapPtr pixmap, unsigned int flags)
pixmap_inplace(sna, pixmap, priv, true) &&
sna_pixmap_create_mappable_gpu(pixmap, true)) {
DBG(("%s: write inplace\n", __FUNCTION__));
assert(priv->cow == NULL);
assert(!priv->shm);
assert(priv->gpu_bo->exec == NULL);
assert((flags & MOVE_READ) == 0 || priv->cpu_damage == NULL);
@ -1856,6 +1860,7 @@ skip_inplace_map:
pixmap_inplace(sna, pixmap, priv, (flags & MOVE_READ) == 0) &&
sna_pixmap_create_mappable_gpu(pixmap, (flags & MOVE_READ) == 0)) {
DBG(("%s: try to operate inplace (GTT)\n", __FUNCTION__));
assert(priv->cow == NULL);
assert((flags & MOVE_READ) == 0 || priv->cpu_damage == NULL);
/* XXX only sync for writes? */
kgem_bo_submit(&sna->kgem, priv->gpu_bo);
@ -1897,6 +1902,7 @@ skip_inplace_map:
((flags & (MOVE_WRITE | MOVE_ASYNC_HINT)) == 0 ||
!__kgem_bo_is_busy(&sna->kgem, priv->gpu_bo))) {
DBG(("%s: try to operate inplace (CPU)\n", __FUNCTION__));
assert(priv->cow == NULL);
assert(!priv->mapped);
pixmap->devPrivate.ptr =
@ -2238,6 +2244,7 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
region_inplace(sna, pixmap, region, priv, (flags & MOVE_READ) == 0) &&
sna_pixmap_create_mappable_gpu(pixmap, false)) {
DBG(("%s: try to operate inplace\n", __FUNCTION__));
assert(priv->cow == NULL);
/* XXX only sync for writes? */
kgem_bo_submit(&sna->kgem, priv->gpu_bo);
assert(priv->gpu_bo->exec == NULL);