From 65175df601003f5ba29dc9c088952f6454adc0d6 Mon Sep 17 00:00:00 2001 From: Sinclair Yeh Date: Wed, 3 May 2017 11:48:25 -0700 Subject: [PATCH] drivers/svga, winsys/svga/drm: Thread through timeout for fence_finish The timeout parameter is required to implement EGL_ANDROID_native_fence_sync. v2 * Replaced default timeout from 0 to PIPE_TIMEOUT_INFINITE * Add more documentation to the new timeout parameter Reviewed-by: Brian Paul Reviewed-by: Charmaine Lee --- src/gallium/drivers/svga/svga_pipe_query.c | 9 ++++++--- src/gallium/drivers/svga/svga_resource_texture.c | 4 ++-- src/gallium/drivers/svga/svga_screen.c | 2 +- src/gallium/drivers/svga/svga_winsys.h | 3 +++ src/gallium/winsys/svga/drm/vmw_fence.c | 4 +++- src/gallium/winsys/svga/drm/vmw_fence.h | 1 + src/gallium/winsys/svga/drm/vmw_screen_svga.c | 3 ++- 7 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/gallium/drivers/svga/svga_pipe_query.c b/src/gallium/drivers/svga/svga_pipe_query.c index 6703b729c6e..0490a4ab5fc 100644 --- a/src/gallium/drivers/svga/svga_pipe_query.c +++ b/src/gallium/drivers/svga/svga_pipe_query.c @@ -191,7 +191,8 @@ get_query_result_vgpu9(struct svga_context *svga, struct svga_query *sq, if (state == SVGA3D_QUERYSTATE_PENDING) { if (!wait) return FALSE; - sws->fence_finish(sws, sq->fence, SVGA_FENCE_FLAG_QUERY); + sws->fence_finish(sws, sq->fence, PIPE_TIMEOUT_INFINITE, + SVGA_FENCE_FLAG_QUERY); state = sq->queryResult->state; } @@ -651,7 +652,8 @@ get_query_result_vgpu10(struct svga_context *svga, struct svga_query *sq, queryState == SVGA3D_QUERYSTATE_NEW) { if (!wait) return FALSE; - sws->fence_finish(sws, sq->fence, SVGA_FENCE_FLAG_QUERY); + sws->fence_finish(sws, sq->fence, PIPE_TIMEOUT_INFINITE, + SVGA_FENCE_FLAG_QUERY); sws->query_get_result(sws, sq->gb_query, sq->offset, &queryState, result, resultLen); } @@ -1230,7 +1232,8 @@ svga_render_condition(struct pipe_context *pipe, struct pipe_query *q, if ((mode == PIPE_RENDER_COND_WAIT || mode == PIPE_RENDER_COND_BY_REGION_WAIT) && sq->fence) { - sws->fence_finish(sws, sq->fence, SVGA_FENCE_FLAG_QUERY); + sws->fence_finish(sws, sq->fence, PIPE_TIMEOUT_INFINITE, + SVGA_FENCE_FLAG_QUERY); } } /* diff --git a/src/gallium/drivers/svga/svga_resource_texture.c b/src/gallium/drivers/svga/svga_resource_texture.c index 5a684b7933b..5b82e9eb7b6 100644 --- a/src/gallium/drivers/svga/svga_resource_texture.c +++ b/src/gallium/drivers/svga/svga_resource_texture.c @@ -128,7 +128,7 @@ svga_transfer_dma(struct svga_context *svga, if (transfer == SVGA3D_READ_HOST_VRAM) { svga_context_flush(svga, &fence); - sws->fence_finish(sws, fence, 0); + sws->fence_finish(sws, fence, PIPE_TIMEOUT_INFINITE, 0); sws->fence_reference(sws, &fence, NULL); } } @@ -187,7 +187,7 @@ svga_transfer_dma(struct svga_context *svga, if (transfer == SVGA3D_READ_HOST_VRAM) { svga_context_flush(svga, &fence); - sws->fence_finish(sws, fence, 0); + sws->fence_finish(sws, fence, PIPE_TIMEOUT_INFINITE, 0); hw = sws->buffer_map(sws, st->hwbuf, PIPE_TRANSFER_READ); assert(hw); diff --git a/src/gallium/drivers/svga/svga_screen.c b/src/gallium/drivers/svga/svga_screen.c index f40d151af5d..1368267d962 100644 --- a/src/gallium/drivers/svga/svga_screen.c +++ b/src/gallium/drivers/svga/svga_screen.c @@ -854,7 +854,7 @@ svga_fence_finish(struct pipe_screen *screen, SVGA_DBG(DEBUG_DMA|DEBUG_PERF, "%s fence_ptr %p\n", __FUNCTION__, fence); - retVal = sws->fence_finish(sws, fence, 0) == 0; + retVal = sws->fence_finish(sws, fence, timeout, 0) == 0; } SVGA_STATS_TIME_POP(sws); diff --git a/src/gallium/drivers/svga/svga_winsys.h b/src/gallium/drivers/svga/svga_winsys.h index 7c2fb70a0af..c785b4f748a 100644 --- a/src/gallium/drivers/svga/svga_winsys.h +++ b/src/gallium/drivers/svga/svga_winsys.h @@ -625,11 +625,14 @@ struct svga_winsys_screen /** * Wait for the fence to finish. + * \param timeout in nanoseconds (may be PIPE_TIMEOUT_INFINITE). + * 0 to return immediately, if the API suports it. * \param flags driver-specific meaning * \return zero on success. */ int (*fence_finish)( struct svga_winsys_screen *sws, struct pipe_fence_handle *fence, + uint64_t timeout, unsigned flag ); diff --git a/src/gallium/winsys/svga/drm/vmw_fence.c b/src/gallium/winsys/svga/drm/vmw_fence.c index edf205e6239..5b1ba69930b 100644 --- a/src/gallium/winsys/svga/drm/vmw_fence.c +++ b/src/gallium/winsys/svga/drm/vmw_fence.c @@ -300,6 +300,7 @@ vmw_fence_signalled(struct vmw_winsys_screen *vws, * * @vws: Pointer to the winsys screen. * @fence: Handle to the fence object. + * @timeout: How long to wait before timing out. * @flag: Fence flags to wait for. If the fence object can't signal * a flag, it is assumed to be already signaled. * @@ -308,6 +309,7 @@ vmw_fence_signalled(struct vmw_winsys_screen *vws, int vmw_fence_finish(struct vmw_winsys_screen *vws, struct pipe_fence_handle *fence, + uint64_t timeout, unsigned flag) { struct vmw_fence *vfence; @@ -383,7 +385,7 @@ vmw_fence_ops_fence_finish(struct pb_fence_ops *ops, { struct vmw_winsys_screen *vws = vmw_fence_ops(ops)->vws; - return vmw_fence_finish(vws, fence, flag); + return vmw_fence_finish(vws, fence, PIPE_TIMEOUT_INFINITE, flag); } diff --git a/src/gallium/winsys/svga/drm/vmw_fence.h b/src/gallium/winsys/svga/drm/vmw_fence.h index f6381feaa2b..31e1350c316 100644 --- a/src/gallium/winsys/svga/drm/vmw_fence.h +++ b/src/gallium/winsys/svga/drm/vmw_fence.h @@ -43,6 +43,7 @@ vmw_fence_create(struct pb_fence_ops *fence_ops, int vmw_fence_finish(struct vmw_winsys_screen *vws, struct pipe_fence_handle *fence, + uint64_t timeout, unsigned flag); int vmw_fence_signalled(struct vmw_winsys_screen *vws, diff --git a/src/gallium/winsys/svga/drm/vmw_screen_svga.c b/src/gallium/winsys/svga/drm/vmw_screen_svga.c index 9312f88740c..46335378e0a 100644 --- a/src/gallium/winsys/svga/drm/vmw_screen_svga.c +++ b/src/gallium/winsys/svga/drm/vmw_screen_svga.c @@ -123,11 +123,12 @@ vmw_svga_winsys_fence_signalled(struct svga_winsys_screen *sws, static int vmw_svga_winsys_fence_finish(struct svga_winsys_screen *sws, struct pipe_fence_handle *fence, + uint64_t timeout, unsigned flag) { struct vmw_winsys_screen *vws = vmw_winsys_screen(sws); - return vmw_fence_finish(vws, fence, flag); + return vmw_fence_finish(vws, fence, timeout, flag); } -- 2.30.2