radeonsi: require that compiler threads are enabled
authorMarek Olšák <marek.olsak@amd.com>
Thu, 2 Mar 2017 23:24:03 +0000 (00:24 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Fri, 17 Mar 2017 17:30:21 +0000 (18:30 +0100)
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 <tarceri@itsqueeze.com>
src/gallium/drivers/radeonsi/si_pipe.c
src/gallium/drivers/radeonsi/si_state_shaders.c

index a9a7c8fa42dc9cc8c2212fa7d68a30bd2a2fc545..a3e001c74794d14c705cc66e80138d12b964f9c0 100644 (file)
@@ -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);
 
index 9cde0aabade10412fc8448d07be53c36b10e6786..3596f5af72ae3e9309c3bd0c7ba79c5b902637f7 100644 (file)
@@ -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,