xf86-video-intel: 10 commits - src/sna/kgem.c src/sna/sna_accel.c src/sna/sna.h src/sna/sna_render.c
Chris Wilson
ickle at kemper.freedesktop.org
Wed Aug 22 05:01:21 PDT 2012
src/sna/kgem.c | 22 ++++++++++
src/sna/sna.h | 4 +
src/sna/sna_accel.c | 105 ++++++++++++++++++++++++++++++++++-----------------
src/sna/sna_render.c | 2
4 files changed, 98 insertions(+), 35 deletions(-)
New commits:
commit ac6cb667546a82b865c959a1be32f52b2da7bf7d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Aug 22 12:00:49 2012 +0100
sna: Flush before adding any SHM pixmap into the batch
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 157830b..d655da0 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -458,7 +458,9 @@ sna_drawable_move_to_gpu(DrawablePtr drawable, unsigned flags)
return sna_pixmap_move_to_gpu(get_drawable_pixmap(drawable), flags) != NULL;
}
-void sna_add_flush_pixmap(struct sna *sna, struct sna_pixmap *priv);
+void sna_add_flush_pixmap(struct sna *sna,
+ struct sna_pixmap *priv,
+ struct kgem_bo *bo);
struct kgem_bo *sna_pixmap_change_tiling(PixmapPtr pixmap, uint32_t tiling);
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index bba24e5..9bab91c 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1016,16 +1016,18 @@ fallback:
return create_pixmap(sna, screen, width, height, depth, usage);
}
-void sna_add_flush_pixmap(struct sna *sna, struct sna_pixmap *priv)
+void sna_add_flush_pixmap(struct sna *sna,
+ struct sna_pixmap *priv,
+ struct kgem_bo *bo)
{
DBG(("%s: marking pixmap=%ld for flushing\n",
__FUNCTION__, priv->pixmap->drawable.serialNumber));
list_move(&priv->list, &sna->flush_pixmaps);
- if (sna->kgem.need_retire)
+ if (bo->exec == NULL && sna->kgem.need_retire)
kgem_retire(&sna->kgem);
- if (!sna->kgem.need_retire || !sna->kgem.flush) {
- DBG(("%s: GPU idle, flushing\n", __FUNCTION__));
+ if (bo->exec == NULL || !sna->kgem.need_retire) {
+ DBG(("%s: flush bo idle, flushing\n", __FUNCTION__));
kgem_submit(&sna->kgem);
}
@@ -1078,8 +1080,8 @@ static Bool sna_destroy_pixmap(PixmapPtr pixmap)
kgem_bo_destroy(&sna->kgem, priv->gpu_bo);
if (priv->shm && kgem_bo_is_busy(priv->cpu_bo)) {
+ sna_add_flush_pixmap(sna, priv, priv->cpu_bo);
kgem_bo_submit(&sna->kgem, priv->cpu_bo); /* XXX ShmDetach */
- sna_add_flush_pixmap(sna, priv);
} else
__sna_free_pixmap(sna, pixmap, priv);
return TRUE;
@@ -1419,7 +1421,7 @@ skip_inplace_map:
if (priv->flush) {
assert(!priv->shm);
- sna_add_flush_pixmap(sna, priv);
+ sna_add_flush_pixmap(sna, priv, priv->gpu_bo);
}
}
@@ -2030,7 +2032,7 @@ done:
}
if (priv->flush) {
assert(!priv->shm);
- sna_add_flush_pixmap(sna, priv);
+ sna_add_flush_pixmap(sna, priv, priv->gpu_bo);
}
}
@@ -2244,7 +2246,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
box, n, 0);
if (ok && priv->shm) {
assert(!priv->flush);
- sna_add_flush_pixmap(sna, priv);
+ sna_add_flush_pixmap(sna, priv, priv->cpu_bo);
}
}
if (!ok) {
@@ -2288,7 +2290,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
box, 1, 0);
if (ok && priv->shm) {
assert(!priv->flush);
- sna_add_flush_pixmap(sna, priv);
+ sna_add_flush_pixmap(sna, priv, priv->cpu_bo);
}
}
if (!ok) {
@@ -2323,7 +2325,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
box, n, 0);
if (ok && priv->shm) {
assert(!priv->flush);
- sna_add_flush_pixmap(sna, priv);
+ sna_add_flush_pixmap(sna, priv, priv->cpu_bo);
}
}
if (!ok) {
@@ -2349,7 +2351,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
if (priv->shm) {
assert(!priv->flush);
- sna_add_flush_pixmap(sna, priv);
+ sna_add_flush_pixmap(sna, priv, priv->cpu_bo);
}
done:
@@ -2623,7 +2625,7 @@ use_cpu_bo:
if (priv->shm) {
assert(!priv->flush);
- sna_add_flush_pixmap(sna, priv);
+ sna_add_flush_pixmap(sna, priv, priv->cpu_bo);
/* As we may have flushed and retired,, recheck for busy bo */
if ((flags & FORCE_GPU) == 0 && !kgem_bo_is_busy(priv->cpu_bo))
@@ -2851,7 +2853,7 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
box, n, 0);
if (ok && priv->shm) {
assert(!priv->flush);
- sna_add_flush_pixmap(sna, priv);
+ sna_add_flush_pixmap(sna, priv, priv->cpu_bo);
}
}
if (!ok) {
@@ -2886,7 +2888,7 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
if (priv->shm) {
assert(!priv->flush);
- sna_add_flush_pixmap(sna, priv);
+ sna_add_flush_pixmap(sna, priv, priv->cpu_bo);
}
/* For large bo, try to keep only a single copy around */
@@ -3441,7 +3443,7 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
}
if (priv->flush) {
assert(!priv->shm);
- sna_add_flush_pixmap(sna, priv);
+ sna_add_flush_pixmap(sna, priv, priv->gpu_bo);
}
}
priv->cpu = true;
@@ -4320,7 +4322,7 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
if (src_priv->shm) {
assert(!src_priv->flush);
- sna_add_flush_pixmap(sna, src_priv);
+ sna_add_flush_pixmap(sna, src_priv, src_priv->cpu_bo);
}
if (damage)
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index 13822b8..8373890 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -378,7 +378,7 @@ use_cpu_bo(struct sna *sna, PixmapPtr pixmap, const BoxRec *box, bool blt)
if (priv->shm) {
assert(!priv->flush);
- sna_add_flush_pixmap(sna, priv);
+ sna_add_flush_pixmap(sna, priv, priv->cpu_bo);
}
DBG(("%s for box=(%d, %d), (%d, %d)\n",
commit 785c1046b94fd9ca6f22b2a6d73639408a411cea
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Aug 22 10:56:12 2012 +0100
sna: Only use the GPU for an active CPU bo unless forced
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 110d9c5..bba24e5 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1339,7 +1339,8 @@ skip_inplace_map:
}
if (priv->clear) {
- if (priv->cpu_bo && !priv->cpu_bo->flush && kgem_bo_is_busy(priv->cpu_bo)) {
+ if (priv->cpu_bo && !priv->cpu_bo->flush &&
+ __kgem_bo_is_busy(&sna->kgem, priv->cpu_bo)) {
assert(!priv->shm);
sna_pixmap_free_cpu(sna, priv);
}
@@ -1439,8 +1440,11 @@ done:
DBG(("%s: syncing CPU bo\n", __FUNCTION__));
kgem_bo_sync__cpu(&sna->kgem, priv->cpu_bo);
}
- if (flags & MOVE_WRITE)
+ if (flags & MOVE_WRITE) {
+ DBG(("%s: discarding GPU bo in favour of CPU bo\n", __FUNCTION__));
sna_pixmap_free_gpu(sna, priv);
+ priv->undamaged = false;
+ }
}
priv->cpu = (flags & MOVE_ASYNC_HINT) == 0;
assert(pixmap->devPrivate.ptr);
@@ -2371,6 +2375,7 @@ sna_drawable_use_bo(DrawablePtr drawable, unsigned flags, const BoxRec *box,
{
PixmapPtr pixmap = get_drawable_pixmap(drawable);
struct sna_pixmap *priv = sna_pixmap(pixmap);
+ struct sna *sna;
RegionRec region;
int16_t dx, dy;
int ret;
@@ -2565,8 +2570,13 @@ use_cpu_bo:
if (priv->cpu_bo == NULL)
return NULL;
- if ((flags & FORCE_GPU) == 0 && !kgem_bo_is_busy(priv->cpu_bo))
+ sna = to_sna_from_pixmap(pixmap);
+ if ((flags & FORCE_GPU) == 0 &&
+ !__kgem_bo_is_busy(&sna->kgem, priv->cpu_bo)) {
+ DBG(("%s: has CPU bo, but is idle and acceleration not forced\n",
+ __FUNCTION__));
return NULL;
+ }
get_drawable_deltas(drawable, pixmap, &dx, &dy);
@@ -2590,11 +2600,11 @@ use_cpu_bo:
if (priv->cpu_bo->pitch >= 4096)
goto move_to_gpu;
- if (!to_sna_from_pixmap(pixmap)->kgem.can_blt_cpu)
+ if (!sna->kgem.can_blt_cpu)
goto move_to_gpu;
}
- if (!to_sna_from_pixmap(pixmap)->kgem.can_blt_cpu)
+ if (!sna->kgem.can_blt_cpu)
return NULL;
if (!sna_drawable_move_region_to_cpu(&pixmap->drawable, ®ion,
@@ -2613,7 +2623,11 @@ use_cpu_bo:
if (priv->shm) {
assert(!priv->flush);
- sna_add_flush_pixmap(to_sna_from_pixmap(pixmap), priv);
+ sna_add_flush_pixmap(sna, priv);
+
+ /* As we may have flushed and retired,, recheck for busy bo */
+ if ((flags & FORCE_GPU) == 0 && !kgem_bo_is_busy(priv->cpu_bo))
+ return NULL;
}
DBG(("%s: using CPU bo with damage? %d\n",
commit 8032f51859ce1928922edf6892f493a84d9c39f0
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Aug 22 10:40:53 2012 +0100
sna: If we cannot use the CPU bo along a render pathway, promote to GPU
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 5521c83..110d9c5 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2589,6 +2589,9 @@ use_cpu_bo:
if (priv->cpu_bo->pitch >= 4096)
goto move_to_gpu;
+
+ if (!to_sna_from_pixmap(pixmap)->kgem.can_blt_cpu)
+ goto move_to_gpu;
}
if (!to_sna_from_pixmap(pixmap)->kgem.can_blt_cpu)
commit cc967507bbf357e1d5ec3cd0f3c0c5ecfa8b867a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Aug 22 10:36:04 2012 +0100
sna: Convert to using IGNORE_CPU flag rather than complicating the CPU damage
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 9731a0a..5521c83 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -4113,6 +4113,7 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
struct sna *sna = to_sna_from_pixmap(src_pixmap);
struct sna_damage **damage;
struct kgem_bo *bo;
+ unsigned hint;
int16_t src_dx, src_dy;
int16_t dst_dx, dst_dy;
BoxPtr box = RegionRects(region);
@@ -4171,20 +4172,20 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
if (dst_priv == NULL)
goto fallback;
+ hint = source_prefer_gpu(src_priv) ?:
+ region_inplace(sna, dst_pixmap, region,
+ dst_priv, alu_overwrites(alu));
if (dst_priv->cpu_damage && alu_overwrites(alu)) {
DBG(("%s: overwritting CPU damage\n", __FUNCTION__));
- sna_damage_subtract(&dst_priv->cpu_damage, region);
- if (dst_priv->cpu_damage == NULL) {
+ if (region_subsumes_damage(region, dst_priv->cpu_damage)) {
+ DBG(("%s: discarding existing CPU damage\n", __FUNCTION__));
+ sna_damage_destroy(&dst_priv->cpu_damage);
list_del(&dst_priv->list);
- dst_priv->undamaged = false;
- dst_priv->cpu = false;
}
+ hint |= IGNORE_CPU;
}
- bo = sna_drawable_use_bo(&dst_pixmap->drawable,
- source_prefer_gpu(src_priv) ?:
- region_inplace(sna, dst_pixmap, region,
- dst_priv, alu_overwrites(alu)),
+ bo = sna_drawable_use_bo(&dst_pixmap->drawable, hint,
®ion->extents, &damage);
if (bo) {
if (src_priv && src_priv->clear) {
commit 5aa59ce7c012eb309c4f5a362ccf531c065bd7ff
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Aug 22 10:10:33 2012 +0100
sna: Assert that the CPU bo is not used if the GPU is clear
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index ba8c93d..9731a0a 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2561,6 +2561,7 @@ use_gpu_bo:
return priv->gpu_bo;
use_cpu_bo:
+ assert(!priv->clear);
if (priv->cpu_bo == NULL)
return NULL;
commit 273765033223024ff6a662195e0e4b96f8960463
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Aug 22 00:48:08 2012 +0100
sna: Make sure the opposite damage is destroyed after reducing to all
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index ee23b43..ba8c93d 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2536,9 +2536,10 @@ done:
assert(priv->gpu_bo != NULL);
if (sna_damage_is_all(&priv->gpu_damage,
pixmap->drawable.width,
- pixmap->drawable.height))
+ pixmap->drawable.height)) {
+ sna_damage_destroy(&priv->cpu_damage);
*damage = NULL;
- else
+ } else
*damage = &priv->gpu_damage;
DBG(("%s: using GPU bo with damage? %d\n",
@@ -2579,6 +2580,8 @@ use_cpu_bo:
if (priv->gpu_bo && kgem_bo_is_busy(priv->gpu_bo))
goto move_to_gpu;
+ assert(priv->gpu_bo == NULL || priv->gpu_bo->proxy == NULL);
+
if (flags & RENDER_GPU) {
if (priv->gpu_bo && priv->gpu_bo->tiling)
goto move_to_gpu;
@@ -2598,9 +2601,10 @@ use_cpu_bo:
if (sna_damage_is_all(&priv->cpu_damage,
pixmap->drawable.width,
- pixmap->drawable.height))
+ pixmap->drawable.height)) {
+ sna_damage_destroy(&priv->gpu_damage);
*damage = NULL;
- else
+ } else
*damage = &priv->cpu_damage;
if (priv->shm) {
@@ -2726,6 +2730,8 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
pixmap->drawable.width,
pixmap->drawable.height)) {
DBG(("%s: already all-damaged\n", __FUNCTION__));
+ sna_damage_destroy(&priv->cpu_damage);
+ priv->undamaged = true;
goto active;
}
commit 31e398c9dbd8539e6fd2cc7398e97ee1df2f7f23
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Aug 22 00:38:17 2012 +0100
sna: Discard a no-longer-used GPU bo after moving to the CPU domain
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 59ed0d7..ee23b43 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1426,6 +1426,12 @@ done:
if (flags & MOVE_WRITE) {
priv->source_count = SOURCE_BIAS;
assert(priv->gpu_bo == NULL || priv->gpu_bo->proxy == NULL);
+ if (priv->gpu_bo && priv->gpu_bo->domain != DOMAIN_GPU) {
+ DBG(("%s: discarding inactive GPU bo\n", __FUNCTION__));
+ assert(DAMAGE_IS_ALL(priv->cpu_damage));
+ sna_pixmap_free_gpu(sna, priv);
+ priv->undamaged = false;
+ }
}
if (priv->cpu_bo) {
commit 8be15c37df9d9b34e0f21700673212bd19c772b2
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Aug 22 00:27:00 2012 +0100
sna: Balance CPU bo accounting for SHM pixmaps
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 1c77104..59ed0d7 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -473,8 +473,8 @@ static void sna_pixmap_free_cpu(struct sna *sna, struct sna_pixmap *priv)
sna->debug_memory.cpu_bo_bytes -= kgem_bo_size(priv->cpu_bo);
#endif
if (priv->cpu_bo->flush) {
+ assert(priv->cpu_bo->reusable == false);
kgem_bo_sync__cpu(&sna->kgem, priv->cpu_bo);
- priv->cpu_bo->reusable = false;
sna_accel_watch_flush(sna, -1);
}
kgem_bo_destroy(&sna->kgem, priv->cpu_bo);
@@ -819,6 +819,10 @@ fallback:
priv->cpu_bo->pitch = pitch;
priv->cpu_bo->reusable = false;
sna_accel_watch_flush(sna, 1);
+#ifdef DEBUG_MEMORY
+ sna->debug_memory.cpu_bo_allocs++;
+ sna->debug_memory.cpu_bo_bytes += kgem_bo_size(priv->cpu_bo);
+#endif
priv->cpu = true;
priv->shm = true;
commit 262d57a5aaac46508d8e29860c7a567bcd5bc4d8
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Tue Aug 21 23:36:12 2012 +0100
sna: Display still resident memory in inactive/snoop caches under DEBUG_MEMORY
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 0942917..077f3e1 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -2343,6 +2343,16 @@ bool kgem_expire_cache(struct kgem *kgem)
kgem_bo_free(kgem, bo);
}
}
+#ifdef DEBUG_MEMORY
+ {
+ long size = 0;
+ int count = 0;
+ list_for_each_entry(bo, &kgem->snoop, list)
+ count++, size += bytes(bo);
+ ErrorF("%s: still allocated %d bo, %ld bytes, in snoop cache\n",
+ __FUNCTION__, count, size);
+ }
+#endif
kgem_retire(kgem);
if (kgem->wedged)
@@ -2408,6 +2418,18 @@ bool kgem_expire_cache(struct kgem *kgem)
}
}
+#ifdef DEBUG_MEMORY
+ {
+ long size = 0;
+ int count = 0;
+ for (i = 0; i < ARRAY_SIZE(kgem->inactive); i++)
+ list_for_each_entry(bo, &kgem->inactive[i], list)
+ count++, size += bytes(bo);
+ ErrorF("%s: still allocated %d bo, %ld bytes, in inactive cache\n",
+ __FUNCTION__, count, size);
+ }
+#endif
+
DBG(("%s: expired %d objects, %d bytes, idle? %d\n",
__FUNCTION__, count, size, idle));
commit 304581cc02adeb865a24edde934b5b9ceba68d96
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Tue Aug 21 23:29:12 2012 +0100
sna: Add a DBG to log pixmap destruction
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 9fda8ca..1c77104 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1059,6 +1059,8 @@ static Bool sna_destroy_pixmap(PixmapPtr pixmap)
return TRUE;
priv = sna_pixmap(pixmap);
+ DBG(("%s: pixmap=%ld, attached?=%d\n",
+ __FUNCTION__, pixmap->drawable.serialNumber, priv != NULL));
if (priv == NULL) {
FreePixmap(pixmap);
return TRUE;
More information about the xorg-commit
mailing list