[Mesa-dev] [PATCH v2 2/9] anv: Submit a dummy batch when only semaphores are provided.
Jason Ekstrand
jason at jlekstrand.net
Fri Aug 4 16:20:08 UTC 2017
On Fri, Aug 4, 2017 at 1:43 AM, Chris Wilson <chris at chris-wilson.co.uk>
wrote:
> Quoting Jason Ekstrand (2017-08-04 02:25:21)
> > Vulkan allows you to do a submit whose only job is to wait on and
> > trigger semaphores. The easiest way for us to support that right
> > now is to insert a dummy execbuf.
> > ---
> > diff --git a/src/intel/vulkan/anv_device.c
> b/src/intel/vulkan/anv_device.c
> > index 793e519..0f0aa22 100644
> > --- a/src/intel/vulkan/anv_device.c
> > +++ b/src/intel/vulkan/anv_device.c
> > @@ -1014,6 +1014,28 @@ anv_device_init_border_colors(struct anv_device
> *device)
> > border_colors);
> > }
> >
> > +static void
> > +anv_device_init_trivial_batch(struct anv_device *device)
> > +{
> > + anv_bo_init_new(&device->trivial_batch_bo, device, 4096);
>
> Is this created with ASYNC?
No, it isn't but I'm happy to set the flag. This patch predates the ASYNC
stuff, I believe.
Just thinking that you only want the
> external ordering constraints on this bo, and not accidentally serialize
> between contexts.
>
Is this really an issue? No other process will ever see this BO. I
suppose the kernel is still doing unneeded flushing but this shouldn't
cause cross-context synchronization.
> > + void *map = anv_gem_mmap(device, device->trivial_batch_bo.gem_
> handle,
> > + 0, 4096, 0);
> > +
> > + struct anv_batch batch = {
> > + .start = map,
> > + .next = map,
> > + .end = map + 4096,
> > + };
> > +
> > + anv_batch_emit(&batch, GEN7_MI_BATCH_BUFFER_END, bbe);
> > + anv_batch_emit(&batch, GEN7_MI_NOOP, noop);
> > +
> > + if (!device->info.has_llc)
> > + gen_clflush_range(map, batch.next - map);
> > +
> > + anv_gem_munmap(map, device->trivial_batch_bo.size);
> > +}
>
> > diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_
> private.h
> > index b599db3..bc67bb6 100644
> > --- a/src/intel/vulkan/anv_private.h
> > +++ b/src/intel/vulkan/anv_private.h
> > @@ -745,6 +745,7 @@ struct anv_device {
> > struct anv_state_pool surface_state_pool;
> >
> > struct anv_bo workaround_bo;
> > + struct anv_bo trivial_batch_bo;
>
> Do you use all 4096 bytes of the workaround_bo, or could you spare 64?
> ;)
>
I could... Then again, I can also easily spare a single 4K page per context
and prevent myself from accidentally overwriting my little batch. :-)
> > diff --git a/src/intel/vulkan/anv_queue.c b/src/intel/vulkan/anv_queue.c
> > index 446c3de..9934fef 100644
> > --- a/src/intel/vulkan/anv_queue.c
> > +++ b/src/intel/vulkan/anv_queue.c
> > @@ -159,6 +159,23 @@ VkResult anv_QueueSubmit(
> > pthread_mutex_lock(&device->mutex);
> >
> > for (uint32_t i = 0; i < submitCount; i++) {
> > + if (pSubmits[i].commandBufferCount == 0) {
> > + /* If we don't have any command buffers, we need to submit a
> dummy
> > + * batch to give GEM something to wait on. We could,
> potentially,
> > + * come up with something more efficient but this shouldn't be
> a
> > + * common case.
> > + */
> > + result = anv_cmd_buffer_execbuf(device, NULL,
> > + pSubmits[i].pWaitSemaphores,
> > + pSubmits[i].
> waitSemaphoreCount,
> > + pSubmits[i].pSignalSemaphores,
> > + pSubmits[i].
> signalSemaphoreCount);
>
> Might as well just pass &pSubmits[i] along?
>
I can't. See below where we only pass the wait semaphores to the first
execbuf in the batch and only pass the signal semaphores to the last.
--Jason
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170804/fb0f9abe/attachment.html>
More information about the mesa-dev
mailing list