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

Reply via email to