nir/validate: Rework intrinsic type validation
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 3 Apr 2018 02:23:36 +0000 (19:23 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Sat, 23 Jun 2018 03:15:53 +0000 (20:15 -0700)
This moves the switch statement for specific intrinsics above source and
destination validation.  We also rework the source and destination
validation to use different bit_size values for each source and/or
destination.

Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Acked-by: Rob Clark <robdclark@gmail.com>
Acked-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Acked-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/compiler/nir/nir_validate.c

index abfd1712b397197cdef1eaae64cf22d290a90b3a..4a4d8a651a2beb8972731dd619c3051c7275eaa1 100644 (file)
@@ -465,36 +465,8 @@ validate_deref_var(void *parent_mem_ctx, nir_deref_var *deref, validate_state *s
 static void
 validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state)
 {
-   unsigned bit_size = 0;
-   if (instr->intrinsic == nir_intrinsic_load_var ||
-       instr->intrinsic == nir_intrinsic_store_var) {
-      const struct glsl_type *type =
-         nir_deref_tail(&instr->variables[0]->deref)->type;
-      bit_size = glsl_get_bit_size(type);
-   }
-
-   unsigned num_srcs = nir_intrinsic_infos[instr->intrinsic].num_srcs;
-   for (unsigned i = 0; i < num_srcs; i++) {
-      unsigned components_read = nir_intrinsic_src_components(instr, i);
-
-      validate_assert(state, components_read > 0);
-
-      validate_src(&instr->src[i], state, bit_size, components_read);
-   }
-
-   unsigned num_vars = nir_intrinsic_infos[instr->intrinsic].num_variables;
-   for (unsigned i = 0; i < num_vars; i++) {
-      validate_deref_var(instr, instr->variables[i], state);
-   }
-
-   if (nir_intrinsic_infos[instr->intrinsic].has_dest) {
-      unsigned components_written = nir_intrinsic_dest_components(instr);
-
-      validate_assert(state, components_written > 0);
-
-      validate_dest(&instr->dest, state, bit_size, components_written);
-   }
-
+   unsigned dest_bit_size = 0;
+   unsigned src_bit_sizes[NIR_INTRINSIC_MAX_INPUTS] = { 0, };
    switch (instr->intrinsic) {
    case nir_intrinsic_load_var: {
       const struct glsl_type *type =
@@ -502,9 +474,12 @@ validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state)
       validate_assert(state, glsl_type_is_vector_or_scalar(type) ||
              (instr->variables[0]->var->data.mode == nir_var_uniform &&
               glsl_get_base_type(type) == GLSL_TYPE_SUBROUTINE));
-      validate_assert(state, instr->num_components == glsl_get_vector_elements(type));
+      validate_assert(state, instr->num_components ==
+                             glsl_get_vector_elements(type));
+      dest_bit_size = glsl_get_bit_size(type);
       break;
    }
+
    case nir_intrinsic_store_var: {
       const struct glsl_type *type =
          nir_deref_tail(&instr->variables[0]->deref)->type;
@@ -512,12 +487,14 @@ validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state)
              (instr->variables[0]->var->data.mode == nir_var_uniform &&
               glsl_get_base_type(type) == GLSL_TYPE_SUBROUTINE));
       validate_assert(state, instr->num_components == glsl_get_vector_elements(type));
+      src_bit_sizes[0] = glsl_get_bit_size(type);
       validate_assert(state, instr->variables[0]->var->data.mode != nir_var_shader_in &&
              instr->variables[0]->var->data.mode != nir_var_uniform &&
              instr->variables[0]->var->data.mode != nir_var_shader_storage);
       validate_assert(state, (nir_intrinsic_write_mask(instr) & ~((1 << instr->num_components) - 1)) == 0);
       break;
    }
+
    case nir_intrinsic_copy_var:
       validate_assert(state, nir_deref_tail(&instr->variables[0]->deref)->type ==
              nir_deref_tail(&instr->variables[1]->deref)->type);
@@ -525,9 +502,32 @@ validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state)
              instr->variables[0]->var->data.mode != nir_var_uniform &&
              instr->variables[0]->var->data.mode != nir_var_shader_storage);
       break;
+
    default:
       break;
    }
+
+   unsigned num_srcs = nir_intrinsic_infos[instr->intrinsic].num_srcs;
+   for (unsigned i = 0; i < num_srcs; i++) {
+      unsigned components_read = nir_intrinsic_src_components(instr, i);
+
+      validate_assert(state, components_read > 0);
+
+      validate_src(&instr->src[i], state, src_bit_sizes[i], components_read);
+   }
+
+   unsigned num_vars = nir_intrinsic_infos[instr->intrinsic].num_variables;
+   for (unsigned i = 0; i < num_vars; i++) {
+      validate_deref_var(instr, instr->variables[i], state);
+   }
+
+   if (nir_intrinsic_infos[instr->intrinsic].has_dest) {
+      unsigned components_written = nir_intrinsic_dest_components(instr);
+
+      validate_assert(state, components_written > 0);
+
+      validate_dest(&instr->dest, state, dest_bit_size, components_written);
+   }
 }
 
 static void