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:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user