Mesa (main): gallium/u_threaded: Split out options struct
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Oct 7 17:52:54 UTC 2021
Module: Mesa
Branch: main
Commit: 1c1c43fbabf985e21f5b7396c347cf49d403ed18
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1c1c43fbabf985e21f5b7396c347cf49d403ed18
Author: Rob Clark <robdclark at chromium.org>
Date: Tue Oct 5 16:24:47 2021 -0700
gallium/u_threaded: Split out options struct
Rather than having an ever increasing list of parameters to
threaded_context_create(), split out a struct for optional
flags and parameters. This should reduce churn in adding
new options.
Signed-off-by: Rob Clark <robdclark at chromium.org>
Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13207>
---
src/gallium/auxiliary/driver_noop/noop_pipe.c | 8 +++--
src/gallium/auxiliary/driver_trace/tr_context.h | 3 +-
src/gallium/auxiliary/driver_trace/tr_screen.c | 15 +++++----
src/gallium/auxiliary/util/u_threaded_context.c | 37 ++++++++---------------
src/gallium/auxiliary/util/u_threaded_context.h | 34 ++++++++++++---------
src/gallium/drivers/crocus/crocus_context.c | 3 --
src/gallium/drivers/freedreno/freedreno_context.c | 9 +++---
src/gallium/drivers/iris/iris_context.c | 3 --
src/gallium/drivers/radeonsi/si_pipe.c | 10 +++---
src/gallium/drivers/zink/zink_context.c | 9 ++++--
10 files changed, 63 insertions(+), 68 deletions(-)
diff --git a/src/gallium/auxiliary/driver_noop/noop_pipe.c b/src/gallium/auxiliary/driver_noop/noop_pipe.c
index 83306ab9538..73d35d003cf 100644
--- a/src/gallium/auxiliary/driver_noop/noop_pipe.c
+++ b/src/gallium/auxiliary/driver_noop/noop_pipe.c
@@ -457,9 +457,11 @@ static struct pipe_context *noop_create_context(struct pipe_screen *screen,
threaded_context_create(ctx,
&((struct noop_pipe_screen*)screen)->pool_transfers,
noop_replace_buffer_storage,
- noop_create_fence,
- noop_is_resource_busy,
- false, false, NULL);
+ &(struct threaded_context_options) {
+ .create_fence = noop_create_fence,
+ .is_resource_busy = noop_is_resource_busy,
+ },
+ NULL);
if (tc && tc != ctx)
threaded_context_init_bytes_mapped_limit((struct threaded_context *)tc, 4);
diff --git a/src/gallium/auxiliary/driver_trace/tr_context.h b/src/gallium/auxiliary/driver_trace/tr_context.h
index 953ccd328c0..f687fa2939d 100644
--- a/src/gallium/auxiliary/driver_trace/tr_context.h
+++ b/src/gallium/auxiliary/driver_trace/tr_context.h
@@ -86,8 +86,7 @@ trace_context_create(struct trace_screen *tr_scr,
struct pipe_context *
trace_context_create_threaded(struct pipe_screen *screen, struct pipe_context *pipe,
tc_replace_buffer_storage_func *replace_buffer,
- tc_create_fence_func *create_fence,
- tc_is_resource_busy *is_resource_busy);
+ struct threaded_context_options *options);
#ifdef __cplusplus
}
#endif
diff --git a/src/gallium/auxiliary/driver_trace/tr_screen.c b/src/gallium/auxiliary/driver_trace/tr_screen.c
index 02562e565c7..81eaff92f3e 100644
--- a/src/gallium/auxiliary/driver_trace/tr_screen.c
+++ b/src/gallium/auxiliary/driver_trace/tr_screen.c
@@ -333,8 +333,7 @@ trace_context_is_resource_busy(struct pipe_screen *_screen,
struct pipe_context *
trace_context_create_threaded(struct pipe_screen *screen, struct pipe_context *pipe,
tc_replace_buffer_storage_func *replace_buffer,
- tc_create_fence_func *create_fence,
- tc_is_resource_busy *is_resource_busy)
+ struct threaded_context_options *options)
{
if (!trace_screens)
return pipe;
@@ -353,14 +352,14 @@ trace_context_create_threaded(struct pipe_screen *screen, struct pipe_context *p
struct trace_context *tr_ctx = trace_context(ctx);
tr_ctx->replace_buffer_storage = *replace_buffer;
- tr_ctx->create_fence = *create_fence;
- tr_scr->is_resource_busy = *is_resource_busy;
+ tr_ctx->create_fence = options->create_fence;
+ tr_scr->is_resource_busy = options->is_resource_busy;
tr_ctx->threaded = true;
*replace_buffer = trace_context_replace_buffer_storage;
- if (*create_fence)
- *create_fence = trace_context_create_fence;
- if (*is_resource_busy)
- *is_resource_busy = trace_context_is_resource_busy;
+ if (options->create_fence)
+ options->create_fence = trace_context_create_fence;
+ if (options->is_resource_busy)
+ options->is_resource_busy = trace_context_is_resource_busy;
return ctx;
}
diff --git a/src/gallium/auxiliary/util/u_threaded_context.c b/src/gallium/auxiliary/util/u_threaded_context.c
index 8f99fe77ba3..1b4aaf28b48 100644
--- a/src/gallium/auxiliary/util/u_threaded_context.c
+++ b/src/gallium/auxiliary/util/u_threaded_context.c
@@ -221,7 +221,7 @@ tc_batch_execute(void *job, UNUSED void *gdata, int thread_index)
struct util_queue_fence *fence =
&tc->buffer_lists[batch->buffer_list_index].driver_flushed_fence;
- if (tc->driver_calls_flush_notify) {
+ if (tc->options.driver_calls_flush_notify) {
tc->signal_fences_next_flush[tc->num_signal_fences_next_flush++] = fence;
/* Since our buffer lists are chained as a ring, we need to flush
@@ -649,7 +649,7 @@ static bool
tc_is_buffer_busy(struct threaded_context *tc, struct threaded_resource *tbuf,
unsigned map_usage)
{
- if (!tc->is_resource_busy)
+ if (!tc->options.is_resource_busy)
return true;
uint32_t id_hash = tbuf->buffer_id_unique & TC_BUFFER_ID_MASK;
@@ -666,7 +666,7 @@ tc_is_buffer_busy(struct threaded_context *tc, struct threaded_resource *tbuf,
/* The buffer isn't referenced by any unflushed batch: we can safely ask to the driver whether
* this buffer is busy or not. */
- return tc->is_resource_busy(tc->pipe->screen, tbuf->latest, map_usage);
+ return tc->options.is_resource_busy(tc->pipe->screen, tbuf->latest, map_usage);
}
void
@@ -2613,7 +2613,7 @@ tc_get_device_reset_status(struct pipe_context *_pipe)
struct threaded_context *tc = threaded_context(_pipe);
struct pipe_context *pipe = tc->pipe;
- if (!tc->unsynchronized_get_device_reset_status)
+ if (!tc->options.unsynchronized_get_device_reset_status)
tc_sync(tc);
return pipe->get_device_reset_status(pipe);
@@ -2883,7 +2883,7 @@ tc_flush(struct pipe_context *_pipe, struct pipe_fence_handle **fence,
struct pipe_screen *screen = pipe->screen;
bool async = flags & (PIPE_FLUSH_DEFERRED | PIPE_FLUSH_ASYNC);
- if (async && tc->create_fence) {
+ if (async && tc->options.create_fence) {
if (fence) {
struct tc_batch *next = &tc->batch_slots[tc->next];
@@ -2896,7 +2896,8 @@ tc_flush(struct pipe_context *_pipe, struct pipe_fence_handle **fence,
next->token->tc = tc;
}
- screen->fence_reference(screen, fence, tc->create_fence(pipe, next->token));
+ screen->fence_reference(screen, fence,
+ tc->options.create_fence(pipe, next->token));
if (!*fence)
goto out_of_memory;
}
@@ -4186,15 +4187,7 @@ void tc_driver_internal_flush_notify(struct threaded_context *tc)
* in pipe_screen.
* \param replace_buffer callback for replacing a pipe_resource's storage
* with another pipe_resource's storage.
- * \param create_fence optional callback to create a fence for async flush
- * \param is_resource_busy optional callback to tell TC if transfer_map()/etc
- * with the given usage would stall
- * \param driver_calls_flush_notify whether the driver calls
- * tc_driver_internal_flush_notify after every
- * driver flush
- * \param unsynchronized_get_device_reset_status if true, get_device_reset_status()
- * calls will not be synchronized with
- * driver thread
+ * \param options optional TC options/callbacks
* \param out if successful, the threaded_context will be returned here in
* addition to the return value if "out" != NULL
*/
@@ -4202,10 +4195,7 @@ struct pipe_context *
threaded_context_create(struct pipe_context *pipe,
struct slab_parent_pool *parent_transfer_pool,
tc_replace_buffer_storage_func replace_buffer,
- tc_create_fence_func create_fence,
- tc_is_resource_busy is_resource_busy,
- bool driver_calls_flush_notify,
- bool unsynchronized_get_device_reset_status,
+ const struct threaded_context_options *options,
struct threaded_context **out)
{
struct threaded_context *tc;
@@ -4224,17 +4214,16 @@ threaded_context_create(struct pipe_context *pipe,
return NULL;
}
- pipe = trace_context_create_threaded(pipe->screen, pipe, &replace_buffer, &create_fence, &is_resource_busy);
+ if (options)
+ tc->options = *options;
+
+ pipe = trace_context_create_threaded(pipe->screen, pipe, &replace_buffer, &tc->options);
/* The driver context isn't wrapped, so set its "priv" to NULL. */
pipe->priv = NULL;
tc->pipe = pipe;
tc->replace_buffer_storage = replace_buffer;
- tc->create_fence = create_fence;
- tc->is_resource_busy = is_resource_busy;
- tc->driver_calls_flush_notify = driver_calls_flush_notify;
- tc->unsynchronized_get_device_reset_status = unsynchronized_get_device_reset_status;
tc->map_buffer_alignment =
pipe->screen->get_param(pipe->screen, PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT);
tc->ubo_alignment =
diff --git a/src/gallium/auxiliary/util/u_threaded_context.h b/src/gallium/auxiliary/util/u_threaded_context.h
index 929f3bed1e1..a961a11dbe5 100644
--- a/src/gallium/auxiliary/util/u_threaded_context.h
+++ b/src/gallium/auxiliary/util/u_threaded_context.h
@@ -408,13 +408,29 @@ struct tc_buffer_list {
BITSET_DECLARE(buffer_list, TC_BUFFER_ID_MASK + 1);
};
+/**
+ * Optional TC parameters/callbacks.
+ */
+struct threaded_context_options {
+ tc_create_fence_func create_fence;
+ tc_is_resource_busy is_resource_busy;
+ bool driver_calls_flush_notify;
+
+ /**
+ * If true, ctx->get_device_reset_status() will be called without
+ * synchronizing with driver thread. Drivers can enable this to avoid
+ * TC syncs if their implementation of get_device_reset_status() is
+ * safe to call without synchronizing with driver thread.
+ */
+ bool unsynchronized_get_device_reset_status;
+};
+
struct threaded_context {
struct pipe_context base;
struct pipe_context *pipe;
struct slab_child_pool pool_transfers;
tc_replace_buffer_storage_func replace_buffer_storage;
- tc_create_fence_func create_fence;
- tc_is_resource_busy is_resource_busy;
+ struct threaded_context_options options;
unsigned map_buffer_alignment;
unsigned ubo_alignment;
@@ -425,19 +441,10 @@ struct threaded_context {
unsigned num_direct_slots;
unsigned num_syncs;
- bool driver_calls_flush_notify;
bool use_forced_staging_uploads;
bool add_all_gfx_bindings_to_buffer_list;
bool add_all_compute_bindings_to_buffer_list;
- /**
- * If true, ctx->get_device_reset_status() will be called without
- * synchronizing with driver thread. Drivers can enable this to avoid
- * TC syncs if their implementation of get_device_reset_status() is
- * safe to call without synchronizing with driver thread.
- */
- bool unsynchronized_get_device_reset_status;
-
/* Estimation of how much vram/gtt bytes are mmap'd in
* the current tc_batch.
*/
@@ -505,10 +512,7 @@ struct pipe_context *
threaded_context_create(struct pipe_context *pipe,
struct slab_parent_pool *parent_transfer_pool,
tc_replace_buffer_storage_func replace_buffer,
- tc_create_fence_func create_fence,
- tc_is_resource_busy is_resource_busy,
- bool driver_calls_flush_notify,
- bool unsynchronized_get_device_reset_status,
+ const struct threaded_context_options *options,
struct threaded_context **out);
void
diff --git a/src/gallium/drivers/crocus/crocus_context.c b/src/gallium/drivers/crocus/crocus_context.c
index 9bfa5116a6d..ed0a3723007 100644
--- a/src/gallium/drivers/crocus/crocus_context.c
+++ b/src/gallium/drivers/crocus/crocus_context.c
@@ -325,9 +325,6 @@ crocus_create_context(struct pipe_screen *pscreen, void *priv, unsigned flags)
return threaded_context_create(ctx, &screen->transfer_pool,
crocus_replace_buffer_storage,
NULL, /* TODO: asynchronous flushes? */
- NULL,
- false,
- false,
&ice->thrctx);
}
diff --git a/src/gallium/drivers/freedreno/freedreno_context.c b/src/gallium/drivers/freedreno/freedreno_context.c
index 43ab14f8a8c..2c2b33de46e 100644
--- a/src/gallium/drivers/freedreno/freedreno_context.c
+++ b/src/gallium/drivers/freedreno/freedreno_context.c
@@ -691,10 +691,11 @@ fd_context_init_tc(struct pipe_context *pctx, unsigned flags)
struct pipe_context *tc = threaded_context_create(
pctx, &ctx->screen->transfer_pool,
fd_replace_buffer_storage,
- fd_fence_create_unflushed,
- fd_resource_busy,
- false,
- true,
+ &(struct threaded_context_options){
+ .create_fence = fd_fence_create_unflushed,
+ .is_resource_busy = fd_resource_busy,
+ .unsynchronized_get_device_reset_status = true,
+ },
&ctx->tc);
if (tc && tc != pctx)
diff --git a/src/gallium/drivers/iris/iris_context.c b/src/gallium/drivers/iris/iris_context.c
index 8bb0b8d69eb..fa511b3a443 100644
--- a/src/gallium/drivers/iris/iris_context.c
+++ b/src/gallium/drivers/iris/iris_context.c
@@ -379,8 +379,5 @@ iris_create_context(struct pipe_screen *pscreen, void *priv, unsigned flags)
return threaded_context_create(ctx, &screen->transfer_pool,
iris_replace_buffer_storage,
NULL, /* TODO: asynchronous flushes? */
- NULL,
- false,
- false,
&ice->thrctx);
}
diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
index 080e88f8403..77f4c29e1b5 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.c
+++ b/src/gallium/drivers/radeonsi/si_pipe.c
@@ -862,10 +862,12 @@ static struct pipe_context *si_pipe_create_context(struct pipe_screen *screen, v
struct pipe_context *tc =
threaded_context_create(ctx, &sscreen->pool_transfers,
si_replace_buffer_storage,
- sscreen->info.is_amdgpu ? si_create_fence : NULL,
- si_is_resource_busy,
- true,
- false,
+ &(struct threaded_context_options){
+ .create_fence = sscreen->info.is_amdgpu ?
+ si_create_fence : NULL,
+ .is_resource_busy = si_is_resource_busy,
+ .driver_calls_flush_notify = true,
+ },
&((struct si_context *)ctx)->tc);
if (tc && tc != ctx)
diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index 952dd6ea428..10136174cfa 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -4214,8 +4214,13 @@ zink_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
struct threaded_context *tc = (struct threaded_context*)threaded_context_create(&ctx->base, &screen->transfer_pool,
zink_context_replace_buffer_storage,
- zink_create_tc_fence_for_tc,
- zink_context_is_resource_busy, true, true, &ctx->tc);
+ &(struct threaded_context_options){
+ .create_fence = zink_create_tc_fence_for_tc,
+ .is_resource_busy = zink_context_is_resource_busy,
+ .driver_calls_flush_notify = true,
+ .unsynchronized_get_device_reset_status = true,
+ },
+ &ctx->tc);
if (tc && (struct zink_context*)tc != ctx) {
threaded_context_init_bytes_mapped_limit(tc, 4);
More information about the mesa-commit
mailing list