gallium: PIPE_COMPUTE_CAP_IR_TARGET - allow drivers to specify a processor v2
authorTom Stellard <thomas.stellard@amd.com>
Thu, 7 Mar 2013 15:51:25 +0000 (10:51 -0500)
committerTom Stellard <thomas.stellard@amd.com>
Fri, 5 Apr 2013 22:43:34 +0000 (18:43 -0400)
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>
src/gallium/docs/source/screen.rst
src/gallium/drivers/r600/r600_llvm.c
src/gallium/drivers/r600/r600_llvm.h
src/gallium/drivers/r600/r600_pipe.c
src/gallium/drivers/r600/r600_pipe.h
src/gallium/drivers/radeon/LLVM_REVISION.txt
src/gallium/drivers/radeonsi/radeonsi_pipe.c
src/gallium/drivers/radeonsi/radeonsi_pipe.h
src/gallium/drivers/radeonsi/radeonsi_shader.c
src/gallium/state_trackers/clover/llvm/invocation.cpp

index c1a3c0b1e734666d2b8b9f74307528e3e5b17f0f..4b01d77322e501161a99ee7fb2fedb381f32d9f6 100644 (file)
@@ -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``.
index be8ad1559872ab0e48e2a8bf646985bac119c9ca..127149faefe2df6c4a77f82f72f7cdbe6375973d 100644 (file)
@@ -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,
index 090d909a475e634598672de4dfe5db43923a1672..b5e2af2afed3bf1c47baa9cc3315e7c5bb7bc7d6 100644 (file)
@@ -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,
index 1e4c9642a0d53614d9c5c37928e6b299dd87dbd6..7f308f7d001e058bee4dba9622450a3c789c25ff 100644 (file)
@@ -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;
index 541d42e798315af30d5be20c7c4024da315f3d42..de1545e7cdd0e391d91183e12f53331baecbd341 100644 (file)
@@ -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);
index 3bcada5e33bc1b1880346b0be10d48f9f4577938..dcce2fa2bf164cee89364b4fbf48c65f4e34bbc1 100644 (file)
@@ -1 +1 @@
-@178505
+@178928
index 17d825b1d42bf99bbc45a44f42231d2b3c499368..ce6fabba65c3c7e18efaa9b9c44311210b22f28e 100644 (file)
@@ -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) {
index 40a5c8c3d907b771e3561c85b1b0e6d62d280781..496741f37267f2dd8ca0c3166a4b710ecb8649d4 100644 (file)
@@ -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);
index 5fdf46e7358f9093db306dfc02810ddd40d77566..0db4555d59a350cabd5498a07dbaa66ff8a75295 100644 (file)
@@ -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 ) {
index 1cad15c1d1decf1857dc4f54a9e8a211b12564d1..15b10be2a13d1cff99693a93cfdcc6cea8b58f99 100644 (file)
@@ -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) {