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

Author: Gert Wollny <gert.wol...@collabora.com>
Date:   Sun Oct 22 20:28:49 2023 +0200

r600/sfn: Allow skipping backend shader optimization for a subset of shaders

This comes in handy when debugging problems with the backend optimizer

Signed-off-by: Gert Wollny <gert.wol...@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25846>

---

 src/gallium/drivers/r600/sfn/sfn_nir.cpp              | 19 +++++++++++++++----
 src/gallium/drivers/r600/sfn/sfn_shader.cpp           |  6 +++++-
 src/gallium/drivers/r600/sfn/sfn_shader.h             |  8 +++++++-
 .../drivers/r600/sfn/tests/sfn_test_shaders.cpp       |  2 ++
 4 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/r600/sfn/sfn_nir.cpp 
b/src/gallium/drivers/r600/sfn/sfn_nir.cpp
index afdbf823a71..f490c63ff5e 100644
--- a/src/gallium/drivers/r600/sfn/sfn_nir.cpp
+++ b/src/gallium/drivers/r600/sfn/sfn_nir.cpp
@@ -45,6 +45,7 @@
 #include "sfn_scheduler.h"
 #include "sfn_shader.h"
 #include "sfn_split_address_loads.h"
+#include "util/u_debug.h"
 #include "util/u_prim.h"
 
 #include <vector>
@@ -746,6 +747,9 @@ r600_finalize_nir_common(nir_shader *nir, enum 
amd_gfx_level gfx_level)
       ;
 }
 
+DEBUG_GET_ONCE_NUM_OPTION(skip_opt_start, "R600_SFN_SKIP_OPT_START", -1);
+DEBUG_GET_ONCE_NUM_OPTION(skip_opt_end, "R600_SFN_SKIP_OPT_END", -1);
+
 void
 r600_lower_and_optimize_nir(nir_shader *sh,
                             const union r600_shader_key *key,
@@ -893,9 +897,17 @@ r600_finalize_and_optimize_shader(r600::Shader *shader)
       shader->print(std::cerr);
    }
 
-   if (!r600::sfn_log.has_debug_flag(r600::SfnLog::noopt)) {
-      optimize(*shader);
+   auto sfn_skip_opt_start = debug_get_option_skip_opt_start();
+   auto sfn_skip_opt_end = debug_get_option_skip_opt_end();
+   bool skip_shader_opt_per_id = sfn_skip_opt_start >= 0 &&
+                                 sfn_skip_opt_start <= shader->shader_id() &&
+                                 sfn_skip_opt_end >= shader->shader_id();
+
+   bool skip_shader_opt = r600::sfn_log.has_debug_flag(r600::SfnLog::noopt) ||
+                          skip_shader_opt_per_id;
 
+   if (!skip_shader_opt) {
+      optimize(*shader);
       if (r600::sfn_log.has_debug_flag(r600::SfnLog::steps)) {
          std::cerr << "Shader after optimization\n";
          shader->print(std::cerr);
@@ -909,9 +921,8 @@ r600_finalize_and_optimize_shader(r600::Shader *shader)
       shader->print(std::cerr);
    }
    
-   if (!r600::sfn_log.has_debug_flag(r600::SfnLog::noopt)) {
+   if (!skip_shader_opt) {
       optimize(*shader);
-
       if (r600::sfn_log.has_debug_flag(r600::SfnLog::steps)) {
          std::cerr << "Shader after optimization\n";
          shader->print(std::cerr);
diff --git a/src/gallium/drivers/r600/sfn/sfn_shader.cpp 
b/src/gallium/drivers/r600/sfn/sfn_shader.cpp
index 4db52be4f4a..7cd90e38d2d 100644
--- a/src/gallium/drivers/r600/sfn/sfn_shader.cpp
+++ b/src/gallium/drivers/r600/sfn/sfn_shader.cpp
@@ -151,12 +151,15 @@ ShaderInput::set_uses_interpolate_at_centroid()
    m_uses_interpolate_at_centroid = true;
 }
 
+int64_t Shader::s_next_shader_id = 1;
+
 Shader::Shader(const char *type_id, unsigned atomic_base):
     m_current_block(nullptr),
     m_type_id(type_id),
     m_chip_class(ISA_CC_R600),
     m_next_block(0),
-    m_atomic_base(atomic_base)
+    m_atomic_base(atomic_base),
+    m_shader_id(s_next_shader_id++)
 {
    m_instr_factory = new InstrFactory();
    m_chain_instr.this_shader = this;
@@ -1615,6 +1618,7 @@ void
 Shader::print_header(std::ostream& os) const
 {
    assert(m_chip_class <= ISA_CC_CAYMAN);
+   os << "Shader: " << m_shader_id << "\n";
    os << m_type_id << "\n";
    os << "CHIPCLASS " << chip_class_names[m_chip_class] << "\n";
    print_properties(os);
diff --git a/src/gallium/drivers/r600/sfn/sfn_shader.h 
b/src/gallium/drivers/r600/sfn/sfn_shader.h
index ebd586ced75..9b442bdab04 100644
--- a/src/gallium/drivers/r600/sfn/sfn_shader.h
+++ b/src/gallium/drivers/r600/sfn/sfn_shader.h
@@ -149,6 +149,10 @@ public:
 
    virtual ~Shader() {}
 
+   auto shader_id() const {return m_shader_id;}
+   // Needed for testing
+   void reset_shader_id() {m_shader_id = 0;}
+
    bool add_info_from_string(std::istream& is);
 
    static Shader *translate_from_nir(nir_shader *nir,
@@ -378,6 +382,9 @@ private:
    uint32_t m_nloops{0};
    uint32_t m_required_registers{0};
 
+   int64_t m_shader_id;
+   static int64_t s_next_shader_id;
+
    class InstructionChain : public InstrVisitor {
    public:
       void visit(AluGroup *instr) override { (void)instr; }
@@ -414,7 +421,6 @@ private:
    std::list<Instr *, Allocator<Instr *>> m_loops;
    int m_control_flow_depth{0};
    std::list<nir_intrinsic_instr*> m_register_allocations;
-
 };
 
 } // namespace r600
diff --git a/src/gallium/drivers/r600/sfn/tests/sfn_test_shaders.cpp 
b/src/gallium/drivers/r600/sfn/tests/sfn_test_shaders.cpp
index 4f75e5cf466..87b8367a7f1 100644
--- a/src/gallium/drivers/r600/sfn/tests/sfn_test_shaders.cpp
+++ b/src/gallium/drivers/r600/sfn/tests/sfn_test_shaders.cpp
@@ -3244,6 +3244,8 @@ TestShader::from_string(const std::string& s)
    else
       return nullptr;
 
+   shader->reset_shader_id();
+
    while (std::getline(is, line)) {
       if (line.find_first_not_of(" \t") == std::string::npos)
          continue;

Reply via email to