Commit 5b284fe6 authored by Emil Velikov's avatar Emil Velikov
Browse files

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's avatarEmil Velikov <emil.velikov@collabora.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com> (v1)
Reviewed-by: Gustaw Smolarczyk's avatarGustaw Smolarczyk <wielkiegie@gmail.com>
parent bd0c4e36
......@@ -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;
}
......@@ -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);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment