diff options
author | Pierre-Eric Pelloux-Prayer <[email protected]> | 2020-03-16 15:10:23 +0100 |
---|---|---|
committer | Marge Bot <[email protected]> | 2020-03-18 20:01:57 +0000 |
commit | e7f3a8d6959c74f63c877dd8776fe519d54f946f (patch) | |
tree | 46d5ae5fca87f067b7412be4c7b45a3be94c8cf4 | |
parent | 6ee971c8823d23e70ba34088fa5e9fd20eba2047 (diff) |
st/mesa: disallow deferred flush if there are multiple contexts
u_threaded can hang in these situation, with one context waiting on a
deferred fence from the other context.
But the other context isn't flushing its pending work (because it's waiting
for more work to pushed) so everything is stuck.
Fixes: d17b35e671a ("gallium: add PIPE_FLUSH_DEFERRED")
Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/1430
Reviewed-by: Marek Olšák <[email protected]>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4213>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4213>
-rw-r--r-- | src/mesa/state_tracker/st_cb_syncobj.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/mesa/state_tracker/st_cb_syncobj.c b/src/mesa/state_tracker/st_cb_syncobj.c index 48e7647b602..2cbbc580c8c 100644 --- a/src/mesa/state_tracker/st_cb_syncobj.c +++ b/src/mesa/state_tracker/st_cb_syncobj.c @@ -74,7 +74,8 @@ static void st_fence_sync(struct gl_context *ctx, struct gl_sync_object *obj, assert(condition == GL_SYNC_GPU_COMMANDS_COMPLETE && flags == 0); assert(so->fence == NULL); - pipe->flush(pipe, &so->fence, PIPE_FLUSH_DEFERRED); + /* Deferred flush are only allowed when there's a single context. See issue 1430 */ + pipe->flush(pipe, &so->fence, ctx->Shared->RefCount == 1 ? PIPE_FLUSH_DEFERRED : 0); } static void st_client_wait_sync(struct gl_context *ctx, |