From: Tom Stellard Date: Thu, 7 Mar 2013 15:51:25 +0000 (-0500) Subject: gallium: PIPE_COMPUTE_CAP_IR_TARGET - allow drivers to specify a processor v2 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c5e5b3401c52f83bd885497cb30125e78a21d666;p=mesa.git 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 --- diff --git a/src/gallium/docs/source/screen.rst b/src/gallium/docs/source/screen.rst index c1a3c0b1e73..4b01d77322e 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 be8ad155987..127149faefe 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 090d909a475..b5e2af2afed 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 1e4c9642a0d..7f308f7d001 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 541d42e7983..de1545e7cdd 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 3bcada5e33b..dcce2fa2bf1 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 17d825b1d42..ce6fabba65c 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 40a5c8c3d90..496741f3726 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 5fdf46e7358..0db4555d59a 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 1cad15c1d1d..15b10be2a13 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 &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 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) {