diff --git a/src/freedreno/drm/freedreno_priv.h b/src/freedreno/drm/freedreno_priv.h index 006c968963c..ccdb637578f 100644 --- a/src/freedreno/drm/freedreno_priv.h +++ b/src/freedreno/drm/freedreno_priv.h @@ -138,6 +138,8 @@ struct fd_submit_funcs { struct fd_submit { struct fd_pipe *pipe; const struct fd_submit_funcs *funcs; + + struct fd_ringbuffer *primary; }; struct fd_bo_funcs { diff --git a/src/freedreno/drm/freedreno_ringbuffer.c b/src/freedreno/drm/freedreno_ringbuffer.c index bc747502070..291bd74e61c 100644 --- a/src/freedreno/drm/freedreno_ringbuffer.c +++ b/src/freedreno/drm/freedreno_ringbuffer.c @@ -39,6 +39,8 @@ fd_submit_new(struct fd_pipe *pipe) void fd_submit_del(struct fd_submit *submit) { + if (submit->primary) + fd_ringbuffer_del(submit->primary); return submit->funcs->destroy(submit); } @@ -46,6 +48,7 @@ int fd_submit_flush(struct fd_submit *submit, int in_fence_fd, int *out_fence_fd, uint32_t *out_fence) { + debug_assert(submit->primary); return submit->funcs->flush(submit, in_fence_fd, out_fence_fd, out_fence); } @@ -58,7 +61,15 @@ fd_submit_new_ringbuffer(struct fd_submit *submit, uint32_t size, debug_assert(!(flags & FD_RINGBUFFER_GROWABLE)); debug_assert(!(flags & FD_RINGBUFFER_PRIMARY)); } - return submit->funcs->new_ringbuffer(submit, size, flags); + struct fd_ringbuffer *ring = + submit->funcs->new_ringbuffer(submit, size, flags); + + if (flags & FD_RINGBUFFER_PRIMARY) { + debug_assert(!submit->primary); + submit->primary = fd_ringbuffer_ref(ring); + } + + return ring; } struct fd_ringbuffer * diff --git a/src/freedreno/drm/msm_ringbuffer.c b/src/freedreno/drm/msm_ringbuffer.c index 8095ab6c9b8..903997204bf 100644 --- a/src/freedreno/drm/msm_ringbuffer.c +++ b/src/freedreno/drm/msm_ringbuffer.c @@ -54,8 +54,6 @@ struct msm_submit { /* hash-set of associated rings: */ struct set *ring_set; - struct fd_ringbuffer *primary; - /* Allow for sub-allocation of stateobj ring buffers (ie. sharing * the same underlying bo).. * @@ -246,11 +244,6 @@ msm_submit_new_ringbuffer(struct fd_submit *submit, uint32_t size, if (!msm_ringbuffer_init(msm_ring, size, flags)) return NULL; - if (flags & FD_RINGBUFFER_PRIMARY) { - debug_assert(!msm_submit->primary); - msm_submit->primary = fd_ringbuffer_ref(&msm_ring->base); - } - return &msm_ring->base; } @@ -285,10 +278,8 @@ msm_submit_flush(struct fd_submit *submit, int in_fence_fd, int *out_fence_fd, }; int ret; - debug_assert(msm_submit->primary); - - finalize_current_cmd(msm_submit->primary); - append_ring(msm_submit->ring_set, msm_submit->primary); + finalize_current_cmd(submit->primary); + append_ring(msm_submit->ring_set, submit->primary); unsigned nr_cmds = 0; unsigned nr_objs = 0; @@ -299,7 +290,7 @@ msm_submit_flush(struct fd_submit *submit, int in_fence_fd, int *out_fence_fd, nr_cmds += 1; nr_objs += 1; } else { - if (ring != msm_submit->primary) + if (ring != submit->primary) finalize_current_cmd(ring); nr_cmds += to_msm_ringbuffer(ring)->u.nr_cmds; } @@ -399,8 +390,6 @@ msm_submit_destroy(struct fd_submit *submit) { struct msm_submit *msm_submit = to_msm_submit(submit); - if (msm_submit->primary) - fd_ringbuffer_del(msm_submit->primary); if (msm_submit->suballoc_ring) fd_ringbuffer_del(msm_submit->suballoc_ring); diff --git a/src/freedreno/drm/msm_ringbuffer_sp.c b/src/freedreno/drm/msm_ringbuffer_sp.c index b078e602513..71e9af60692 100644 --- a/src/freedreno/drm/msm_ringbuffer_sp.c +++ b/src/freedreno/drm/msm_ringbuffer_sp.c @@ -50,8 +50,6 @@ struct msm_submit_sp { struct slab_child_pool ring_pool; - struct fd_ringbuffer *primary; - /* Allow for sub-allocation of stateobj ring buffers (ie. sharing * the same underlying bo).. * @@ -203,11 +201,6 @@ msm_submit_sp_new_ringbuffer(struct fd_submit *submit, uint32_t size, if (!msm_ringbuffer_sp_init(msm_ring, size, flags)) return NULL; - if (flags & FD_RINGBUFFER_PRIMARY) { - debug_assert(!msm_submit->primary); - msm_submit->primary = fd_ringbuffer_ref(&msm_ring->base); - } - return &msm_ring->base; } @@ -223,11 +216,10 @@ msm_submit_sp_flush(struct fd_submit *submit, int in_fence_fd, }; int ret; - debug_assert(msm_submit->primary); - finalize_current_cmd(msm_submit->primary); + finalize_current_cmd(submit->primary); struct msm_ringbuffer_sp *primary = - to_msm_ringbuffer_sp(msm_submit->primary); + to_msm_ringbuffer_sp(submit->primary); struct drm_msm_gem_submit_cmd cmds[primary->u.nr_cmds]; for (unsigned i = 0; i < primary->u.nr_cmds; i++) { @@ -298,8 +290,6 @@ msm_submit_sp_destroy(struct fd_submit *submit) { struct msm_submit_sp *msm_submit = to_msm_submit_sp(submit); - if (msm_submit->primary) - fd_ringbuffer_del(msm_submit->primary); if (msm_submit->suballoc_ring) fd_ringbuffer_del(msm_submit->suballoc_ring);