gallium/noop: enable threaded_context to test TC overhead without a driver

Acked-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12255>
This commit is contained in:
Marek Olšák 2021-08-06 17:01:04 -04:00 committed by Marge Bot
parent dd528305d5
commit ddd695407e
1 changed files with 46 additions and 1 deletions

View File

@ -40,6 +40,7 @@ void noop_init_state_functions(struct pipe_context *ctx);
struct noop_pipe_screen {
struct pipe_screen pscreen;
struct pipe_screen *oscreen;
struct slab_parent_pool pool_transfers;
};
/*
@ -357,6 +358,32 @@ static void noop_set_frontend_noop(struct pipe_context *ctx, bool enable)
{
}
static void noop_replace_buffer_storage(struct pipe_context *ctx,
struct pipe_resource *dst,
struct pipe_resource *src,
unsigned num_rebinds,
uint32_t rebind_mask,
uint32_t delete_buffer_id)
{
}
static struct pipe_fence_handle *
noop_create_fence(struct pipe_context *ctx,
struct tc_unflushed_batch_token *tc_token)
{
struct pipe_reference *f = MALLOC_STRUCT(pipe_reference);
f->count = 1;
return (struct pipe_fence_handle*)f;
}
static bool noop_is_resource_busy(struct pipe_screen *screen,
struct pipe_resource *resource,
unsigned usage)
{
return false;
}
static struct pipe_context *noop_create_context(struct pipe_screen *screen,
void *priv, unsigned flags)
{
@ -402,7 +429,21 @@ static struct pipe_context *noop_create_context(struct pipe_screen *screen,
ctx->set_frontend_noop = noop_set_frontend_noop;
noop_init_state_functions(ctx);
return ctx;
if (!(flags & PIPE_CONTEXT_PREFER_THREADED))
return ctx;
struct pipe_context *tc =
threaded_context_create(ctx,
&((struct noop_pipe_screen*)screen)->pool_transfers,
noop_replace_buffer_storage,
noop_create_fence,
noop_is_resource_busy,
false, NULL);
if (tc && tc != ctx)
threaded_context_init_bytes_mapped_limit((struct threaded_context *)tc, 4);
return tc;
}
@ -490,6 +531,7 @@ static void noop_destroy_screen(struct pipe_screen *screen)
struct pipe_screen *oscreen = noop_screen->oscreen;
oscreen->destroy(oscreen);
slab_destroy_parent(&noop_screen->pool_transfers);
FREE(screen);
}
@ -585,5 +627,8 @@ struct pipe_screen *noop_screen_create(struct pipe_screen *oscreen)
screen->get_compiler_options = noop_get_compiler_options;
screen->finalize_nir = noop_finalize_nir;
slab_create_parent(&noop_screen->pool_transfers,
sizeof(struct pipe_transfer), 64);
return screen;
}