summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;