freedreno/drm/sp: Split submit prep and finish
authorRob Clark <robdclark@chromium.org>
Sat, 17 Apr 2021 19:09:42 +0000 (12:09 -0700)
committerMarge Bot <eric+marge@anholt.net>
Wed, 28 Apr 2021 15:36:42 +0000 (15:36 +0000)
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 <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10444>

src/freedreno/drm/msm_ringbuffer_sp.c

index 4d2a304..e6c8418 100644 (file)
@@ -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)
 {