diff --git a/src/freedreno/computerator/main.c b/src/freedreno/computerator/main.c index 6c4f14534c2..29bd6a73fab 100644 --- a/src/freedreno/computerator/main.c +++ b/src/freedreno/computerator/main.c @@ -281,7 +281,7 @@ main(int argc, char **argv) backend->emit_grid(kernel, grid, submit); - struct fd_submit_fence fence = {}; + struct fd_fence fence = {}; util_queue_fence_init(&fence.ready); fd_submit_flush(submit, -1, &fence); diff --git a/src/freedreno/drm/freedreno_drmif.h b/src/freedreno/drm/freedreno_drmif.h index e8fd0bbac79..ea857a2bcfb 100644 --- a/src/freedreno/drm/freedreno_drmif.h +++ b/src/freedreno/drm/freedreno_drmif.h @@ -32,6 +32,7 @@ #include "util/bitset.h" #include "util/list.h" #include "util/u_debug.h" +#include "util/u_queue.h" #ifdef __cplusplus extern "C" { @@ -83,6 +84,10 @@ fd_fence_after(uint32_t a, uint32_t b) } /** + * Encapsulates submit out-fence(s), which consist of a 'timestamp' (per- + * pipe (submitqueue) sequence number) and optionally, if requested, an + * out-fence-fd + * * Per submit, there are actually two fences: * 1) The userspace maintained fence, which is used to optimistically * avoid kernel ioctls to query if specific rendering is completed @@ -94,8 +99,21 @@ fd_fence_after(uint32_t a, uint32_t b) * fd_pipe_wait(). So this struct encapsulates the two. */ struct fd_fence { + /** + * The ready fence is signaled once the submit is actually flushed down + * to the kernel, and fence/fence_fd are populated. You must wait for + * this fence to be signaled before reading fence/fence_fd. + */ + struct util_queue_fence ready; + uint32_t kfence; /* kernel fence */ uint32_t ufence; /* userspace fence */ + + /** + * Optional dma_fence fd, returned by submit if use_fence_fd is true + */ + int fence_fd; + bool use_fence_fd; }; /* diff --git a/src/freedreno/drm/freedreno_priv.h b/src/freedreno/drm/freedreno_priv.h index 62fc182ba97..8f83030b31e 100644 --- a/src/freedreno/drm/freedreno_priv.h +++ b/src/freedreno/drm/freedreno_priv.h @@ -293,7 +293,7 @@ struct fd_submit_funcs { uint32_t size, enum fd_ringbuffer_flags flags); int (*flush)(struct fd_submit *submit, int in_fence_fd, - struct fd_submit_fence *out_fence); + struct fd_fence *out_fence); void (*destroy)(struct fd_submit *submit); }; diff --git a/src/freedreno/drm/freedreno_ringbuffer.c b/src/freedreno/drm/freedreno_ringbuffer.c index 5a811ad619a..90d045c62a0 100644 --- a/src/freedreno/drm/freedreno_ringbuffer.c +++ b/src/freedreno/drm/freedreno_ringbuffer.c @@ -62,7 +62,7 @@ fd_submit_ref(struct fd_submit *submit) int fd_submit_flush(struct fd_submit *submit, int in_fence_fd, - struct fd_submit_fence *out_fence) + struct fd_fence *out_fence) { submit->fence = fd_pipe_emit_fence(submit->pipe, submit->primary); return submit->funcs->flush(submit, in_fence_fd, out_fence); diff --git a/src/freedreno/drm/freedreno_ringbuffer.h b/src/freedreno/drm/freedreno_ringbuffer.h index 5b452343e7b..a72d6c54f58 100644 --- a/src/freedreno/drm/freedreno_ringbuffer.h +++ b/src/freedreno/drm/freedreno_ringbuffer.h @@ -30,7 +30,6 @@ #include #include "util/u_atomic.h" #include "util/u_debug.h" -#include "util/u_queue.h" #include "adreno_common.xml.h" #include "adreno_pm4.xml.h" @@ -93,33 +92,11 @@ struct fd_ringbuffer *fd_submit_new_ringbuffer(struct fd_submit *submit, uint32_t size, enum fd_ringbuffer_flags flags); -/** - * Encapsulates submit out-fence(s), which consist of a 'timestamp' (per- - * pipe (submitqueue) sequence number) and optionally, if requested, an - * out-fence-fd - */ -struct fd_submit_fence { - /** - * The ready fence is signaled once the submit is actually flushed down - * to the kernel, and fence/fence_fd are populated. You must wait for - * this fence to be signaled before reading fence/fence_fd. - */ - struct util_queue_fence ready; - - struct fd_fence fence; - - /** - * Optional dma_fence fd, returned by submit if use_fence_fd is true - */ - int fence_fd; - bool use_fence_fd; -}; - /* in_fence_fd: -1 for no in-fence, else fence fd * out_fence can be NULL if no output fence is required */ int fd_submit_flush(struct fd_submit *submit, int in_fence_fd, - struct fd_submit_fence *out_fence); + struct fd_fence *out_fence); struct fd_ringbuffer; struct fd_reloc; diff --git a/src/freedreno/drm/freedreno_ringbuffer_sp.c b/src/freedreno/drm/freedreno_ringbuffer_sp.c index d8459be98c8..93cd6cf3e82 100644 --- a/src/freedreno/drm/freedreno_ringbuffer_sp.c +++ b/src/freedreno/drm/freedreno_ringbuffer_sp.c @@ -166,7 +166,7 @@ fd_submit_sp_new_ringbuffer(struct fd_submit *submit, uint32_t size, */ static bool fd_submit_sp_flush_prep(struct fd_submit *submit, int in_fence_fd, - struct fd_submit_fence *out_fence) + struct fd_fence *out_fence) { struct fd_submit_sp *fd_submit = to_fd_submit_sp(submit); bool has_shared = false; @@ -268,7 +268,7 @@ should_defer(struct fd_submit *submit) static int fd_submit_sp_flush(struct fd_submit *submit, int in_fence_fd, - struct fd_submit_fence *out_fence) + struct fd_fence *out_fence) { struct fd_device *dev = submit->pipe->dev; struct fd_pipe *pipe = submit->pipe; diff --git a/src/freedreno/drm/freedreno_ringbuffer_sp.h b/src/freedreno/drm/freedreno_ringbuffer_sp.h index 49e27fd1dc6..2a2cb099333 100644 --- a/src/freedreno/drm/freedreno_ringbuffer_sp.h +++ b/src/freedreno/drm/freedreno_ringbuffer_sp.h @@ -67,7 +67,7 @@ struct fd_submit_sp { * of submits to merge: */ int in_fence_fd; - struct fd_submit_fence *out_fence; + struct fd_fence *out_fence; /* State for enqueued submits: */ diff --git a/src/freedreno/drm/msm/msm_ringbuffer.c b/src/freedreno/drm/msm/msm_ringbuffer.c index 8a09379430d..8caba381678 100644 --- a/src/freedreno/drm/msm/msm_ringbuffer.c +++ b/src/freedreno/drm/msm/msm_ringbuffer.c @@ -267,7 +267,7 @@ handle_stateobj_relocs(struct msm_submit *submit, struct msm_ringbuffer *ring) static int msm_submit_flush(struct fd_submit *submit, int in_fence_fd, - struct fd_submit_fence *out_fence) + struct fd_fence *out_fence) { struct msm_submit *msm_submit = to_msm_submit(submit); struct msm_pipe *msm_pipe = to_msm_pipe(submit->pipe); @@ -370,8 +370,8 @@ msm_submit_flush(struct fd_submit *submit, int in_fence_fd, ERROR_MSG("submit failed: %d (%s)", ret, strerror(errno)); msm_dump_submit(&req); } else if (!ret && out_fence) { - out_fence->fence.kfence = req.fence; - out_fence->fence.ufence = submit->fence; + out_fence->kfence = req.fence; + out_fence->ufence = submit->fence; out_fence->fence_fd = req.fence_fd; } diff --git a/src/freedreno/drm/msm/msm_ringbuffer_sp.c b/src/freedreno/drm/msm/msm_ringbuffer_sp.c index fb1869cdaa6..abdbff41429 100644 --- a/src/freedreno/drm/msm/msm_ringbuffer_sp.c +++ b/src/freedreno/drm/msm/msm_ringbuffer_sp.c @@ -151,8 +151,8 @@ flush_submit_list(struct list_head *submit_list) ERROR_MSG("submit failed: %d (%s)", ret, strerror(errno)); msm_dump_submit(&req); } else if (!ret && fd_submit->out_fence) { - fd_submit->out_fence->fence.kfence = req.fence; - fd_submit->out_fence->fence.ufence = fd_submit->base.fence; + fd_submit->out_fence->kfence = req.fence; + fd_submit->out_fence->ufence = fd_submit->base.fence; fd_submit->out_fence->fence_fd = req.fence_fd; } diff --git a/src/freedreno/drm/virtio/virtio_ringbuffer.c b/src/freedreno/drm/virtio/virtio_ringbuffer.c index 7beaa0b4c73..6d6bb030feb 100644 --- a/src/freedreno/drm/virtio/virtio_ringbuffer.c +++ b/src/freedreno/drm/virtio/virtio_ringbuffer.c @@ -174,12 +174,12 @@ flush_submit_list(struct list_head *submit_list) memcpy(req->payload, submit_bos, bos_len); memcpy(req->payload + bos_len, cmds, cmd_len); - struct fd_submit_fence *out_fence = fd_submit->out_fence; + struct fd_fence *out_fence = fd_submit->out_fence; int *out_fence_fd = NULL; if (out_fence) { - out_fence->fence.kfence = kfence; - out_fence->fence.ufence = fd_submit->base.fence; + out_fence->kfence = kfence; + out_fence->ufence = fd_submit->base.fence; /* Even if gallium driver hasn't requested a fence-fd, request one. * This way, if we have to block waiting for the fence, we can do * it in the guest, rather than in the single-threaded host. diff --git a/src/freedreno/ds/fd_pps_driver.cc b/src/freedreno/ds/fd_pps_driver.cc index 57a32f50c5c..a364008b4cc 100644 --- a/src/freedreno/ds/fd_pps_driver.cc +++ b/src/freedreno/ds/fd_pps_driver.cc @@ -412,7 +412,7 @@ FreedrenoDriver::configure_counters(bool reset, bool wait) for (const auto &countable : countables) countable.configure(ring, reset); - struct fd_submit_fence fence = {}; + struct fd_fence fence = {}; util_queue_fence_init(&fence.ready); fd_submit_flush(submit, -1, &fence); @@ -423,7 +423,7 @@ FreedrenoDriver::configure_counters(bool reset, bool wait) fd_submit_del(submit); if (wait) - fd_pipe_wait(pipe, &fence.fence); + fd_pipe_wait(pipe, &fence); } /** diff --git a/src/freedreno/perfcntrs/fdperf.c b/src/freedreno/perfcntrs/fdperf.c index 407fdda24c8..f14aa17dbcb 100644 --- a/src/freedreno/perfcntrs/fdperf.c +++ b/src/freedreno/perfcntrs/fdperf.c @@ -194,7 +194,7 @@ flush_ring(void) if (!dev.submit) return; - struct fd_submit_fence fence = {}; + struct fd_fence fence = {}; util_queue_fence_init(&fence.ready); ret = fd_submit_flush(dev.submit, -1, &fence); diff --git a/src/gallium/drivers/freedreno/freedreno_fence.c b/src/gallium/drivers/freedreno/freedreno_fence.c index 35380518c81..ba6a8d0cf6e 100644 --- a/src/gallium/drivers/freedreno/freedreno_fence.c +++ b/src/gallium/drivers/freedreno/freedreno_fence.c @@ -150,7 +150,7 @@ fd_fence_finish(struct pipe_screen *pscreen, struct pipe_context *pctx, return ret == 0; } - if (fd_pipe_wait_timeout(fence->pipe, &fence->submit_fence.fence, timeout)) + if (fd_pipe_wait_timeout(fence->pipe, &fence->submit_fence, timeout)) return false; return true; diff --git a/src/gallium/drivers/freedreno/freedreno_fence.h b/src/gallium/drivers/freedreno/freedreno_fence.h index 4d9efb8c234..99b13dc19fb 100644 --- a/src/gallium/drivers/freedreno/freedreno_fence.h +++ b/src/gallium/drivers/freedreno/freedreno_fence.h @@ -73,7 +73,7 @@ struct pipe_fence_handle { struct fd_context *ctx; struct fd_pipe *pipe; struct fd_screen *screen; - struct fd_submit_fence submit_fence; + struct fd_fence submit_fence; uint32_t syncobj; };