Mesa (main): r600/sfn: force new CF if fetch through TC would be used in same clause

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue May 18 20:31:02 UTC 2021


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

Author: Gert Wollny <gert.wollny at collabora.com>
Date:   Mon May 10 23:32:13 2021 +0200

r600/sfn: force new CF if fetch through TC would be used in same clause

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

---

 .../drivers/r600/sfn/sfn_ir_to_assembly.cpp        | 35 ++++++++++++++++++++--
 src/gallium/drivers/r600/sfn/sfn_optimizers.cpp    | 12 ++++++++
 src/gallium/drivers/r600/sfn/sfn_optimizers.h      | 14 +++++++++
 3 files changed, 58 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/r600/sfn/sfn_ir_to_assembly.cpp b/src/gallium/drivers/r600/sfn/sfn_ir_to_assembly.cpp
index 9a4a4f5fbe5..d97abe73262 100644
--- a/src/gallium/drivers/r600/sfn/sfn_ir_to_assembly.cpp
+++ b/src/gallium/drivers/r600/sfn/sfn_ir_to_assembly.cpp
@@ -98,6 +98,7 @@ public:
    int m_loop_nesting;
    int m_nliterals_in_group;
    std::set<int> vtx_fetch_results;
+   std::set<int> tex_fetch_results;
    bool m_last_op_was_barrier;
 };
 
@@ -158,8 +159,11 @@ bool AssemblyFromShaderLegacyImpl::visit(const InstructionBlock& block)
 {
    for (const auto& i : block) {
 
-      if (i->type() != Instruction::vtx)
+      if (i->type() != Instruction::vtx) {
           vtx_fetch_results.clear();
+          if (i->type() != Instruction::tex)
+              tex_fetch_results.clear();
+      }
 
       m_last_op_was_barrier &= i->type() == Instruction::alu;
 
@@ -649,6 +653,12 @@ bool AssemblyFromShaderLegacyImpl::visit(const TexInstruction & tex_instr)
       m_bc->index_loaded[1] = true;
    }
 
+   if (tex_fetch_results.find(tex_instr.src().sel()) !=
+       tex_fetch_results.end()) {
+      m_bc->force_add_cf = 1;
+      tex_fetch_results.clear();
+   }
+
    r600_bytecode_tex tex;
    memset(&tex, 0, sizeof(struct r600_bytecode_tex));
    tex.op = tex_instr.opcode();
@@ -676,6 +686,12 @@ bool AssemblyFromShaderLegacyImpl::visit(const TexInstruction & tex_instr)
    tex.resource_index_mode = (!!addr) ? 2 : 0;
    tex.sampler_index_mode = tex.resource_index_mode;
 
+   if (tex.dst_sel_x < 4 &&
+       tex.dst_sel_y < 4 &&
+       tex.dst_sel_z < 4 &&
+       tex.dst_sel_w < 4)
+      tex_fetch_results.insert(tex.dst_gpr);
+
    if (tex_instr.opcode() == TexInstruction::get_gradient_h ||
        tex_instr.opcode() == TexInstruction::get_gradient_v)
       tex.inst_mod = tex_instr.has_flag(TexInstruction::grad_fine) ? 1 : 0;
@@ -710,12 +726,25 @@ bool AssemblyFromShaderLegacyImpl::visit(const FetchInstruction& fetch_instr)
       }
    }
 
-   if (vtx_fetch_results.find(fetch_instr.src().sel()) !=
+   bool use_tc = fetch_instr.use_tc() || (m_bc->chip_class == CAYMAN);
+   if (!use_tc &&
+       vtx_fetch_results.find(fetch_instr.src().sel()) !=
        vtx_fetch_results.end()) {
       m_bc->force_add_cf = 1;
       vtx_fetch_results.clear();
    }
-   vtx_fetch_results.insert(fetch_instr.dst().sel());
+
+   if (fetch_instr.use_tc() &&
+       tex_fetch_results.find(fetch_instr.src().sel()) !=
+       tex_fetch_results.end()) {
+      m_bc->force_add_cf = 1;
+      tex_fetch_results.clear();
+   }
+
+   if (use_tc)
+      tex_fetch_results.insert(fetch_instr.dst().sel());
+   else
+      vtx_fetch_results.insert(fetch_instr.dst().sel());
 
    struct r600_bytecode_vtx vtx;
    memset(&vtx, 0, sizeof(vtx));
diff --git a/src/gallium/drivers/r600/sfn/sfn_optimizers.cpp b/src/gallium/drivers/r600/sfn/sfn_optimizers.cpp
new file mode 100644
index 00000000000..dbffcfa31e8
--- /dev/null
+++ b/src/gallium/drivers/r600/sfn/sfn_optimizers.cpp
@@ -0,0 +1,12 @@
+#include "sfn_optimizers.h"
+#include "sfn_instruction_block.h"
+
+namespace r600 {
+
+std::vector<PInstruction>
+flatten_shader(const std::vector<InstructionBlock> &ir)
+{
+
+}
+
+}
\ No newline at end of file
diff --git a/src/gallium/drivers/r600/sfn/sfn_optimizers.h b/src/gallium/drivers/r600/sfn/sfn_optimizers.h
new file mode 100644
index 00000000000..d17d32b2a5f
--- /dev/null
+++ b/src/gallium/drivers/r600/sfn/sfn_optimizers.h
@@ -0,0 +1,14 @@
+#ifndef SFN_OPTIMIZERS_H
+#define SFN_OPTIMIZERS_H
+
+#include "sfn_instruction_base.h"
+
+namespace r600 {
+
+std::vector<PInstruction>
+flatten_alu_ops(const std::vector<InstructionBlock> &ir);
+
+
+}
+
+#endif // SFN_OPTIMIZERS_H



More information about the mesa-commit mailing list