Mesa (staging/21.2): aco: fix load_barycentric_at_{offset,sample}

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Oct 11 16:26:39 UTC 2021


Module: Mesa
Branch: staging/21.2
Commit: 45e9cb35dd20a5e3f072e988f89f6eba4bfc57cb
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=45e9cb35dd20a5e3f072e988f89f6eba4bfc57cb

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Thu Oct  7 22:56:23 2021 +0200

aco: fix load_barycentric_at_{offset,sample}

The linear case was missing.

Cc: 21.2 mesa-stable
Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Rhys Perry <pendingchaos02 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13257>
(cherry picked from commit 333472f0de43d5fee7270c87696955d5e5bfab4c)

---

 .pick_status.json                                  |  2 +-
 src/amd/compiler/aco_instruction_selection.cpp     | 52 +++++++++++-----------
 .../compiler/aco_instruction_selection_setup.cpp   |  4 +-
 3 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index 8f202ee34a3..7db08c7a345 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -499,7 +499,7 @@
         "description": "aco: fix load_barycentric_at_{offset,sample}",
         "nominated": true,
         "nomination_type": 0,
-        "resolution": 0,
+        "resolution": 1,
         "main_sha": null,
         "because_sha": null
     },
diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp
index 6fb409904bd..88c0d3657d2 100644
--- a/src/amd/compiler/aco_instruction_selection.cpp
+++ b/src/amd/compiler/aco_instruction_selection.cpp
@@ -7842,12 +7842,11 @@ emit_reduction_instr(isel_context* ctx, aco_opcode aco_op, ReduceOp op, unsigned
 }
 
 void
-emit_interp_center(isel_context* ctx, Temp dst, Temp pos1, Temp pos2)
+emit_interp_center(isel_context* ctx, Temp dst, Temp bary, Temp pos1, Temp pos2)
 {
    Builder bld(ctx->program, ctx->block);
-   Temp persp_center = get_arg(ctx, ctx->args->ac.persp_center);
-   Temp p1 = emit_extract_vector(ctx, persp_center, 0, v1);
-   Temp p2 = emit_extract_vector(ctx, persp_center, 1, v1);
+   Temp p1 = emit_extract_vector(ctx, bary, 0, v1);
+   Temp p2 = emit_extract_vector(ctx, bary, 1, v1);
 
    Temp ddx_1, ddx_2, ddy_1, ddy_2;
    uint32_t dpp_ctrl0 = dpp_quad_perm(0, 0, 0, 0);
@@ -7894,6 +7893,23 @@ Temp merged_wave_info_to_mask(isel_context* ctx, unsigned i);
 void ngg_emit_sendmsg_gs_alloc_req(isel_context* ctx, Temp vtx_cnt, Temp prm_cnt);
 static void create_vs_exports(isel_context* ctx);
 
+Temp
+get_interp_param(isel_context* ctx, nir_intrinsic_op intrin,
+                 enum glsl_interp_mode interp)
+{
+   bool linear = interp == INTERP_MODE_NOPERSPECTIVE;
+   if (intrin == nir_intrinsic_load_barycentric_pixel ||
+       intrin == nir_intrinsic_load_barycentric_at_sample ||
+       intrin == nir_intrinsic_load_barycentric_at_offset) {
+      return get_arg(ctx, linear ? ctx->args->ac.linear_center : ctx->args->ac.persp_center);
+   } else if (intrin == nir_intrinsic_load_barycentric_centroid) {
+      return linear ? ctx->linear_centroid : ctx->persp_centroid;
+   } else {
+      assert(intrin == nir_intrinsic_load_barycentric_sample);
+      return get_arg(ctx, linear ? ctx->args->ac.linear_sample : ctx->args->ac.persp_sample);
+   }
+}
+
 void
 visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr)
 {
@@ -7903,27 +7919,7 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr)
    case nir_intrinsic_load_barycentric_pixel:
    case nir_intrinsic_load_barycentric_centroid: {
       glsl_interp_mode mode = (glsl_interp_mode)nir_intrinsic_interp_mode(instr);
-      Temp bary = Temp(0, s2);
-      switch (mode) {
-      case INTERP_MODE_SMOOTH:
-      case INTERP_MODE_NONE:
-         if (instr->intrinsic == nir_intrinsic_load_barycentric_pixel)
-            bary = get_arg(ctx, ctx->args->ac.persp_center);
-         else if (instr->intrinsic == nir_intrinsic_load_barycentric_centroid)
-            bary = ctx->persp_centroid;
-         else if (instr->intrinsic == nir_intrinsic_load_barycentric_sample)
-            bary = get_arg(ctx, ctx->args->ac.persp_sample);
-         break;
-      case INTERP_MODE_NOPERSPECTIVE:
-         if (instr->intrinsic == nir_intrinsic_load_barycentric_pixel)
-            bary = get_arg(ctx, ctx->args->ac.linear_center);
-         else if (instr->intrinsic == nir_intrinsic_load_barycentric_centroid)
-            bary = ctx->linear_centroid;
-         else if (instr->intrinsic == nir_intrinsic_load_barycentric_sample)
-            bary = get_arg(ctx, ctx->args->ac.linear_sample);
-         break;
-      default: break;
-      }
+      Temp bary = get_interp_param(ctx, instr->intrinsic, mode);
       Temp dst = get_ssa_temp(ctx, &instr->dest.ssa);
       Temp p1 = emit_extract_vector(ctx, bary, 0, v1);
       Temp p2 = emit_extract_vector(ctx, bary, 1, v1);
@@ -8035,7 +8031,8 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr)
       pos1 = bld.vop2_e64(aco_opcode::v_sub_f32, bld.def(v1), pos1, Operand::c32(0x3f000000u));
       pos2 = bld.vop2_e64(aco_opcode::v_sub_f32, bld.def(v1), pos2, Operand::c32(0x3f000000u));
 
-      emit_interp_center(ctx, get_ssa_temp(ctx, &instr->dest.ssa), pos1, pos2);
+      Temp bary = get_interp_param(ctx, instr->intrinsic, (glsl_interp_mode)nir_intrinsic_interp_mode(instr));
+      emit_interp_center(ctx, get_ssa_temp(ctx, &instr->dest.ssa), bary, pos1, pos2);
       break;
    }
    case nir_intrinsic_load_barycentric_at_offset: {
@@ -8043,7 +8040,8 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr)
       RegClass rc = RegClass(offset.type(), 1);
       Temp pos1 = bld.tmp(rc), pos2 = bld.tmp(rc);
       bld.pseudo(aco_opcode::p_split_vector, Definition(pos1), Definition(pos2), offset);
-      emit_interp_center(ctx, get_ssa_temp(ctx, &instr->dest.ssa), pos1, pos2);
+      Temp bary = get_interp_param(ctx, instr->intrinsic, (glsl_interp_mode)nir_intrinsic_interp_mode(instr));
+      emit_interp_center(ctx, get_ssa_temp(ctx, &instr->dest.ssa), bary, pos1, pos2);
       break;
    }
    case nir_intrinsic_load_front_face: {
diff --git a/src/amd/compiler/aco_instruction_selection_setup.cpp b/src/amd/compiler/aco_instruction_selection_setup.cpp
index 689c4bb8c04..eca9f445ea7 100644
--- a/src/amd/compiler/aco_instruction_selection_setup.cpp
+++ b/src/amd/compiler/aco_instruction_selection_setup.cpp
@@ -52,7 +52,9 @@ get_interp_input(nir_intrinsic_op intrin, enum glsl_interp_mode interp)
          return S_0286CC_PERSP_SAMPLE_ENA(1);
       break;
    case INTERP_MODE_NOPERSPECTIVE:
-      if (intrin == nir_intrinsic_load_barycentric_pixel)
+      if (intrin == nir_intrinsic_load_barycentric_pixel ||
+          intrin == nir_intrinsic_load_barycentric_at_sample ||
+          intrin == nir_intrinsic_load_barycentric_at_offset)
          return S_0286CC_LINEAR_CENTER_ENA(1);
       else if (intrin == nir_intrinsic_load_barycentric_centroid)
          return S_0286CC_LINEAR_CENTROID_ENA(1);



More information about the mesa-commit mailing list