summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTom Stellard <thomas.stellard@amd.com>2013-03-07 10:51:25 -0500
committerTom Stellard <thomas.stellard@amd.com>2013-04-05 18:43:34 -0400
commitc5e5b3401c52f83bd885497cb30125e78a21d666 (patch)
tree895fceb4d43d1d6d8e9427907bc081007a86d9fa /src
parent1a868acbecdd7b7cb71342a75a36ad9a80d8eb17 (diff)
downloadexternal_mesa3d-c5e5b3401c52f83bd885497cb30125e78a21d666.zip
external_mesa3d-c5e5b3401c52f83bd885497cb30125e78a21d666.tar.gz
external_mesa3d-c5e5b3401c52f83bd885497cb30125e78a21d666.tar.bz2
gallium: PIPE_COMPUTE_CAP_IR_TARGET - allow drivers to specify a processor v2
This target string now contains four values instead of three. The old processor field (which was really being interpreted as arch) has been split into two fields: processor and arch. This allows drivers to pass a more a more detailed description of the hardware to compiler frontends. v2: - Adapt to libclc changes Reviewed-by: Francisco Jerez <currojerez@riseup.net>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/docs/source/screen.rst8
-rw-r--r--src/gallium/drivers/r600/r600_llvm.c63
-rw-r--r--src/gallium/drivers/r600/r600_llvm.h2
-rw-r--r--src/gallium/drivers/r600/r600_pipe.c74
-rw-r--r--src/gallium/drivers/r600/r600_pipe.h2
-rw-r--r--src/gallium/drivers/radeon/LLVM_REVISION.txt2
-rw-r--r--src/gallium/drivers/radeonsi/radeonsi_pipe.c11
-rw-r--r--src/gallium/drivers/radeonsi/radeonsi_pipe.h1
-rw-r--r--src/gallium/drivers/radeonsi/radeonsi_shader.c4
-rw-r--r--src/gallium/state_trackers/clover/llvm/invocation.cpp18
10 files changed, 105 insertions, 80 deletions
diff --git a/src/gallium/docs/source/screen.rst b/src/gallium/docs/source/screen.rst
index c1a3c0b..4b01d77 100644
--- a/src/gallium/docs/source/screen.rst
+++ b/src/gallium/docs/source/screen.rst
@@ -236,10 +236,10 @@ PIPE_COMPUTE_CAP_*
Compute-specific capabilities. They can be queried using
pipe_screen::get_compute_param.
-* ``PIPE_COMPUTE_CAP_IR_TARGET``: A description of the target as a target
- triple specification of the form ``processor-manufacturer-os`` that will
- be passed on to the compiler. This CAP is only relevant for drivers
- that specify PIPE_SHADER_IR_LLVM for their preferred IR.
+* ``PIPE_COMPUTE_CAP_IR_TARGET``: A description of the target of the form
+ ``processor-arch-manufacturer-os`` that will be passed on to the compiler.
+ This CAP is only relevant for drivers that specify PIPE_SHADER_IR_LLVM for
+ their preferred IR.
Value type: null-terminated string.
* ``PIPE_COMPUTE_CAP_GRID_DIMENSION``: Number of supported dimensions
for grid and block coordinates. Value type: ``uint64_t``.
diff --git a/src/gallium/drivers/r600/r600_llvm.c b/src/gallium/drivers/r600/r600_llvm.c
index be8ad15..127149f 100644
--- a/src/gallium/drivers/r600/r600_llvm.c
+++ b/src/gallium/drivers/r600/r600_llvm.c
@@ -550,69 +550,6 @@ LLVMModuleRef r600_tgsi_llvm(
return ctx->gallivm.module;
}
-const char * r600_llvm_gpu_string(enum radeon_family family)
-{
- const char * gpu_family;
-
- switch (family) {
- case CHIP_R600:
- case CHIP_RV610:
- case CHIP_RV630:
- case CHIP_RV620:
- case CHIP_RV635:
- case CHIP_RV670:
- case CHIP_RS780:
- case CHIP_RS880:
- gpu_family = "r600";
- break;
- case CHIP_RV710:
- gpu_family = "rv710";
- break;
- case CHIP_RV730:
- gpu_family = "rv730";
- break;
- case CHIP_RV740:
- case CHIP_RV770:
- gpu_family = "rv770";
- break;
- case CHIP_PALM:
- case CHIP_CEDAR:
- gpu_family = "cedar";
- break;
- case CHIP_SUMO:
- case CHIP_SUMO2:
- case CHIP_REDWOOD:
- gpu_family = "redwood";
- break;
- case CHIP_JUNIPER:
- gpu_family = "juniper";
- break;
- case CHIP_HEMLOCK:
- case CHIP_CYPRESS:
- gpu_family = "cypress";
- break;
- case CHIP_BARTS:
- gpu_family = "barts";
- break;
- case CHIP_TURKS:
- gpu_family = "turks";
- break;
- case CHIP_CAICOS:
- gpu_family = "caicos";
- break;
- case CHIP_CAYMAN:
- case CHIP_ARUBA:
- gpu_family = "cayman";
- break;
- default:
- gpu_family = "";
- fprintf(stderr, "Chip not supported by r600 llvm "
- "backend, please file a bug at " PACKAGE_BUGREPORT "\n");
- break;
- }
- return gpu_family;
-}
-
unsigned r600_llvm_compile(
LLVMModuleRef mod,
unsigned char ** inst_bytes,
diff --git a/src/gallium/drivers/r600/r600_llvm.h b/src/gallium/drivers/r600/r600_llvm.h
index 090d909..b5e2af2 100644
--- a/src/gallium/drivers/r600/r600_llvm.h
+++ b/src/gallium/drivers/r600/r600_llvm.h
@@ -15,8 +15,6 @@ LLVMModuleRef r600_tgsi_llvm(
struct radeon_llvm_context * ctx,
const struct tgsi_token * tokens);
-const char * r600_llvm_gpu_string(enum radeon_family family);
-
unsigned r600_llvm_compile(
LLVMModuleRef mod,
unsigned char ** inst_bytes,
diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
index 1e4c964..7f308f7 100644
--- a/src/gallium/drivers/r600/r600_pipe.c
+++ b/src/gallium/drivers/r600/r600_pipe.c
@@ -764,18 +764,84 @@ static int r600_get_video_param(struct pipe_screen *screen,
}
}
+const char * r600_llvm_gpu_string(enum radeon_family family)
+{
+ const char * gpu_family;
+
+ switch (family) {
+ case CHIP_R600:
+ case CHIP_RV610:
+ case CHIP_RV630:
+ case CHIP_RV620:
+ case CHIP_RV635:
+ case CHIP_RV670:
+ case CHIP_RS780:
+ case CHIP_RS880:
+ gpu_family = "r600";
+ break;
+ case CHIP_RV710:
+ gpu_family = "rv710";
+ break;
+ case CHIP_RV730:
+ gpu_family = "rv730";
+ break;
+ case CHIP_RV740:
+ case CHIP_RV770:
+ gpu_family = "rv770";
+ break;
+ case CHIP_PALM:
+ case CHIP_CEDAR:
+ gpu_family = "cedar";
+ break;
+ case CHIP_SUMO:
+ case CHIP_SUMO2:
+ case CHIP_REDWOOD:
+ gpu_family = "redwood";
+ break;
+ case CHIP_JUNIPER:
+ gpu_family = "juniper";
+ break;
+ case CHIP_HEMLOCK:
+ case CHIP_CYPRESS:
+ gpu_family = "cypress";
+ break;
+ case CHIP_BARTS:
+ gpu_family = "barts";
+ break;
+ case CHIP_TURKS:
+ gpu_family = "turks";
+ break;
+ case CHIP_CAICOS:
+ gpu_family = "caicos";
+ break;
+ case CHIP_CAYMAN:
+ case CHIP_ARUBA:
+ gpu_family = "cayman";
+ break;
+ default:
+ gpu_family = "";
+ fprintf(stderr, "Chip not supported by r600 llvm "
+ "backend, please file a bug at " PACKAGE_BUGREPORT "\n");
+ break;
+ }
+ return gpu_family;
+}
+
+
static int r600_get_compute_param(struct pipe_screen *screen,
enum pipe_compute_cap param,
void *ret)
{
+ struct r600_screen *rscreen = (struct r600_screen *)screen;
//TODO: select these params by asic
switch (param) {
- case PIPE_COMPUTE_CAP_IR_TARGET:
+ case PIPE_COMPUTE_CAP_IR_TARGET: {
+ const char *gpu = r600_llvm_gpu_string(rscreen->family);
if (ret) {
- strcpy(ret, "r600--");
+ sprintf(ret, "%s-r600--", gpu);
}
- return 7 * sizeof(char);
-
+ return (8 + strlen(gpu)) * sizeof(char);
+ }
case PIPE_COMPUTE_CAP_GRID_DIMENSION:
if (ret) {
uint64_t * grid_dimension = ret;
diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
index 541d42e..de1545e 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -746,6 +746,8 @@ boolean r600_rings_is_buffer_referenced(struct r600_context *ctx,
void *r600_buffer_mmap_sync_with_rings(struct r600_context *ctx,
struct r600_resource *resource,
unsigned usage);
+const char * r600_llvm_gpu_string(enum radeon_family family);
+
/* r600_query.c */
void r600_init_query_functions(struct r600_context *rctx);
diff --git a/src/gallium/drivers/radeon/LLVM_REVISION.txt b/src/gallium/drivers/radeon/LLVM_REVISION.txt
index 3bcada5..dcce2fa 100644
--- a/src/gallium/drivers/radeon/LLVM_REVISION.txt
+++ b/src/gallium/drivers/radeon/LLVM_REVISION.txt
@@ -1 +1 @@
-@178505
+@178928
diff --git a/src/gallium/drivers/radeonsi/radeonsi_pipe.c b/src/gallium/drivers/radeonsi/radeonsi_pipe.c
index 17d825b..ce6fabb 100644
--- a/src/gallium/drivers/radeonsi/radeonsi_pipe.c
+++ b/src/gallium/drivers/radeonsi/radeonsi_pipe.c
@@ -274,6 +274,17 @@ static const char* r600_get_vendor(struct pipe_screen* pscreen)
return "X.Org";
}
+const char *r600_get_llvm_processor_name(enum radeon_family family)
+{
+ switch (family) {
+ case CHIP_TAHITI: return "tahiti";
+ case CHIP_PITCAIRN: return "pitcairn";
+ case CHIP_VERDE: return "verde";
+ case CHIP_OLAND: return "oland";
+ default: return "";
+ }
+}
+
static const char *r600_get_family_name(enum radeon_family family)
{
switch(family) {
diff --git a/src/gallium/drivers/radeonsi/radeonsi_pipe.h b/src/gallium/drivers/radeonsi/radeonsi_pipe.h
index 40a5c8c..496741f 100644
--- a/src/gallium/drivers/radeonsi/radeonsi_pipe.h
+++ b/src/gallium/drivers/radeonsi/radeonsi_pipe.h
@@ -218,6 +218,7 @@ void r600_upload_index_buffer(struct r600_context *rctx,
/* r600_pipe.c */
void radeonsi_flush(struct pipe_context *ctx, struct pipe_fence_handle **fence,
unsigned flags);
+const char *r600_get_llvm_processor_name(enum radeon_family family);
/* r600_query.c */
void r600_init_query_functions(struct r600_context *rctx);
diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c b/src/gallium/drivers/radeonsi/radeonsi_shader.c
index 5fdf46e..0db4555 100644
--- a/src/gallium/drivers/radeonsi/radeonsi_shader.c
+++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c
@@ -1165,7 +1165,9 @@ int si_pipe_shader_create(
if (dump) {
LLVMDumpModule(mod);
}
- radeon_llvm_compile(mod, &inst_bytes, &inst_byte_count, "SI", dump);
+ radeon_llvm_compile(mod, &inst_bytes, &inst_byte_count,
+ r600_get_llvm_processor_name(rctx->screen->family)
+ , dump);
if (dump) {
fprintf(stderr, "SI CODE:\n");
for (i = 0; i < inst_byte_count; i+=4 ) {
diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp
index 1cad15c..15b10be 100644
--- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
+++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
@@ -110,7 +110,8 @@ namespace {
llvm::Module *
compile(const std::string &source, const std::string &name,
- const std::string &triple, const std::string &opts) {
+ const std::string &triple, const std::string &processor,
+ const std::string &opts) {
clang::CompilerInstance c;
clang::CompilerInvocation invocation;
@@ -175,6 +176,7 @@ namespace {
c.getLangOpts().NoBuiltin = true;
c.getTargetOpts().Triple = triple;
+ c.getTargetOpts().CPU = processor;
#if HAVE_LLVM <= 0x0301
c.getInvocation().setLangDefaults(clang::IK_OpenCL);
#else
@@ -215,12 +217,14 @@ namespace {
void
link(llvm::Module *mod, const std::string &triple,
+ const std::string &processor,
const std::vector<llvm::Function *> &kernels) {
llvm::PassManager PM;
llvm::PassManagerBuilder Builder;
llvm::sys::Path libclc_path =
- llvm::sys::Path(LIBCLC_LIBEXECDIR + triple + ".bc");
+ llvm::sys::Path(LIBCLC_LIBEXECDIR + processor +
+ "-" + triple + ".bc");
// Link the kernel with libclc
#if HAVE_LLVM < 0x0303
@@ -339,18 +343,22 @@ namespace {
module
clover::compile_program_llvm(const compat::string &source,
enum pipe_shader_ir ir,
- const compat::string &triple,
+ const compat::string &target,
const compat::string &opts) {
std::vector<llvm::Function *> kernels;
+ size_t processor_str_len = std::string(target.begin()).find_first_of("-");
+ std::string processor(target.begin(), 0, processor_str_len);
+ std::string triple(target.begin(), processor_str_len + 1,
+ target.size() - processor_str_len - 1);
// The input file name must have the .cl extension in order for the
// CompilerInvocation class to recognize it as an OpenCL source file.
- llvm::Module *mod = compile(source, "input.cl", triple, opts);
+ llvm::Module *mod = compile(source, "input.cl", triple, processor, opts);
find_kernels(mod, kernels);
- link(mod, triple, kernels);
+ link(mod, triple, processor, kernels);
// Build the clover::module
switch (ir) {