sna: Allow use of mmap(wc) for inplace GetImage

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2015-01-08 14:27:35 +00:00
parent bc59d3fc76
commit e53087e48b
2 changed files with 16 additions and 8 deletions

View File

@ -6314,7 +6314,6 @@ void *kgem_bo_map__wc(struct kgem *kgem, struct kgem_bo *bo)
bo->handle, (long)bo->presumed_offset, bo->tiling, bo->map__gtt, bo->map__cpu, bo->domain));
assert(bo->proxy == NULL);
assert(bo->exec == NULL);
assert(list_is_empty(&bo->list));
assert_tiling(kgem, bo);
assert(!bo->purged || bo->reusable);
@ -6322,6 +6321,7 @@ void *kgem_bo_map__wc(struct kgem *kgem, struct kgem_bo *bo)
if (bo->map__wc)
return bo->map__wc;
kgem_trim_vma_cache(kgem, MAP_GTT, bucket(bo));
return __kgem_bo_map__wc(kgem, bo);
}

View File

@ -16794,7 +16794,8 @@ sna_get_image__inplace(PixmapPtr pixmap,
break;
}
if (!kgem_bo_can_map__cpu(&sna->kgem, priv->gpu_bo, FORCE_FULL_SYNC))
if ((flags & MOVE_INPLACE_HINT) == 0 &&
!kgem_bo_can_map__cpu(&sna->kgem, priv->gpu_bo, FORCE_FULL_SYNC))
return false;
if (idle && __kgem_bo_is_busy(&sna->kgem, priv->gpu_bo))
@ -16806,11 +16807,19 @@ sna_get_image__inplace(PixmapPtr pixmap,
assert(sna_damage_contains_box(&priv->gpu_damage, &region->extents) == PIXMAN_REGION_IN);
assert(sna_damage_contains_box(&priv->cpu_damage, &region->extents) == PIXMAN_REGION_OUT);
src = kgem_bo_map__cpu(&sna->kgem, priv->gpu_bo);
if (src == NULL)
return false;
if (kgem_bo_can_map__cpu(&sna->kgem, priv->gpu_bo, FORCE_FULL_SYNC)) {
src = kgem_bo_map__cpu(&sna->kgem, priv->gpu_bo);
if (src == NULL)
return false;
kgem_bo_sync__cpu_full(&sna->kgem, priv->gpu_bo, FORCE_FULL_SYNC);
kgem_bo_sync__cpu_full(&sna->kgem, priv->gpu_bo, FORCE_FULL_SYNC);
} else {
src = kgem_bo_map__wc(&sna->kgem, priv->gpu_bo);
if (src == NULL)
return false;
kgem_bo_sync__gtt(&sna->kgem, priv->gpu_bo);
}
if (sigtrap_get())
return false;
@ -16838,10 +16847,9 @@ sna_get_image__inplace(PixmapPtr pixmap,
region->extents.x2 - region->extents.x1,
region->extents.y2 - region->extents.y1);
if (!priv->shm) {
assert(src == MAP(priv->gpu_bo->map__cpu));
pixmap->devPrivate.ptr = src;
pixmap->devKind = priv->gpu_bo->pitch;
priv->mapped = MAPPED_CPU;
priv->mapped = src == MAP(priv->gpu_bo->map__cpu) ? MAPPED_CPU : MAPPED_GTT;
assert_pixmap_map(pixmap, priv);
priv->cpu = true;
}