radeonsi: replace llvm gs copy shader generation with nir

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/19489>
This commit is contained in:
Qiang Yu
2022-12-04 13:29:29 +08:00
committed by Marge Bot
parent 246630ac98
commit e007c7fa6f
2 changed files with 15 additions and 8 deletions
+4 -6
View File
@@ -71,7 +71,7 @@ bool si_is_multi_part_shader(struct si_shader *shader)
/** Whether the shader runs on a merged HW stage (LSHS or ESGS) */
bool si_is_merged_shader(struct si_shader *shader)
{
if (shader->selector->stage > MESA_SHADER_GEOMETRY)
if (shader->selector->stage > MESA_SHADER_GEOMETRY || shader->is_gs_copy_shader)
return false;
return shader->key.ge.as_ngg || si_is_multi_part_shader(shader);
@@ -2173,11 +2173,9 @@ bool si_compile_shader(struct si_screen *sscreen, struct ac_llvm_compiler *compi
/* The GS copy shader is compiled next. */
if (sel->stage == MESA_SHADER_GEOMETRY && !shader->key.ge.as_ngg) {
struct pipe_stream_output_info so = {};
if (si_shader_uses_streamout(shader))
nir_gather_stream_output_info(nir, &so);
shader->gs_copy_shader = si_generate_gs_copy_shader(sscreen, compiler, sel, &so, debug);
shader->gs_copy_shader =
si_nir_generate_gs_copy_shader(sscreen, compiler, shader, nir, debug,
&legacy_gs_output_info.info);
if (!shader->gs_copy_shader) {
fprintf(stderr, "radeonsi: can't create GS copy shader\n");
ret = false;
+11 -2
View File
@@ -781,7 +781,7 @@ bool si_llvm_translate_nir(struct si_shader_context *ctx, struct si_shader *shad
const struct si_shader_info *info = &sel->info;
ctx->shader = shader;
ctx->stage = sel->stage;
ctx->stage = shader->is_gs_copy_shader ? MESA_SHADER_VERTEX : sel->stage;
ctx->num_const_buffers = info->base.num_ubos;
ctx->num_shader_buffers = info->base.num_ssbos;
@@ -811,6 +811,15 @@ bool si_llvm_translate_nir(struct si_shader_context *ctx, struct si_shader *shad
ac_build_load_to_sgpr(
&ctx->ac, buf, LLVMConstInt(ctx->ac.i32, SI_VS_CONST_INSTANCE_DIVISORS, 0));
}
/* preload GSVS ring for GS copy shader */
if (shader->is_gs_copy_shader) {
ctx->gsvs_ring[0] =
ac_build_load_to_sgpr(
&ctx->ac,
ac_get_ptr_arg(&ctx->ac, &ctx->args->ac, ctx->args->internal_bindings),
LLVMConstInt(ctx->ac.i32, SI_RING_GSVS, 0));
}
break;
case MESA_SHADER_TESS_CTRL:
@@ -1042,7 +1051,7 @@ bool si_llvm_translate_nir(struct si_shader_context *ctx, struct si_shader *shad
if (!ac_nir_translate(&ctx->ac, &ctx->abi, &ctx->args->ac, nir))
return false;
switch (sel->stage) {
switch (ctx->stage) {
case MESA_SHADER_VERTEX:
if (shader->key.ge.as_ls)
si_llvm_ls_build_end(ctx);