radeonsi: enable threaded_context

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de>
This commit is contained in:
Marek Olšák 2017-03-02 01:28:51 +01:00
parent e24d094d70
commit 1c8f7d3be6

View file

@ -138,7 +138,7 @@ si_create_llvm_target_machine(struct si_screen *sscreen)
}
static struct pipe_context *si_create_context(struct pipe_screen *screen,
void *priv, unsigned flags)
unsigned flags)
{
struct si_context *sctx = CALLOC_STRUCT(si_context);
struct si_screen* sscreen = (struct si_screen *)screen;
@ -320,6 +320,37 @@ fail:
return NULL;
}
static struct pipe_context *si_pipe_create_context(struct pipe_screen *screen,
void *priv, unsigned flags)
{
struct si_screen *sscreen = (struct si_screen *)screen;
struct pipe_context *ctx = si_create_context(screen, flags);
if (!(flags & PIPE_CONTEXT_PREFER_THREADED))
return ctx;
/* Clover (compute-only) is unsupported.
*
* Since the threaded context creates shader states from the non-driver
* thread, asynchronous compilation is required for create_{shader}_-
* state not to use pipe_context. Debug contexts (ddebug) disable
* asynchronous compilation, so don't use the threaded context with
* those.
*/
if (flags & (PIPE_CONTEXT_COMPUTE_ONLY | PIPE_CONTEXT_DEBUG))
return ctx;
/* When shaders are logged to stderr, asynchronous compilation is
* disabled too. */
if (sscreen->b.debug_flags & (DBG_VS | DBG_TCS | DBG_TES | DBG_GS |
DBG_PS | DBG_CS))
return ctx;
return threaded_context_create(ctx, &sscreen->b.pool_transfers,
r600_replace_buffer_storage,
&((struct si_context*)ctx)->b.tc);
}
/*
* pipe_screen
*/
@ -831,7 +862,7 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws)
}
/* Set functions first. */
sscreen->b.b.context_create = si_create_context;
sscreen->b.b.context_create = si_pipe_create_context;
sscreen->b.b.destroy = si_destroy_screen;
sscreen->b.b.get_param = si_get_param;
sscreen->b.b.get_shader_param = si_get_shader_param;
@ -922,7 +953,7 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws)
sscreen->tm[i] = si_create_llvm_target_machine(sscreen);
/* Create the auxiliary context. This must be done last. */
sscreen->b.aux_context = sscreen->b.b.context_create(&sscreen->b.b, NULL, 0);
sscreen->b.aux_context = si_create_context(&sscreen->b.b, 0);
if (sscreen->b.debug_flags & DBG_TEST_DMA)
r600_test_dma(&sscreen->b);