diff options
author | Emma Anholt <emma@anholt.net> | 2021-12-14 15:51:13 -0800 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2021-12-15 21:58:04 +0000 |
commit | 3ffd6f3fa624c2da09c8ab72588f89fdfc501c69 (patch) | |
tree | a3382c97c4e27c6a10ca6b050d4a9eca616bea11 | |
parent | af4d277cccbba77a78f49c83305f99eef8c12f4a (diff) |
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@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14201>
-rw-r--r-- | src/gallium/auxiliary/nir/nir_to_tgsi.c | 4 | ||||
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_ureg.c | 9 | ||||
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_ureg.h | 1 |
3 files changed, 13 insertions, 1 deletions
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: |