From c7dc5cf3cb3b9f4c73d51f234e3c09dc4eca22a5 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Sat, 17 Apr 2021 12:09:42 -0700 Subject: [PATCH] freedreno/drm/sp: Split submit prep and finish For deferred submits, we still need to do the prep steps immediately, but the ioctl construction can be deferred.. prepare for that by splitting the prep out. Signed-off-by: Rob Clark Part-of: --- src/freedreno/drm/msm_ringbuffer_sp.c | 46 +++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/src/freedreno/drm/msm_ringbuffer_sp.c b/src/freedreno/drm/msm_ringbuffer_sp.c index 4d2a304..e6c8418 100644 --- a/src/freedreno/drm/msm_ringbuffer_sp.c +++ b/src/freedreno/drm/msm_ringbuffer_sp.c @@ -204,9 +204,37 @@ msm_submit_sp_new_ringbuffer(struct fd_submit *submit, uint32_t size, return &msm_ring->base; } +/** + * Prepare submit for flush, always done synchronously. + * + * 1) Finalize primary ringbuffer, at this point no more cmdstream may + * be written into it, since from the PoV of the upper level driver + * the submit is flushed, even if deferred + * 2) Add cmdstream bos to bos table + * 3) Update bo fences + */ +static void +msm_submit_sp_flush_prep(struct fd_submit *submit) +{ + struct msm_submit_sp *msm_submit = to_msm_submit_sp(submit); + + finalize_current_cmd(submit->primary); + + struct msm_ringbuffer_sp *primary = + to_msm_ringbuffer_sp(submit->primary); + + for (unsigned i = 0; i < primary->u.nr_cmds; i++) + msm_submit_append_bo(msm_submit, primary->u.cmds[i].ring_bo); + + simple_mtx_lock(&table_lock); + for (unsigned i = 0; i < msm_submit->nr_bos; i++) + fd_bo_add_fence(msm_submit->bos[i], submit->pipe, submit->fence); + simple_mtx_unlock(&table_lock); +} + static int -msm_submit_sp_flush(struct fd_submit *submit, int in_fence_fd, - struct fd_submit_fence *out_fence) +msm_submit_sp_flush_finish(struct fd_submit *submit, int in_fence_fd, + struct fd_submit_fence *out_fence) { struct msm_submit_sp *msm_submit = to_msm_submit_sp(submit); struct msm_pipe *msm_pipe = to_msm_pipe(submit->pipe); @@ -216,8 +244,6 @@ msm_submit_sp_flush(struct fd_submit *submit, int in_fence_fd, }; int ret; - finalize_current_cmd(submit->primary); - struct msm_ringbuffer_sp *primary = to_msm_ringbuffer_sp(submit->primary); struct drm_msm_gem_submit_cmd cmds[primary->u.nr_cmds]; @@ -257,14 +283,11 @@ msm_submit_sp_flush(struct fd_submit *submit, int in_fence_fd, submit_bos = malloc(msm_submit->nr_bos * sizeof(submit_bos[0])); } - simple_mtx_lock(&table_lock); for (unsigned i = 0; i < msm_submit->nr_bos; i++) { submit_bos[i].flags = msm_submit->bos[i]->flags; submit_bos[i].handle = msm_submit->bos[i]->handle; submit_bos[i].presumed = 0; - fd_bo_add_fence(msm_submit->bos[i], submit->pipe, submit->fence); } - simple_mtx_unlock(&table_lock); req.bos = VOID2U64(submit_bos), req.nr_bos = msm_submit->nr_bos; req.cmds = VOID2U64(cmds), req.nr_cmds = primary->u.nr_cmds; @@ -288,6 +311,15 @@ msm_submit_sp_flush(struct fd_submit *submit, int in_fence_fd, return ret; } +static int +msm_submit_sp_flush(struct fd_submit *submit, int in_fence_fd, + struct fd_submit_fence *out_fence) +{ + msm_submit_sp_flush_prep(submit); + + return msm_submit_sp_flush_finish(submit, in_fence_fd, out_fence); +} + static void msm_submit_sp_destroy(struct fd_submit *submit) { -- 2.7.4