diff options
author | Nicolai Hähnle <[email protected]> | 2017-11-09 14:34:19 +0100 |
---|---|---|
committer | Nicolai Hähnle <[email protected]> | 2017-11-20 18:15:07 +0100 |
commit | 2d8b82baaad43a41d076a5273ac0de3c03cc5a55 (patch) | |
tree | a2a5ac130253a983ed9ddee7fdd25ebf6977dc84 /src/mesa/state_tracker/st_cb_syncobj.c | |
parent | ce470af0b1bcb276c22dd04e627ab665e10619f7 (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.c | 26 |
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) |