diff options
author | Marek Olšák <[email protected]> | 2017-03-03 00:24:03 +0100 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2017-03-17 18:30:21 +0100 |
commit | e9c6953ddb6baa68ef4704104744934e194c089d (patch) | |
tree | 6a7c251cdf10ffb83331096fd105356f995c1203 /src/gallium | |
parent | 080f322f06e05b0813f3753898e48dbc72b35a13 (diff) |
radeonsi: require that compiler threads are enabled
threaded gallium can't use pipe_context's LLVM target machine, because
create_shader_selector can be called from a non-driver thread.
Reviewed-by: Timothy Arceri <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/radeonsi/si_pipe.c | 21 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state_shaders.c | 3 |
2 files changed, 13 insertions, 11 deletions
diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index a9a7c8fa42d..a3e001c7479 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -690,8 +690,7 @@ static void si_destroy_screen(struct pipe_screen* pscreen) if (!sscreen->b.ws->unref(sscreen->b.ws)) return; - if (util_queue_is_initialized(&sscreen->shader_compiler_queue)) - util_queue_destroy(&sscreen->shader_compiler_queue); + util_queue_destroy(&sscreen->shader_compiler_queue); for (i = 0; i < ARRAY_SIZE(sscreen->tm); i++) if (sscreen->tm[i]) @@ -797,6 +796,17 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws) return NULL; } + /* Only enable as many threads as we have target machines and CPUs. */ + num_cpus = sysconf(_SC_NPROCESSORS_ONLN); + num_compiler_threads = MIN2(num_cpus, ARRAY_SIZE(sscreen->tm)); + + if (!util_queue_init(&sscreen->shader_compiler_queue, "si_shader", + 32, num_compiler_threads)) { + si_destroy_shader_cache(sscreen); + FREE(sscreen); + return NULL; + } + si_handle_env_var_force_family(sscreen); if (!debug_get_bool_option("RADEON_DISABLE_PERFCOUNTERS", false)) @@ -841,16 +851,9 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws) if (debug_get_bool_option("RADEON_DUMP_SHADERS", false)) sscreen->b.debug_flags |= DBG_FS | DBG_VS | DBG_GS | DBG_PS | DBG_CS; - /* Only enable as many threads as we have target machines and CPUs. */ - num_cpus = sysconf(_SC_NPROCESSORS_ONLN); - num_compiler_threads = MIN2(num_cpus, ARRAY_SIZE(sscreen->tm)); - for (i = 0; i < num_compiler_threads; i++) sscreen->tm[i] = si_create_llvm_target_machine(sscreen); - util_queue_init(&sscreen->shader_compiler_queue, "si_shader", - 32, num_compiler_threads); - /* Create the auxiliary context. This must be done last. */ sscreen->b.aux_context = sscreen->b.b.context_create(&sscreen->b.b, NULL, 0); diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index 9cde0aabade..3596f5af72a 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -1769,8 +1769,7 @@ static void *si_create_shader_selector(struct pipe_context *ctx, if ((sctx->b.debug.debug_message && !sctx->b.debug.async) || sctx->is_debug || - r600_can_dump_shader(&sscreen->b, sel->info.processor) || - !util_queue_is_initialized(&sscreen->shader_compiler_queue)) + r600_can_dump_shader(&sscreen->b, sel->info.processor)) si_init_shader_selector_async(sel, -1); else util_queue_add_job(&sscreen->shader_compiler_queue, sel, |