mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-01 22:40:09 +01:00
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:
parent
ec17cc345f
commit
7daa0857c0
3 changed files with 51 additions and 37 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue