From e007c7fa6f149054c9ed392167d07fd7eab7bcd4 Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Sun, 4 Dec 2022 13:29:29 +0800 Subject: [PATCH] radeonsi: replace llvm gs copy shader generation with nir MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Marek Olšák Signed-off-by: Qiang Yu Part-of: --- src/gallium/drivers/radeonsi/si_shader.c | 10 ++++------ src/gallium/drivers/radeonsi/si_shader_llvm.c | 13 +++++++++++-- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 180100ca96d..142e094d7b5 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -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; diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm.c b/src/gallium/drivers/radeonsi/si_shader_llvm.c index 3c1d344f6a4..37f491eb47a 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm.c @@ -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);