[Mesa-dev] [PATCH 7/8] gallium/u_threaded: implement pin_threads_to_L3_cache
Marek Olšák
maraeo at gmail.com
Thu Sep 6 04:02:28 UTC 2018
From: Marek Olšák <marek.olsak at amd.com>
---
.../auxiliary/util/u_threaded_context.c | 23 +++++++++++++++++++
.../auxiliary/util/u_threaded_context.h | 1 +
.../auxiliary/util/u_threaded_context_calls.h | 1 +
3 files changed, 25 insertions(+)
diff --git a/src/gallium/auxiliary/util/u_threaded_context.c b/src/gallium/auxiliary/util/u_threaded_context.c
index fc7eb138835..95b98514a12 100644
--- a/src/gallium/auxiliary/util/u_threaded_context.c
+++ b/src/gallium/auxiliary/util/u_threaded_context.c
@@ -1892,20 +1892,42 @@ tc_create_video_codec(UNUSED struct pipe_context *_pipe,
}
static struct pipe_video_buffer *
tc_create_video_buffer(UNUSED struct pipe_context *_pipe,
UNUSED const struct pipe_video_buffer *templ)
{
unreachable("Threaded context should not be enabled for video APIs");
return NULL;
}
+static void
+tc_call_pin_threads_to_L3_cache(struct pipe_context *pipe,
+ union tc_payload *payload)
+{
+ pipe->pin_threads_to_L3_cache(pipe, payload->uint);
+}
+
+static void
+tc_pin_threads_to_L3_cache(struct pipe_context *_pipe,
+ unsigned cache)
+{
+ struct threaded_context *tc = threaded_context(_pipe);
+ union tc_payload *payload =
+ tc_add_small_call(tc, TC_CALL_pin_threads_to_L3_cache);
+
+ payload->uint = cache;
+
+ /* Pin the gallium thread as requested. */
+ util_pin_thread_to_L3(tc->queue.threads[0], cache,
+ util_cpu_caps.cores_per_L3);
+}
+
/********************************************************************
* draw, launch, clear, blit, copy, flush
*/
struct tc_flush_payload {
struct threaded_context *tc;
struct pipe_fence_handle *fence;
unsigned flags;
};
@@ -2683,20 +2705,21 @@ threaded_context_create(struct pipe_context *pipe,
CTX_INIT(create_fence_fd);
CTX_INIT(fence_server_sync);
CTX_INIT(fence_server_signal);
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);
+ CTX_INIT(pin_threads_to_L3_cache);
#undef CTX_INIT
if (out)
*out = tc;
return &tc->base;
fail:
tc_destroy(&tc->base);
return NULL;
diff --git a/src/gallium/auxiliary/util/u_threaded_context.h b/src/gallium/auxiliary/util/u_threaded_context.h
index be6933d05a4..e3cb05318b2 100644
--- a/src/gallium/auxiliary/util/u_threaded_context.h
+++ b/src/gallium/auxiliary/util/u_threaded_context.h
@@ -304,20 +304,21 @@ struct threaded_query {
/* This is the second half of tc_call containing call data.
* Most calls will typecast this to the type they need, typically larger
* than 8 bytes.
*/
union tc_payload {
struct pipe_query *query;
struct pipe_resource *resource;
struct pipe_transfer *transfer;
struct pipe_fence_handle *fence;
uint64_t handle;
+ unsigned uint;
};
#ifdef _MSC_VER
#define ALIGN16 __declspec(align(16))
#else
#define ALIGN16 __attribute__((aligned(16)))
#endif
/* Each call slot should be aligned to its own size for optimal cache usage. */
struct ALIGN16 tc_call {
diff --git a/src/gallium/auxiliary/util/u_threaded_context_calls.h b/src/gallium/auxiliary/util/u_threaded_context_calls.h
index 921b86a67f0..42f244f1c67 100644
--- a/src/gallium/auxiliary/util/u_threaded_context_calls.h
+++ b/src/gallium/auxiliary/util/u_threaded_context_calls.h
@@ -42,20 +42,21 @@ CALL(set_stencil_ref)
CALL(set_clip_state)
CALL(set_sample_mask)
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(pin_threads_to_L3_cache)
CALL(bind_blend_state)
CALL(bind_rasterizer_state)
CALL(bind_depth_stencil_alpha_state)
CALL(bind_compute_state)
CALL(bind_fs_state)
CALL(bind_vs_state)
CALL(bind_gs_state)
CALL(bind_tcs_state)
CALL(bind_tes_state)
--
2.17.1
More information about the mesa-dev
mailing list