diff options
author | Samuel Pitoiset <[email protected]> | 2017-05-16 15:00:35 +0200 |
---|---|---|
committer | Samuel Pitoiset <[email protected]> | 2017-06-14 10:04:36 +0200 |
commit | ed4fbb84d1c3251d87476500272d28c59419fa88 (patch) | |
tree | 38b736bb49e5f629e10d540b5ec5be46f79c2b0e | |
parent | e53e374b26ed0a94eda524ebc21a1604c5f6d923 (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.c | 128 | ||||
-rw-r--r-- | src/gallium/auxiliary/util/u_threaded_context.h | 2 | ||||
-rw-r--r-- | src/gallium/auxiliary/util/u_threaded_context_calls.h | 4 |
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) |