From 8016639f636f4a0876fb63e508167eab26be9c69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Wed, 5 Sep 2018 23:12:27 -0400 Subject: [PATCH] gallium/u_threaded: implement set_context_param for thread pinning (v2) v2: - use set_context_param - set set_context_param even if the driver doesn't implement it Reviewed-by: Brian Paul --- .../auxiliary/util/u_threaded_context.c | 40 +++++++++++++++++++ .../auxiliary/util/u_threaded_context_calls.h | 1 + 2 files changed, 41 insertions(+) diff --git a/src/gallium/auxiliary/util/u_threaded_context.c b/src/gallium/auxiliary/util/u_threaded_context.c index fc7eb138835..8e3bceae18d 100644 --- a/src/gallium/auxiliary/util/u_threaded_context.c +++ b/src/gallium/auxiliary/util/u_threaded_context.c @@ -1899,6 +1899,44 @@ tc_create_video_buffer(UNUSED struct pipe_context *_pipe, return NULL; } +struct tc_context_param { + enum pipe_context_param param; + unsigned value; +}; + +static void +tc_call_set_context_param(struct pipe_context *pipe, + union tc_payload *payload) +{ + struct tc_context_param *p = (struct tc_context_param*)payload; + + if (pipe->set_context_param) + pipe->set_context_param(pipe, p->param, p->value); +} + +static void +tc_set_context_param(struct pipe_context *_pipe, + enum pipe_context_param param, + unsigned value) +{ + struct threaded_context *tc = threaded_context(_pipe); + + if (tc->pipe->set_context_param) { + struct tc_context_param *payload = + tc_add_struct_typed_call(tc, TC_CALL_set_context_param, + tc_context_param); + + payload->param = param; + payload->value = value; + } + + if (param == PIPE_CONTEXT_PARAM_PIN_THREADS_TO_L3_CACHE) { + /* Pin the gallium thread as requested. */ + util_pin_thread_to_L3(tc->queue.threads[0], value, + util_cpu_caps.cores_per_L3); + } +} + /******************************************************************** * draw, launch, clear, blit, copy, flush @@ -2580,6 +2618,8 @@ threaded_context_create(struct pipe_context *pipe, slab_create_child(&tc->pool_transfers, parent_transfer_pool); + tc->base.set_context_param = tc_set_context_param; /* always set this */ + #define CTX_INIT(_member) \ tc->base._member = tc->pipe->_member ? tc_##_member : NULL diff --git a/src/gallium/auxiliary/util/u_threaded_context_calls.h b/src/gallium/auxiliary/util/u_threaded_context_calls.h index 921b86a67f0..e6ea1b5747c 100644 --- a/src/gallium/auxiliary/util/u_threaded_context_calls.h +++ b/src/gallium/auxiliary/util/u_threaded_context_calls.h @@ -49,6 +49,7 @@ CALL(delete_texture_handle) CALL(make_texture_handle_resident) CALL(delete_image_handle) CALL(make_image_handle_resident) +CALL(set_context_param) CALL(bind_blend_state) CALL(bind_rasterizer_state)