Mesa (main): nir_to_tgsi: Set the TGSI Precise flag for exact ALU instructions.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Dec 15 22:35:37 UTC 2021


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

Author: Emma Anholt <emma at anholt.net>
Date:   Tue Dec 14 15:51:13 2021 -0800

nir_to_tgsi: Set the TGSI Precise flag for exact ALU instructions.

This flag is used by the nv50, r600, and svga backends for instruction
exactness.  It was easier to plumb it in as an override in tgsi_ureg than
to make all of ALU instruction emit do it.

Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14201>

---

 src/gallium/auxiliary/nir/nir_to_tgsi.c | 4 ++++
 src/gallium/auxiliary/tgsi/tgsi_ureg.c  | 9 ++++++++-
 src/gallium/auxiliary/tgsi/tgsi_ureg.h  | 1 +
 3 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/src/gallium/auxiliary/nir/nir_to_tgsi.c b/src/gallium/auxiliary/nir/nir_to_tgsi.c
index 1041132039f..71eee4ace0f 100644
--- a/src/gallium/auxiliary/nir/nir_to_tgsi.c
+++ b/src/gallium/auxiliary/nir/nir_to_tgsi.c
@@ -863,6 +863,8 @@ ntt_emit_alu(struct ntt_compile *c, nir_alu_instr *instr)
    int src_64 = nir_src_bit_size(instr->src[0].src) == 64;
    int num_srcs = nir_op_infos[instr->op].num_inputs;
 
+   ureg_set_precise(c->ureg, instr->exact);
+
    assert(num_srcs <= ARRAY_SIZE(src));
    for (i = 0; i < num_srcs; i++)
       src[i] = ntt_get_alu_src(c, instr, i);
@@ -1262,6 +1264,8 @@ ntt_emit_alu(struct ntt_compile *c, nir_alu_instr *instr)
       }
       ureg_release_temporary(c->ureg, dst);
    }
+
+   ureg_set_precise(c->ureg, false);
 }
 
 static struct ureg_src
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
index eedba34cbc7..ceb93c440bf 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
@@ -205,6 +205,8 @@ struct ureg_program
    struct ureg_tokens domain[2];
 
    bool use_memory[TGSI_MEMORY_TYPE_COUNT];
+
+   bool precise;
 };
 
 static union tgsi_any_token error_tokens[32];
@@ -1267,7 +1269,7 @@ ureg_emit_insn(struct ureg_program *ureg,
    out[0].insn = tgsi_default_instruction();
    out[0].insn.Opcode = opcode;
    out[0].insn.Saturate = saturate;
-   out[0].insn.Precise = precise;
+   out[0].insn.Precise = precise || ureg->precise;
    out[0].insn.NumDstRegs = num_dst;
    out[0].insn.NumSrcRegs = num_src;
 
@@ -2437,3 +2439,8 @@ void ureg_destroy( struct ureg_program *ureg )
 
    FREE(ureg);
 }
+
+void ureg_set_precise( struct ureg_program *ureg, bool precise )
+{
+   ureg->precise = precise;
+}
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
index 343708b6c09..59041e94d73 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
@@ -137,6 +137,7 @@ void ureg_free_tokens( const struct tgsi_token *tokens );
 void 
 ureg_destroy( struct ureg_program * );
 
+void ureg_set_precise( struct ureg_program *ureg, bool precise );
 
 /***********************************************************************
  * Convenience routine:



More information about the mesa-commit mailing list