Mesa (master): r600/sfn: Fix split_alu_modifiers

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Sep 16 08:36:17 UTC 2020


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

Author: Gert Wollny <gert.wollny at collabora.com>
Date:   Sun Aug  2 20:50:33 2020 +0200

r600/sfn: Fix split_alu_modifiers

Don't reuse the dest register so we can better track instruction
dependencies later.

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

---

 src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.cpp | 12 ++++++++----
 src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.h   |  3 ++-
 2 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.cpp b/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.cpp
index 48a77d2edd6..03f1f11b95c 100644
--- a/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.cpp
+++ b/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.cpp
@@ -1225,12 +1225,12 @@ bool EmitAluInstruction::emit_alu_div_int(const nir_alu_instr& instr, bool use_s
 }
 
 void EmitAluInstruction::split_alu_modifiers(const nir_alu_src& src,
-                                             GPRVector::Values& v, int ncomp)
+                                             const GPRVector::Values& v, GPRVector::Values& out, int ncomp)
 {
 
    AluInstruction *alu = nullptr;
    for (int i = 0; i < ncomp; ++i) {
-      alu  = new AluInstruction(op1_mov,  v[i], v[i], {alu_write});
+      alu  = new AluInstruction(op1_mov,  out[i], v[i], {alu_write});
       if (src.abs)
          alu->set_flag(alu_src0_abs);
       if (src.negate)
@@ -1251,8 +1251,12 @@ bool EmitAluInstruction::emit_tex_fdd(const nir_alu_instr& instr, TexInstruction
    auto src = vec_from_nir_with_fetch_constant(instr.src[0].src, (1 << ncomp) - 1, {0,1,2,3});
 
 
-   if (instr.src[0].abs || instr.src[0].negate)
-      split_alu_modifiers(instr.src[0], src.values(), ncomp);
+
+   if (instr.src[0].abs || instr.src[0].negate) {
+      GPRVector tmp = get_temp_vec4();
+      split_alu_modifiers(instr.src[0], src.values(), tmp.values(), ncomp);
+      src = tmp;
+   }
 
    for (int i = 0; i < 4; ++i) {
       writemask[i] = (instr.dest.write_mask & (1 << i)) ? i : 7;
diff --git a/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.h b/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.h
index 9e875b6db9a..7cbdcfd5d5c 100644
--- a/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.h
+++ b/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.h
@@ -100,7 +100,8 @@ private:
 
 private:
    void make_last(AluInstruction *ir) const;
-   void split_alu_modifiers(const nir_alu_src &src, GPRVector::Values& v, int ncomp);
+   void split_alu_modifiers(const nir_alu_src &src, const GPRVector::Values& v,
+                            GPRVector::Values& out, int ncomp);
 
    void preload_src(const nir_alu_instr& instr);
    unsigned num_src_comp(const nir_alu_instr& instr);



More information about the mesa-commit mailing list