Hi, Please find my comments below:
Regards, Andrii. On Tue, Sep 18, 2018 at 4:49 AM Marek Olšák <mar...@gmail.com> wrote: > Reviewed-by: Marek Olšák <marek.ol...@amd.com> > > Marek > > On Wed, Sep 12, 2018 at 6:50 AM, Timothy Arceri <tarc...@itsqueeze.com> > wrote: > > This reverts commit bc65dcab3bc48673ff6180afb036561a4b8b1119. > > > > This was manually reverted. Reverting stops the menu hanging in > > some id tech games such as RAGE and Wolfenstein The New Order. > > > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107891 > > --- > > .../auxiliary/util/u_threaded_context.h | 8 -- > > src/gallium/drivers/radeonsi/si_fence.c | 82 +++++++++---------- > > src/gallium/drivers/radeonsi/si_gfx_cs.c | 2 - > > 3 files changed, 40 insertions(+), 52 deletions(-) > > > > diff --git a/src/gallium/auxiliary/util/u_threaded_context.h > b/src/gallium/auxiliary/util/u_threaded_context.h > > index be6933d05a4..a32f893592a 100644 > > --- a/src/gallium/auxiliary/util/u_threaded_context.h > > +++ b/src/gallium/auxiliary/util/u_threaded_context.h > > @@ -408,14 +408,6 @@ threaded_transfer(struct pipe_transfer *transfer) > > return (struct threaded_transfer*)transfer; > > } > > > > -static inline struct pipe_context * > > -threaded_context_unwrap_unsync(struct pipe_context *pipe) > > -{ > > - if (!pipe || !pipe->priv) > > - return pipe; > > - return (struct pipe_context*)pipe->priv; > > -} > > - > > static inline void > > tc_unflushed_batch_token_reference(struct tc_unflushed_batch_token > **dst, > > struct tc_unflushed_batch_token *src) > > diff --git a/src/gallium/drivers/radeonsi/si_fence.c > b/src/gallium/drivers/radeonsi/si_fence.c > > index 186a785437d..abb7057f299 100644 > > --- a/src/gallium/drivers/radeonsi/si_fence.c > > +++ b/src/gallium/drivers/radeonsi/si_fence.c > > @@ -291,8 +291,12 @@ static boolean si_fence_finish(struct pipe_screen > *screen, > > { > > struct radeon_winsys *rws = ((struct si_screen*)screen)->ws; > > struct si_multi_fence *rfence = (struct si_multi_fence *)fence; > > + struct si_context *sctx; > > int64_t abs_timeout = os_time_get_absolute_timeout(timeout); > > > > + ctx = threaded_context_unwrap_sync(ctx); > > + sctx = (struct si_context*)(ctx ? ctx : NULL); > Looks like it should be like: sctx = (struct si_context*)ctx; or maybe you meant: sctx = (struct si_context*)(ctx ? ctx->****** : NULL); > + > > if (!util_queue_fence_is_signalled(&rfence->ready)) { > > if (rfence->tc_token) { > > /* Ensure that si_flush_from_st will be called > for > > @@ -345,49 +349,43 @@ static boolean si_fence_finish(struct pipe_screen > *screen, > > } > > > > /* Flush the gfx IB if it hasn't been flushed yet. */ > > - if (ctx && rfence->gfx_unflushed.ctx) { > > - struct si_context *sctx; > > - > > - sctx = (struct si_context > *)threaded_context_unwrap_unsync(ctx); > > - if (rfence->gfx_unflushed.ctx == sctx && > > - rfence->gfx_unflushed.ib_index == > sctx->num_gfx_cs_flushes) { > > - /* Section 4.1.2 (Signaling) of the OpenGL 4.6 > (Core profile) > > - * spec says: > > - * > > - * "If the sync object being blocked upon > will not be > > - * signaled in finite time (for example, by > an associated > > - * fence command issued previously, but not > yet flushed to > > - * the graphics pipeline), then > ClientWaitSync may hang > > - * forever. To help prevent this behavior, 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." > > - * > > - * This means we need to flush for such fences > even when we're > > - * not going to wait. > > - */ > > - threaded_context_unwrap_sync(ctx); > > - si_flush_gfx_cs(sctx, > > - (timeout ? 0 : PIPE_FLUSH_ASYNC) > | > > - > RADEON_FLUSH_START_NEXT_GFX_IB_NOW, > > - NULL); > > - rfence->gfx_unflushed.ctx = NULL; > > - > > - if (!timeout) > > - return false; > > + if (sctx && rfence->gfx_unflushed.ctx == sctx && > > + rfence->gfx_unflushed.ib_index == sctx->num_gfx_cs_flushes) { > > + /* Section 4.1.2 (Signaling) of the OpenGL 4.6 (Core > profile) > > + * spec says: > > + * > > + * "If the sync object being blocked upon will not be > > + * signaled in finite time (for example, by an > associated > > + * fence command issued previously, but not yet > flushed to > > + * the graphics pipeline), then ClientWaitSync may > hang > > + * forever. To help prevent this behavior, 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." > > + * > > + * This means we need to flush for such fences even when > we're > > + * not going to wait. > > + */ > > + si_flush_gfx_cs(sctx, > > + (timeout ? 0 : PIPE_FLUSH_ASYNC) | > > + RADEON_FLUSH_START_NEXT_GFX_IB_NOW, > > + NULL); > > + rfence->gfx_unflushed.ctx = NULL; > > > > - /* Recompute the timeout after all that. */ > > - if (timeout && timeout != PIPE_TIMEOUT_INFINITE) > { > > - int64_t time = os_time_get_nano(); > > - timeout = abs_timeout > time ? > abs_timeout - time : 0; > > - } > > + if (!timeout) > > + return false; > > + > > + /* Recompute the timeout after all that. */ > > + if (timeout && timeout != PIPE_TIMEOUT_INFINITE) { > > + int64_t time = os_time_get_nano(); > > + timeout = abs_timeout > time ? abs_timeout - > time : 0; > > } > > } > > > > diff --git a/src/gallium/drivers/radeonsi/si_gfx_cs.c > b/src/gallium/drivers/radeonsi/si_gfx_cs.c > > index 38b85ce6243..bdb576f7e5c 100644 > > --- a/src/gallium/drivers/radeonsi/si_gfx_cs.c > > +++ b/src/gallium/drivers/radeonsi/si_gfx_cs.c > > @@ -147,8 +147,6 @@ void si_flush_gfx_cs(struct si_context *ctx, > unsigned flags, > > if (fence) > > ws->fence_reference(fence, ctx->last_gfx_fence); > > > > - /* This must be after cs_flush returns, since the context's API > > - * thread can concurrently read this value in si_fence_finish. */ > > ctx->num_gfx_cs_flushes++; > > > > /* Check VM faults if needed. */ > > -- > > 2.17.1 > > > > _______________________________________________ > > mesa-dev mailing list > > mesa-dev@lists.freedesktop.org > > https://lists.freedesktop.org/mailman/listinfo/mesa-dev > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev