summaryrefslogtreecommitdiff
path: root/freedreno/freedreno_ringbuffer.h
diff options
context:
space:
mode:
authorRob Clark <robclark@freedesktop.org>2018-10-09 15:33:39 -0400
committerRob Clark <robclark@freedesktop.org>2018-10-13 17:18:43 -0400
commita8a006192634d1390acf3a09d4edec27084c8507 (patch)
treea684c232c2c5e5ad8b15e47c32b9fa5e012d9b3e /freedreno/freedreno_ringbuffer.h
parent566b1d9f93e4922edf5b13b80cb46179e9d85802 (diff)
downloaddrm-a8a006192634d1390acf3a09d4edec27084c8507.tar.gz
freedreno: expose refcnt'ing on ringbuffers
Move this out of msm_ringbuffer backend so that the gallium driver can refcnt rb's Signed-off-by: Rob Clark <robclark@freedesktop.org>
Diffstat (limited to 'freedreno/freedreno_ringbuffer.h')
-rw-r--r--freedreno/freedreno_ringbuffer.h14
1 files changed, 14 insertions, 0 deletions
diff --git a/freedreno/freedreno_ringbuffer.h b/freedreno/freedreno_ringbuffer.h
index 69e7ed99..b2e8024d 100644
--- a/freedreno/freedreno_ringbuffer.h
+++ b/freedreno/freedreno_ringbuffer.h
@@ -53,6 +53,19 @@ struct fd_ringbuffer {
void *user;
uint32_t flags;
+
+ /* This is a bit gross, but we can't use atomic_t in exported
+ * headers. OTOH, we don't need the refcnt to be publicly
+ * visible. The only reason that this struct is exported is
+ * because fd_ringbuffer_emit needs to be something that can
+ * be inlined for performance reasons.
+ */
+ union {
+#ifdef HAS_ATOMIC_OPS
+ atomic_t refcnt;
+#endif
+ uint64_t __pad;
+ };
};
struct fd_ringbuffer * fd_ringbuffer_new(struct fd_pipe *pipe,
@@ -60,6 +73,7 @@ struct fd_ringbuffer * fd_ringbuffer_new(struct fd_pipe *pipe,
struct fd_ringbuffer * fd_ringbuffer_new_object(struct fd_pipe *pipe,
uint32_t size);
+struct fd_ringbuffer *fd_ringbuffer_ref(struct fd_ringbuffer *ring);
void fd_ringbuffer_del(struct fd_ringbuffer *ring);
void fd_ringbuffer_set_parent(struct fd_ringbuffer *ring,
struct fd_ringbuffer *parent);