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

Reply via email to