/* generate either a constant or indirect deref chain for accessing an
* array variable.
*/
-static nir_deref_var *
-ttn_array_deref(struct ttn_compile *c, nir_intrinsic_instr *instr,
- nir_variable *var, unsigned offset,
+static nir_deref_instr *
+ttn_array_deref(struct ttn_compile *c, nir_variable *var, unsigned offset,
struct tgsi_ind_register *indirect)
{
- nir_deref_var *deref = nir_deref_var_create(instr, var);
- nir_deref_array *arr = nir_deref_array_create(deref);
-
- arr->base_offset = offset;
- arr->deref.type = glsl_get_array_element(var->type);
-
- if (indirect) {
- arr->deref_array_type = nir_deref_array_type_indirect;
- arr->indirect = nir_src_for_ssa(ttn_src_for_indirect(c, indirect));
- } else {
- arr->deref_array_type = nir_deref_array_type_direct;
- }
-
- deref->deref.child = &arr->deref;
-
- return deref;
+ nir_deref_instr *deref = nir_build_deref_var(&c->build, var);
+ nir_ssa_def *index = nir_imm_int(&c->build, offset);
+ if (indirect)
+ index = nir_iadd(&c->build, index, ttn_src_for_indirect(c, indirect));
+ return nir_build_deref_array(&c->build, deref, index);
}
static nir_src
if (c->temp_regs[index].var) {
unsigned offset = c->temp_regs[index].offset;
nir_variable *var = c->temp_regs[index].var;
- nir_intrinsic_instr *load;
-
- load = nir_intrinsic_instr_create(b->shader,
- nir_intrinsic_load_var);
- load->num_components = 4;
- load->variables[0] = ttn_array_deref(c, load, var, offset, indirect);
- nir_ssa_dest_init(&load->instr, &load->dest,
- 4, 32, NULL);
- nir_builder_instr_insert(b, &load->instr);
-
- src = nir_src_for_ssa(&load->dest.ssa);
+ nir_ssa_def *load = nir_load_deref(&c->build,
+ ttn_array_deref(c, var, offset, indirect));
+ src = nir_src_for_ssa(load);
} else {
assert(!indirect);
src.reg.reg = c->temp_regs[index].reg;
if (var) {
unsigned index = tgsi_dst->Register.Index;
unsigned offset = c->temp_regs[index].offset;
- nir_intrinsic_instr *store =
- nir_intrinsic_instr_create(b->shader, nir_intrinsic_store_var);
struct tgsi_ind_register *indirect = tgsi_dst->Register.Indirect ?
&tgsi_dst->Indirect : NULL;
-
- store->num_components = 4;
- nir_intrinsic_set_write_mask(store, dest.write_mask);
- store->variables[0] = ttn_array_deref(c, store, var, offset, indirect);
- store->src[0] = nir_src_for_reg(dest.dest.reg.reg);
-
- nir_builder_instr_insert(b, &store->instr);
+ nir_src val = nir_src_for_reg(dest.dest.reg.reg);
+ nir_store_deref(b, ttn_array_deref(c, var, offset, indirect),
+ nir_ssa_for_src(b, val, 4), dest.write_mask);
}
}