summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2018-04-02 19:23:36 -0700
committerJason Ekstrand <[email protected]>2018-06-22 20:15:53 -0700
commit5fbbbda37a09e6d253532fd83097b21cd289c16b (patch)
tree4b0a371be87b28be34b060c365fbc35df8a7509f /src
parent133e8bf4de0439b37ec1b684087571e349991cd9 (diff)
nir/validate: Rework intrinsic type validation
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 <[email protected]> Acked-by: Rob Clark <[email protected]> Acked-by: Bas Nieuwenhuizen <[email protected]> Acked-by: Dave Airlie <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/compiler/nir/nir_validate.c62
1 files changed, 31 insertions, 31 deletions
diff --git a/src/compiler/nir/nir_validate.c b/src/compiler/nir/nir_validate.c
index abfd1712b39..4a4d8a651a2 100644
--- a/src/compiler/nir/nir_validate.c
+++ b/src/compiler/nir/nir_validate.c
@@ -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