nir: Disallow writes to system values and mem_constant

Reviewed-by: Jesse Natalie <jenatali@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6332>
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
index f782253..43ee5a9 100644
--- a/src/compiler/nir/nir.h
+++ b/src/compiler/nir/nir.h
@@ -130,6 +130,8 @@
    nir_var_mem_global      = (1 << 9),
    nir_var_mem_push_const  = (1 << 10), /* not actually used for variables */
    nir_var_mem_constant    = (1 << 11),
+   nir_var_read_only_modes = nir_var_shader_in | nir_var_uniform |
+                             nir_var_system_value | nir_var_mem_constant,
    nir_num_variable_modes  = 12,
    nir_var_all             = (1 << nir_num_variable_modes) - 1,
 } nir_variable_mode;
diff --git a/src/compiler/nir/nir_validate.c b/src/compiler/nir/nir_validate.c
index 83d7e84..f0f1d7d 100644
--- a/src/compiler/nir/nir_validate.c
+++ b/src/compiler/nir/nir_validate.c
@@ -591,8 +591,7 @@
       /* Also allow 32-bit boolean store operations */
       if (glsl_type_is_boolean(dst->type))
          src_bit_sizes[1] |= 32;
-      validate_assert(state, (dst->mode & (nir_var_shader_in |
-                                           nir_var_uniform)) == 0);
+      validate_assert(state, (dst->mode & nir_var_read_only_modes) == 0);
       validate_assert(state, (nir_intrinsic_write_mask(instr) & ~((1 << instr->num_components) - 1)) == 0);
       break;
    }
@@ -602,8 +601,7 @@
       nir_deref_instr *src = nir_src_as_deref(instr->src[1]);
       validate_assert(state, glsl_get_bare_type(dst->type) ==
                              glsl_get_bare_type(src->type));
-      validate_assert(state, (dst->mode & (nir_var_shader_in |
-                                           nir_var_uniform)) == 0);
+      validate_assert(state, (dst->mode & nir_var_read_only_modes) == 0);
       break;
    }