radeonsi: extract si_get_prev_stage_nir_shader to be shared with aco

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Signed-off-by: Qiang Yu <yuq825@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24204>
This commit is contained in:
Qiang Yu 2023-07-06 10:09:34 +08:00 committed by Marge Bot
parent ec17cc345f
commit 7daa0857c0
3 changed files with 51 additions and 37 deletions

View file

@ -3421,3 +3421,48 @@ void si_shader_destroy(struct si_shader *shader)
free(shader->shader_log);
}
nir_shader *si_get_prev_stage_nir_shader(struct si_shader *shader,
struct si_shader *prev_shader,
struct si_shader_args *args,
bool *free_nir)
{
const struct si_shader_selector *sel = shader->selector;
const union si_shader_key *key = &shader->key;
if (sel->stage == MESA_SHADER_TESS_CTRL) {
struct si_shader_selector *ls = key->ge.part.tcs.ls;
prev_shader->selector = ls;
prev_shader->key.ge.part.vs.prolog = key->ge.part.tcs.ls_prolog;
prev_shader->key.ge.as_ls = 1;
} else {
struct si_shader_selector *es = key->ge.part.gs.es;
prev_shader->selector = es;
prev_shader->key.ge.part.vs.prolog = key->ge.part.gs.vs_prolog;
prev_shader->key.ge.as_es = 1;
prev_shader->key.ge.as_ngg = key->ge.as_ngg;
}
prev_shader->key.ge.mono = key->ge.mono;
prev_shader->key.ge.opt = key->ge.opt;
prev_shader->key.ge.opt.inline_uniforms = false; /* only TCS/GS can inline uniforms */
/* kill_outputs was computed based on second shader's outputs so we can't use it to
* kill first shader's outputs.
*/
prev_shader->key.ge.opt.kill_outputs = 0;
prev_shader->is_monolithic = true;
si_init_shader_args(prev_shader, args);
nir_shader *nir = si_get_nir_shader(prev_shader, args, free_nir,
sel->info.tcs_vgpr_only_inputs, NULL);
si_update_shader_binary_info(shader, nir);
shader->info.uses_instanceid |=
prev_shader->selector->info.uses_instanceid || prev_shader->info.uses_instanceid;
return nir;
}

View file

@ -131,6 +131,10 @@ void si_get_ps_prolog_key(struct si_shader *shader, union si_shader_part_key *ke
void si_get_ps_epilog_key(struct si_shader *shader, union si_shader_part_key *key);
enum ac_hw_stage si_select_hw_stage(const gl_shader_stage stage, const union si_shader_key *const key,
const enum amd_gfx_level gfx_level);
nir_shader *si_get_prev_stage_nir_shader(struct si_shader *shader,
struct si_shader *prev_shader,
struct si_shader_args *args,
bool *free_nir);
/* gfx10_shader_ngg.c */
unsigned gfx10_ngg_get_vertices_per_prim(struct si_shader *shader);

View file

@ -1039,42 +1039,9 @@ bool si_llvm_compile_shader(struct si_screen *sscreen, struct ac_llvm_compiler *
(sel->stage == MESA_SHADER_TESS_CTRL || sel->stage == MESA_SHADER_GEOMETRY)) {
/* LS or ES shader. */
struct si_shader prev_shader = {};
uint64_t tcs_vgpr_only_inputs = 0;
bool same_thread_count = false;
if (sel->stage == MESA_SHADER_TESS_CTRL) {
struct si_shader_selector *ls = shader->key.ge.part.tcs.ls;
prev_shader.selector = ls;
prev_shader.key.ge.part.vs.prolog = shader->key.ge.part.tcs.ls_prolog;
prev_shader.key.ge.as_ls = 1;
tcs_vgpr_only_inputs = sel->info.tcs_vgpr_only_inputs;
same_thread_count = shader->key.ge.opt.same_patch_vertices;
} else {
struct si_shader_selector *es = shader->key.ge.part.gs.es;
prev_shader.selector = es;
prev_shader.key.ge.part.vs.prolog = shader->key.ge.part.gs.vs_prolog;
prev_shader.key.ge.as_es = 1;
prev_shader.key.ge.as_ngg = shader->key.ge.as_ngg;
}
prev_shader.key.ge.mono = shader->key.ge.mono;
prev_shader.key.ge.opt = shader->key.ge.opt;
prev_shader.key.ge.opt.inline_uniforms = false; /* only TCS/GS can inline uniforms */
/* kill_outputs was computed based on second shader's outputs so we can't use it to
* kill first shader's outputs.
*/
prev_shader.key.ge.opt.kill_outputs = 0;
prev_shader.is_monolithic = true;
si_init_shader_args(&prev_shader, ctx.args);
bool free_nir;
nir = si_get_nir_shader(&prev_shader, ctx.args, &free_nir,
tcs_vgpr_only_inputs, NULL);
si_update_shader_binary_info(shader, nir);
nir = si_get_prev_stage_nir_shader(shader, &prev_shader, ctx.args, &free_nir);
struct ac_llvm_pointer parts[2];
parts[1] = ctx.main_fn;
@ -1084,9 +1051,6 @@ bool si_llvm_compile_shader(struct si_screen *sscreen, struct ac_llvm_compiler *
return false;
}
shader->info.uses_instanceid |=
prev_shader.selector->info.uses_instanceid || prev_shader.info.uses_instanceid;
parts[0] = ctx.main_fn;
/* Preserve main arguments. */
@ -1099,6 +1063,7 @@ bool si_llvm_compile_shader(struct si_screen *sscreen, struct ac_llvm_compiler *
ctx.shader = shader;
ctx.stage = sel->stage;
bool same_thread_count = shader->key.ge.opt.same_patch_vertices;
si_build_wrapper_function(&ctx, parts, 2, 0, 1, main_arg_types,
same_thread_count);
}