summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolai Hähnle <nicolai.haehnle@amd.com>2017-11-06 11:56:54 +0100
committerNicolai Hähnle <nicolai.haehnle@amd.com>2017-11-20 18:15:06 +0100
commitce470af0b1bcb276c22dd04e627ab665e10619f7 (patch)
treec6a091ac35e71a0c80793bdd66c31882be69d1aa
parentabeded1cacb5a17a422cb3788153814ed2e01ecb (diff)
u_threaded_gallium: remove synchronization in fence_server_sync
The whole point of fence_server_sync is that it can be used to avoid waiting in the application thread. Reviewed-by: Andres Rodriguez <andresx7@gmail.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com>
-rw-r--r--src/gallium/auxiliary/util/u_threaded_context.c14
-rw-r--r--src/gallium/auxiliary/util/u_threaded_context.h1
-rw-r--r--src/gallium/auxiliary/util/u_threaded_context_calls.h1
3 files changed, 13 insertions, 3 deletions
diff --git a/src/gallium/auxiliary/util/u_threaded_context.c b/src/gallium/auxiliary/util/u_threaded_context.c
index b212393a5b..d0a8ffbd11 100644
--- a/src/gallium/auxiliary/util/u_threaded_context.c
+++ b/src/gallium/auxiliary/util/u_threaded_context.c
@@ -1835,14 +1835,22 @@ tc_create_fence_fd(struct pipe_context *_pipe,
}
static void
+tc_call_fence_server_sync(struct pipe_context *pipe, union tc_payload *payload)
+{
+ pipe->fence_server_sync(pipe, payload->fence);
+ pipe->screen->fence_reference(pipe->screen, &payload->fence, NULL);
+}
+
+static void
tc_fence_server_sync(struct pipe_context *_pipe,
struct pipe_fence_handle *fence)
{
struct threaded_context *tc = threaded_context(_pipe);
- struct pipe_context *pipe = tc->pipe;
+ struct pipe_screen *screen = tc->pipe->screen;
+ union tc_payload *payload = tc_add_small_call(tc, TC_CALL_fence_server_sync);
- tc_sync(tc);
- pipe->fence_server_sync(pipe, fence);
+ payload->fence = NULL;
+ screen->fence_reference(screen, &payload->fence, fence);
}
static struct pipe_video_codec *
diff --git a/src/gallium/auxiliary/util/u_threaded_context.h b/src/gallium/auxiliary/util/u_threaded_context.h
index ea815ed5e0..b2d904569e 100644
--- a/src/gallium/auxiliary/util/u_threaded_context.h
+++ b/src/gallium/auxiliary/util/u_threaded_context.h
@@ -309,6 +309,7 @@ union tc_payload {
struct pipe_query *query;
struct pipe_resource *resource;
struct pipe_transfer *transfer;
+ struct pipe_fence_handle *fence;
uint64_t handle;
};
diff --git a/src/gallium/auxiliary/util/u_threaded_context_calls.h b/src/gallium/auxiliary/util/u_threaded_context_calls.h
index 0d2fd18368..675deaabd9 100644
--- a/src/gallium/auxiliary/util/u_threaded_context_calls.h
+++ b/src/gallium/auxiliary/util/u_threaded_context_calls.h
@@ -1,5 +1,6 @@
CALL(flush)
CALL(callback)
+CALL(fence_server_sync)
CALL(destroy_query)
CALL(begin_query)
CALL(end_query)