[Mesa-dev] [PATCH 09/11] radeonsi: port to shared ac llvm per-thread structs.

Marek Olšák maraeo at gmail.com
Sat Jun 30 03:55:36 UTC 2018


On Tue, Jun 26, 2018 at 11:58 PM, Dave Airlie <airlied at gmail.com> wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> The new structs are pretty much based on the radeonsi code,
> so it just ports over the uses to them.
> ---
>  src/gallium/drivers/radeonsi/si_compute.c     |  2 +-
>  src/gallium/drivers/radeonsi/si_pipe.c        | 50 ++++---------------
>  src/gallium/drivers/radeonsi/si_pipe.h        |  6 +--
>  src/gallium/drivers/radeonsi/si_shader.c      | 24 ++++-----
>  src/gallium/drivers/radeonsi/si_shader.h      | 18 ++-----
>  .../drivers/radeonsi/si_shader_internal.h     |  6 +--
>  .../drivers/radeonsi/si_shader_tgsi_setup.c   |  9 ++--
>  .../drivers/radeonsi/si_state_shaders.c       |  4 +-
>  8 files changed, 40 insertions(+), 79 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c
> index cb320323db3..e8ad6ce0e16 100644
> --- a/src/gallium/drivers/radeonsi/si_compute.c
> +++ b/src/gallium/drivers/radeonsi/si_compute.c
> @@ -86,7 +86,7 @@ static void si_create_compute_state_async(void *job, int thread_index)
>         struct si_compute *program = (struct si_compute *)job;
>         struct si_shader *shader = &program->shader;
>         struct si_shader_selector sel;
> -       struct si_compiler *compiler;
> +       struct ac_llvm_compiler_info *compiler;
>         struct pipe_debug_callback *debug = &program->compiler_ctx_state.debug;
>
>         assert(!debug->debug_message || debug->async);
> diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
> index aca61670765..e4906a479c9 100644
> --- a/src/gallium/drivers/radeonsi/si_pipe.c
> +++ b/src/gallium/drivers/radeonsi/si_pipe.c
> @@ -105,51 +105,21 @@ static const struct debug_named_value debug_options[] = {
>  };
>
>  static void si_init_compiler(struct si_screen *sscreen,
> -                            struct si_compiler *compiler)
> +                            struct ac_llvm_compiler_info *compiler)
>  {
>         enum ac_target_machine_options tm_options =
>                 (sscreen->debug_flags & DBG(SI_SCHED) ? AC_TM_SISCHED : 0) |
>                 (sscreen->info.chip_class >= GFX9 ? AC_TM_FORCE_ENABLE_XNACK : 0) |
>                 (sscreen->info.chip_class < GFX9 ? AC_TM_FORCE_DISABLE_XNACK : 0) |
> -               (!sscreen->llvm_has_working_vgpr_indexing ? AC_TM_PROMOTE_ALLOCA_TO_SCRATCH : 0);
> +               (!sscreen->llvm_has_working_vgpr_indexing ? AC_TM_PROMOTE_ALLOCA_TO_SCRATCH : 0) |
> +               (sscreen->debug_flags & DBG(CHECK_IR) ? AC_TM_CHECK_IR : 0);
>
>         ac_init_llvm_once();
> -       compiler->tm = ac_create_target_machine(sscreen->info.family,
> -                                               tm_options, &compiler->triple);
> -       if (!compiler->tm)
> -               return;
> -
> -       compiler->target_library_info =
> -               gallivm_create_target_library_info(compiler->triple);
> -       if (!compiler->target_library_info)
> -               return;
> -
> -       compiler->passmgr = ac_init_passmgr(compiler->target_library_info,
> -                                           (sscreen->debug_flags & DBG(CHECK_IR)));
> -       if (!compiler->passmgr)
> -               return;
>
> -       /* Get the data layout. */
> -       LLVMTargetDataRef data_layout = LLVMCreateTargetDataLayout(compiler->tm);
> -       if (!data_layout)
> -               return;
> -       compiler->data_layout = LLVMCopyStringRepOfTargetData(data_layout);
> -       LLVMDisposeTargetData(data_layout);
> -}
> -
> -static void si_destroy_compiler(struct si_compiler *compiler)
> -{
> -       if (compiler->data_layout)
> -               LLVMDisposeMessage((char*)compiler->data_layout);
> -       if (compiler->passmgr)
> -               LLVMDisposePassManager(compiler->passmgr);
> -#if HAVE_LLVM >= 0x0700
> -       /* This crashes on LLVM 5.0 and 6.0 and Ubuntu 18.04, so leak it there. */
> -       if (compiler->target_library_info)
> -               gallivm_dispose_target_library_info(compiler->target_library_info);
> -#endif
> -       if (compiler->tm)
> -               LLVMDisposeTargetMachine(compiler->tm);
> +       ac_llvm_compiler_init(compiler,
> +                             true,
> +                             sscreen->info.family,
> +                             tm_options);
>  }
>
>  /*
> @@ -250,7 +220,7 @@ static void si_destroy_context(struct pipe_context *context)
>         sctx->ws->fence_reference(&sctx->last_sdma_fence, NULL);
>         r600_resource_reference(&sctx->eop_bug_scratch, NULL);
>
> -       si_destroy_compiler(&sctx->compiler);
> +       ac_llvm_compiler_dispose(&sctx->compiler);
>
>         si_saved_cs_reference(&sctx->current_saved_cs, NULL);
>
> @@ -659,10 +629,10 @@ static void si_destroy_screen(struct pipe_screen* pscreen)
>         util_queue_destroy(&sscreen->shader_compiler_queue_low_priority);
>
>         for (i = 0; i < ARRAY_SIZE(sscreen->compiler); i++)
> -               si_destroy_compiler(&sscreen->compiler[i]);
> +               ac_llvm_compiler_dispose(&sscreen->compiler[i]);
>
>         for (i = 0; i < ARRAY_SIZE(sscreen->compiler_lowp); i++)
> -               si_destroy_compiler(&sscreen->compiler_lowp[i]);
> +               ac_llvm_compiler_dispose(&sscreen->compiler_lowp[i]);
>
>         /* Free shader parts. */
>         for (i = 0; i < ARRAY_SIZE(parts); i++) {
> diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h
> index bd857f8a349..210e28fe105 100644
> --- a/src/gallium/drivers/radeonsi/si_pipe.h
> +++ b/src/gallium/drivers/radeonsi/si_pipe.h
> @@ -515,12 +515,12 @@ struct si_screen {
>         /* Use at most 3 normal compiler threads on quadcore and better.
>          * Hyperthreaded CPUs report the number of threads, but we want
>          * the number of cores. We only need this many threads for shader-db. */
> -       struct si_compiler              compiler[24]; /* used by the queue only */
> +       struct ac_llvm_compiler_info    compiler[24]; /* used by the queue only */
>
>         struct util_queue               shader_compiler_queue_low_priority;
>         /* Use at most 2 low priority threads on quadcore and better.
>          * We want to minimize the impact on multithreaded Mesa. */
> -       struct si_compiler              compiler_lowp[10];
> +       struct ac_llvm_compiler_info    compiler_lowp[10];
>  };
>
>  struct si_blend_color {
> @@ -762,7 +762,7 @@ struct si_context {
>         void                            *vs_blit_texcoord;
>         struct si_screen                *screen;
>         struct pipe_debug_callback      debug;
> -       struct si_compiler              compiler; /* only non-threaded compilation */
> +       struct ac_llvm_compiler_info    compiler; /* only non-threaded compilation */
>         struct si_shader_ctx_state      fixed_func_tcs_shader;
>         struct r600_resource            *wait_mem_scratch;
>         unsigned                        wait_mem_number;
> diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
> index b04ad217ce3..c7bcf2d3674 100644
> --- a/src/gallium/drivers/radeonsi/si_shader.c
> +++ b/src/gallium/drivers/radeonsi/si_shader.c
> @@ -69,7 +69,7 @@ enum si_arg_regfile {
>
>  static void si_init_shader_ctx(struct si_shader_context *ctx,
>                                struct si_screen *sscreen,
> -                              struct si_compiler *compiler);
> +                              struct ac_llvm_compiler_info *compiler);
>
>  static void si_llvm_emit_barrier(const struct lp_build_tgsi_action *action,
>                                  struct lp_build_tgsi_context *bld_base,
> @@ -5642,7 +5642,7 @@ void si_shader_dump(struct si_screen *sscreen, const struct si_shader *shader,
>  static int si_compile_llvm(struct si_screen *sscreen,
>                            struct ac_shader_binary *binary,
>                            struct si_shader_config *conf,
> -                          struct si_compiler *compiler,
> +                          struct ac_llvm_compiler_info *compiler,
>                            LLVMModuleRef mod,
>                            struct pipe_debug_callback *debug,
>                            unsigned processor,
> @@ -5720,7 +5720,7 @@ static void si_llvm_build_ret(struct si_shader_context *ctx, LLVMValueRef ret)
>  /* Generate code for the hardware VS shader stage to go with a geometry shader */
>  struct si_shader *
>  si_generate_gs_copy_shader(struct si_screen *sscreen,
> -                          struct si_compiler *compiler,
> +                          struct ac_llvm_compiler_info *compiler,
>                            struct si_shader_selector *gs_selector,
>                            struct pipe_debug_callback *debug)
>  {
> @@ -5967,7 +5967,7 @@ static void si_dump_shader_key(unsigned processor, const struct si_shader *shade
>
>  static void si_init_shader_ctx(struct si_shader_context *ctx,
>                                struct si_screen *sscreen,
> -                              struct si_compiler *compiler)
> +                              struct ac_llvm_compiler_info *compiler)
>  {
>         struct lp_build_tgsi_context *bld_base;
>
> @@ -6749,7 +6749,7 @@ static void si_build_wrapper_function(struct si_shader_context *ctx,
>  }
>
>  int si_compile_tgsi_shader(struct si_screen *sscreen,
> -                          struct si_compiler *compiler,
> +                          struct ac_llvm_compiler_info *compiler,
>                            struct si_shader *shader,
>                            struct pipe_debug_callback *debug)
>  {
> @@ -7090,7 +7090,7 @@ si_get_shader_part(struct si_screen *sscreen,
>                    enum pipe_shader_type type,
>                    bool prolog,
>                    union si_shader_part_key *key,
> -                  struct si_compiler *compiler,
> +                  struct ac_llvm_compiler_info *compiler,
>                    struct pipe_debug_callback *debug,
>                    void (*build)(struct si_shader_context *,
>                                  union si_shader_part_key *),
> @@ -7336,7 +7336,7 @@ static void si_build_vs_prolog_function(struct si_shader_context *ctx,
>  }
>
>  static bool si_get_vs_prolog(struct si_screen *sscreen,
> -                            struct si_compiler *compiler,
> +                            struct ac_llvm_compiler_info *compiler,
>                              struct si_shader *shader,
>                              struct pipe_debug_callback *debug,
>                              struct si_shader *main_part,
> @@ -7364,7 +7364,7 @@ static bool si_get_vs_prolog(struct si_screen *sscreen,
>   * Select and compile (or reuse) vertex shader parts (prolog & epilog).
>   */
>  static bool si_shader_select_vs_parts(struct si_screen *sscreen,
> -                                     struct si_compiler *compiler,
> +                                     struct ac_llvm_compiler_info *compiler,
>                                       struct si_shader *shader,
>                                       struct pipe_debug_callback *debug)
>  {
> @@ -7453,7 +7453,7 @@ static void si_build_tcs_epilog_function(struct si_shader_context *ctx,
>   * Select and compile (or reuse) TCS parts (epilog).
>   */
>  static bool si_shader_select_tcs_parts(struct si_screen *sscreen,
> -                                      struct si_compiler *compiler,
> +                                      struct ac_llvm_compiler_info *compiler,
>                                        struct si_shader *shader,
>                                        struct pipe_debug_callback *debug)
>  {
> @@ -7485,7 +7485,7 @@ static bool si_shader_select_tcs_parts(struct si_screen *sscreen,
>   * Select and compile (or reuse) GS parts (prolog).
>   */
>  static bool si_shader_select_gs_parts(struct si_screen *sscreen,
> -                                     struct si_compiler *compiler,
> +                                     struct ac_llvm_compiler_info *compiler,
>                                       struct si_shader *shader,
>                                       struct pipe_debug_callback *debug)
>  {
> @@ -7898,7 +7898,7 @@ static void si_build_ps_epilog_function(struct si_shader_context *ctx,
>   * Select and compile (or reuse) pixel shader parts (prolog & epilog).
>   */
>  static bool si_shader_select_ps_parts(struct si_screen *sscreen,
> -                                     struct si_compiler *compiler,
> +                                     struct ac_llvm_compiler_info *compiler,
>                                       struct si_shader *shader,
>                                       struct pipe_debug_callback *debug)
>  {
> @@ -8029,7 +8029,7 @@ static void si_fix_resource_usage(struct si_screen *sscreen,
>         }
>  }
>
> -int si_shader_create(struct si_screen *sscreen, struct si_compiler *compiler,
> +int si_shader_create(struct si_screen *sscreen, struct ac_llvm_compiler_info *compiler,
>                      struct si_shader *shader,
>                      struct pipe_debug_callback *debug)
>  {
> diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h
> index 0ca0a6b9679..78a5d2b4bcc 100644
> --- a/src/gallium/drivers/radeonsi/si_shader.h
> +++ b/src/gallium/drivers/radeonsi/si_shader.h
> @@ -139,6 +139,7 @@
>
>  #include "ac_binary.h"
>  #include "ac_llvm_build.h"
> +#include "ac_llvm_util.h"
>
>  #include <stdio.h>
>
> @@ -311,20 +312,11 @@ enum {
>
>  struct si_shader;
>
> -/* Per-thread persistent LLVM objects. */
> -struct si_compiler {
> -       LLVMTargetMachineRef            tm;
> -       const char                      *triple;
> -       const char                      *data_layout;
> -       LLVMTargetLibraryInfoRef        target_library_info;
> -       LLVMPassManagerRef              passmgr;
> -};
> -
>  /* State of the context creating the shader object. */
>  struct si_compiler_ctx_state {
>         /* Should only be used by si_init_shader_selector_async and
>          * si_build_shader_variant if thread_index == -1 (non-threaded). */
> -       struct si_compiler              *compiler;
> +       struct ac_llvm_compiler_info            *compiler;
>
>         /* Used if thread_index == -1 or if debug.async is true. */
>         struct pipe_debug_callback      debug;
> @@ -656,14 +648,14 @@ struct si_shader_part {
>  /* si_shader.c */
>  struct si_shader *
>  si_generate_gs_copy_shader(struct si_screen *sscreen,
> -                          struct si_compiler *compiler,
> +                          struct ac_llvm_compiler_info *compiler,
>                            struct si_shader_selector *gs_selector,
>                            struct pipe_debug_callback *debug);
>  int si_compile_tgsi_shader(struct si_screen *sscreen,
> -                          struct si_compiler *compiler,
> +                          struct ac_llvm_compiler_info *compiler,
>                            struct si_shader *shader,
>                            struct pipe_debug_callback *debug);
> -int si_shader_create(struct si_screen *sscreen, struct si_compiler *compiler,
> +int si_shader_create(struct si_screen *sscreen, struct ac_llvm_compiler_info *compiler,
>                      struct si_shader *shader,
>                      struct pipe_debug_callback *debug);
>  void si_shader_destroy(struct si_shader *shader);
> diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h
> index 5c275ab6d9f..2832d9db19f 100644
> --- a/src/gallium/drivers/radeonsi/si_shader_internal.h
> +++ b/src/gallium/drivers/radeonsi/si_shader_internal.h
> @@ -174,7 +174,7 @@ struct si_shader_context {
>         /* CS */
>         int param_block_size;
>
> -       struct si_compiler *compiler;
> +       struct ac_llvm_compiler_info *compiler;
>
>         /* Preloaded descriptors. */
>         LLVMValueRef esgs_ring;
> @@ -216,7 +216,7 @@ si_shader_context_from_abi(struct ac_shader_abi *abi)
>  }
>
>  unsigned si_llvm_compile(LLVMModuleRef M, struct ac_shader_binary *binary,
> -                        struct si_compiler *compiler,
> +                        struct ac_llvm_compiler_info *compiler,
>                          struct pipe_debug_callback *debug);
>
>  LLVMTypeRef tgsi2llvmtype(struct lp_build_tgsi_context *bld_base,
> @@ -231,7 +231,7 @@ LLVMValueRef si_llvm_bound_index(struct si_shader_context *ctx,
>
>  void si_llvm_context_init(struct si_shader_context *ctx,
>                           struct si_screen *sscreen,
> -                         struct si_compiler *compiler);
> +                         struct ac_llvm_compiler_info *compiler);
>  void si_llvm_context_set_tgsi(struct si_shader_context *ctx,
>                               struct si_shader *shader);
>
> diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c
> index de3a6cbf0d7..736fa4b7828 100644
> --- a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c
> +++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c
> @@ -81,7 +81,7 @@ static void si_diagnostic_handler(LLVMDiagnosticInfoRef di, void *context)
>   * @returns 0 for success, 1 for failure
>   */
>  unsigned si_llvm_compile(LLVMModuleRef M, struct ac_shader_binary *binary,
> -                        struct si_compiler *compiler,
> +                        struct ac_llvm_compiler_info *compiler,
>                          struct pipe_debug_callback *debug)
>  {
>         struct si_llvm_diagnostics diag;
> @@ -101,9 +101,8 @@ unsigned si_llvm_compile(LLVMModuleRef M, struct ac_shader_binary *binary,
>         LLVMContextSetDiagnosticHandler(llvm_ctx, si_diagnostic_handler, &diag);
>
>         /* Compile IR*/
> -       mem_err = LLVMTargetMachineEmitToMemoryBuffer(compiler->tm, M,
> -                                                     LLVMObjectFile, &err,
> -                                                     &out_buffer);
> +       mem_err = ac_compile_to_memory_buffer(compiler, M,
> +                                             &err, &out_buffer);

Are you sure you want to add this change? I think you said that it
doesn't work on radeonsi.

Marek


More information about the mesa-dev mailing list