iris: Fix export of fences that have already completed.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 19 Dec 2019 21:51:07 +0000 (13:51 -0800)
committerKristian H. Kristensen <hoegsberg@google.com>
Wed, 15 Jan 2020 22:47:46 +0000 (14:47 -0800)
commite9f9a944d3497f892ec92994197c9442ac9ee324
tree0181af51596cd8974367a9f3829898f24f9a250a
parent6b9fce5d9eb7d2f3eb56083d0d440e099b0e001a
iris: Fix export of fences that have already completed.

After flushing batches, iris_fence_flush() asks the kernel whether
each batch's last_syncpt has already signalled or not.  (The idea is
that either the compute or render batch may not have actually had any
work queued up, so last_syncpt there might have been signalled a long
time ago.)  If it's already completed, we don't bother to record it.

A strange corner is the case of repeated flushes.  For example, we
might flush for some reason, and hit a glFlush(), and hit SwapBuffers.
It's possible for all the batches to have been flushed previously, -and-
for them to have actually completed.  In this case, we'll see that there
are no syncobj's to wait on, and record fence->count == 0.

This works fine internally - fence_finish can see count == 0 and realize
that it doesn't need to wait, for example.  But when working with native
FDs, we may be asked to export a fence with count == 0.  So we need an
actual synchronization primitive we can hand off.  Because all of the
relevant batches had been signalled when creating the fence, we want the
new dummy fence to be signalled as well.

So we just make a signalled syncobj and export it.

Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
src/gallium/drivers/iris/iris_fence.c