Mesa (master): radeonsi: split ac_shader_args initialization from LLVM code
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Dec 9 20:29:54 UTC 2020
Module: Mesa
Branch: master
Commit: d9c1a47d48ea32c055e58fee890d943a78361373
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d9c1a47d48ea32c055e58fee890d943a78361373
Author: Marek Olšák <marek.olsak at amd.com>
Date: Fri Dec 4 11:22:14 2020 -0500
radeonsi: split ac_shader_args initialization from LLVM code
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7939>
---
src/gallium/drivers/radeonsi/si_shader.c | 59 +++++++++++++++++++-------------
1 file changed, 36 insertions(+), 23 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index f40fb02ce54..9eaea9c97d2 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -368,12 +368,10 @@ void si_add_arg_checked(struct ac_shader_args *args, enum ac_arg_regfile file, u
ac_add_arg(args, file, registers, type, arg);
}
-void si_create_function(struct si_shader_context *ctx, bool ngg_cull_shader)
+static void si_init_shader_args(struct si_shader_context *ctx, bool ngg_cull_shader)
{
struct si_shader *shader = ctx->shader;
- LLVMTypeRef returns[AC_MAX_ARGS];
- unsigned i, num_return_sgprs;
- unsigned num_returns = 0;
+ unsigned i, num_returns, num_return_sgprs;
unsigned num_prolog_vgprs = 0;
unsigned stage = ctx->stage;
@@ -419,7 +417,7 @@ void si_create_function(struct si_shader_context *ctx, bool ngg_cull_shader)
/* Return values */
if (shader->key.opt.vs_as_prim_discard_cs) {
for (i = 0; i < 4; i++)
- returns[num_returns++] = ctx->ac.f32; /* VGPRs */
+ ac_add_return(&ctx->args, AC_ARG_VGPR);
}
break;
@@ -441,9 +439,9 @@ void si_create_function(struct si_shader_context *ctx, bool ngg_cull_shader)
* placed after the user SGPRs.
*/
for (i = 0; i < GFX6_TCS_NUM_USER_SGPR + 2; i++)
- returns[num_returns++] = ctx->ac.i32; /* SGPRs */
+ ac_add_return(&ctx->args, AC_ARG_SGPR);
for (i = 0; i < 11; i++)
- returns[num_returns++] = ctx->ac.f32; /* VGPRs */
+ ac_add_return(&ctx->args, AC_ARG_VGPR);
break;
case SI_SHADER_MERGED_VERTEX_TESSCTRL:
@@ -476,15 +474,15 @@ void si_create_function(struct si_shader_context *ctx, bool ngg_cull_shader)
/* LS return values are inputs to the TCS main shader part. */
for (i = 0; i < 8 + GFX9_TCS_NUM_USER_SGPR; i++)
- returns[num_returns++] = ctx->ac.i32; /* SGPRs */
+ ac_add_return(&ctx->args, AC_ARG_SGPR);
for (i = 0; i < 2; i++)
- returns[num_returns++] = ctx->ac.f32; /* VGPRs */
+ ac_add_return(&ctx->args, AC_ARG_VGPR);
/* VS outputs passed via VGPRs to TCS. */
if (shader->key.opt.same_patch_vertices) {
unsigned num_outputs = util_last_bit64(shader->selector->outputs_written);
for (i = 0; i < num_outputs * 4; i++)
- returns[num_returns++] = ctx->ac.f32; /* VGPRs */
+ ac_add_return(&ctx->args, AC_ARG_VGPR);
}
} else {
/* TCS inputs are passed via VGPRs from VS. */
@@ -501,9 +499,9 @@ void si_create_function(struct si_shader_context *ctx, bool ngg_cull_shader)
* should be passed to the epilog.
*/
for (i = 0; i <= 8 + GFX9_SGPR_TCS_OUT_LAYOUT; i++)
- returns[num_returns++] = ctx->ac.i32; /* SGPRs */
+ ac_add_return(&ctx->args, AC_ARG_SGPR);
for (i = 0; i < 11; i++)
- returns[num_returns++] = ctx->ac.f32; /* VGPRs */
+ ac_add_return(&ctx->args, AC_ARG_VGPR);
}
break;
@@ -587,9 +585,9 @@ void si_create_function(struct si_shader_context *ctx, bool ngg_cull_shader)
/* ES return values are inputs to GS. */
for (i = 0; i < 8 + num_user_sgprs; i++)
- returns[num_returns++] = ctx->ac.i32; /* SGPRs */
+ ac_add_return(&ctx->args, AC_ARG_SGPR);
for (i = 0; i < num_vgprs; i++)
- returns[num_returns++] = ctx->ac.f32; /* VGPRs */
+ ac_add_return(&ctx->args, AC_ARG_VGPR);
}
break;
@@ -689,9 +687,9 @@ void si_create_function(struct si_shader_context *ctx, bool ngg_cull_shader)
num_returns = MAX2(num_returns, num_return_sgprs + PS_EPILOG_SAMPLEMASK_MIN_LOC + 1);
for (i = 0; i < num_return_sgprs; i++)
- returns[i] = ctx->ac.i32;
+ ac_add_return(&ctx->args, AC_ARG_SGPR);
for (; i < num_returns; i++)
- returns[i] = ctx->ac.f32;
+ ac_add_return(&ctx->args, AC_ARG_VGPR);
break;
case MESA_SHADER_COMPUTE:
@@ -743,8 +741,28 @@ void si_create_function(struct si_shader_context *ctx, bool ngg_cull_shader)
return;
}
- si_llvm_create_func(ctx, ngg_cull_shader ? "ngg_cull_main" : "main", returns, num_returns,
- si_get_max_workgroup_size(shader));
+ shader->info.num_input_sgprs = ctx->args.num_sgprs_used;
+ shader->info.num_input_vgprs = ctx->args.num_vgprs_used;
+
+ assert(shader->info.num_input_vgprs >= num_prolog_vgprs);
+ shader->info.num_input_vgprs -= num_prolog_vgprs;
+}
+
+void si_create_function(struct si_shader_context *ctx, bool ngg_cull_shader)
+{
+ struct si_shader *shader = ctx->shader;
+ LLVMTypeRef returns[AC_MAX_ARGS];
+ unsigned i;
+
+ si_init_shader_args(ctx, ngg_cull_shader);
+
+ for (i = 0; i < ctx->args.num_sgprs_returned; i++)
+ returns[i] = ctx->ac.i32; /* SGPR */
+ for (; i < ctx->args.return_count; i++)
+ returns[i] = ctx->ac.f32; /* VGPR */
+
+ si_llvm_create_func(ctx, ngg_cull_shader ? "ngg_cull_main" : "main", returns,
+ ctx->args.return_count, si_get_max_workgroup_size(shader));
/* Reserve register locations for VGPR inputs the PS prolog may need. */
if (ctx->stage == MESA_SHADER_FRAGMENT && !ctx->shader->is_monolithic) {
@@ -756,11 +774,6 @@ void si_create_function(struct si_shader_context *ctx, bool ngg_cull_shader)
S_0286D0_FRONT_FACE_ENA(1) | S_0286D0_ANCILLARY_ENA(1) | S_0286D0_POS_FIXED_PT_ENA(1));
}
- shader->info.num_input_sgprs = ctx->args.num_sgprs_used;
- shader->info.num_input_vgprs = ctx->args.num_vgprs_used;
-
- assert(shader->info.num_input_vgprs >= num_prolog_vgprs);
- shader->info.num_input_vgprs -= num_prolog_vgprs;
if (shader->key.as_ls || ctx->stage == MESA_SHADER_TESS_CTRL) {
if (USE_LDS_SYMBOLS && LLVM_VERSION_MAJOR >= 9) {
More information about the mesa-commit
mailing list