Mesa (main): radv: gather more information about PS in the shader info pass

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Oct 8 12:48:42 UTC 2021


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

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Mon Oct  4 18:37:15 2021 +0200

radv: gather more information about PS in the shader info pass

To compute the PS SPI inputs.

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/13192>

---

 src/amd/vulkan/radv_shader.h      | 13 ++++++++-
 src/amd/vulkan/radv_shader_info.c | 59 +++++++++++++++++++++++++++++++--------
 2 files changed, 60 insertions(+), 12 deletions(-)

diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h
index 4657ee6235c..dc7f4b2e72c 100644
--- a/src/amd/vulkan/radv_shader.h
+++ b/src/amd/vulkan/radv_shader.h
@@ -300,8 +300,19 @@ struct radv_shader_info {
       bool early_fragment_test;
       bool post_depth_coverage;
       bool reads_sample_mask_in;
+      bool reads_front_face;
+      bool reads_sample_id;
+      bool reads_frag_shading_rate;
+      bool reads_barycentric_model;
+      bool reads_persp_sample;
+      bool reads_persp_center;
+      bool reads_persp_centroid;
+      bool reads_linear_sample;
+      bool reads_linear_center;
+      bool reads_linear_centroid;
+      uint8_t reads_frag_coord_mask;
+      uint8_t reads_sample_pos_mask;
       uint8_t depth_layout;
-      bool uses_persp_or_linear_interp;
       bool allow_flat_shading;
    } ps;
    struct {
diff --git a/src/amd/vulkan/radv_shader_info.c b/src/amd/vulkan/radv_shader_info.c
index 5a3e5f12b12..a29d089069c 100644
--- a/src/amd/vulkan/radv_shader_info.c
+++ b/src/amd/vulkan/radv_shader_info.c
@@ -130,27 +130,42 @@ gather_intrinsic_info(const nir_shader *nir, const nir_intrinsic_instr *instr,
    switch (instr->intrinsic) {
    case nir_intrinsic_load_barycentric_sample:
    case nir_intrinsic_load_barycentric_pixel:
-   case nir_intrinsic_load_barycentric_centroid: {
+   case nir_intrinsic_load_barycentric_centroid:
+   case nir_intrinsic_load_barycentric_at_sample:
+   case nir_intrinsic_load_barycentric_at_offset: {
       enum glsl_interp_mode mode = nir_intrinsic_interp_mode(instr);
       switch (mode) {
-      case INTERP_MODE_NONE:
       case INTERP_MODE_SMOOTH:
+      case INTERP_MODE_NONE:
+         if (instr->intrinsic == nir_intrinsic_load_barycentric_pixel ||
+             instr->intrinsic == nir_intrinsic_load_barycentric_at_sample ||
+             instr->intrinsic == nir_intrinsic_load_barycentric_at_offset)
+            info->ps.reads_persp_center = true;
+         else if (instr->intrinsic == nir_intrinsic_load_barycentric_centroid)
+            info->ps.reads_persp_centroid = true;
+         else if (instr->intrinsic == nir_intrinsic_load_barycentric_sample)
+            info->ps.reads_persp_sample = true;
+         break;
       case INTERP_MODE_NOPERSPECTIVE:
-         info->ps.uses_persp_or_linear_interp = true;
+         if (instr->intrinsic == nir_intrinsic_load_barycentric_pixel ||
+             instr->intrinsic == nir_intrinsic_load_barycentric_at_sample ||
+             instr->intrinsic == nir_intrinsic_load_barycentric_at_offset)
+            info->ps.reads_linear_center = true;
+         else if (instr->intrinsic == nir_intrinsic_load_barycentric_centroid)
+            info->ps.reads_linear_centroid = true;
+         else if (instr->intrinsic == nir_intrinsic_load_barycentric_sample)
+            info->ps.reads_linear_sample = true;
          break;
       default:
          break;
       }
-      break;
-   }
-   case nir_intrinsic_load_barycentric_at_offset:
-   case nir_intrinsic_load_barycentric_at_sample:
-      if (nir_intrinsic_interp_mode(instr) != INTERP_MODE_FLAT)
-         info->ps.uses_persp_or_linear_interp = true;
-
       if (instr->intrinsic == nir_intrinsic_load_barycentric_at_sample)
          info->ps.needs_sample_positions = true;
       break;
+   }
+   case nir_intrinsic_load_barycentric_model:
+      info->ps.reads_barycentric_model = true;
+      break;
    case nir_intrinsic_load_draw_id:
       info->vs.needs_draw_id = true;
       break;
@@ -187,6 +202,21 @@ gather_intrinsic_info(const nir_shader *nir, const nir_intrinsic_instr *instr,
    case nir_intrinsic_load_sample_mask_in:
       info->ps.reads_sample_mask_in = true;
       break;
+   case nir_intrinsic_load_sample_id:
+      info->ps.reads_sample_id = true;
+      break;
+   case nir_intrinsic_load_frag_shading_rate:
+      info->ps.reads_frag_shading_rate = true;
+      break;
+   case nir_intrinsic_load_front_face:
+      info->ps.reads_front_face = true;
+      break;
+   case nir_intrinsic_load_frag_coord:
+      info->ps.reads_frag_coord_mask = nir_ssa_def_components_read(&instr->dest.ssa);
+      break;
+   case nir_intrinsic_load_sample_pos:
+      info->ps.reads_sample_pos_mask = nir_ssa_def_components_read(&instr->dest.ssa);
+      break;
    case nir_intrinsic_load_view_index:
       info->needs_multiview_view_index = true;
       if (nir->info.stage == MESA_SHADER_FRAGMENT)
@@ -725,8 +755,15 @@ radv_nir_shader_info_pass(struct radv_device *device, const struct nir_shader *n
    }
 
    if (nir->info.stage == MESA_SHADER_FRAGMENT) {
+      bool uses_persp_or_linear_interp = info->ps.reads_persp_center ||
+                                         info->ps.reads_persp_centroid ||
+                                         info->ps.reads_persp_sample ||
+                                         info->ps.reads_linear_center ||
+                                         info->ps.reads_linear_centroid ||
+                                         info->ps.reads_linear_sample;
+
       info->ps.allow_flat_shading =
-         !(info->ps.uses_persp_or_linear_interp || info->ps.needs_sample_positions ||
+         !(uses_persp_or_linear_interp || info->ps.needs_sample_positions ||
            info->ps.writes_memory || nir->info.fs.needs_quad_helper_invocations ||
            BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_FRAG_COORD) ||
            BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_POINT_COORD) ||



More information about the mesa-commit mailing list