iris: Implement Gen12 workaround for non pipelined state
[mesa.git] / src / gallium / drivers / freedreno / freedreno_fence.c
index 928972003c68b67bf96ed7e7ccfb461d5bfd2c4d..9d49f10ed94e444d4a27e2bbe2277396a140e0ab 100644 (file)
@@ -1,5 +1,3 @@
-/* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */
-
 /*
  * Copyright (C) 2012 Rob Clark <robclark@freedesktop.org>
  *
@@ -41,7 +39,7 @@ struct pipe_fence_handle {
         * fence_fd become valid and the week reference is dropped.
         */
        struct fd_batch *batch;
-       struct fd_context *ctx;
+       struct fd_pipe *pipe;
        struct fd_screen *screen;
        int fence_fd;
        uint32_t timestamp;
@@ -50,7 +48,7 @@ struct pipe_fence_handle {
 static void fence_flush(struct pipe_fence_handle *fence)
 {
        if (fence->batch)
-               fd_batch_flush(fence->batch, true, true);
+               fd_batch_flush(fence->batch, true);
        debug_assert(!fence->batch);
 }
 
@@ -68,11 +66,11 @@ static void fd_fence_destroy(struct pipe_fence_handle *fence)
 {
        if (fence->fence_fd != -1)
                close(fence->fence_fd);
+       fd_pipe_del(fence->pipe);
        FREE(fence);
 }
 
-void fd_fence_ref(struct pipe_screen *pscreen,
-               struct pipe_fence_handle **ptr,
+void fd_fence_ref(struct pipe_fence_handle **ptr,
                struct pipe_fence_handle *pfence)
 {
        if (pipe_reference(&(*ptr)->reference, &pfence->reference))
@@ -81,7 +79,7 @@ void fd_fence_ref(struct pipe_screen *pscreen,
        *ptr = pfence;
 }
 
-boolean fd_fence_finish(struct pipe_screen *pscreen,
+bool fd_fence_finish(struct pipe_screen *pscreen,
                struct pipe_context *ctx,
                struct pipe_fence_handle *fence,
                uint64_t timeout)
@@ -93,7 +91,7 @@ boolean fd_fence_finish(struct pipe_screen *pscreen,
                return ret == 0;
        }
 
-       if (fd_pipe_wait_timeout(fence->ctx->pipe, fence->timestamp, timeout))
+       if (fd_pipe_wait_timeout(fence->pipe, fence->timestamp, timeout))
                return false;
 
        return true;
@@ -111,7 +109,7 @@ static struct pipe_fence_handle * fence_create(struct fd_context *ctx,
        pipe_reference_init(&fence->reference, 1);
 
        fence->batch = batch;
-       fence->ctx = ctx;
+       fence->pipe = fd_pipe_ref(ctx->pipe);
        fence->screen = ctx->screen;
        fence->timestamp = timestamp;
        fence->fence_fd = fence_fd;
@@ -120,8 +118,10 @@ static struct pipe_fence_handle * fence_create(struct fd_context *ctx,
 }
 
 void fd_create_fence_fd(struct pipe_context *pctx,
-               struct pipe_fence_handle **pfence, int fd)
+               struct pipe_fence_handle **pfence, int fd,
+               enum pipe_fd_type type)
 {
+       assert(type == PIPE_FD_TYPE_NATIVE_SYNC);
        *pfence = fence_create(fd_context(pctx), NULL, 0, dup(fd));
 }
 
@@ -129,10 +129,14 @@ void fd_fence_server_sync(struct pipe_context *pctx,
                struct pipe_fence_handle *fence)
 {
        struct fd_context *ctx = fd_context(pctx);
-       struct fd_batch *batch = ctx->batch;
+       struct fd_batch *batch = fd_context_batch(ctx);
 
        fence_flush(fence);
 
+       /* if not an external fence, then nothing more to do without preemption: */
+       if (fence->fence_fd == -1)
+               return;
+
        if (sync_accumulate("freedreno", &batch->in_fence_fd, fence->fence_fd)) {
                /* error */
        }