I think your issue is that you have self-releasing jobs with the cleanup callback and you automatically lose fences that way, so there is no way to wait for completion.
Since you have only 1 thread with N jobs at most, I suggest you keep N+1 fences around (a ring of fences) that you reuse for new jobs and keep a pointer to the most-recently-used fence. That way you know which fence you need to wait on to make the whole queue idle. Marek On Mon, Jul 18, 2016 at 10:25 PM, Rob Clark <robdcl...@gmail.com> wrote: > Helper to block until all previous jobs are complete. > --- > So I think this might end up being useful to me in some cases.. but > the implementation only works for a single threaded queue (which is > all I need). I could also just put a helper in my driver code. > > Opinions? > > src/gallium/auxiliary/util/u_queue.c | 12 ++++++++++++ > src/gallium/auxiliary/util/u_queue.h | 2 ++ > 2 files changed, 14 insertions(+) > > diff --git a/src/gallium/auxiliary/util/u_queue.c > b/src/gallium/auxiliary/util/u_queue.c > index 838464f..861faca 100644 > --- a/src/gallium/auxiliary/util/u_queue.c > +++ b/src/gallium/auxiliary/util/u_queue.c > @@ -242,3 +242,15 @@ util_queue_add_job(struct util_queue *queue, > pipe_condvar_signal(queue->has_queued_cond); > pipe_mutex_unlock(queue->lock); > } > + > +static void dummy_execute(void *job, int thread_index) {} > + > +/* blocks until all previously queued jobs complete: */ > +void util_queue_barrier(struct util_queue *queue) > +{ > + struct util_queue_fence fence; > + util_queue_fence_init(&fence); > + util_queue_add_job(queue, &fence /*dummy*/, &fence, dummy_execute, NULL); > + util_queue_job_wait(&fence); > + util_queue_fence_destroy(&fence); > +} > diff --git a/src/gallium/auxiliary/util/u_queue.h > b/src/gallium/auxiliary/util/u_queue.h > index 59646cc..8a22ee0 100644 > --- a/src/gallium/auxiliary/util/u_queue.h > +++ b/src/gallium/auxiliary/util/u_queue.h > @@ -85,6 +85,8 @@ void util_queue_add_job(struct util_queue *queue, > > void util_queue_job_wait(struct util_queue_fence *fence); > > +void util_queue_barrier(struct util_queue *queue); > + > /* util_queue needs to be cleared to zeroes for this to work */ > static inline bool > util_queue_is_initialized(struct util_queue *queue) > -- > 2.7.4 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev