summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmma Anholt <emma@anholt.net>2022-02-11 13:38:28 -0800
committerMarge Bot <emma+marge@anholt.net>2022-04-02 15:17:01 +0000
commit44aff2beec8de4d971005a6d5abff1327b955969 (patch)
tree3e88807ec5e0ec543f39b4e1f9e0962440316c29
parenta570e6c243e79429a95bc58f2097bae4220cdda8 (diff)
nir_to_tgsi: Add support for nir_intrinsic_image_samples.
Found in 1 piglit test on r600. Reviewed-by: Gert Wollny <gert.wollny@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15627>
-rw-r--r--src/gallium/auxiliary/nir/nir_to_tgsi.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/gallium/auxiliary/nir/nir_to_tgsi.c b/src/gallium/auxiliary/nir/nir_to_tgsi.c
index f4d3110b7fd..f0033ef8a96 100644
--- a/src/gallium/auxiliary/nir/nir_to_tgsi.c
+++ b/src/gallium/auxiliary/nir/nir_to_tgsi.c
@@ -2016,8 +2016,9 @@ ntt_emit_image_load_store(struct ntt_compile *c, nir_intrinsic_instr *instr)
srcs[num_src++] = resource;
dst = ntt_get_dest(c, &instr->dest);
}
+ struct ureg_dst opcode_dst = dst;
- if (instr->intrinsic != nir_intrinsic_image_size) {
+ if (instr->intrinsic != nir_intrinsic_image_size && instr->intrinsic != nir_intrinsic_image_samples) {
struct ureg_src coord = ntt_get_src(c, instr->src[1]);
if (dim == GLSL_SAMPLER_DIM_MS) {
@@ -2046,6 +2047,10 @@ ntt_emit_image_load_store(struct ntt_compile *c, nir_intrinsic_instr *instr)
case nir_intrinsic_image_size:
op = TGSI_OPCODE_RESQ;
break;
+ case nir_intrinsic_image_samples:
+ op = TGSI_OPCODE_RESQ;
+ opcode_dst = ureg_writemask(ntt_temp(c), TGSI_WRITEMASK_W);
+ break;
case nir_intrinsic_image_atomic_add:
op = TGSI_OPCODE_ATOMUADD;
break;
@@ -2083,11 +2088,14 @@ ntt_emit_image_load_store(struct ntt_compile *c, nir_intrinsic_instr *instr)
unreachable("bad op");
}
- struct ntt_insn *insn = ntt_insn(c, op, dst, srcs[0], srcs[1], srcs[2], srcs[3]);
+ struct ntt_insn *insn = ntt_insn(c, op, opcode_dst, srcs[0], srcs[1], srcs[2], srcs[3]);
insn->tex_target = target;
insn->mem_qualifier = ntt_get_access_qualifier(instr);
insn->mem_format = nir_intrinsic_format(instr);
insn->is_mem = true;
+
+ if (instr->intrinsic == nir_intrinsic_image_samples)
+ ntt_MOV(c, dst, ureg_scalar(ureg_src(opcode_dst), 3));
}
static void
@@ -2416,6 +2424,7 @@ ntt_emit_intrinsic(struct ntt_compile *c, nir_intrinsic_instr *instr)
case nir_intrinsic_image_load:
case nir_intrinsic_image_store:
case nir_intrinsic_image_size:
+ case nir_intrinsic_image_samples:
case nir_intrinsic_image_atomic_add:
case nir_intrinsic_image_atomic_fadd:
case nir_intrinsic_image_atomic_imin: