summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/radeon
diff options
context:
space:
mode:
authorTom Stellard <[email protected]>2014-12-23 10:26:23 -0500
committerTom Stellard <[email protected]>2015-01-06 12:53:21 -0800
commita8ef880a1b38cbcfc26e9f829338739d16cece99 (patch)
tree5a65fa8ae3ce7115a4b687c7394ced18a43b3054 /src/gallium/drivers/radeon
parent761e36b4caab4e8e09a4c2b1409a825902fc7d2c (diff)
radeon/llvm: Use amdgcn triple for SI+ on LLVM >= 3.6
Diffstat (limited to 'src/gallium/drivers/radeon')
-rw-r--r--src/gallium/drivers/radeon/r600_pipe_common.c11
-rw-r--r--src/gallium/drivers/radeon/radeon_llvm_emit.c21
-rw-r--r--src/gallium/drivers/radeon/radeon_llvm_emit.h2
3 files changed, 20 insertions, 14 deletions
diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c
index d4133d8cbad..d46b3b38f86 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.c
+++ b/src/gallium/drivers/radeon/r600_pipe_common.c
@@ -499,6 +499,12 @@ static int r600_get_compute_param(struct pipe_screen *screen,
switch (param) {
case PIPE_COMPUTE_CAP_IR_TARGET: {
const char *gpu;
+ const char *triple;
+ if (rscreen->family <= CHIP_ARUBA || HAVE_LLVM < 0x0306) {
+ triple = "r600--";
+ } else {
+ triple = "amdgcn--";
+ }
switch(rscreen->family) {
/* Clang < 3.6 is missing Hainan in its list of
* GPUs, so we need to use the name of a similar GPU.
@@ -513,9 +519,10 @@ static int r600_get_compute_param(struct pipe_screen *screen,
break;
}
if (ret) {
- sprintf(ret, "%s-r600--", gpu);
+ sprintf(ret, "%s-%s", gpu, triple);
+
}
- return (8 + strlen(gpu)) * sizeof(char);
+ return (strlen(triple) + strlen(gpu)) * sizeof(char);
}
case PIPE_COMPUTE_CAP_GRID_DIMENSION:
if (ret) {
diff --git a/src/gallium/drivers/radeon/radeon_llvm_emit.c b/src/gallium/drivers/radeon/radeon_llvm_emit.c
index 4f288e42b1f..b98afb246ae 100644
--- a/src/gallium/drivers/radeon/radeon_llvm_emit.c
+++ b/src/gallium/drivers/radeon/radeon_llvm_emit.c
@@ -98,20 +98,19 @@ static void init_r600_target()
}
}
-LLVMTargetRef radeon_llvm_get_r600_target()
+LLVMTargetRef radeon_llvm_get_r600_target(const char *triple)
{
LLVMTargetRef target = NULL;
+ char *err_message = NULL;
+
init_r600_target();
- for (target = LLVMGetFirstTarget(); target;
- target = LLVMGetNextTarget(target)) {
- if (!strncmp(LLVMGetTargetName(target), "r600", 4)) {
- break;
+ if (LLVMGetTargetFromTriple(triple, &target, &err_message)) {
+ fprintf(stderr, "Cannot find target for triple %s ", triple);
+ if (err_message) {
+ fprintf(stderr, "%s\n", err_message);
}
- }
-
- if (!target) {
- fprintf(stderr, "Can't find target r600\n");
+ LLVMDisposeMessage(err_message);
return NULL;
}
return target;
@@ -155,7 +154,8 @@ unsigned radeon_llvm_compile(LLVMModuleRef M, struct radeon_shader_binary *binar
LLVMBool mem_err;
if (!tm) {
- LLVMTargetRef target = radeon_llvm_get_r600_target();
+ strncpy(triple, "r600--", TRIPLE_STRING_LEN);
+ LLVMTargetRef target = radeon_llvm_get_r600_target(triple);
if (!target) {
return 1;
}
@@ -165,7 +165,6 @@ unsigned radeon_llvm_compile(LLVMModuleRef M, struct radeon_shader_binary *binar
LLVMDumpModule(M);
strncpy(fs, "+DumpCode", FS_STRING_LEN);
}
- strncpy(triple, "r600--", TRIPLE_STRING_LEN);
tm = LLVMCreateTargetMachine(target, triple, cpu, fs,
LLVMCodeGenLevelDefault, LLVMRelocDefault,
LLVMCodeModelDefault);
diff --git a/src/gallium/drivers/radeon/radeon_llvm_emit.h b/src/gallium/drivers/radeon/radeon_llvm_emit.h
index 66217b5ce5f..3ccef78e36d 100644
--- a/src/gallium/drivers/radeon/radeon_llvm_emit.h
+++ b/src/gallium/drivers/radeon/radeon_llvm_emit.h
@@ -34,7 +34,7 @@ struct radeon_shader_binary;
void radeon_llvm_shader_type(LLVMValueRef F, unsigned type);
-LLVMTargetRef radeon_llvm_get_r600_target(void);
+LLVMTargetRef radeon_llvm_get_r600_target(const char *triple);
unsigned radeon_llvm_compile(
LLVMModuleRef M,