ac/llvm: remove ac_shader_abi::emit_outputs

it's called last in ac_nir_translate, so call it in the caller.

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16467>
This commit is contained in:
Marek Olšák 2022-05-05 20:36:55 -04:00
parent 9a8413aaea
commit dc81f0ba46
9 changed files with 50 additions and 34 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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 */

View File

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

View File

@ -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;
}

View File

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

View File

@ -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;
}

View File

@ -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;
}