Mesa (main): nir: Validate newly documented texture restrictions

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jul 23 16:25:51 UTC 2021


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

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Fri Jul  9 08:09:46 2021 -0500

nir: Validate newly documented texture restrictions

Reviewed-by: Alyssa Rosenzweig <alyssa at collabora.com>
Acked-by: Adam Jackson <ajax at redhat.com>
Reviewed-by: Connor Abbott <cwabbott0 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11775>

---

 src/compiler/nir/nir_validate.c | 81 ++++++++++++++++++++++++++++++++++++++---
 1 file changed, 76 insertions(+), 5 deletions(-)

diff --git a/src/compiler/nir/nir_validate.c b/src/compiler/nir/nir_validate.c
index 8791ed3b050..648e5af7a1a 100644
--- a/src/compiler/nir/nir_validate.c
+++ b/src/compiler/nir/nir_validate.c
@@ -835,17 +835,88 @@ validate_tex_instr(nir_tex_instr *instr, validate_state *state)
                    0, nir_tex_instr_src_size(instr, i));
 
       switch (instr->src[i].src_type) {
-      case nir_tex_src_texture_deref:
-      case nir_tex_src_sampler_deref:
-         validate_assert(state, instr->src[i].src.is_ssa);
-         validate_assert(state,
-                         instr->src[i].src.ssa->parent_instr->type == nir_instr_type_deref);
+      case nir_tex_src_coord:
+         validate_assert(state, nir_src_num_components(instr->src[i].src) ==
+                                instr->coord_components);
+         break;
+
+      case nir_tex_src_projector:
+         validate_assert(state, nir_src_num_components(instr->src[i].src) == 1);
+         break;
+
+      case nir_tex_src_comparator:
+         validate_assert(state, instr->is_shadow);
+         validate_assert(state, nir_src_num_components(instr->src[i].src) == 1);
+         break;
+
+      case nir_tex_src_offset:
+         validate_assert(state, nir_src_num_components(instr->src[i].src) ==
+                                instr->coord_components - instr->is_array);
+         break;
+
+      case nir_tex_src_bias:
+         validate_assert(state, instr->op == nir_texop_txb ||
+                                instr->op == nir_texop_tg4);
+         validate_assert(state, nir_src_num_components(instr->src[i].src) == 1);
+         break;
+
+      case nir_tex_src_lod:
+         validate_assert(state, instr->op != nir_texop_tex &&
+                                instr->op != nir_texop_txb &&
+                                instr->op != nir_texop_txd &&
+                                instr->op != nir_texop_lod);
+         validate_assert(state, nir_src_num_components(instr->src[i].src) == 1);
+         break;
+
+      case nir_tex_src_min_lod:
+      case nir_tex_src_ms_index:
+         validate_assert(state, nir_src_num_components(instr->src[i].src) == 1);
+         break;
+
+      case nir_tex_src_ddx:
+      case nir_tex_src_ddy:
+         validate_assert(state, instr->op == nir_texop_txd);
+         validate_assert(state, nir_src_num_components(instr->src[i].src) ==
+                                instr->coord_components - instr->is_array);
          break;
+
+      case nir_tex_src_texture_deref: {
+         nir_deref_instr *deref = nir_src_as_deref(instr->src[i].src);
+         if (!validate_assert(state, deref))
+            break;
+
+         validate_assert(state, glsl_type_is_image(deref->type) ||
+                                glsl_type_is_sampler(deref->type));
+         break;
+      }
+
+      case nir_tex_src_sampler_deref: {
+         nir_deref_instr *deref = nir_src_as_deref(instr->src[i].src);
+         if (!validate_assert(state, deref))
+            break;
+
+         validate_assert(state, glsl_type_is_sampler(deref->type));
+         break;
+      }
+
+      case nir_tex_src_texture_offset:
+      case nir_tex_src_sampler_offset:
+      case nir_tex_src_plane:
+         validate_assert(state, nir_src_num_components(instr->src[i].src) == 1);
+         break;
+
+      case nir_tex_src_texture_handle:
+      case nir_tex_src_sampler_handle:
+         break;
+
       default:
          break;
       }
    }
 
+   if (instr->op != nir_texop_tg4)
+      validate_assert(state, instr->component == 0);
+
    if (nir_tex_instr_has_explicit_tg4_offsets(instr)) {
       validate_assert(state, instr->op == nir_texop_tg4);
       validate_assert(state, !src_type_seen[nir_tex_src_offset]);



More information about the mesa-commit mailing list