Module: Mesa Branch: main Commit: a994db1d8f3292757f00de1217ebe4472c45d95a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a994db1d8f3292757f00de1217ebe4472c45d95a
Author: Qiang Yu <[email protected]> Date: Fri Aug 11 17:21:27 2023 +0800 radeonsi: extract si_get_ps_epilog_args to be shared with aco Reviewed-by: Marek Olšák <[email protected]> Signed-off-by: Qiang Yu <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24989> --- src/gallium/drivers/radeonsi/si_shader.c | 28 +++++++++++++ src/gallium/drivers/radeonsi/si_shader_internal.h | 5 +++ src/gallium/drivers/radeonsi/si_shader_llvm_ps.c | 49 +++++++---------------- 3 files changed, 47 insertions(+), 35 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 1ac482f2db7..6eaf0e444ab 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -3692,3 +3692,31 @@ void si_get_ps_prolog_args(struct si_shader_args *args, ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, &args->ac.sample_coverage); ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, &args->ac.pos_fixed_pt); } + +void si_get_ps_epilog_args(struct si_shader_args *args, + const union si_shader_part_key *key, + struct ac_arg colors[MAX_DRAW_BUFFERS], + struct ac_arg *depth, struct ac_arg *stencil, + struct ac_arg *sample_mask) +{ + memset(args, 0, sizeof(*args)); + + ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, NULL); + ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, NULL); + ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, NULL); + ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, NULL); + ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_FLOAT, &args->alpha_reference); + + u_foreach_bit (i, key->ps_epilog.colors_written) { + ac_add_arg(&args->ac, AC_ARG_VGPR, 4, AC_ARG_FLOAT, colors + i); + } + + if (key->ps_epilog.writes_z) + ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, depth); + + if (key->ps_epilog.writes_stencil) + ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, stencil); + + if (key->ps_epilog.writes_samplemask) + ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, sample_mask); +} diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h index 854ac377b15..9b85375d913 100644 --- a/src/gallium/drivers/radeonsi/si_shader_internal.h +++ b/src/gallium/drivers/radeonsi/si_shader_internal.h @@ -158,6 +158,11 @@ void si_get_vs_prolog_args(enum amd_gfx_level gfx_level, const union si_shader_part_key *key); void si_get_ps_prolog_args(struct si_shader_args *args, const union si_shader_part_key *key); +void si_get_ps_epilog_args(struct si_shader_args *args, + const union si_shader_part_key *key, + struct ac_arg colors[MAX_DRAW_BUFFERS], + struct ac_arg *depth, struct ac_arg *stencil, + struct ac_arg *sample_mask); /* 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_ps.c b/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c index ae89ff039e9..67869f4b3ee 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c @@ -100,7 +100,7 @@ static void si_alpha_test(struct si_shader_context *ctx, LLVMValueRef alpha) LLVMRealPredicate cond = cond_map[ctx->shader->key.ps.part.epilog.alpha_func]; assert(cond); - LLVMValueRef alpha_ref = LLVMGetParam(ctx->main_fn.value, SI_PARAM_ALPHA_REF); + LLVMValueRef alpha_ref = ac_get_arg(&ctx->ac, ctx->args->alpha_reference); if (LLVMTypeOf(alpha) == ctx->ac.f16) alpha_ref = LLVMBuildFPTrunc(ctx->ac.builder, alpha_ref, ctx->ac.f16, ""); @@ -666,22 +666,10 @@ void si_llvm_build_ps_epilog(struct si_shader_context *ctx, union si_shader_part struct si_ps_exports exp = {}; LLVMValueRef color[8][4] = {}; - memset(ctx->args, 0, sizeof(*ctx->args)); - - /* Declare input SGPRs. */ - ac_add_arg(&ctx->args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &ctx->args->internal_bindings); - ac_add_arg(&ctx->args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &ctx->args->bindless_samplers_and_images); - ac_add_arg(&ctx->args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &ctx->args->const_and_shader_buffers); - ac_add_arg(&ctx->args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &ctx->args->samplers_and_images); - si_add_arg_checked(&ctx->args->ac, AC_ARG_SGPR, 1, AC_ARG_FLOAT, NULL, SI_PARAM_ALPHA_REF); - - /* Declare input VGPRs. */ - unsigned required_num_params = - ctx->args->ac.num_sgprs_used + util_bitcount(key->ps_epilog.colors_written) * 4 + - key->ps_epilog.writes_z + key->ps_epilog.writes_stencil + key->ps_epilog.writes_samplemask; - - while (ctx->args->ac.arg_count < required_num_params) - ac_add_arg(&ctx->args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, NULL); + struct si_shader_args *args = ctx->args; + struct ac_arg color_args[MAX_DRAW_BUFFERS]; + struct ac_arg depth_arg, stencil_arg, samplemask_arg; + si_get_ps_epilog_args(args, key, color_args, &depth_arg, &stencil_arg, &samplemask_arg); /* Create the function. */ si_llvm_create_func(ctx, "ps_epilog", NULL, 0, 0); @@ -689,25 +677,18 @@ void si_llvm_build_ps_epilog(struct si_shader_context *ctx, union si_shader_part ac_llvm_add_target_dep_function_attr(ctx->main_fn.value, "InitialPSInputAddr", 0xffffff); /* Prepare color. */ - unsigned vgpr = ctx->args->ac.num_sgprs_used; unsigned colors_written = key->ps_epilog.colors_written; while (colors_written) { int write_i = u_bit_scan(&colors_written); unsigned color_type = (key->ps_epilog.color_types >> (write_i * 2)) & 0x3; + LLVMValueRef arg = ac_get_arg(&ctx->ac, color_args[write_i]); - if (color_type != SI_TYPE_ANY32) { - for (i = 0; i < 4; i++) { - color[write_i][i] = LLVMGetParam(ctx->main_fn.value, vgpr + i / 2); - color[write_i][i] = LLVMBuildBitCast(ctx->ac.builder, color[write_i][i], - ctx->ac.v2f16, ""); - color[write_i][i] = ac_llvm_extract_elem(&ctx->ac, color[write_i][i], i % 2); - } - vgpr += 4; - } else { - for (i = 0; i < 4; i++) - color[write_i][i] = LLVMGetParam(ctx->main_fn.value, vgpr++); - } + if (color_type != SI_TYPE_ANY32) + arg = LLVMBuildBitCast(ctx->ac.builder, arg, LLVMVectorType(ctx->ac.f16, 8), ""); + + for (i = 0; i < 4; i++) + color[write_i][i] = ac_llvm_extract_elem(&ctx->ac, arg, i); si_llvm_build_clamp_alpha_test(ctx, color[write_i], write_i); } @@ -721,15 +702,13 @@ void si_llvm_build_ps_epilog(struct si_shader_context *ctx, union si_shader_part key->ps_epilog.writes_samplemask || mrtz_alpha) { LLVMValueRef depth = NULL, stencil = NULL, samplemask = NULL; - unsigned vgpr_index = ctx->args->ac.num_sgprs_used + - util_bitcount(key->ps_epilog.colors_written) * 4; if (key->ps_epilog.writes_z) - depth = LLVMGetParam(ctx->main_fn.value, vgpr_index++); + depth = ac_get_arg(&ctx->ac, depth_arg); if (key->ps_epilog.writes_stencil) - stencil = LLVMGetParam(ctx->main_fn.value, vgpr_index++); + stencil = ac_get_arg(&ctx->ac, stencil_arg); if (key->ps_epilog.writes_samplemask) - samplemask = LLVMGetParam(ctx->main_fn.value, vgpr_index++); + samplemask = ac_get_arg(&ctx->ac, samplemask_arg); ac_export_mrt_z(&ctx->ac, depth, stencil, samplemask, mrtz_alpha, false, &exp.args[exp.num++]);
