Mesa (master): gallium/ntt: Emit sample index when necessary for image load/store.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jan 8 22:47:45 UTC 2021


Module: Mesa
Branch: master
Commit: c6d3fd8c21e06086e573be24ef3e28454245845f
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c6d3fd8c21e06086e573be24ef3e28454245845f

Author: Eric Anholt <eric at anholt.net>
Date:   Fri Dec 11 13:31:33 2020 -0800

gallium/ntt: Emit sample index when necessary for image load/store.

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

---

 src/gallium/auxiliary/nir/nir_to_tgsi.c | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/src/gallium/auxiliary/nir/nir_to_tgsi.c b/src/gallium/auxiliary/nir/nir_to_tgsi.c
index d56aca4a4a3..df07dd94330 100644
--- a/src/gallium/auxiliary/nir/nir_to_tgsi.c
+++ b/src/gallium/auxiliary/nir/nir_to_tgsi.c
@@ -1223,10 +1223,12 @@ ntt_emit_image_load_store(struct ntt_compile *c, nir_intrinsic_instr *instr)
    unsigned op;
    struct ureg_src srcs[3];
    int num_src = 0;
+   enum glsl_sampler_dim dim = nir_intrinsic_image_dim(instr);
+   bool is_array = nir_intrinsic_image_array(instr);
 
-   enum tgsi_texture_type target =
-      tgsi_target_from_sampler_dim(nir_intrinsic_image_dim(instr),
-                                   nir_intrinsic_image_array(instr));
+   struct ureg_dst temp = ureg_dst_undef();
+
+   enum tgsi_texture_type target = tgsi_target_from_sampler_dim(dim, is_array);
 
    struct ureg_src resource =
       ntt_ureg_src_indirect(c, ureg_src_register(TGSI_FILE_IMAGE, 0),
@@ -1241,8 +1243,17 @@ ntt_emit_image_load_store(struct ntt_compile *c, nir_intrinsic_instr *instr)
    }
 
    if (instr->intrinsic != nir_intrinsic_image_size) {
-      srcs[num_src++] = ntt_get_src(c, instr->src[1]); /* coord */
-      /* XXX: src[2] sample index to coord.z (2d) or coord.w (2darray) */
+      struct ureg_src coord = ntt_get_src(c, instr->src[1]);
+
+      if (dim == GLSL_SAMPLER_DIM_MS) {
+         temp = ureg_DECL_temporary(c->ureg);
+         ureg_MOV(c->ureg, temp, coord);
+         ureg_MOV(c->ureg, ureg_writemask(temp, 1 << (is_array ? 3 : 2)),
+                  ureg_scalar(ntt_get_src(c, instr->src[2]), TGSI_SWIZZLE_X));
+         coord = ureg_src(temp);
+      }
+      srcs[num_src++] = coord;
+
       if (instr->intrinsic != nir_intrinsic_image_load) {
          srcs[num_src++] = ntt_get_src(c, instr->src[3]); /* data */
          if (instr->intrinsic == nir_intrinsic_image_atomic_comp_swap)
@@ -1301,6 +1312,9 @@ ntt_emit_image_load_store(struct ntt_compile *c, nir_intrinsic_instr *instr)
                     ntt_get_access_qualifier(instr),
                     target,
                     nir_intrinsic_format(instr));
+
+   if (!ureg_dst_is_undef(temp))
+      ureg_release_temporary(c->ureg, temp);
 }
 
 static void



More information about the mesa-commit mailing list