From: Dave Airlie <airl...@redhat.com> This just splits out the non-shared code and reuses ac_get_llvm_target in radv. --- src/amd/common/ac_llvm_util.c | 6 ++++-- src/amd/common/ac_llvm_util.h | 2 ++ src/amd/vulkan/radv_shader.c | 20 ++++---------------- src/gallium/drivers/radeonsi/si_pipe.c | 1 + 4 files changed, 11 insertions(+), 18 deletions(-)
diff --git a/src/amd/common/ac_llvm_util.c b/src/amd/common/ac_llvm_util.c index be2d92b4c08..f33691dcc92 100644 --- a/src/amd/common/ac_llvm_util.c +++ b/src/amd/common/ac_llvm_util.c @@ -57,13 +57,15 @@ static void ac_init_llvm_target() static once_flag ac_init_llvm_target_once_flag = ONCE_FLAG_INIT; +void ac_init_llvm_once(void) { + call_once(&ac_init_llvm_target_once_flag, ac_init_llvm_target); +} + LLVMTargetRef ac_get_llvm_target(const char *triple) { LLVMTargetRef target = NULL; char *err_message = NULL; - call_once(&ac_init_llvm_target_once_flag, ac_init_llvm_target); - if (LLVMGetTargetFromTriple(triple, &target, &err_message)) { fprintf(stderr, "Cannot find target for triple %s ", triple); if (err_message) { diff --git a/src/amd/common/ac_llvm_util.h b/src/amd/common/ac_llvm_util.h index 0aa803c5bc1..4a894d0cc8f 100644 --- a/src/amd/common/ac_llvm_util.h +++ b/src/amd/common/ac_llvm_util.h @@ -110,6 +110,8 @@ ac_get_store_intr_attribs(bool writeonly_memory) unsigned ac_count_scratch_private_memory(LLVMValueRef function); +void ac_init_llvm_once(void); + #ifdef __cplusplus } #endif diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index c7ffd47c0b8..a7f058bc302 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -505,22 +505,9 @@ static void radv_init_llvm_target() static once_flag radv_init_llvm_target_once_flag = ONCE_FLAG_INIT; -static LLVMTargetRef radv_get_llvm_target(const char *triple) +static void radv_init_llvm_once(void) { - LLVMTargetRef target = NULL; - char *err_message = NULL; - call_once(&radv_init_llvm_target_once_flag, radv_init_llvm_target); - - if (LLVMGetTargetFromTriple(triple, &target, &err_message)) { - fprintf(stderr, "Cannot find target for triple %s ", triple); - if (err_message) { - fprintf(stderr, "%s\n", err_message); - } - LLVMDisposeMessage(err_message); - return NULL; - } - return target; } static LLVMTargetMachineRef radv_create_target_machine(enum radeon_family family, @@ -530,7 +517,7 @@ static LLVMTargetMachineRef radv_create_target_machine(enum radeon_family family assert(family >= CHIP_TAHITI); char features[256]; const char *triple = (tm_options & AC_TM_SUPPORTS_SPILL) ? "amdgcn-mesa-mesa3d" : "amdgcn--"; - LLVMTargetRef target = radv_get_llvm_target(triple); + LLVMTargetRef target = ac_get_llvm_target(triple); snprintf(features, sizeof(features), "+DumpCode,+vgpr-spilling,-fp32-denormals,+fp64-denormals%s%s%s%s", @@ -588,8 +575,9 @@ shader_variant_create(struct radv_device *device, tm_options |= AC_TM_SUPPORTS_SPILL; if (device->instance->perftest_flags & RADV_PERFTEST_SISCHED) tm_options |= AC_TM_SISCHED; + + radv_init_llvm_once(); tm = radv_create_target_machine(chip_family, tm_options, NULL); - if (gs_copy_shader) { assert(shader_count == 1); radv_compile_gs_copy_shader(tm, *shaders, &binary, diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index ded8cb5eb08..e1db4cccdde 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -119,6 +119,7 @@ static void si_init_compiler(struct si_screen *sscreen, (sscreen->info.chip_class < GFX9 ? AC_TM_FORCE_DISABLE_XNACK : 0) | (!sscreen->llvm_has_working_vgpr_indexing ? AC_TM_PROMOTE_ALLOCA_TO_SCRATCH : 0); + ac_init_llvm_once(); compiler->tm = ac_create_target_machine(sscreen->info.family, tm_options, &compiler->triple); if (!compiler->tm) -- 2.17.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev