+ return nir_iadd(b, nir_imul(b, nir_u2u(b, group_id, bit_size),
+ nir_u2u(b, group_size, bit_size)),
+ nir_u2u(b, local_id, bit_size));
+ }
+
+ case nir_intrinsic_load_global_invocation_index: {
+ nir_ssa_def *global_id = nir_load_global_invocation_id(b, bit_size);
+ nir_ssa_def *global_size = build_global_group_size(b, bit_size);
+
+ /* index = id.x + ((id.y + (id.z * size.y)) * size.x) */
+ nir_ssa_def *index;
+ index = nir_imul(b, nir_channel(b, global_id, 2),
+ nir_channel(b, global_size, 1));
+ index = nir_iadd(b, nir_channel(b, global_id, 1), index);
+ index = nir_imul(b, nir_channel(b, global_size, 0), index);
+ index = nir_iadd(b, nir_channel(b, global_id, 0), index);
+ return index;
+ }
+
+ case nir_intrinsic_load_helper_invocation:
+ if (b->shader->options->lower_helper_invocation) {
+ nir_ssa_def *tmp;
+ tmp = nir_ishl(b, nir_imm_int(b, 1),
+ nir_load_sample_id_no_per_sample(b));
+ tmp = nir_iand(b, nir_load_sample_mask_in(b), tmp);
+ return nir_inot(b, nir_i2b(b, tmp));
+ } else {
+ return NULL;
+ }
+
+ case nir_intrinsic_load_num_work_groups:
+ case nir_intrinsic_load_work_group_id:
+ return sanitize_32bit_sysval(b, intrin);
+
+ case nir_intrinsic_load_deref: {
+ nir_deref_instr *deref = nir_src_as_deref(intrin->src[0]);
+ if (deref->mode != nir_var_system_value)
+ return NULL;
+
+ if (deref->deref_type != nir_deref_type_var) {
+ /* The only one system value that is an array and that is
+ * gl_SampleMask which is always an array of one element.
+ */
+ assert(deref->deref_type == nir_deref_type_array);
+ deref = nir_deref_instr_parent(deref);
+ assert(deref->deref_type == nir_deref_type_var);
+ assert(deref->var->data.location == SYSTEM_VALUE_SAMPLE_MASK_IN);