radeonsi: monolithic ps emit prolog in nir directly
authorQiang Yu <yuq825@gmail.com>
Fri, 3 Mar 2023 07:09:25 +0000 (15:09 +0800)
committerMarge Bot <emma+marge@anholt.net>
Mon, 17 Apr 2023 02:11:56 +0000 (02:11 +0000)
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/21683>

src/gallium/drivers/radeonsi/si_shader.c
src/gallium/drivers/radeonsi/si_shader_internal.h
src/gallium/drivers/radeonsi/si_shader_llvm.c
src/gallium/drivers/radeonsi/si_shader_llvm_ps.c

index 67e98f9..c39b4f1 100644 (file)
@@ -701,18 +701,18 @@ void si_init_shader_args(struct si_shader *shader, struct si_shader_args *args)
       si_add_arg_checked(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->pos_fixed_pt,
                          SI_PARAM_POS_FIXED_PT);
 
-      /* Color inputs from the prolog. */
-      if (shader->selector->info.colors_read) {
-         unsigned num_color_elements = util_bitcount(shader->selector->info.colors_read);
+      /* Monolithic PS emit prolog and epilog in NIR directly. */
+      if (!shader->is_monolithic) {
+         /* Color inputs from the prolog. */
+         if (shader->selector->info.colors_read) {
+            unsigned num_color_elements = util_bitcount(shader->selector->info.colors_read);
 
-         for (i = 0; i < num_color_elements; i++)
-            ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, i ? NULL : &args->color_start);
+            for (i = 0; i < num_color_elements; i++)
+               ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, i ? NULL : &args->color_start);
 
-         num_prolog_vgprs += num_color_elements;
-      }
+            num_prolog_vgprs += num_color_elements;
+         }
 
-      /* Monolithic PS emit epilog in NIR directly. */
-      if (!shader->is_monolithic) {
          /* Outputs for the epilog. */
          num_return_sgprs = SI_SGPR_ALPHA_REF + 1;
          num_returns =
@@ -2148,6 +2148,10 @@ struct nir_shader *si_get_nir_shader(struct si_shader *shader,
    } else if (is_legacy_gs) {
       NIR_PASS_V(nir, ac_nir_lower_legacy_gs, false, sel->screen->use_ngg, output_info);
    } else if (sel->stage == MESA_SHADER_FRAGMENT && shader->is_monolithic) {
+      /* two-side color selection and interpolation */
+      if (sel->info.colors_read)
+         NIR_PASS_V(nir, si_nir_lower_ps_color_input, shader);
+
       ac_nir_lower_ps_options options = {
          .gfx_level = sel->screen->info.gfx_level,
          .family = sel->screen->info.family,
@@ -2161,9 +2165,22 @@ struct nir_shader *si_get_nir_shader(struct si_shader *shader,
          .alpha_to_one = key->ps.part.epilog.alpha_to_one,
          .alpha_func = key->ps.part.epilog.alpha_func,
          .broadcast_last_cbuf = key->ps.part.epilog.last_cbuf,
+
+         .bc_optimize_for_persp = key->ps.part.prolog.bc_optimize_for_persp,
+         .bc_optimize_for_linear = key->ps.part.prolog.bc_optimize_for_linear,
+         .force_persp_sample_interp = key->ps.part.prolog.force_persp_sample_interp,
+         .force_linear_sample_interp = key->ps.part.prolog.force_linear_sample_interp,
+         .force_persp_center_interp = key->ps.part.prolog.force_persp_center_interp,
+         .force_linear_center_interp = key->ps.part.prolog.force_linear_center_interp,
+         .samplemask_log_ps_iter = key->ps.part.prolog.samplemask_log_ps_iter,
       };
 
       NIR_PASS_V(nir, ac_nir_lower_ps, &options);
+
+      if (key->ps.part.prolog.poly_stipple)
+         NIR_PASS_V(nir, si_nir_emit_polygon_stipple, args);
+
+      progress2 = true;
    }
 
    NIR_PASS(progress2, nir, si_nir_lower_abi, shader, args);
index a9dd6a3..858987a 100644 (file)
@@ -235,7 +235,6 @@ void si_llvm_build_ps_prolog(struct si_shader_context *ctx, union si_shader_part
                              bool separate_prolog);
 void si_llvm_build_ps_epilog(struct si_shader_context *ctx, union si_shader_part_key *key,
                              bool separate_epilog);
-void si_llvm_build_monolithic_ps(struct si_shader_context *ctx, struct si_shader *shader);
 void si_llvm_ps_build_end(struct si_shader_context *ctx);
 
 /* si_shader_llvm_vs.c */
index a9dc7ef..3228329 100644 (file)
@@ -1177,8 +1177,6 @@ bool si_llvm_compile_shader(struct si_screen *sscreen, struct ac_llvm_compiler *
       } else {
          /* Nothing to do for gfx6-8. The shader has only 1 part and it's ctx.main_fn. */
       }
-   } else if (shader->is_monolithic && sel->stage == MESA_SHADER_FRAGMENT) {
-      si_llvm_build_monolithic_ps(&ctx, shader);
    }
 
    si_llvm_optimize_module(&ctx);
index ef669b4..460bc06 100644 (file)
@@ -848,28 +848,3 @@ void si_llvm_build_ps_epilog(struct si_shader_context *ctx, union si_shader_part
    LLVMBuildRetVoid(ctx->ac.builder);
 }
 
-void si_llvm_build_monolithic_ps(struct si_shader_context *ctx, struct si_shader *shader)
-{
-   union si_shader_part_key prolog_key;
-   si_get_ps_prolog_key(shader, &prolog_key, false);
-
-   /* If no prolog is needed, we only have the main part, no need to build wrapper function. */
-   if (!si_need_ps_prolog(&prolog_key))
-      return;
-
-   struct ac_llvm_pointer main_fn = ctx->main_fn;
-
-   /* Preserve main arguments. */
-   enum ac_arg_type main_arg_types[AC_MAX_ARGS];
-   for (int i = 0; i < ctx->args->ac.arg_count; i++)
-      main_arg_types[i] = ctx->args->ac.args[i].type;
-
-   si_llvm_build_ps_prolog(ctx, &prolog_key, false);
-
-   struct ac_llvm_pointer parts[2] = {
-      ctx->main_fn, /* prolog */
-      main_fn,      /* main */
-   };
-
-   si_build_wrapper_function(ctx, parts, 2, 1, 0, main_arg_types, false);
-}