Mesa (main): nir_to_tgsi: Add support for nir_intrinsic_image_samples.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Apr 2 16:04:11 UTC 2022


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

Author: Emma Anholt <emma at anholt.net>
Date:   Fri Feb 11 13:38:28 2022 -0800

nir_to_tgsi: Add support for nir_intrinsic_image_samples.

Found in 1 piglit test on r600.

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

---

 src/gallium/auxiliary/nir/nir_to_tgsi.c | 13 +++++++++++--
 1 file 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:



More information about the mesa-commit mailing list