From: Marek Olšák <marek.ol...@amd.com> threaded gallium can't use pipe_context's LLVM target machine, because create_shader_selector can be called from a non-driver thread. --- src/gallium/drivers/radeonsi/si_pipe.c | 21 ++++++++++++--------- 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 a9a7c8f..a3e001c 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -683,22 +683,21 @@ static void si_destroy_screen(struct pipe_screen* pscreen) sscreen->ps_epilogs }; unsigned i; if (!sscreen) return; 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]) LLVMDisposeTargetMachine(sscreen->tm[i]); /* Free shader parts. */ for (i = 0; i < ARRAY_SIZE(parts); i++) { while (parts[i]) { struct si_shader_part *part = parts[i]; @@ -790,20 +789,31 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws) si_init_screen_state_functions(sscreen); if (!r600_common_screen_init(&sscreen->b, ws) || !si_init_gs_info(sscreen) || !si_init_shader_cache(sscreen)) { FREE(sscreen); 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)) si_init_perfcounters(sscreen); /* Hawaii has a bug with offchip buffers > 256 that can be worked * around by setting 4K granularity. */ sscreen->tess_offchip_block_dw_size = sscreen->b.family == CHIP_HAWAII ? 4096 : 8192; @@ -834,28 +844,21 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws) (sscreen->b.debug_flags & DBG_MONOLITHIC_SHADERS) != 0; sscreen->b.barrier_flags.cp_to_L2 = SI_CONTEXT_INV_SMEM_L1 | SI_CONTEXT_INV_VMEM_L1 | SI_CONTEXT_INV_GLOBAL_L2; sscreen->b.barrier_flags.compute_to_L2 = SI_CONTEXT_CS_PARTIAL_FLUSH; 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); if (sscreen->b.debug_flags & DBG_TEST_DMA) r600_test_dma(&sscreen->b); return &sscreen->b.b; } diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index 9cde0aa..3596f5a 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -1762,22 +1762,21 @@ static void *si_create_shader_selector(struct pipe_context *ctx, } else { /* Case 1. */ sel->db_shader_control |= S_02880C_Z_ORDER(V_02880C_EARLY_Z_THEN_LATE_Z); } (void) mtx_init(&sel->mutex, mtx_plain); util_queue_fence_init(&sel->ready); 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, &sel->ready, si_init_shader_selector_async, NULL); return sel; } static void si_bind_vs_shader(struct pipe_context *ctx, void *state) -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev