From: Marek Olšák <marek.ol...@amd.com> An alternative (and ugly) solution to the current clover issue. --- src/gallium/drivers/radeon/r600_pipe_common.c | 12 ++++++++++++ src/gallium/drivers/radeon/r600_pipe_common.h | 3 +++ src/gallium/drivers/radeonsi/si_hw_context.c | 10 ++++++++-- 3 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c index 94a7535..858404d 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.c +++ b/src/gallium/drivers/radeon/r600_pipe_common.c @@ -718,6 +718,15 @@ static void r600_fence_reference(struct pipe_screen *screen, { struct radeon_winsys *rws = ((struct r600_common_screen*)screen)->ws; + if (*ptr == R600_SIGNALLED_FENCE) + *ptr = NULL; + + if (fence == R600_SIGNALLED_FENCE) { + rws->fence_reference(ptr, NULL); + *ptr = R600_SIGNALLED_FENCE; + return; + } + rws->fence_reference(ptr, fence); } @@ -727,6 +736,9 @@ static boolean r600_fence_finish(struct pipe_screen *screen, { struct radeon_winsys *rws = ((struct r600_common_screen*)screen)->ws; + if (fence == R600_SIGNALLED_FENCE) + return true; + return rws->fence_wait(rws, fence, timeout); } diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h index aeb1e7a..ab8cabb 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.h +++ b/src/gallium/drivers/radeon/r600_pipe_common.h @@ -43,6 +43,9 @@ #include "util/u_suballoc.h" #include "util/u_transfer.h" +/* A dummy fence handle used as a special fence that's always signalled. */ +#define R600_SIGNALLED_FENCE ((struct pipe_fence_handle*)1) + #define R600_RESOURCE_FLAG_TRANSFER (PIPE_RESOURCE_FLAG_DRV_PRIV << 0) #define R600_RESOURCE_FLAG_FLUSHED_DEPTH (PIPE_RESOURCE_FLAG_DRV_PRIV << 1) #define R600_RESOURCE_FLAG_FORCE_TILING (PIPE_RESOURCE_FLAG_DRV_PRIV << 2) diff --git a/src/gallium/drivers/radeonsi/si_hw_context.c b/src/gallium/drivers/radeonsi/si_hw_context.c index c75def5..29576f3 100644 --- a/src/gallium/drivers/radeonsi/si_hw_context.c +++ b/src/gallium/drivers/radeonsi/si_hw_context.c @@ -98,8 +98,14 @@ void si_context_gfx_flush(void *context, unsigned flags, struct radeon_winsys *ws = ctx->b.ws; if (cs->cdw == ctx->b.initial_gfx_cs_size) { - if (fence) - ws->fence_reference(fence, ctx->last_gfx_fence); + if (fence) { + if (ctx->last_gfx_fence) + ws->fence_reference(fence, ctx->last_gfx_fence); + else { + ws->fence_reference(fence, NULL); + *fence = R600_SIGNALLED_FENCE; + } + } if (!(flags & RADEON_FLUSH_ASYNC)) ws->cs_sync_flush(cs); return; -- 2.1.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev