Module: Mesa
Branch: main
Commit: a4b60295a797cda88be111029da146117040081c
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=a4b60295a797cda88be111029da146117040081c

Author: Qiang Yu <[email protected]>
Date:   Wed Mar 29 15:56:21 2023 +0800

aco,ac/llvm,radv,radeonsi: handle ps bc optimization in nir for radv

The side effect is removing the aco/llvm backend bc optimization code
and linear/persp_centroid variable.

Reviewed-by: Timur Kristóf <[email protected]>
Signed-off-by: Qiang Yu <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22199>

---

 src/amd/compiler/aco_instruction_selection.cpp | 59 +-------------------------
 src/amd/compiler/aco_instruction_selection.h   |  3 --
 src/amd/llvm/ac_nir_to_llvm.c                  |  4 +-
 src/amd/llvm/ac_shader_abi.h                   |  1 -
 src/amd/vulkan/radv_nir_to_llvm.c              | 36 +---------------
 src/amd/vulkan/radv_pipeline.c                 |  5 +++
 src/gallium/drivers/radeonsi/si_shader_llvm.c  |  3 --
 7 files changed, 9 insertions(+), 102 deletions(-)

diff --git a/src/amd/compiler/aco_instruction_selection.cpp 
b/src/amd/compiler/aco_instruction_selection.cpp
index 3cabec8c13d..12c386c0639 100644
--- a/src/amd/compiler/aco_instruction_selection.cpp
+++ b/src/amd/compiler/aco_instruction_selection.cpp
@@ -8080,7 +8080,7 @@ get_interp_param(isel_context* ctx, nir_intrinsic_op 
intrin,
        intrin == nir_intrinsic_load_barycentric_at_offset) {
       return get_arg(ctx, linear ? ctx->args->linear_center : 
ctx->args->persp_center);
    } else if (intrin == nir_intrinsic_load_barycentric_centroid) {
-      return linear ? ctx->linear_centroid : ctx->persp_centroid;
+      return get_arg(ctx, linear ? ctx->args->linear_centroid : 
ctx->args->persp_centroid);
    } else {
       assert(intrin == nir_intrinsic_load_barycentric_sample);
       return get_arg(ctx, linear ? ctx->args->linear_sample : 
ctx->args->persp_sample);
@@ -11200,60 +11200,6 @@ split_arguments(isel_context* ctx, Pseudo_instruction* 
startpgm)
    }
 }
 
-void
-handle_bc_optimize(isel_context* ctx)
-{
-   /* needed when SPI_PS_IN_CONTROL.BC_OPTIMIZE_DISABLE is set to 0 */
-   Builder bld(ctx->program, ctx->block);
-   uint32_t spi_ps_input_ena = ctx->program->config->spi_ps_input_ena;
-   bool uses_center =
-      G_0286CC_PERSP_CENTER_ENA(spi_ps_input_ena) || 
G_0286CC_LINEAR_CENTER_ENA(spi_ps_input_ena);
-   bool uses_persp_centroid = G_0286CC_PERSP_CENTROID_ENA(spi_ps_input_ena);
-   bool uses_linear_centroid = G_0286CC_LINEAR_CENTROID_ENA(spi_ps_input_ena);
-
-   if (uses_persp_centroid)
-      ctx->persp_centroid = get_arg(ctx, ctx->args->persp_centroid);
-   if (uses_linear_centroid)
-      ctx->linear_centroid = get_arg(ctx, ctx->args->linear_centroid);
-
-   if (uses_center && (uses_persp_centroid || uses_linear_centroid)) {
-      Temp sel = bld.vopc_e64(aco_opcode::v_cmp_lt_i32, bld.def(bld.lm),
-                              get_arg(ctx, ctx->args->prim_mask), 
Operand::zero());
-
-      if (uses_persp_centroid) {
-         Temp new_coord[2];
-         for (unsigned i = 0; i < 2; i++) {
-            Temp persp_centroid =
-               emit_extract_vector(ctx, get_arg(ctx, 
ctx->args->persp_centroid), i, v1);
-            Temp persp_center =
-               emit_extract_vector(ctx, get_arg(ctx, ctx->args->persp_center), 
i, v1);
-            new_coord[i] =
-               bld.vop2(aco_opcode::v_cndmask_b32, bld.def(v1), 
persp_centroid, persp_center, sel);
-         }
-         ctx->persp_centroid = bld.tmp(v2);
-         bld.pseudo(aco_opcode::p_create_vector, 
Definition(ctx->persp_centroid),
-                    Operand(new_coord[0]), Operand(new_coord[1]));
-         emit_split_vector(ctx, ctx->persp_centroid, 2);
-      }
-
-      if (uses_linear_centroid) {
-         Temp new_coord[2];
-         for (unsigned i = 0; i < 2; i++) {
-            Temp linear_centroid =
-               emit_extract_vector(ctx, get_arg(ctx, 
ctx->args->linear_centroid), i, v1);
-            Temp linear_center =
-               emit_extract_vector(ctx, get_arg(ctx, 
ctx->args->linear_center), i, v1);
-            new_coord[i] = bld.vop2(aco_opcode::v_cndmask_b32, bld.def(v1), 
linear_centroid,
-                                    linear_center, sel);
-         }
-         ctx->linear_centroid = bld.tmp(v2);
-         bld.pseudo(aco_opcode::p_create_vector, 
Definition(ctx->linear_centroid),
-                    Operand(new_coord[0]), Operand(new_coord[1]));
-         emit_split_vector(ctx, ctx->linear_centroid, 2);
-      }
-   }
-}
-
 void
 setup_fp_mode(isel_context* ctx, nir_shader* shader)
 {
@@ -11444,9 +11390,6 @@ select_program(Program* program, unsigned shader_count, 
struct nir_shader* const
       } else if (ctx.stage == geometry_gs)
          ctx.gs_wave_id = get_arg(&ctx, args->gs_wave_id);
 
-      if (ctx.stage == fragment_fs)
-         handle_bc_optimize(&ctx);
-
       visit_cf_list(&ctx, &func->body);
 
       if (nir->info.stage == MESA_SHADER_GEOMETRY && !ngg_gs) {
diff --git a/src/amd/compiler/aco_instruction_selection.h 
b/src/amd/compiler/aco_instruction_selection.h
index acb254111dd..65a32a9b561 100644
--- a/src/amd/compiler/aco_instruction_selection.h
+++ b/src/amd/compiler/aco_instruction_selection.h
@@ -91,9 +91,6 @@ struct isel_context {
 
    Temp arg_temps[AC_MAX_ARGS];
 
-   /* FS inputs */
-   Temp persp_centroid, linear_centroid;
-
    /* GS inputs */
    Temp gs_wave_id;
 
diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c
index 5a36ee54fb3..3a3c7d5c950 100644
--- a/src/amd/llvm/ac_nir_to_llvm.c
+++ b/src/amd/llvm/ac_nir_to_llvm.c
@@ -3195,7 +3195,7 @@ static LLVMValueRef lookup_interp_param(struct 
ac_nir_context *ctx, enum glsl_in
       if (location == INTERP_CENTER)
          return ac_get_arg(&ctx->ac, ctx->args->persp_center);
       else if (location == INTERP_CENTROID)
-         return ctx->abi->persp_centroid;
+         return ac_get_arg(&ctx->ac, ctx->args->persp_centroid);
       else if (location == INTERP_SAMPLE)
          return ac_get_arg(&ctx->ac, ctx->args->persp_sample);
       break;
@@ -3203,7 +3203,7 @@ static LLVMValueRef lookup_interp_param(struct 
ac_nir_context *ctx, enum glsl_in
       if (location == INTERP_CENTER)
          return ac_get_arg(&ctx->ac, ctx->args->linear_center);
       else if (location == INTERP_CENTROID)
-         return ctx->abi->linear_centroid;
+         return ac_get_arg(&ctx->ac, ctx->args->linear_centroid);
       else if (location == INTERP_SAMPLE)
          return ac_get_arg(&ctx->ac, ctx->args->linear_sample);
       break;
diff --git a/src/amd/llvm/ac_shader_abi.h b/src/amd/llvm/ac_shader_abi.h
index 0369d574a5f..ec37a008c52 100644
--- a/src/amd/llvm/ac_shader_abi.h
+++ b/src/amd/llvm/ac_shader_abi.h
@@ -46,7 +46,6 @@ struct ac_shader_abi {
    LLVMValueRef vertex_id;
    LLVMValueRef vs_rel_patch_id;
    LLVMValueRef instance_id;
-   LLVMValueRef persp_centroid, linear_centroid;
    LLVMValueRef user_data;
 
    /* replaced registers when culling enabled */
diff --git a/src/amd/vulkan/radv_nir_to_llvm.c 
b/src/amd/vulkan/radv_nir_to_llvm.c
index 7ae308ea4f6..0bcbd29b53f 100644
--- a/src/amd/vulkan/radv_nir_to_llvm.c
+++ b/src/amd/vulkan/radv_nir_to_llvm.c
@@ -253,38 +253,6 @@ radv_get_sampler_desc(struct ac_shader_abi *abi, 
LLVMValueRef index,
    return radv_load_rsrc(ctx, index, v4 ? ctx->ac.v4i32 : ctx->ac.v8i32);
 }
 
-static void
-prepare_interp_optimize(struct radv_shader_context *ctx, struct nir_shader 
*nir)
-{
-   bool uses_center = false;
-   bool uses_centroid = false;
-   nir_foreach_shader_in_variable (variable, nir) {
-      if (glsl_get_base_type(glsl_without_array(variable->type)) != 
GLSL_TYPE_FLOAT ||
-          variable->data.sample)
-         continue;
-
-      if (variable->data.centroid)
-         uses_centroid = true;
-      else
-         uses_center = true;
-   }
-
-   ctx->abi.persp_centroid = ac_get_arg(&ctx->ac, 
ctx->args->ac.persp_centroid);
-   ctx->abi.linear_centroid = ac_get_arg(&ctx->ac, 
ctx->args->ac.linear_centroid);
-
-   if (uses_center && uses_centroid) {
-      LLVMValueRef sel =
-         LLVMBuildICmp(ctx->ac.builder, LLVMIntSLT, ac_get_arg(&ctx->ac, 
ctx->args->ac.prim_mask),
-                       ctx->ac.i32_0, "");
-      ctx->abi.persp_centroid =
-         LLVMBuildSelect(ctx->ac.builder, sel, ac_get_arg(&ctx->ac, 
ctx->args->ac.persp_center),
-                         ctx->abi.persp_centroid, "");
-      ctx->abi.linear_centroid =
-         LLVMBuildSelect(ctx->ac.builder, sel, ac_get_arg(&ctx->ac, 
ctx->args->ac.linear_center),
-                         ctx->abi.linear_centroid, "");
-   }
-}
-
 static void
 scan_shader_output_decl(struct radv_shader_context *ctx, struct nir_variable 
*variable,
                         struct nir_shader *shader, gl_shader_stage stage)
@@ -548,9 +516,7 @@ ac_translate_nir_to_llvm(struct ac_llvm_compiler *ac_llvm,
          LLVMPositionBuilderAtEnd(ctx.ac.builder, then_block);
       }
 
-      if (shaders[shader_idx]->info.stage == MESA_SHADER_FRAGMENT)
-         prepare_interp_optimize(&ctx, shaders[shader_idx]);
-      else if (shaders[shader_idx]->info.stage == MESA_SHADER_GEOMETRY && 
!info->is_ngg)
+      if (shaders[shader_idx]->info.stage == MESA_SHADER_GEOMETRY && 
!info->is_ngg)
          prepare_gs_input_vgprs(&ctx, shader_count >= 2);
 
       if (!ac_nir_translate(&ctx.ac, &ctx.abi, &args->ac, 
shaders[shader_idx])) {
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index b5322b74b1d..a90a3627949 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -610,6 +610,11 @@ radv_postprocess_nir(struct radv_device *device, const 
struct radv_pipeline_layo
 
          .enable_mrt_output_nan_fixup = 
pipeline_key->ps.epilog.enable_mrt_output_nan_fixup,
          .no_color_export = stage->info.ps.has_epilog,
+
+         .bc_optimize_for_persp =
+            stage->info.ps.reads_persp_center && 
stage->info.ps.reads_persp_centroid,
+         .bc_optimize_for_linear =
+            stage->info.ps.reads_linear_center && 
stage->info.ps.reads_linear_centroid,
       };
 
       NIR_PASS_V(stage->nir, ac_nir_lower_ps, &options);
diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm.c 
b/src/gallium/drivers/radeonsi/si_shader_llvm.c
index 583abbd61e2..9625aea0249 100644
--- a/src/gallium/drivers/radeonsi/si_shader_llvm.c
+++ b/src/gallium/drivers/radeonsi/si_shader_llvm.c
@@ -250,9 +250,6 @@ void si_llvm_create_main_func(struct si_shader_context *ctx)
        */
       if (shader->is_monolithic && shader->key.ge.part.vs.prolog.ls_vgpr_fix)
          ac_fixup_ls_hs_input_vgprs(&ctx->ac, &ctx->abi, &ctx->args->ac);
-   } else if (ctx->stage == MESA_SHADER_FRAGMENT) {
-      ctx->abi.persp_centroid = ac_get_arg(&ctx->ac, 
ctx->args->ac.persp_centroid);
-      ctx->abi.linear_centroid = ac_get_arg(&ctx->ac, 
ctx->args->ac.linear_centroid);
    }
 }
 

Reply via email to