diff options
author | Russell King <rmk@armlinux.org.uk> | 2017-02-12 17:00:42 +0000 |
---|---|---|
committer | Russell King <rmk@armlinux.org.uk> | 2017-02-12 23:22:37 +0000 |
commit | 4454535cf739d0f13eebe7f48744fb3d881dcf34 (patch) | |
tree | 001e6938a0d5e5add4ce97c0275943d33c01201e | |
parent | 9159fe0933c26a9c6a708a23601827538a415148 (diff) |
etnaviv: add reference counting to etnaviv_pixmaps
Add reference counting to etnaviv_pixmaps so we can track when it is
safe to free these.
Signed-off-by: Russell King <rmk@armlinux.org.uk>
-rw-r--r-- | etnaviv/etnaviv.c | 14 | ||||
-rw-r--r-- | etnaviv/etnaviv_accel.h | 1 |
2 files changed, 12 insertions, 3 deletions
diff --git a/etnaviv/etnaviv.c b/etnaviv/etnaviv.c index a4e303f..07ec439 100644 --- a/etnaviv/etnaviv.c +++ b/etnaviv/etnaviv.c @@ -76,6 +76,13 @@ static void etnaviv_free_vpix(struct etnaviv *etnaviv, free(vPix); } +static void etnaviv_put_vpix(struct etnaviv *etnaviv, + struct etnaviv_pixmap *vPix) +{ + if (--vPix->refcnt == 0) + etnaviv_free_vpix(etnaviv, vPix); +} + void etnaviv_free_busy_vpix(struct etnaviv *etnaviv) { struct etnaviv_pixmap *i, *n; @@ -83,7 +90,7 @@ void etnaviv_free_busy_vpix(struct etnaviv *etnaviv) xorg_list_for_each_entry_safe(i, n, &etnaviv->busy_free_list, busy_node) { if (i->batch_state == B_NONE) { xorg_list_del(&i->busy_node); - etnaviv_free_vpix(etnaviv, i); + etnaviv_put_vpix(etnaviv, i); } } } @@ -158,7 +165,7 @@ static void etnaviv_free_pixmap(PixmapPtr pixmap) * the GPU but we have already seen a commit+stall. * We can just free this pixmap. */ - etnaviv_free_vpix(etnaviv, vPix); + etnaviv_put_vpix(etnaviv, vPix); break; case B_FENCED: @@ -168,7 +175,7 @@ static void etnaviv_free_pixmap(PixmapPtr pixmap) */ if (VIV_FENCE_BEFORE_EQ(vPix->fence, etnaviv->last_fence)) { etnaviv_retire_vpix(etnaviv, vPix); - etnaviv_free_vpix(etnaviv, vPix); + etnaviv_put_vpix(etnaviv, vPix); break; } @@ -209,6 +216,7 @@ static struct etnaviv_pixmap *etnaviv_alloc_pixmap(PixmapPtr pixmap, vpix->height = pixmap->drawable.height; vpix->pitch = pixmap->devKind; vpix->format = fmt; + vpix->refcnt = 1; } return vpix; } diff --git a/etnaviv/etnaviv_accel.h b/etnaviv/etnaviv_accel.h index 671f37c..6928361 100644 --- a/etnaviv/etnaviv_accel.h +++ b/etnaviv/etnaviv_accel.h @@ -171,6 +171,7 @@ struct etnaviv_pixmap { struct drm_armada_bo *bo; struct etna_bo *etna_bo; uint32_t name; + unsigned int refcnt; }; struct etnaviv_usermem_node { |