ac/radv: split the non-common init_once code from the common target code. (v2)
authorDave Airlie <airlied@redhat.com>
Tue, 26 Jun 2018 22:36:41 +0000 (08:36 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 3 Jul 2018 19:15:23 +0000 (05:15 +1000)
This just splits out the non-shared code and reuses ac_get_llvm_target in radv.

v2: rebase on Marek's patch - fixup brace position/whitespace

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/amd/common/ac_llvm_util.c
src/amd/common/ac_llvm_util.h
src/amd/vulkan/radv_shader.c
src/gallium/drivers/radeonsi/si_pipe.c

index 99cc677edce6037d0eefc172faa570fa8d2914d1..25ff4a8c22ad020f447e3ed88b4fef67e14337a8 100644 (file)
@@ -57,13 +57,16 @@ 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) {
index 6e6d15bb56c493485f39197a7b8b101ba4e5ea0b..4311c5ea8a4c52c5029784fc16d77e04c7bd41c6 100644 (file)
@@ -111,6 +111,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
index 9470c4907c207ab9929f30460ab7e46821236967..749e89e4bf795b011c41922deb90377e29701d8f 100644 (file)
@@ -521,22 +521,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,
@@ -546,7 +533,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",
@@ -604,8 +591,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;
-       tm = radv_create_target_machine(chip_family, tm_options, NULL);
 
+       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,
index 5da8a4b9873150c44fb87563a324979fdcb17bf0..0d6d93a73586ecfb08652a34ccba4f63b6fdf43f 100644 (file)
@@ -120,6 +120,7 @@ static void si_init_compiler(struct si_screen *sscreen,
                (!sscreen->llvm_has_working_vgpr_indexing ? AC_TM_PROMOTE_ALLOCA_TO_SCRATCH : 0);
 
        const char *triple;
+       ac_init_llvm_once();
        compiler->tm = ac_create_target_machine(sscreen->info.family,
                                                tm_options, &triple);
        if (!compiler->tm)