freedreno: use fd_pipe_wait_timeout()

To properly support the case of waiting on a fence with a 0 timeout, we
still need to call down to the kernel.  Which requires the use of the
new fd_pipe_wait_timeout() API.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
This commit is contained in:
Rob Clark 2015-08-18 15:07:02 -04:00
parent fd7a14f8dd
commit 4a0bea3863
3 changed files with 2 additions and 22 deletions

View File

@ -74,7 +74,7 @@ LIBDRM_AMDGPU_REQUIRED=2.4.63
LIBDRM_INTEL_REQUIRED=2.4.61
LIBDRM_NVVIEUX_REQUIRED=2.4.33
LIBDRM_NOUVEAU_REQUIRED=2.4.62
LIBDRM_FREEDRENO_REQUIRED=2.4.57
LIBDRM_FREEDRENO_REQUIRED=2.4.64
DRI2PROTO_REQUIRED=2.6
DRI3PROTO_REQUIRED=1.0
PRESENTPROTO_REQUIRED=1.0

View File

@ -50,29 +50,11 @@ fd_screen_fence_ref(struct pipe_screen *pscreen,
*ptr = pfence;
}
/* TODO we need to spiff out libdrm_freedreno a bit to allow passing
* the timeout.. and maybe a better way to check if fence has been
* signaled. The current implementation is a bit lame for now to
* avoid bumping libdrm version requirement.
*/
boolean fd_screen_fence_signalled(struct pipe_screen *screen,
struct pipe_fence_handle *fence)
{
uint32_t timestamp = fd_ringbuffer_timestamp(fence->ctx->ring);
/* TODO util helper for compare w/ rollover? */
return timestamp >= fence->timestamp;
}
boolean fd_screen_fence_finish(struct pipe_screen *screen,
struct pipe_fence_handle *fence,
uint64_t timeout)
{
if (!timeout)
return fd_screen_fence_signalled(screen, fence);
if (fd_pipe_wait(fence->screen->pipe, fence->timestamp))
if (fd_pipe_wait_timeout(fence->screen->pipe, fence->timestamp, timeout))
return false;
return true;

View File

@ -34,8 +34,6 @@
void fd_screen_fence_ref(struct pipe_screen *pscreen,
struct pipe_fence_handle **ptr,
struct pipe_fence_handle *pfence);
boolean fd_screen_fence_signalled(struct pipe_screen *screen,
struct pipe_fence_handle *pfence);
boolean fd_screen_fence_finish(struct pipe_screen *screen,
struct pipe_fence_handle *pfence,
uint64_t timeout);