From: Tom Stellard <thomas.stell...@amd.com>

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
---
 src/gallium/docs/source/screen.rst                 |    8 +-
 src/gallium/drivers/r600/r600_llvm.c               |   63 -----------------
 src/gallium/drivers/r600/r600_llvm.h               |    2 -
 src/gallium/drivers/r600/r600_pipe.c               |   74 ++++++++++++++++++-
 src/gallium/drivers/r600/r600_pipe.h               |    2 +
 src/gallium/drivers/radeonsi/radeonsi_pipe.c       |   11 +++
 src/gallium/drivers/radeonsi/radeonsi_pipe.h       |    1 +
 src/gallium/drivers/radeonsi/radeonsi_shader.c     |    4 +-
 .../state_trackers/clover/llvm/invocation.cpp      |   18 ++++--
 9 files changed, 104 insertions(+), 79 deletions(-)

diff --git a/src/gallium/docs/source/screen.rst 
b/src/gallium/docs/source/screen.rst
index 68d1a35..10836f1 100644
--- a/src/gallium/docs/source/screen.rst
+++ b/src/gallium/docs/source/screen.rst
@@ -222,10 +222,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 042193c..1552ccb 100644
--- a/src/gallium/drivers/r600/r600_llvm.c
+++ b/src/gallium/drivers/r600/r600_llvm.c
@@ -561,69 +561,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 60a0247..66dac62 100644
--- a/src/gallium/drivers/r600/r600_pipe.c
+++ b/src/gallium/drivers/r600/r600_pipe.c
@@ -760,18 +760,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 285d45f..b84b278 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -738,6 +738,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/radeonsi/radeonsi_pipe.c 
b/src/gallium/drivers/radeonsi/radeonsi_pipe.c
index acf3e2d..1f545d4 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 d0f04f4..c79e03b 100644
--- a/src/gallium/drivers/radeonsi/radeonsi_pipe.h
+++ b/src/gallium/drivers/radeonsi/radeonsi_pipe.h
@@ -210,6 +210,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 95ccd1e..00a46a9 100644
--- a/src/gallium/drivers/radeonsi/radeonsi_shader.c
+++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c
@@ -1040,7 +1040,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 2785d10..f5d7793 100644
--- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
+++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
@@ -109,7 +109,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;
@@ -174,6 +175,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
@@ -214,12 +216,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
@@ -338,18 +342,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) {
-- 
1.7.3.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to