aboutsummaryrefslogtreecommitdiffstats
path: root/src/mesa/state_tracker/st_cb_syncobj.c
diff options
context:
space:
mode:
authorNicolai Hähnle <[email protected]>2017-11-09 14:34:19 +0100
committerNicolai Hähnle <[email protected]>2017-11-20 18:15:07 +0100
commit2d8b82baaad43a41d076a5273ac0de3c03cc5a55 (patch)
treea2a5ac130253a983ed9ddee7fdd25ebf6977dc84 /src/mesa/state_tracker/st_cb_syncobj.c
parentce470af0b1bcb276c22dd04e627ab665e10619f7 (diff)
st/mesa: implement st_server_wait_sync properly
Asynchronous flushes require a proper implementation of st_server_wait_sync, because we could have the following with threaded Gallium: Context 1 app Context 1 driver Context 2 ------------- ---------------- --------- f = glFenceSync glFlush <-- app sync --> <-- app sync --> glWaitSync(f) .. draw calls .. pipe_context::flush for glFenceSync pipe_context::flush for glFlush Reviewed-by: Andres Rodriguez <[email protected]> Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/mesa/state_tracker/st_cb_syncobj.c')
-rw-r--r--src/mesa/state_tracker/st_cb_syncobj.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/mesa/state_tracker/st_cb_syncobj.c b/src/mesa/state_tracker/st_cb_syncobj.c
index 637fbe3b73a..44323b4750a 100644
--- a/src/mesa/state_tracker/st_cb_syncobj.c
+++ b/src/mesa/state_tracker/st_cb_syncobj.c
@@ -130,8 +130,30 @@ static void st_server_wait_sync(struct gl_context *ctx,
struct gl_sync_object *obj,
GLbitfield flags, GLuint64 timeout)
{
- /* NO-OP.
- * Neither Gallium nor DRM interfaces support blocking on the GPU. */
+ struct pipe_context *pipe = st_context(ctx)->pipe;
+ struct pipe_screen *screen = pipe->screen;
+ struct st_sync_object *so = (struct st_sync_object*)obj;
+ struct pipe_fence_handle *fence = NULL;
+
+ /* Nothing needs to be done here if the driver does not support async
+ * flushes. */
+ if (!pipe->fence_server_sync)
+ return;
+
+ /* If the fence doesn't exist, assume it's signalled. */
+ mtx_lock(&so->mutex);
+ if (!so->fence) {
+ mtx_unlock(&so->mutex);
+ so->b.StatusFlag = GL_TRUE;
+ return;
+ }
+
+ /* We need a local copy of the fence pointer. */
+ screen->fence_reference(screen, &fence, so->fence);
+ mtx_unlock(&so->mutex);
+
+ pipe->fence_server_sync(pipe, fence);
+ screen->fence_reference(screen, &fence, NULL);
}
void st_init_syncobj_functions(struct dd_function_table *functions)