From: Marek Olšák <marek.ol...@amd.com> for deferred flushes --- src/mesa/state_tracker/st_cb_syncobj.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-)
diff --git a/src/mesa/state_tracker/st_cb_syncobj.c b/src/mesa/state_tracker/st_cb_syncobj.c index 1fa1403..123925a 100644 --- a/src/mesa/state_tracker/st_cb_syncobj.c +++ b/src/mesa/state_tracker/st_cb_syncobj.c @@ -71,53 +71,64 @@ static void st_fence_sync(struct gl_context *ctx, struct gl_sync_object *obj, struct st_sync_object *so = (struct st_sync_object*)obj; assert(condition == GL_SYNC_GPU_COMMANDS_COMPLETE && flags == 0); assert(so->fence == NULL); pipe->flush(pipe, &so->fence, PIPE_FLUSH_DEFERRED); } static void st_check_sync(struct gl_context *ctx, struct gl_sync_object *obj) { - struct pipe_screen *screen = st_context(ctx)->pipe->screen; + struct pipe_context *pipe = st_context(ctx)->pipe; + struct pipe_screen *screen = pipe->screen; struct st_sync_object *so = (struct st_sync_object*)obj; /* If the fence doesn't exist, assume it's signalled. */ if (!so->fence) { so->b.StatusFlag = GL_TRUE; return; } - if (screen->fence_finish(screen, NULL, so->fence, 0)) { + if (screen->fence_finish(screen, pipe, so->fence, 0)) { screen->fence_reference(screen, &so->fence, NULL); so->b.StatusFlag = GL_TRUE; } } static void st_client_wait_sync(struct gl_context *ctx, struct gl_sync_object *obj, GLbitfield flags, GLuint64 timeout) { - struct pipe_screen *screen = st_context(ctx)->pipe->screen; + struct pipe_context *pipe = st_context(ctx)->pipe; + struct pipe_screen *screen = pipe->screen; struct st_sync_object *so = (struct st_sync_object*)obj; /* If the fence doesn't exist, assume it's signalled. */ if (!so->fence) { so->b.StatusFlag = GL_TRUE; return; } - /* We don't care about GL_SYNC_FLUSH_COMMANDS_BIT, because flush is - * already called when creating a fence. */ - + /* Section 4.1.2 of OpenGL 4.5 (Compatibility Profile) says: + * [...] if ClientWaitSync is called and all of the following are true: + * - the SYNC_FLUSH_COMMANDS_BIT bit is set in flags, + * - sync is unsignaled when ClientWaitSync is called, + * - and the calls to ClientWaitSync and FenceSync were issued from + * the same context, + * then the GL will behave as if the equivalent of Flush were inserted + * immediately after the creation of sync. + * + * Assume GL_SYNC_FLUSH_COMMANDS_BIT is always set, because applications + * forget to set it. + */ if (so->fence && - screen->fence_finish(screen, NULL, so->fence, timeout)) { + screen->fence_finish(screen, pipe, so->fence, timeout)) { screen->fence_reference(screen, &so->fence, NULL); so->b.StatusFlag = GL_TRUE; } } static void st_server_wait_sync(struct gl_context *ctx, struct gl_sync_object *obj, GLbitfield flags, GLuint64 timeout) { /* NO-OP. -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev