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. --- src/compiler/nir/nir_validate.c | 74 ++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 37 deletions(-)
diff --git a/src/compiler/nir/nir_validate.c b/src/compiler/nir/nir_validate.c index 5566ceb..d05b982 100644 --- a/src/compiler/nir/nir_validate.c +++ b/src/compiler/nir/nir_validate.c @@ -473,42 +473,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_infos[instr->intrinsic].src_components[i]; - if (components_read == 0) - components_read = instr->num_components; - - 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_infos[instr->intrinsic].dest_components; - if (components_written == 0) - components_written = instr->num_components; - - 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 = @@ -516,9 +482,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; @@ -526,12 +495,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); @@ -539,9 +510,38 @@ 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_infos[instr->intrinsic].src_components[i]; + if (components_read == 0) + components_read = instr->num_components; + + 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_infos[instr->intrinsic].dest_components; + if (components_written == 0) + components_written = instr->num_components; + + validate_assert(state, components_written > 0); + + validate_dest(&instr->dest, state, dest_bit_size, components_written); + } } static void -- 2.5.0.400.gff86faf _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev