diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c index efdad1449b6..3b638ceb5a7 100644 --- a/src/amd/llvm/ac_nir_to_llvm.c +++ b/src/amd/llvm/ac_nir_to_llvm.c @@ -5464,9 +5464,6 @@ void ac_nir_translate(struct ac_llvm_context *ac, struct ac_shader_abi *abi, if (ctx.ac.postponed_kill) ac_build_kill_if_false(&ctx.ac, LLVMBuildLoad2(ctx.ac.builder, ctx.ac.i1, ctx.ac.postponed_kill, "")); - if (!gl_shader_stage_is_compute(nir->info.stage)) - ctx.abi->emit_outputs(ctx.abi); - free(ctx.ssa_defs); ralloc_free(ctx.defs); ralloc_free(ctx.phis); diff --git a/src/amd/llvm/ac_shader_abi.h b/src/amd/llvm/ac_shader_abi.h index d71d25c6c0d..b7406b92b70 100644 --- a/src/amd/llvm/ac_shader_abi.h +++ b/src/amd/llvm/ac_shader_abi.h @@ -51,8 +51,6 @@ struct ac_shader_abi { void (*export_vertex)(struct ac_shader_abi *abi); - void (*emit_outputs)(struct ac_shader_abi *abi); - void (*emit_vertex)(struct ac_shader_abi *abi, unsigned stream, LLVMValueRef *addrs); void (*emit_primitive)(struct ac_shader_abi *abi, unsigned stream); diff --git a/src/amd/vulkan/radv_nir_to_llvm.c b/src/amd/vulkan/radv_nir_to_llvm.c index 80df23e144b..ecfd4f94f36 100644 --- a/src/amd/vulkan/radv_nir_to_llvm.c +++ b/src/amd/vulkan/radv_nir_to_llvm.c @@ -2044,7 +2044,6 @@ ac_translate_nir_to_llvm(struct ac_llvm_compiler *ac_llvm, create_function(&ctx, shaders[shader_count - 1]->info.stage, shader_count >= 2); - ctx.abi.emit_outputs = handle_shader_outputs_post; ctx.abi.emit_vertex_with_counter = visit_emit_vertex_with_counter; ctx.abi.load_ubo = radv_load_ubo; ctx.abi.load_ssbo = radv_load_ssbo; @@ -2185,6 +2184,9 @@ ac_translate_nir_to_llvm(struct ac_llvm_compiler *ac_llvm, ac_nir_translate(&ctx.ac, &ctx.abi, &args->ac, shaders[shader_idx]); + if (!gl_shader_stage_is_compute(shaders[shader_idx]->info.stage)) + handle_shader_outputs_post(&ctx.abi); + if (shader_count >= 2 || is_ngg) { LLVMBuildBr(ctx.ac.builder, merge_block); LLVMPositionBuilderAtEnd(ctx.ac.builder, merge_block); diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h index fa120e8322a..f5e0b973b19 100644 --- a/src/gallium/drivers/radeonsi/si_shader_internal.h +++ b/src/gallium/drivers/radeonsi/si_shader_internal.h @@ -240,12 +240,14 @@ LLVMValueRef si_is_gs_thread(struct si_shader_context *ctx); void si_llvm_emit_es_epilogue(struct ac_shader_abi *abi); void si_preload_esgs_ring(struct si_shader_context *ctx); void si_preload_gs_rings(struct si_shader_context *ctx); +void si_llvm_emit_gs_epilogue(struct ac_shader_abi *abi); void si_llvm_init_gs_callbacks(struct si_shader_context *ctx); /* si_shader_llvm_tess.c */ void si_llvm_preload_tes_rings(struct si_shader_context *ctx); void si_llvm_emit_ls_epilogue(struct ac_shader_abi *abi); void si_llvm_build_tcs_epilog(struct si_shader_context *ctx, union si_shader_part_key *key); +void si_llvm_emit_tcs_epilogue(struct ac_shader_abi *abi); void si_llvm_init_tcs_callbacks(struct si_shader_context *ctx); void si_llvm_init_tes_callbacks(struct si_shader_context *ctx, bool ngg_cull_shader); @@ -254,6 +256,7 @@ LLVMValueRef si_get_sample_id(struct si_shader_context *ctx); void si_llvm_build_ps_prolog(struct si_shader_context *ctx, union si_shader_part_key *key); void si_llvm_build_ps_epilog(struct si_shader_context *ctx, union si_shader_part_key *key); void si_llvm_build_monolithic_ps(struct si_shader_context *ctx, struct si_shader *shader); +void si_llvm_return_fs_outputs(struct ac_shader_abi *abi); void si_llvm_init_ps_callbacks(struct si_shader_context *ctx); /* si_shader_llvm_resources.c */ diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm.c b/src/gallium/drivers/radeonsi/si_shader_llvm.c index b23c39d64db..53ec19b42e8 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm.c @@ -1029,6 +1029,47 @@ bool si_llvm_translate_nir(struct si_shader_context *ctx, struct si_shader *shad ac_nir_translate(&ctx->ac, &ctx->abi, &ctx->args, nir); + switch (sel->stage) { + case MESA_SHADER_VERTEX: + if (shader->key.ge.as_ls) + si_llvm_emit_ls_epilogue(&ctx->abi); + else if (shader->key.ge.as_es) + si_llvm_emit_es_epilogue(&ctx->abi); + else if (ngg_cull_shader) + gfx10_emit_ngg_culling_epilogue(&ctx->abi); + else if (shader->key.ge.as_ngg) + gfx10_emit_ngg_epilogue(&ctx->abi); + else + si_llvm_emit_vs_epilogue(&ctx->abi); + break; + + case MESA_SHADER_TESS_CTRL: + si_llvm_emit_tcs_epilogue(&ctx->abi); + break; + + case MESA_SHADER_TESS_EVAL: + if (ctx->shader->key.ge.as_es) + si_llvm_emit_es_epilogue(&ctx->abi); + else if (ngg_cull_shader) + gfx10_emit_ngg_culling_epilogue(&ctx->abi); + else if (ctx->shader->key.ge.as_ngg) + gfx10_emit_ngg_epilogue(&ctx->abi); + else + si_llvm_emit_vs_epilogue(&ctx->abi); + break; + + case MESA_SHADER_GEOMETRY: + si_llvm_emit_gs_epilogue(&ctx->abi); + break; + + case MESA_SHADER_FRAGMENT: + si_llvm_return_fs_outputs(&ctx->abi); + break; + + default: + break; + } + si_llvm_build_ret(ctx, ctx->return_value); if (free_nir) diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_gs.c b/src/gallium/drivers/radeonsi/si_shader_llvm_gs.c index 4ddc860aca7..92b289cd199 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm_gs.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm_gs.c @@ -271,7 +271,7 @@ static void emit_gs_epilogue(struct si_shader_context *ctx) ac_build_endif(&ctx->ac, ctx->merged_wrap_if_label); } -static void si_llvm_emit_gs_epilogue(struct ac_shader_abi *abi) +void si_llvm_emit_gs_epilogue(struct ac_shader_abi *abi) { struct si_shader_context *ctx = si_shader_context_from_abi(abi); struct si_shader_info UNUSED *info = &ctx->shader->selector->info; @@ -658,5 +658,4 @@ void si_llvm_init_gs_callbacks(struct si_shader_context *ctx) ctx->abi.load_inputs = si_nir_load_input_gs; ctx->abi.emit_vertex = si_llvm_emit_vertex; ctx->abi.emit_primitive = si_llvm_emit_primitive; - ctx->abi.emit_outputs = si_llvm_emit_gs_epilogue; } diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c b/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c index 4745353f78c..5b9b50298af 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c @@ -470,7 +470,7 @@ static void si_export_mrt_color(struct si_shader_context *ctx, LLVMValueRef *col * * The alpha-ref SGPR is returned via its original location. */ -static void si_llvm_return_fs_outputs(struct ac_shader_abi *abi) +void si_llvm_return_fs_outputs(struct ac_shader_abi *abi) { struct si_shader_context *ctx = si_shader_context_from_abi(abi); struct si_shader *shader = ctx->shader; @@ -987,7 +987,6 @@ void si_llvm_build_monolithic_ps(struct si_shader_context *ctx, struct si_shader void si_llvm_init_ps_callbacks(struct si_shader_context *ctx) { - ctx->abi.emit_outputs = si_llvm_return_fs_outputs; ctx->abi.load_sample_position = load_sample_position; ctx->abi.load_sample_mask_in = load_sample_mask_in; ctx->abi.emit_fbfetch = si_nir_emit_fbfetch; diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_tess.c b/src/gallium/drivers/radeonsi/si_shader_llvm_tess.c index 7b907b09dd0..32c5574cc2b 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm_tess.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm_tess.c @@ -832,7 +832,7 @@ static void si_write_tess_factors(struct si_shader_context *ctx, union si_shader } /* This only writes the tessellation factor levels. */ -static void si_llvm_emit_tcs_epilogue(struct ac_shader_abi *abi) +void si_llvm_emit_tcs_epilogue(struct ac_shader_abi *abi) { struct si_shader_context *ctx = si_shader_context_from_abi(abi); LLVMBuilderRef builder = ctx->ac.builder; @@ -1090,7 +1090,6 @@ void si_llvm_init_tcs_callbacks(struct si_shader_context *ctx) ctx->abi.load_tess_varyings = si_nir_load_tcs_varyings; ctx->abi.load_tess_level = si_load_tess_level; ctx->abi.store_tcs_outputs = si_nir_store_output_tcs; - ctx->abi.emit_outputs = si_llvm_emit_tcs_epilogue; ctx->abi.load_patch_vertices_in = si_load_patch_vertices_in; } @@ -1099,13 +1098,4 @@ void si_llvm_init_tes_callbacks(struct si_shader_context *ctx, bool ngg_cull_sha ctx->abi.load_tess_varyings = si_nir_load_input_tes; ctx->abi.load_tess_level = si_load_tess_level; ctx->abi.load_patch_vertices_in = si_load_patch_vertices_in; - - if (ctx->shader->key.ge.as_es) - ctx->abi.emit_outputs = si_llvm_emit_es_epilogue; - else if (ngg_cull_shader) - ctx->abi.emit_outputs = gfx10_emit_ngg_culling_epilogue; - else if (ctx->shader->key.ge.as_ngg) - ctx->abi.emit_outputs = gfx10_emit_ngg_epilogue; - else - ctx->abi.emit_outputs = si_llvm_emit_vs_epilogue; } diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c b/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c index c4de9b7570f..ca0a1a869b5 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c @@ -1008,19 +1008,6 @@ static LLVMValueRef get_base_vertex(struct ac_shader_abi *abi, bool non_indexed_ void si_llvm_init_vs_callbacks(struct si_shader_context *ctx, bool ngg_cull_shader) { - struct si_shader *shader = ctx->shader; - - if (shader->key.ge.as_ls) - ctx->abi.emit_outputs = si_llvm_emit_ls_epilogue; - else if (shader->key.ge.as_es) - ctx->abi.emit_outputs = si_llvm_emit_es_epilogue; - else if (ngg_cull_shader) - ctx->abi.emit_outputs = gfx10_emit_ngg_culling_epilogue; - else if (shader->key.ge.as_ngg) - ctx->abi.emit_outputs = gfx10_emit_ngg_epilogue; - else - ctx->abi.emit_outputs = si_llvm_emit_vs_epilogue; - ctx->abi.load_base_vertex = get_base_vertex; ctx->abi.load_inputs = si_load_vs_input; }