From: Pierre-Eric Pelloux-Prayer Date: Mon, 16 Mar 2020 14:10:23 +0000 (+0100) Subject: st/mesa: disallow deferred flush if there are multiple contexts X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e7f3a8d6959c74f63c877dd8776fe519d54f946f;p=mesa.git 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 Tested-by: Marge Bot Part-of: --- 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,