xf86-video-intel: src/sna/sna_accel.c
Chris Wilson
ickle at kemper.freedesktop.org
Tue Aug 14 07:10:36 PDT 2012
src/sna/sna_accel.c | 60 ++++++++++++++++++++++++++++++----------------------
1 file changed, 35 insertions(+), 25 deletions(-)
New commits:
commit 48f436d3705059711097a222aac65f862b4a5cfd
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Tue Aug 14 15:05:33 2012 +0100
sna: Defer the release of a busy SHM pixmap until the next flush callback
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 bd07662..3f886b0 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1012,6 +1012,35 @@ fallback:
return create_pixmap(sna, screen, width, height, depth, usage);
}
+static inline void add_flush_pixmap(struct sna *sna, struct sna_pixmap *priv)
+{
+ DBG(("%s: marking pixmap=%ld for flushing\n",
+ __FUNCTION__, priv->pixmap->drawable.serialNumber));
+ list_move(&priv->list, &sna->flush_pixmaps);
+ sna->kgem.flush = true;
+}
+
+static void __sna_free_pixmap(struct sna *sna,
+ PixmapPtr pixmap,
+ struct sna_pixmap *priv)
+{
+ list_del(&priv->list);
+ list_del(&priv->inactive);
+
+ sna_damage_destroy(&priv->gpu_damage);
+ sna_damage_destroy(&priv->cpu_damage);
+
+ sna_pixmap_free_cpu(sna, priv);
+
+ if (priv->header) {
+ pixmap->devPrivate.ptr = sna->freed_pixmap;
+ sna->freed_pixmap = pixmap;
+ } else {
+ free(priv);
+ FreePixmap(pixmap);
+ }
+}
+
static Bool sna_destroy_pixmap(PixmapPtr pixmap)
{
struct sna *sna;
@@ -1027,29 +1056,16 @@ static Bool sna_destroy_pixmap(PixmapPtr pixmap)
}
assert_pixmap_damage(pixmap);
-
- list_del(&priv->list);
- list_del(&priv->inactive);
-
- sna_damage_destroy(&priv->gpu_damage);
- sna_damage_destroy(&priv->cpu_damage);
-
sna = to_sna_from_pixmap(pixmap);
/* Always release the gpu bo back to the lower levels of caching */
if (priv->gpu_bo)
kgem_bo_destroy(&sna->kgem, priv->gpu_bo);
- sna_pixmap_free_cpu(sna, priv);
-
- if (priv->header) {
- pixmap->devPrivate.ptr = sna->freed_pixmap;
- sna->freed_pixmap = pixmap;
- } else {
- free(priv);
- FreePixmap(pixmap);
- }
-
+ if (priv->shm && priv->cpu_bo->rq)
+ add_flush_pixmap(sna, priv);
+ else
+ __sna_free_pixmap(sna, pixmap, priv);
return TRUE;
}
@@ -1160,14 +1176,6 @@ static inline bool operate_inplace(struct sna_pixmap *priv, unsigned flags)
return priv->stride != 0;
}
-static inline void add_flush_pixmap(struct sna *sna, struct sna_pixmap *priv)
-{
- DBG(("%s: marking pixmap=%ld for flushing\n",
- __FUNCTION__, priv->pixmap->drawable.serialNumber));
- list_move(&priv->list, &sna->flush_pixmaps);
- sna->kgem.flush = true;
-}
-
bool
_sna_pixmap_move_to_cpu(PixmapPtr pixmap, unsigned int flags)
{
@@ -13297,6 +13305,8 @@ sna_accel_flush_callback(CallbackListPtr *list,
priv->pixmap->drawable.serialNumber));
ret = sna_pixmap_move_to_cpu(priv->pixmap,
MOVE_READ | MOVE_WRITE);
+ if (priv->pixmap->refcnt == 0)
+ __sna_free_pixmap(sna, priv->pixmap, priv);
} else {
DBG(("%s: flushing DRI pixmap=%ld\n", __FUNCTION__,
priv->pixmap->drawable.serialNumber));
More information about the xorg-commit
mailing list