Mesa (main): nir_to_tgsi: Fix internal handling of NIR uints for !CAP_INTEGERS
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Jun 18 05:01:20 UTC 2021
Module: Mesa
Branch: main
Commit: baa8d33908cd640ef1e5c7efca931d43a46cd9f5
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=baa8d33908cd640ef1e5c7efca931d43a46cd9f5
Author: Emma Anholt <emma at anholt.net>
Date: Thu Jun 3 16:20:12 2021 -0700
nir_to_tgsi: Fix internal handling of NIR uints for !CAP_INTEGERS
If we called nir_lower_int_to_float(), then ALU-consumed ints got turned
into floats and we have to interpret them that way.
Reviewed-by: Adam Jackson <ajax at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11329>
---
src/gallium/auxiliary/nir/nir_to_tgsi.c | 38 ++++++++++++++++++++++++++-------
1 file changed, 30 insertions(+), 8 deletions(-)
diff --git a/src/gallium/auxiliary/nir/nir_to_tgsi.c b/src/gallium/auxiliary/nir/nir_to_tgsi.c
index 2b12d802618..1da966277b0 100644
--- a/src/gallium/auxiliary/nir/nir_to_tgsi.c
+++ b/src/gallium/auxiliary/nir/nir_to_tgsi.c
@@ -31,6 +31,7 @@
#include "tgsi/tgsi_info.h"
#include "tgsi/tgsi_ureg.h"
#include "util/debug.h"
+#include "util/u_math.h"
#include "util/u_memory.h"
struct ntt_compile {
@@ -70,6 +71,27 @@ struct ntt_compile {
static void ntt_emit_cf_list(struct ntt_compile *c, struct exec_list *list);
+/**
+ * Interprets a nir_load_const used as a NIR src as a uint.
+ *
+ * For non-native-integers drivers, nir_load_const_instrs used by an integer ALU
+ * instruction (or in a phi-web used by an integer ALU instruction) were
+ * converted to floats and the ALU instruction swapped to the float equivalent.
+ * However, this means that integer load_consts used by intrinsics (which don't
+ * normally get that conversion) may have been reformatted to be floats. Given
+ * that all of our intrinsic nir_src_as_uint() calls are expected to be small,
+ * we can just look and see if they look like floats and convert them back to
+ * ints.
+ */
+static uint32_t
+ntt_src_as_uint(struct ntt_compile *c, nir_src src)
+{
+ uint32_t val = nir_src_as_uint(src);
+ if (!c->native_integers && val >= fui(1.0))
+ val = (uint32_t)uif(val);
+ return val;
+}
+
static unsigned
ntt_64bit_write_mask(unsigned write_mask)
{
@@ -275,7 +297,7 @@ ntt_try_store_in_tgsi_output(struct ntt_compile *c, struct ureg_dst *dst,
uint32_t frac;
*dst = ntt_store_output_decl(c, intr, &frac);
- dst->Index += nir_src_as_uint(intr->src[1]);
+ dst->Index += ntt_src_as_uint(c, intr->src[1]);
return frac == 0;
}
@@ -1097,7 +1119,7 @@ ntt_ureg_src_indirect(struct ntt_compile *c, struct ureg_src usrc,
nir_src src)
{
if (nir_src_is_const(src)) {
- usrc.Index += nir_src_as_uint(src);
+ usrc.Index += ntt_src_as_uint(c, src);
return usrc;
} else {
return ureg_src_indirect(usrc, ntt_reladdr(c, ntt_get_src(c, src)));
@@ -1109,7 +1131,7 @@ ntt_ureg_dst_indirect(struct ntt_compile *c, struct ureg_dst dst,
nir_src src)
{
if (nir_src_is_const(src)) {
- dst.Index += nir_src_as_uint(src);
+ dst.Index += ntt_src_as_uint(c, src);
return dst;
} else {
return ureg_dst_indirect(dst, ntt_reladdr(c, ntt_get_src(c, src)));
@@ -1121,7 +1143,7 @@ ntt_ureg_src_dimension_indirect(struct ntt_compile *c, struct ureg_src usrc,
nir_src src)
{
if (nir_src_is_const(src)) {
- return ureg_src_dimension(usrc, nir_src_as_uint(src));
+ return ureg_src_dimension(usrc, ntt_src_as_uint(c, src));
}
else
{
@@ -1136,7 +1158,7 @@ ntt_ureg_dst_dimension_indirect(struct ntt_compile *c, struct ureg_dst udst,
nir_src src)
{
if (nir_src_is_const(src)) {
- return ureg_dst_dimension(udst, nir_src_as_uint(src));
+ return ureg_dst_dimension(udst, ntt_src_as_uint(c, src));
} else {
return ureg_dst_dimension_indirect(udst,
ntt_reladdr(c, ntt_get_src(c, src)),
@@ -1173,7 +1195,7 @@ ntt_emit_load_ubo(struct ntt_compile *c, nir_intrinsic_instr *instr)
*/
if (nir_src_is_const(instr->src[1])) {
- src.Index += nir_src_as_uint(instr->src[1]);
+ src.Index += ntt_src_as_uint(c, instr->src[1]);
} else {
src = ureg_src_indirect(src, ntt_reladdr(c, ntt_get_src(c, instr->src[1])));
}
@@ -1549,7 +1571,7 @@ ntt_emit_load_input(struct ntt_compile *c, nir_intrinsic_instr *instr)
case nir_intrinsic_load_barycentric_at_sample:
ureg_INTERP_SAMPLE(c->ureg, ntt_get_dest(c, &instr->dest), input,
ureg_imm1u(c->ureg,
- nir_src_as_uint(bary_instr->src[0])));
+ ntt_src_as_uint(c, bary_instr->src[0])));
break;
case nir_intrinsic_load_barycentric_at_offset:
@@ -1891,7 +1913,7 @@ ntt_emit_texture(struct ntt_compile *c, nir_tex_instr *instr)
int lod_src = nir_tex_instr_src_index(instr, nir_tex_src_lod);
if (lod_src >= 0 &&
nir_src_is_const(instr->src[lod_src].src) &&
- nir_src_as_uint(instr->src[lod_src].src) == 0) {
+ ntt_src_as_uint(c, instr->src[lod_src].src) == 0) {
tex_opcode = TGSI_OPCODE_TXF_LZ;
}
}
More information about the mesa-commit
mailing list