aco: do not fix_exports when separately compiled ngg vs or es

For radeonsi not abort when this case, as it does not jump at
last.

Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Signed-off-by: Qiang Yu <yuq825@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25631>
This commit is contained in:
Qiang Yu 2023-09-01 16:44:07 +08:00 committed by Marge Bot
parent 895c85ca8f
commit 71fd3c2a35
2 changed files with 6 additions and 9 deletions

View file

@ -1008,13 +1008,6 @@ fix_exports(asm_context& ctx, std::vector<uint32_t>& out, Program* program)
}
} else if ((*it)->definitions.size() && (*it)->definitions[0].physReg() == exec) {
break;
} else if ((*it)->opcode == aco_opcode::s_setpc_b64) {
/* Do not abort for VS/TES as NGG if they are non-monolithic shaders
* because a jump would be emitted.
*/
exported |= (program->stage.sw == SWStage::VS || program->stage.sw == SWStage::TES) &&
program->stage.hw == AC_HW_NEXT_GEN_GEOMETRY_SHADER &&
program->info.merged_shader_compiled_separately;
}
++it;
}
@ -1293,8 +1286,13 @@ emit_program(Program* program, std::vector<uint32_t>& code, std::vector<struct a
{
asm_context ctx(program, symbols);
bool is_separately_compiled_ngg_vs_or_es =
(program->stage.sw == SWStage::VS || program->stage.sw == SWStage::TES) &&
program->stage.hw == AC_HW_NEXT_GEN_GEOMETRY_SHADER &&
program->info.merged_shader_compiled_separately;
/* Prolog has no exports. */
if (!program->is_prolog && !program->info.has_epilog &&
if (!program->is_prolog && !program->info.has_epilog && !is_separately_compiled_ngg_vs_or_es &&
(program->stage.hw == AC_HW_VERTEX_SHADER || program->stage.hw == AC_HW_PIXEL_SHADER ||
program->stage.hw == AC_HW_NEXT_GEN_GEOMETRY_SHADER))
fix_exports(ctx, code, program);

View file

@ -11829,7 +11829,6 @@ select_shader(isel_context& ctx, nir_shader* nir, const bool need_startpgm, cons
(ctx.stage.sw == SWStage::VS || ctx.stage.sw == SWStage::TES)) {
assert(program->gfx_level >= GFX9);
create_merged_jump_to_epilog(&ctx);
ctx.block->kind |= block_kind_export_end;
}
cleanup_context(&ctx);