<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>