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@collabora.com> Reviewed-by: Roland Scheidegger <sroland@vmware.com> (v1) Reviewed-by: Gustaw Smolarczyk <wielkiegie@gmail.com>
This commit is contained in:
parent
bd0c4e360d
commit
5b284fe6bc
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue