Mesa (main): nir: Set IMAGE_DIM and IMAGE_ARRAY on deref intrinsics

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jul 20 23:35:10 UTC 2021


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

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Mon Jul 12 09:37:01 2021 -0500

nir: Set IMAGE_DIM and IMAGE_ARRAY on deref intrinsics

The rules here are the same as for texture instructions.  The bits on
the intrinsic are the ground truth and are allowed to vary from the
deref a bit as-needed.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11849>

---

 src/compiler/glsl/glsl_to_nir.cpp  | 3 +++
 src/compiler/nir/nir.c             | 2 --
 src/compiler/nir/nir_intrinsics.py | 2 +-
 src/compiler/spirv/spirv_to_nir.c  | 3 +++
 4 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/compiler/glsl/glsl_to_nir.cpp b/src/compiler/glsl/glsl_to_nir.cpp
index 711b91a7de9..aa226643dc4 100644
--- a/src/compiler/glsl/glsl_to_nir.cpp
+++ b/src/compiler/glsl/glsl_to_nir.cpp
@@ -1314,6 +1314,9 @@ nir_visitor::visit(ir_call *ir)
 
          instr->src[0] = nir_src_for_ssa(&deref->dest.ssa);
          param = param->get_next();
+         nir_intrinsic_set_image_dim(instr,
+            (glsl_sampler_dim)type->sampler_dimensionality);
+         nir_intrinsic_set_image_array(instr, type->sampler_array);
 
          /* Set the intrinsic destination. */
          if (ir->return_deref) {
diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c
index c698cf14105..0fcb4d8ba8b 100644
--- a/src/compiler/nir/nir.c
+++ b/src/compiler/nir/nir.c
@@ -2420,8 +2420,6 @@ nir_rewrite_image_intrinsic(nir_intrinsic_instr *intrin, nir_ssa_def *src,
    nir_deref_instr *deref = nir_src_as_deref(intrin->src[0]);
    nir_variable *var = nir_deref_instr_get_variable(deref);
 
-   nir_intrinsic_set_image_dim(intrin, glsl_get_sampler_dim(deref->type));
-   nir_intrinsic_set_image_array(intrin, glsl_sampler_type_is_array(deref->type));
    nir_intrinsic_set_access(intrin, access | var->data.access);
    nir_intrinsic_set_format(intrin, var->data.image.format);
    if (nir_intrinsic_has_src_type(intrin))
diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py
index 74839171589..6adbc0bf79b 100644
--- a/src/compiler/nir/nir_intrinsics.py
+++ b/src/compiler/nir/nir_intrinsics.py
@@ -562,7 +562,7 @@ atomic3("atomic_counter_comp_swap")
 # the ARB_shader_image_load_store specification.
 def image(name, src_comp=[], extra_indices=[], **kwargs):
     intrinsic("image_deref_" + name, src_comp=[1] + src_comp,
-              indices=[ACCESS] + extra_indices, **kwargs)
+              indices=[IMAGE_DIM, IMAGE_ARRAY, ACCESS] + extra_indices, **kwargs)
     intrinsic("image_" + name, src_comp=[1] + src_comp,
               indices=[IMAGE_DIM, IMAGE_ARRAY, FORMAT, ACCESS] + extra_indices, **kwargs)
     intrinsic("bindless_image_" + name, src_comp=[1] + src_comp,
diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c
index c4e05878062..007e1fe1c1b 100644
--- a/src/compiler/spirv/spirv_to_nir.c
+++ b/src/compiler/spirv/spirv_to_nir.c
@@ -3341,6 +3341,9 @@ vtn_handle_image(struct vtn_builder *b, SpvOp opcode,
    nir_intrinsic_instr *intrin = nir_intrinsic_instr_create(b->shader, op);
 
    intrin->src[0] = nir_src_for_ssa(&image.image->dest.ssa);
+   nir_intrinsic_set_image_dim(intrin, glsl_get_sampler_dim(image.image->type));
+   nir_intrinsic_set_image_array(intrin,
+      glsl_sampler_type_is_array(image.image->type));
 
    switch (opcode) {
    case SpvOpImageQuerySamples:



More information about the mesa-commit mailing list