Mesa (master): llvmpipe: add lp_fence_timedwait() helper

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Apr 26 10:27:06 UTC 2019


Module: Mesa
Branch: master
Commit: 5b284fe6bc0a2a5c2d9e5da09a5b86ff8912e474
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5b284fe6bc0a2a5c2d9e5da09a5b86ff8912e474

Author: Emil Velikov <emil.l.velikov at gmail.com>
Date:   Thu Apr 25 18:42:02 2019 +0100

llvmpipe: add lp_fence_timedwait() helper

The function is analogous to lp_fence_wait() while taking at timeout
(ns) parameter, as needed for EGL fence/sync.

v2:
 - use absolute UTC time, as per spec (Gustaw)
 - bail out on cnd_timedwait() failure (Gustaw)

v3:
 - check count/rank under mutex (Gustaw)

Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
Reviewed-by: Roland Scheidegger <sroland at vmware.com> (v1)
Reviewed-by: Gustaw Smolarczyk <wielkiegie at gmail.com>

---

 src/gallium/drivers/llvmpipe/lp_fence.c | 29 +++++++++++++++++++++++++++++
 src/gallium/drivers/llvmpipe/lp_fence.h |  3 +++
 2 files changed, 32 insertions(+)

diff --git a/src/gallium/drivers/llvmpipe/lp_fence.c b/src/gallium/drivers/llvmpipe/lp_fence.c
index 20cd91cd63d..00cd79d6ba6 100644
--- a/src/gallium/drivers/llvmpipe/lp_fence.c
+++ b/src/gallium/drivers/llvmpipe/lp_fence.c
@@ -125,3 +125,32 @@ lp_fence_wait(struct lp_fence *f)
 }
 
 
+boolean
+lp_fence_timedwait(struct lp_fence *f, uint64_t timeout)
+{
+   struct timespec ts;
+   int ret;
+
+   timespec_get(&ts, TIME_UTC);
+
+   ts.tv_nsec += timeout % 1000000000L;
+   ts.tv_sec += timeout / 1000000000L;
+   if (ts.tv_nsec >= 1000000000L) {
+      ts.tv_sec++;
+      ts.tv_nsec -= 1000000000L;
+   }
+
+   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);
+      if (ret != thrd_success)
+         break;
+   }
+   const boolean result = (f->count >= f->rank);
+   mtx_unlock(&f->mutex);
+   return result;
+}
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);
 




More information about the mesa-commit mailing list