summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Pitoiset <[email protected]>2017-05-16 15:00:35 +0200
committerSamuel Pitoiset <[email protected]>2017-06-14 10:04:36 +0200
commited4fbb84d1c3251d87476500272d28c59419fa88 (patch)
tree38b736bb49e5f629e10d540b5ec5be46f79c2b0e
parente53e374b26ed0a94eda524ebc21a1604c5f6d923 (diff)
tc: add ARB_bindless_texture support
Signed-off-by: Samuel Pitoiset <[email protected]> Reviewed-by: Marek Olšák <[email protected]> Reviewed-by: Nicolai Hähnle <[email protected]>
-rw-r--r--src/gallium/auxiliary/util/u_threaded_context.c128
-rw-r--r--src/gallium/auxiliary/util/u_threaded_context.h2
-rw-r--r--src/gallium/auxiliary/util/u_threaded_context_calls.h4
3 files changed, 133 insertions, 1 deletions
diff --git a/src/gallium/auxiliary/util/u_threaded_context.c b/src/gallium/auxiliary/util/u_threaded_context.c
index 3038fc66830..cb9ea3a908d 100644
--- a/src/gallium/auxiliary/util/u_threaded_context.c
+++ b/src/gallium/auxiliary/util/u_threaded_context.c
@@ -1086,6 +1086,128 @@ tc_stream_output_target_destroy(struct pipe_context *_pipe,
/********************************************************************
+ * bindless
+ */
+
+static uint64_t
+tc_create_texture_handle(struct pipe_context *_pipe,
+ struct pipe_sampler_view *view,
+ const struct pipe_sampler_state *state)
+{
+ struct threaded_context *tc = threaded_context(_pipe);
+ struct pipe_context *pipe = tc->pipe;
+
+ tc_sync(tc);
+ return pipe->create_texture_handle(pipe, view, state);
+}
+
+static void
+tc_call_delete_texture_handle(struct pipe_context *pipe,
+ union tc_payload *payload)
+{
+ pipe->delete_texture_handle(pipe, payload->handle);
+}
+
+static void
+tc_delete_texture_handle(struct pipe_context *_pipe, uint64_t handle)
+{
+ struct threaded_context *tc = threaded_context(_pipe);
+ union tc_payload *payload =
+ tc_add_small_call(tc, TC_CALL_delete_texture_handle);
+
+ payload->handle = handle;
+}
+
+struct tc_make_texture_handle_resident
+{
+ uint64_t handle;
+ bool resident;
+};
+
+static void
+tc_call_make_texture_handle_resident(struct pipe_context *pipe,
+ union tc_payload *payload)
+{
+ struct tc_make_texture_handle_resident *p =
+ (struct tc_make_texture_handle_resident *)payload;
+
+ pipe->make_texture_handle_resident(pipe, p->handle, p->resident);
+}
+
+static void
+tc_make_texture_handle_resident(struct pipe_context *_pipe, uint64_t handle,
+ bool resident)
+{
+ struct threaded_context *tc = threaded_context(_pipe);
+ struct tc_make_texture_handle_resident *p =
+ tc_add_struct_typed_call(tc, TC_CALL_make_texture_handle_resident,
+ tc_make_texture_handle_resident);
+
+ p->handle = handle;
+ p->resident = resident;
+}
+
+static uint64_t
+tc_create_image_handle(struct pipe_context *_pipe,
+ const struct pipe_image_view *image)
+{
+ struct threaded_context *tc = threaded_context(_pipe);
+ struct pipe_context *pipe = tc->pipe;
+
+ tc_sync(tc);
+ return pipe->create_image_handle(pipe, image);
+}
+
+static void
+tc_call_delete_image_handle(struct pipe_context *pipe,
+ union tc_payload *payload)
+{
+ pipe->delete_image_handle(pipe, payload->handle);
+}
+
+static void
+tc_delete_image_handle(struct pipe_context *_pipe, uint64_t handle)
+{
+ struct threaded_context *tc = threaded_context(_pipe);
+ union tc_payload *payload =
+ tc_add_small_call(tc, TC_CALL_delete_image_handle);
+
+ payload->handle = handle;
+}
+
+struct tc_make_image_handle_resident
+{
+ uint64_t handle;
+ unsigned access;
+ bool resident;
+};
+
+static void
+tc_call_make_image_handle_resident(struct pipe_context *pipe,
+ union tc_payload *payload)
+{
+ struct tc_make_image_handle_resident *p =
+ (struct tc_make_image_handle_resident *)payload;
+
+ pipe->make_image_handle_resident(pipe, p->handle, p->access, p->resident);
+}
+
+static void
+tc_make_image_handle_resident(struct pipe_context *_pipe, uint64_t handle,
+ unsigned access, bool resident)
+{
+ struct threaded_context *tc = threaded_context(_pipe);
+ struct tc_make_image_handle_resident *p =
+ tc_add_struct_typed_call(tc, TC_CALL_make_image_handle_resident,
+ tc_make_image_handle_resident);
+
+ p->handle = handle;
+ p->access = access;
+ p->resident = resident;
+}
+
+
+/********************************************************************
* transfer
*/
@@ -2318,6 +2440,12 @@ threaded_context_create(struct pipe_context *pipe,
CTX_INIT(create_fence_fd);
CTX_INIT(fence_server_sync);
CTX_INIT(get_timestamp);
+ CTX_INIT(create_texture_handle);
+ CTX_INIT(delete_texture_handle);
+ CTX_INIT(make_texture_handle_resident);
+ CTX_INIT(create_image_handle);
+ CTX_INIT(delete_image_handle);
+ CTX_INIT(make_image_handle_resident);
#undef CTX_INIT
if (out)
diff --git a/src/gallium/auxiliary/util/u_threaded_context.h b/src/gallium/auxiliary/util/u_threaded_context.h
index 2e7e3012cba..0742faebfbf 100644
--- a/src/gallium/auxiliary/util/u_threaded_context.h
+++ b/src/gallium/auxiliary/util/u_threaded_context.h
@@ -270,7 +270,7 @@ union tc_payload {
struct pipe_query *query;
struct pipe_resource *resource;
struct pipe_transfer *transfer;
- uint64_t __use_8_bytes;
+ uint64_t handle;
};
#ifdef _MSC_VER
diff --git a/src/gallium/auxiliary/util/u_threaded_context_calls.h b/src/gallium/auxiliary/util/u_threaded_context_calls.h
index 7dfccb0f0de..546819a2580 100644
--- a/src/gallium/auxiliary/util/u_threaded_context_calls.h
+++ b/src/gallium/auxiliary/util/u_threaded_context_calls.h
@@ -41,6 +41,10 @@ CALL(set_min_samples)
CALL(set_polygon_stipple)
CALL(texture_barrier)
CALL(memory_barrier)
+CALL(delete_texture_handle)
+CALL(make_texture_handle_resident)
+CALL(delete_image_handle)
+CALL(make_image_handle_resident)
CALL(bind_blend_state)
CALL(bind_rasterizer_state)