diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 1f3caf84bee..c80e0016e00 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -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; +} diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h index 4974405c790..febea08bec2 100644 --- a/src/gallium/drivers/radeonsi/si_shader_internal.h +++ b/src/gallium/drivers/radeonsi/si_shader_internal.h @@ -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); diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm.c b/src/gallium/drivers/radeonsi/si_shader_llvm.c index a2f3ed2232e..a52b12cb5ff 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm.c @@ -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); }