Mesa (master): r600/sfn: Fix FS inputs when reading from the same position

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Feb 1 10:22:35 UTC 2021


Module: Mesa
Branch: master
Commit: 576da40a73d9d88fb5b660c144eb72e9f7564c53
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=576da40a73d9d88fb5b660c144eb72e9f7564c53

Author: Gert Wollny <gert.wollny at collabora.com>
Date:   Sat Jan 30 21:47:26 2021 +0100

r600/sfn: Fix FS inputs when reading from the same position

Don't add another varying in this case.

Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8800>

---

 .../drivers/r600/sfn/sfn_shader_fragment.cpp       | 35 ++++++++++++++++------
 src/gallium/drivers/r600/sfn/sfn_shaderio.cpp      | 13 ++++----
 src/gallium/drivers/r600/sfn/sfn_shaderio.h        |  4 +--
 3 files changed, 35 insertions(+), 17 deletions(-)

diff --git a/src/gallium/drivers/r600/sfn/sfn_shader_fragment.cpp b/src/gallium/drivers/r600/sfn/sfn_shader_fragment.cpp
index 6252f5d2ac6..420ecedb0c6 100644
--- a/src/gallium/drivers/r600/sfn/sfn_shader_fragment.cpp
+++ b/src/gallium/drivers/r600/sfn/sfn_shader_fragment.cpp
@@ -195,11 +195,22 @@ bool FragmentShaderFromNir::process_load_input(nir_intrinsic_instr *instr,
 
    switch (name) {
    case TGSI_SEMANTIC_COLOR: {
-      m_shaderio.add_input(new ShaderInputColor(name, sid,
-                                                nir_intrinsic_base(instr) + index->u32,
-                                                nir_intrinsic_component(instr),
-                                                nir_dest_num_components(instr->dest),
-                                                tgsi_interpolate, tgsi_loc));
+      auto input = m_shaderio.find_varying(name, sid);
+      if (!input) {
+         m_shaderio.add_input(new ShaderInputColor(name, sid,
+                                                   nir_intrinsic_base(instr) + index->u32,
+                                                   nir_intrinsic_component(instr),
+                                                   nir_dest_num_components(instr->dest),
+                                                   tgsi_interpolate, tgsi_loc));
+      }  else {
+         if (uses_interpol_at_centroid)
+            input->set_uses_interpolate_at_centroid();
+
+         auto varying = static_cast<ShaderInputVarying&>(*input);
+         varying.update_mask(nir_dest_num_components(instr->dest),
+                             nir_intrinsic_component(instr));
+      }
+
       m_need_back_color = m_two_sided_color;
       return true;
    }
@@ -214,14 +225,20 @@ bool FragmentShaderFromNir::process_load_input(nir_intrinsic_instr *instr,
    case TGSI_SEMANTIC_PCOORD:
    case TGSI_SEMANTIC_VIEWPORT_INDEX:
    case TGSI_SEMANTIC_CLIPDIST: {
-      auto varying = m_shaderio.find_varying(name, sid, nir_intrinsic_component(instr));
-      if (!varying) {
+      auto input = m_shaderio.find_varying(name, sid);
+      if (!input) {
          m_shaderio.add_input(new ShaderInputVarying(name, sid, nir_intrinsic_base(instr) + index->u32,
                                                      nir_intrinsic_component(instr),
                                                      nir_dest_num_components(instr->dest),
                                                      tgsi_interpolate, tgsi_loc));
-      } else if (uses_interpol_at_centroid)
-         varying->set_uses_interpolate_at_centroid();
+      } else {
+         if (uses_interpol_at_centroid)
+            input->set_uses_interpolate_at_centroid();
+
+         auto varying = static_cast<ShaderInputVarying&>(*input);
+         varying.update_mask(nir_dest_num_components(instr->dest),
+                             nir_intrinsic_component(instr));
+      }
 
       return true;
    }
diff --git a/src/gallium/drivers/r600/sfn/sfn_shaderio.cpp b/src/gallium/drivers/r600/sfn/sfn_shaderio.cpp
index 4cd84723fb3..c398975a1c5 100644
--- a/src/gallium/drivers/r600/sfn/sfn_shaderio.cpp
+++ b/src/gallium/drivers/r600/sfn/sfn_shaderio.cpp
@@ -121,7 +121,7 @@ ShaderInputVarying::ShaderInputVarying(tgsi_semantic _name, int sid, unsigned dr
    m_interpolate_loc(interp_loc),
    m_ij_index(-10),
    m_lds_pos(0),
-   m_mask((1 << components) - 1)
+   m_mask(((1 << components) - 1) << frac)
 {
    evaluate_spi_sid();
 
@@ -141,7 +141,7 @@ ShaderInputVarying::ShaderInputVarying(tgsi_semantic _name, int sid, nir_variabl
    m_sid(sid),
    m_ij_index(-10),
    m_lds_pos(0),
-   m_mask((1 << input->type->components()) - 1)
+   m_mask(((1 << input->type->components()) - 1) << input->data.location_frac)
 {
    sfn_log << SfnLog::io << __func__
            << "name:" << _name
@@ -210,9 +210,9 @@ bool ShaderInputVarying::is_varying() const
    return true;
 }
 
-void ShaderInputVarying::update_mask(int additional_comps)
+void ShaderInputVarying::update_mask(int additional_comps, int frac)
 {
-   m_mask |= additional_comps;
+   m_mask |= ((1 << additional_comps) - 1) << frac;
 }
 
 void ShaderInputVarying::evaluate_spi_sid()
@@ -226,6 +226,7 @@ void ShaderInputVarying::evaluate_spi_sid()
       break;
    case TGSI_SEMANTIC_POSITION:
       m_spi_sid = 0;
+      break;
    case TGSI_SEMANTIC_GENERIC:
    case TGSI_SEMANTIC_TEXCOORD:
    case TGSI_SEMANTIC_PCOORD:
@@ -322,13 +323,13 @@ size_t ShaderIO::add_input(ShaderInput *input)
    return m_inputs.size() - 1;
 }
 
-PShaderInput ShaderIO::find_varying(tgsi_semantic name, int sid, int frac)
+PShaderInput ShaderIO::find_varying(tgsi_semantic name, int sid)
 {
    for (auto& a : m_inputs) {
       if (a->name() == name) {
          assert(a->is_varying());
          auto& v = static_cast<ShaderInputVarying&>(*a);
-         if (v.sid() == sid && (v.location_frac() == frac))
+         if (v.sid() == sid)
             return a;
       }
    }
diff --git a/src/gallium/drivers/r600/sfn/sfn_shaderio.h b/src/gallium/drivers/r600/sfn/sfn_shaderio.h
index 0e20c6716fe..855bbe1433e 100644
--- a/src/gallium/drivers/r600/sfn/sfn_shaderio.h
+++ b/src/gallium/drivers/r600/sfn/sfn_shaderio.h
@@ -93,7 +93,7 @@ public:
 
    int sid() const {return m_sid;}
 
-   void update_mask(int additional_comps);
+   void update_mask(int additional_comps, int frac);
 
    size_t location() const {return m_driver_location;}
    int location_frac() const {return m_location_frac;}
@@ -155,7 +155,7 @@ public:
 
    size_t size() const {return m_inputs.size();}
 
-   PShaderInput find_varying(tgsi_semantic name, int sid, int frac);
+   PShaderInput find_varying(tgsi_semantic name, int sid);
 
    void update_lds_pos();
 



More information about the mesa-commit mailing list