diff --git a/src/sna/kgem.c b/src/sna/kgem.c index aba6881b..fb6a289b 100644 --- a/src/sna/kgem.c +++ b/src/sna/kgem.c @@ -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); } diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index 75c17f92..0de83db1 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -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, ®ion->extents) == PIXMAN_REGION_IN); assert(sna_damage_contains_box(&priv->cpu_damage, ®ion->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; }