aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/radeonsi/si_pipe.c
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2017-03-03 00:24:03 +0100
committerMarek Olšák <[email protected]>2017-03-17 18:30:21 +0100
commite9c6953ddb6baa68ef4704104744934e194c089d (patch)
tree6a7c251cdf10ffb83331096fd105356f995c1203 /src/gallium/drivers/radeonsi/si_pipe.c
parent080f322f06e05b0813f3753898e48dbc72b35a13 (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/drivers/radeonsi/si_pipe.c')
-rw-r--r--src/gallium/drivers/radeonsi/si_pipe.c21
1 files changed, 12 insertions, 9 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);