summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King <rmk@armlinux.org.uk>2017-02-12 20:50:00 +0000
committerRussell King <rmk@armlinux.org.uk>2017-02-12 23:22:39 +0000
commit6e73b1189899a7a59f05512f872b9a102f892a10 (patch)
tree0bbc39c5e59c0a705955867d10efc37f4ff2dcdb
parent17ce35617ce201b934a5193e47620ac5726a4e41 (diff)
etnaviv: convert usermem nodes to use fences
Rather than tying the usermem nodes to their current specific use case (for uploading glyphs) which relies on the destination pixmap never being freed over their lifetimes, switch to using the fencing support. This means we will avoid blocking in etnaviv_BlockHandler() waiting for the glyph upload to complete. Signed-off-by: Russell King <rmk@armlinux.org.uk>
-rw-r--r--etnaviv/etnaviv.c37
-rw-r--r--etnaviv/etnaviv_accel.h4
-rw-r--r--etnaviv/etnaviv_render.c2
3 files changed, 14 insertions, 29 deletions
diff --git a/etnaviv/etnaviv.c b/etnaviv/etnaviv.c
index d6b9a46..5674b07 100644
--- a/etnaviv/etnaviv.c
+++ b/etnaviv/etnaviv.c
@@ -101,27 +101,23 @@ void etnaviv_finish_fences(struct etnaviv *etnaviv, uint32_t fence)
etnaviv->last_fence = fence;
}
-void etnaviv_add_freemem(struct etnaviv *etnaviv,
- struct etnaviv_usermem_node *n)
+static void etnaviv_retire_freemem_fence(struct etnaviv_fence_head *fh,
+ struct etnaviv_fence *f)
{
- xorg_list_append(&n->node, &etnaviv->usermem_free_list);
+ struct etnaviv *etnaviv = container_of(fh, struct etnaviv, fence_head);
+ struct etnaviv_usermem_node *n = container_of(f,
+ struct etnaviv_usermem_node, fence);
+
+ etna_bo_del(etnaviv->conn, n->bo, NULL);
+ free(n->mem);
+ free(n);
}
-static void etnaviv_free_usermem(struct etnaviv *etnaviv)
+void etnaviv_add_freemem(struct etnaviv *etnaviv,
+ struct etnaviv_usermem_node *n)
{
- struct etnaviv_usermem_node *i, *n;
-
- /*
- * This is really a hack - we should have proper APIs, but as long
- * as we support etnaviv alongside etnadrm, we have no option.
- */
- xorg_list_for_each_entry_safe(i, n, &etnaviv->usermem_free_list, node) {
- xorg_list_del(&i->node);
- etnaviv_batch_wait_commit(etnaviv, i->dst);
- etna_bo_del(etnaviv->conn, i->bo, NULL);
- free(i->mem);
- free(i);
- }
+ n->fence.retire = etnaviv_retire_freemem_fence;
+ etnaviv_fence_add(&etnaviv->fence_head, &n->fence);
}
static CARD32 etnaviv_cache_expire(OsTimerPtr timer, CARD32 time, pointer arg)
@@ -825,12 +821,6 @@ static void etnaviv_BlockHandler(BLOCKHANDLER_ARGS_DECL)
etnaviv);
}
}
-
- /*
- * Try to free any usermem buffers
- */
- if (!xorg_list_is_empty(&etnaviv->usermem_free_list))
- etnaviv_free_usermem(etnaviv);
}
static Bool etnaviv_pre_init(ScrnInfoPtr pScrn, int drm_fd)
@@ -892,7 +882,6 @@ static Bool etnaviv_ScreenInit(ScreenPtr pScreen, struct drm_armada_bufmgr *mgr)
goto fail_accel;
etnaviv_fence_head_init(&etnaviv->fence_head);
- xorg_list_init(&etnaviv->usermem_free_list);
etnaviv_set_screen_priv(pScreen, etnaviv);
diff --git a/etnaviv/etnaviv_accel.h b/etnaviv/etnaviv_accel.h
index 4f013f4..0079a4a 100644
--- a/etnaviv/etnaviv_accel.h
+++ b/etnaviv/etnaviv_accel.h
@@ -80,7 +80,6 @@ struct etnaviv {
struct viv_conn *conn;
struct etna_ctx *ctx;
struct etnaviv_fence_head fence_head;
- struct xorg_list usermem_free_list;
OsTimerPtr cache_timer;
uint32_t last_fence;
Bool force_fallback;
@@ -165,8 +164,7 @@ struct etnaviv_pixmap {
};
struct etnaviv_usermem_node {
- struct xorg_list node;
- struct etnaviv_pixmap *dst;
+ struct etnaviv_fence fence;
struct etna_bo *bo;
void *mem;
};
diff --git a/etnaviv/etnaviv_render.c b/etnaviv/etnaviv_render.c
index b0bb3bf..0740f51 100644
--- a/etnaviv/etnaviv_render.c
+++ b/etnaviv/etnaviv_render.c
@@ -1247,8 +1247,6 @@ static void etnaviv_accel_glyph_upload(ScreenPtr pScreen, PicturePtr pDst,
return;
}
- /* vdst will not go away while the server is running */
- unode->dst = vdst;
unode->bo = usr;
unode->mem = b;