[Mesa-dev] [PATCH 01/11] ac/radv: split the non-common init_once code from the common target code.
Dave Airlie
airlied at gmail.com
Wed Jun 27 03:58:35 UTC 2018
From: Dave Airlie <airlied at 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
More information about the mesa-dev
mailing list