<html><head></head><body>R300 had the same problem. Linking to amd_common ends up pulling in addrlib too. Jfyi<br><br><div class="gmail_quote">On June 25, 2018 5:48:51 PM PDT, Timothy Arceri <tarceri@itsqueeze.com> wrote:<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<pre class="k9mail">On 26/06/18 09:51, Dieter Nützel wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #729fcf; padding-left: 1ex;"> Hello Marek,<br> <br> after this series landed I get this:<br> <br> Making all in targets/pipe-loader<br> make[4]: Verzeichnis „/opt/mesa/src/gallium/targets/pipe-loader“ wird <br> betreten<br>    CXXLD    pipe_r600.la<br> ../../../../src/gallium/winsys/radeon/drm/.libs/libradeonwinsys.a(radeon_drm_surface.o): <br> In function `radeon_winsys_surface_init':<br> /opt/mesa/src/gallium/winsys/radeon/drm/radeon_drm_surface.c:307: <br> undefined reference to `ac_compute_cmask'<br> collect2: error: ld returned 1 exit status<br> make[4]: *** [Makefile:970: pipe_r600.la] Fehler 1<br> <br> Didn't have more time for digging, yet.<br></blockquote><br>r600 probably doesn't get linked to the amd common (ac) code that is <br>normally just shared between radv and radeonsi.<br><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #729fcf; padding-left: 1ex;"> <br> Dieter<br> <br> Am 23.06.2018 00:31, schrieb Marek Olšák:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #ad7fa8; padding-left: 1ex;"> From: Marek Olšák <marek.olsak@amd.com><br><br> ---<br>  src/gallium/drivers/radeonsi/si_shader.c      | 30 +++++++++----------<br>  src/gallium/drivers/radeonsi/si_shader.h      |  1 -<br>  .../drivers/radeonsi/si_shader_internal.h     |  3 --<br>  .../drivers/radeonsi/si_state_shaders.c       |  7 +++--<br>  4 files changed, 18 insertions(+), 23 deletions(-)<br><br> diff --git a/src/gallium/drivers/radeonsi/si_shader.c<br> b/src/gallium/drivers/radeonsi/si_shader.c<br> index e7e2a12a7b0..677853af60b 100644<br> --- a/src/gallium/drivers/radeonsi/si_shader.c<br> +++ b/src/gallium/drivers/radeonsi/si_shader.c<br> @@ -5047,22 +5047,21 @@ static void create_function(struct<br> si_shader_context *ctx)<br>          break;<br>      default:<br>          assert(0 && "unimplemented shader");<br>          return;<br>      }<br><br>      si_create_function(ctx, "main", returns, num_returns, &fninfo,<br>                 si_get_max_workgroup_size(shader));<br><br>      /* Reserve register locations for VGPR inputs the PS prolog may <br> need. */<br> -    if (ctx->type == PIPE_SHADER_FRAGMENT &&<br> -        ctx->separate_prolog) {<br> +    if (ctx->type == PIPE_SHADER_FRAGMENT && <br> !ctx->shader->is_monolithic) {<br>          ac_llvm_add_target_dep_function_attr(ctx->main_fn,<br>                               "InitialPSInputAddr",<br>                               S_0286D0_PERSP_SAMPLE_ENA(1) |<br>                               S_0286D0_PERSP_CENTER_ENA(1) |<br>                               S_0286D0_PERSP_CENTROID_ENA(1) |<br>                               S_0286D0_LINEAR_SAMPLE_ENA(1) |<br>                               S_0286D0_LINEAR_CENTER_ENA(1) |<br>                               S_0286D0_LINEAR_CENTROID_ENA(1) |<br>                               S_0286D0_FRONT_FACE_ENA(1) |<br>                               S_0286D0_ANCILLARY_ENA(1) |<br> @@ -6049,22 +6048,21 @@ static void si_init_exec_from_input(struct<br> si_shader_context *ctx,<br>  }<br><br>  static bool si_vs_needs_prolog(const struct si_shader_selector *sel,<br>                     const struct si_vs_prolog_bits *key)<br>  {<br>      /* VGPR initialization fixup for Vega10 and Raven is always done <br> in the<br>       * VS prolog. */<br>      return sel->vs_needs_prolog || key->ls_vgpr_fix;<br>  }<br><br> -static bool si_compile_tgsi_main(struct si_shader_context *ctx,<br> -                 bool is_monolithic)<br> +static bool si_compile_tgsi_main(struct si_shader_context *ctx)<br>  {<br>      struct si_shader *shader = ctx->shader;<br>      struct si_shader_selector *sel = shader->selector;<br>      struct lp_build_tgsi_context *bld_base = &ctx->bld_base;<br><br>      // TODO clean all this up!<br>      switch (ctx->type) {<br>      case PIPE_SHADER_VERTEX:<br>          ctx->load_input = declare_input_vs;<br>          if (shader->key.as_ls)<br> @@ -6135,31 +6133,31 @@ static bool si_compile_tgsi_main(struct<br> si_shader_context *ctx,<br>       * - Add a barrier before the second shader.<br>       * - In the second shader, reset EXEC to ~0 and wrap the main <br> part in<br>       *   an if-statement. This is required for correctness in geometry<br>       *   shaders, to ensure that empty GS waves do not send GS_EMIT and<br>       *   GS_CUT messages.<br>       *<br>       * For monolithic merged shaders, the first shader is wrapped in an<br>       * if-block together with its prolog in si_build_wrapper_function.<br>       */<br>      if (ctx->screen->info.chip_class >= GFX9) {<br> -        if (!is_monolithic &&<br> +        if (!shader->is_monolithic &&<br>              sel->info.num_instructions > 1 && /* not empty shader */<br>              (shader->key.as_es || shader->key.as_ls) &&<br>              (ctx->type == PIPE_SHADER_TESS_EVAL ||<br>               (ctx->type == PIPE_SHADER_VERTEX &&<br>                !si_vs_needs_prolog(sel, &shader->key.part.vs.prolog)))) {<br>              si_init_exec_from_input(ctx,<br>                          ctx->param_merged_wave_info, 0);<br>          } else if (ctx->type == PIPE_SHADER_TESS_CTRL ||<br>                 ctx->type == PIPE_SHADER_GEOMETRY) {<br> -            if (!is_monolithic)<br> +            if (!shader->is_monolithic)<br>                  ac_init_exec_full_mask(&ctx->ac);<br><br>              LLVMValueRef num_threads = si_unpack_param(ctx,<br> ctx->param_merged_wave_info, 8, 8);<br>              LLVMValueRef ena =<br>                  LLVMBuildICmp(ctx->ac.builder, LLVMIntULT,<br>                          ac_get_thread_id(&ctx->ac), num_threads, "");<br>              lp_build_if(&ctx->merged_wrap_if_state, &ctx->gallivm, ena);<br><br>              /* The barrier must execute for all shaders in a<br>               * threadgroup.<br> @@ -6766,71 +6764,69 @@ static void si_build_wrapper_function(struct<br> si_shader_context *ctx,<br>              }<br>          }<br>      }<br><br>      LLVMBuildRetVoid(builder);<br>  }<br><br>  int si_compile_tgsi_shader(struct si_screen *sscreen,<br>                 struct si_compiler *compiler,<br>                 struct si_shader *shader,<br> -               bool is_monolithic,<br>                 struct pipe_debug_callback *debug)<br>  {<br>      struct si_shader_selector *sel = shader->selector;<br>      struct si_shader_context ctx;<br>      int r = -1;<br><br>      /* Dump TGSI code before doing TGSI->LLVM conversion in case the<br>       * conversion fails. */<br>      if (si_can_dump_shader(sscreen, sel->info.processor) &&<br>          !(sscreen->debug_flags & DBG(NO_TGSI))) {<br>          if (sel->tokens)<br>              tgsi_dump(sel->tokens, 0);<br>          else<br>              nir_print_shader(sel->nir, stderr);<br>          si_dump_streamout(&sel->so);<br>      }<br><br>      si_init_shader_ctx(&ctx, sscreen, compiler);<br>      si_llvm_context_set_tgsi(&ctx, shader);<br> -    ctx.separate_prolog = !is_monolithic;<br><br>      memset(shader->info.vs_output_param_offset, AC_EXP_PARAM_UNDEFINED,<br>             sizeof(shader->info.vs_output_param_offset));<br><br>      shader->info.uses_instanceid = sel->info.uses_instanceid;<br><br> -    if (!si_compile_tgsi_main(&ctx, is_monolithic)) {<br> +    if (!si_compile_tgsi_main(&ctx)) {<br>          si_llvm_dispose(&ctx);<br>          return -1;<br>      }<br><br> -    if (is_monolithic && ctx.type == PIPE_SHADER_VERTEX) {<br> +    if (shader->is_monolithic && ctx.type == PIPE_SHADER_VERTEX) {<br>          LLVMValueRef parts[2];<br>          bool need_prolog = sel->vs_needs_prolog;<br><br>          parts[1] = ctx.main_fn;<br><br>          if (need_prolog) {<br>              union si_shader_part_key prolog_key;<br>              si_get_vs_prolog_key(&sel->info,<br>                           shader->info.num_input_sgprs,<br>                           &shader->key.part.vs.prolog,<br>                           shader, &prolog_key);<br>              si_build_vs_prolog_function(&ctx, &prolog_key);<br>              parts[0] = ctx.main_fn;<br>          }<br><br>          si_build_wrapper_function(&ctx, parts + !need_prolog,<br>                        1 + need_prolog, need_prolog, 0);<br> -    } else if (is_monolithic && ctx.type == PIPE_SHADER_TESS_CTRL) {<br> +    } else if (shader->is_monolithic && ctx.type == <br> PIPE_SHADER_TESS_CTRL) {<br>          if (sscreen->info.chip_class >= GFX9) {<br>              struct si_shader_selector *ls = shader->key.part.tcs.ls;<br>              LLVMValueRef parts[4];<br>              bool vs_needs_prolog =<br>                  si_vs_needs_prolog(ls, &shader->key.part.tcs.ls_prolog);<br><br>              /* TCS main part */<br>              parts[2] = ctx.main_fn;<br><br>              /* TCS epilog */<br> @@ -6839,23 +6835,24 @@ int si_compile_tgsi_shader(struct si_screen <br> *sscreen,<br>              tcs_epilog_key.tcs_epilog.states = <br> shader->key.part.tcs.epilog;<br>              si_build_tcs_epilog_function(&ctx, &tcs_epilog_key);<br>              parts[3] = ctx.main_fn;<br><br>              /* VS as LS main part */<br>              struct si_shader shader_ls = {};<br>              shader_ls.selector = ls;<br>              shader_ls.key.as_ls = 1;<br>              shader_ls.key.mono = shader->key.mono;<br>              shader_ls.key.opt = shader->key.opt;<br> +            shader_ls.is_monolithic = true;<br>              si_llvm_context_set_tgsi(&ctx, &shader_ls);<br><br> -            if (!si_compile_tgsi_main(&ctx, true)) {<br> +            if (!si_compile_tgsi_main(&ctx)) {<br>                  si_llvm_dispose(&ctx);<br>                  return -1;<br>              }<br>              shader->info.uses_instanceid |= ls->info.uses_instanceid;<br>              parts[1] = ctx.main_fn;<br><br>              /* LS prolog */<br>              if (vs_needs_prolog) {<br>                  union si_shader_part_key vs_prolog_key;<br>                  si_get_vs_prolog_key(&ls->info,<br> @@ -6881,21 +6878,21 @@ int si_compile_tgsi_shader(struct si_screen <br> *sscreen,<br><br>              parts[0] = ctx.main_fn;<br><br>              memset(&epilog_key, 0, sizeof(epilog_key));<br>              epilog_key.tcs_epilog.states = shader->key.part.tcs.epilog;<br>              si_build_tcs_epilog_function(&ctx, &epilog_key);<br>              parts[1] = ctx.main_fn;<br><br>              si_build_wrapper_function(&ctx, parts, 2, 0, 0);<br>          }<br> -    } else if (is_monolithic && ctx.type == PIPE_SHADER_GEOMETRY) {<br> +    } else if (shader->is_monolithic && ctx.type == <br> PIPE_SHADER_GEOMETRY) {<br>          if (ctx.screen->info.chip_class >= GFX9) {<br>              struct si_shader_selector *es = shader->key.part.gs.es;<br>              LLVMValueRef es_prolog = NULL;<br>              LLVMValueRef es_main = NULL;<br>              LLVMValueRef gs_prolog = NULL;<br>              LLVMValueRef gs_main = ctx.main_fn;<br><br>              /* GS prolog */<br>              union si_shader_part_key gs_prolog_key;<br>              memset(&gs_prolog_key, 0, sizeof(gs_prolog_key));<br> @@ -6903,23 +6900,24 @@ int si_compile_tgsi_shader(struct si_screen <br> *sscreen,<br>              gs_prolog_key.gs_prolog.is_monolithic = true;<br>              si_build_gs_prolog_function(&ctx, &gs_prolog_key);<br>              gs_prolog = ctx.main_fn;<br><br>              /* ES main part */<br>              struct si_shader shader_es = {};<br>              shader_es.selector = es;<br>              shader_es.key.as_es = 1;<br>              shader_es.key.mono = shader->key.mono;<br>              shader_es.key.opt = shader->key.opt;<br> +            shader_es.is_monolithic = true;<br>              si_llvm_context_set_tgsi(&ctx, &shader_es);<br><br> -            if (!si_compile_tgsi_main(&ctx, true)) {<br> +            if (!si_compile_tgsi_main(&ctx)) {<br>                  si_llvm_dispose(&ctx);<br>                  return -1;<br>              }<br>              shader->info.uses_instanceid |= es->info.uses_instanceid;<br>              es_main = ctx.main_fn;<br><br>              /* ES prolog */<br>              if (es->vs_needs_prolog) {<br>                  union si_shader_part_key vs_prolog_key;<br>                  si_get_vs_prolog_key(&es->info,<br> @@ -6954,21 +6952,21 @@ int si_compile_tgsi_shader(struct si_screen <br> *sscreen,<br><br>              parts[1] = ctx.main_fn;<br><br>              memset(&prolog_key, 0, sizeof(prolog_key));<br>              prolog_key.gs_prolog.states = shader->key.part.gs.prolog;<br>              si_build_gs_prolog_function(&ctx, &prolog_key);<br>              parts[0] = ctx.main_fn;<br><br>              si_build_wrapper_function(&ctx, parts, 2, 1, 0);<br>          }<br> -    } else if (is_monolithic && ctx.type == PIPE_SHADER_FRAGMENT) {<br> +    } else if (shader->is_monolithic && ctx.type == <br> PIPE_SHADER_FRAGMENT) {<br>          LLVMValueRef parts[3];<br>          union si_shader_part_key prolog_key;<br>          union si_shader_part_key epilog_key;<br>          bool need_prolog;<br><br>          si_get_ps_prolog_key(shader, &prolog_key, false);<br>          need_prolog = si_need_ps_prolog(&prolog_key);<br><br>          parts[need_prolog ? 1 : 0] = ctx.main_fn;<br><br> @@ -8062,21 +8060,21 @@ int si_shader_create(struct si_screen<br> *sscreen, struct si_compiler *compiler,<br>      /* LS, ES, VS are compiled on demand if the main part hasn't been<br>       * compiled for that stage.<br>       *<br>       * Vertex shaders are compiled on demand when a vertex fetch<br>       * workaround must be applied.<br>       */<br>      if (shader->is_monolithic) {<br>          /* Monolithic shader (compiled as a whole, has many variants,<br>           * may take a long time to compile).<br>           */<br> -        r = si_compile_tgsi_shader(sscreen, compiler, shader, true, <br> debug);<br> +        r = si_compile_tgsi_shader(sscreen, compiler, shader, debug);<br>          if (r)<br>              return r;<br>      } else {<br>          /* The shader consists of several parts:<br>           *<br>           * - the middle part is the user shader, it has 1 variant only<br>           *   and it was compiled during the creation of the shader<br>           *   selector<br>           * - the prolog part is inserted at the beginning<br>           * - the epilog part is inserted at the end<br> diff --git a/src/gallium/drivers/radeonsi/si_shader.h<br> b/src/gallium/drivers/radeonsi/si_shader.h<br> index e1f6b392fbe..fd2f71bed74 100644<br> --- a/src/gallium/drivers/radeonsi/si_shader.h<br> +++ b/src/gallium/drivers/radeonsi/si_shader.h<br> @@ -655,21 +655,20 @@ struct si_shader_part {<br><br>  /* si_shader.c */<br>  struct si_shader *<br>  si_generate_gs_copy_shader(struct si_screen *sscreen,<br>                 struct si_compiler *compiler,<br>                 struct si_shader_selector *gs_selector,<br>                 struct pipe_debug_callback *debug);<br>  int si_compile_tgsi_shader(struct si_screen *sscreen,<br>                 struct si_compiler *compiler,<br>                 struct si_shader *shader,<br> -               bool is_monolithic,<br>                 struct pipe_debug_callback *debug);<br>  int si_shader_create(struct si_screen *sscreen, struct si_compiler <br> *compiler,<br>               struct si_shader *shader,<br>               struct pipe_debug_callback *debug);<br>  void si_shader_destroy(struct si_shader *shader);<br>  unsigned si_shader_io_get_unique_index_patch(unsigned semantic_name,<br> unsigned index);<br>  unsigned si_shader_io_get_unique_index(unsigned semantic_name, <br> unsigned index,<br>                         unsigned is_varying);<br>  int si_shader_binary_upload(struct si_screen *sscreen, struct<br> si_shader *shader);<br>  void si_shader_dump(struct si_screen *sscreen, const struct si_shader <br> *shader,<br> diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h<br> b/src/gallium/drivers/radeonsi/si_shader_internal.h<br> index 0a347172d62..e528a56023f 100644<br> --- a/src/gallium/drivers/radeonsi/si_shader_internal.h<br> +++ b/src/gallium/drivers/radeonsi/si_shader_internal.h<br> @@ -55,23 +55,20 @@ struct si_shader_context {<br>      struct si_screen *screen;<br><br>      unsigned type; /* PIPE_SHADER_* specifies the type of shader. */<br><br>      /* For clamping the non-constant index in resource indexing: */<br>      unsigned num_const_buffers;<br>      unsigned num_shader_buffers;<br>      unsigned num_images;<br>      unsigned num_samplers;<br><br> -    /* Whether the prolog will be compiled separately. */<br> -    bool separate_prolog;<br> -<br>      struct ac_shader_abi abi;<br><br>      /** This function is responsible for initilizing the inputs array <br> and will be<br>        * called once for each input declared in the TGSI shader.<br>        */<br>      void (*load_input)(struct si_shader_context *,<br>                 unsigned input_index,<br>                 const struct tgsi_full_declaration *decl,<br>                 LLVMValueRef out[4]);<br><br> diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c<br> b/src/gallium/drivers/radeonsi/si_state_shaders.c<br> index f0498520ae8..ddd38dabbe6 100644<br> --- a/src/gallium/drivers/radeonsi/si_state_shaders.c<br> +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c<br> @@ -1573,24 +1573,24 @@ static bool si_check_missing_main_part(struct<br> si_screen *sscreen,<br>              return false;<br><br>          /* We can leave the fence as permanently signaled because the<br>           * main part becomes visible globally only after it has been<br>           * compiled. */<br>          util_queue_fence_init(&main_part->ready);<br><br>          main_part->selector = sel;<br>          main_part->key.as_es = key->as_es;<br>          main_part->key.as_ls = key->as_ls;<br> +        main_part->is_monolithic = false;<br><br>          if (si_compile_tgsi_shader(sscreen, compiler_state->compiler,<br> -                       main_part, false,<br> -                       &compiler_state->debug) != 0) {<br> +                       main_part, &compiler_state->debug) != 0) {<br>              FREE(main_part);<br>              return false;<br>          }<br>          *mainp = main_part;<br>      }<br>      return true;<br>  }<br><br>  /* Select the hw shader variant depending on the current state. */<br>  static int si_shader_select_with_key(struct si_screen *sscreen,<br> @@ -1875,39 +1875,40 @@ static void si_init_shader_selector_async(void<br> *job, int thread_index)<br>          if (!shader) {<br>              fprintf(stderr, "radeonsi: can't allocate a main shader <br> part\n");<br>              return;<br>          }<br><br>          /* We can leave the fence signaled because use of the default<br>           * main part is guarded by the selector's ready fence. */<br>          util_queue_fence_init(&shader->ready);<br><br>          shader->selector = sel;<br> +        shader->is_monolithic = false;<br>          si_parse_next_shader_property(&sel->info,<br>                            sel->so.num_outputs != 0,<br>                            &shader->key);<br><br>          if (sel->tokens || sel->nir)<br>              ir_binary = si_get_ir_binary(sel);<br><br>          /* Try to load the shader from the shader cache. */<br>          mtx_lock(&sscreen->shader_cache_mutex);<br><br>          if (ir_binary &&<br>              si_shader_cache_load_shader(sscreen, ir_binary, shader)) {<br>              mtx_unlock(&sscreen->shader_cache_mutex);<br>              si_shader_dump_stats_for_shader_db(shader, debug);<br>          } else {<br>              mtx_unlock(&sscreen->shader_cache_mutex);<br><br>              /* Compile the shader if it hasn't been loaded from the <br> cache. */<br> -            if (si_compile_tgsi_shader(sscreen, compiler, shader, false,<br> +            if (si_compile_tgsi_shader(sscreen, compiler, shader,<br>                             debug) != 0) {<br>                  FREE(shader);<br>                  FREE(ir_binary);<br>                  fprintf(stderr, "radeonsi: can't compile a main <br> shader part\n");<br>                  return;<br>              }<br><br>              if (ir_binary) {<br>                  mtx_lock(&sscreen->shader_cache_mutex);<br>                  if (!si_shader_cache_insert_shader(sscreen, <br> ir_binary, shader, true))<br></blockquote></blockquote><hr><br>mesa-dev mailing list<br>mesa-dev@lists.freedesktop.org<br><a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br></pre></blockquote></div></body></html>