[Mesa-dev] [PATCH 1/3] llvmpipe: add lp_fence_timedwait() helper

Gustaw Smolarczyk wielkiegie at gmail.com
Thu Apr 11 16:54:54 UTC 2019


czw., 11 kwi 2019 o 18:06 Emil Velikov <emil.l.velikov at gmail.com> napisaƂ(a):
>
> The function is analogous to lp_fence_wait() while taking at timeout
> (ns) parameter, as needed for EGL fence/sync.
>
> Cc: Roland Scheidegger <sroland at vmware.com>
> Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
> ---
>  src/gallium/drivers/llvmpipe/lp_fence.c | 22 ++++++++++++++++++++++
>  src/gallium/drivers/llvmpipe/lp_fence.h |  3 +++
>  2 files changed, 25 insertions(+)
>
> diff --git a/src/gallium/drivers/llvmpipe/lp_fence.c b/src/gallium/drivers/llvmpipe/lp_fence.c
> index 20cd91cd63d..f8b31a9d6a5 100644
> --- a/src/gallium/drivers/llvmpipe/lp_fence.c
> +++ b/src/gallium/drivers/llvmpipe/lp_fence.c
> @@ -125,3 +125,25 @@ lp_fence_wait(struct lp_fence *f)
>  }
>
>
> +boolean
> +lp_fence_timedwait(struct lp_fence *f, uint64_t timeout)
> +{
> +   struct timespec ts = {
> +      .tv_nsec = timeout % 1000000000L,
> +      .tv_sec = timeout / 1000000000L,
> +   };

According to the documentation [1] and looking at the implementation
in mesa [2], cnd_timedwait accepts an absolute time in UTC, not
duration. It seems that the fence_finish callback accepts duration.

[1] https://en.cppreference.com/w/c/thread/cnd_timedwait
[2] https://gitlab.freedesktop.org/mesa/mesa/blob/master/include/c11/threads_posix.h#L135

> +   int ret;
> +
> +   if (LP_DEBUG & DEBUG_FENCE)
> +      debug_printf("%s %d\n", __FUNCTION__, f->id);
> +
> +   mtx_lock(&f->mutex);
> +   assert(f->issued);
> +   while (f->count < f->rank) {
> +      ret = cnd_timedwait(&f->signalled, &f->mutex, &ts);

Shouldn't ret be checked for thrd_busy here as well? Otherwise, the
function will busy-wait after the timeout is reached instead of
returning.

Regards,
Gustaw Smolarczyk


> +   }
> +   mtx_unlock(&f->mutex);
> +   return ret == thrd_success;
> +}
> +
> +
> diff --git a/src/gallium/drivers/llvmpipe/lp_fence.h b/src/gallium/drivers/llvmpipe/lp_fence.h
> index b72026492c6..5ba746d22d1 100644
> --- a/src/gallium/drivers/llvmpipe/lp_fence.h
> +++ b/src/gallium/drivers/llvmpipe/lp_fence.h
> @@ -65,6 +65,9 @@ lp_fence_signalled(struct lp_fence *fence);
>  void
>  lp_fence_wait(struct lp_fence *fence);
>
> +boolean
> +lp_fence_timedwait(struct lp_fence *fence, uint64_t timeout);
> +
>  void
>  llvmpipe_init_screen_fence_funcs(struct pipe_screen *screen);
>
> --
> 2.20.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list