ttn: convert to deref instructions

Signed-off-by: Rob Clark <robdclark@gmail.com>
Acked-by: Rob Clark <robdclark@gmail.com>
Acked-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Acked-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Rob Clark 2018-04-04 20:39:01 -04:00 committed by Jason Ekstrand
parent 82c498510e
commit f03a33a19a

View file

@ -487,27 +487,15 @@ ttn_src_for_indirect(struct ttn_compile *c, struct tgsi_ind_register *indirect);
/* generate either a constant or indirect deref chain for accessing an /* generate either a constant or indirect deref chain for accessing an
* array variable. * array variable.
*/ */
static nir_deref_var * static nir_deref_instr *
ttn_array_deref(struct ttn_compile *c, nir_intrinsic_instr *instr, ttn_array_deref(struct ttn_compile *c, nir_variable *var, unsigned offset,
nir_variable *var, unsigned offset,
struct tgsi_ind_register *indirect) struct tgsi_ind_register *indirect)
{ {
nir_deref_var *deref = nir_deref_var_create(instr, var); nir_deref_instr *deref = nir_build_deref_var(&c->build, var);
nir_deref_array *arr = nir_deref_array_create(deref); nir_ssa_def *index = nir_imm_int(&c->build, offset);
if (indirect)
arr->base_offset = offset; index = nir_iadd(&c->build, index, ttn_src_for_indirect(c, indirect));
arr->deref.type = glsl_get_array_element(var->type); return nir_build_deref_array(&c->build, deref, index);
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;
} }
static nir_src static nir_src
@ -526,18 +514,10 @@ ttn_src_for_file_and_index(struct ttn_compile *c, unsigned file, unsigned index,
if (c->temp_regs[index].var) { if (c->temp_regs[index].var) {
unsigned offset = c->temp_regs[index].offset; unsigned offset = c->temp_regs[index].offset;
nir_variable *var = c->temp_regs[index].var; nir_variable *var = c->temp_regs[index].var;
nir_intrinsic_instr *load; nir_ssa_def *load = nir_load_deref(&c->build,
ttn_array_deref(c, var, offset, indirect));
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);
src = nir_src_for_ssa(load);
} else { } else {
assert(!indirect); assert(!indirect);
src.reg.reg = c->temp_regs[index].reg; src.reg.reg = c->temp_regs[index].reg;
@ -1829,17 +1809,11 @@ ttn_emit_instruction(struct ttn_compile *c)
if (var) { if (var) {
unsigned index = tgsi_dst->Register.Index; unsigned index = tgsi_dst->Register.Index;
unsigned offset = c->temp_regs[index].offset; 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 ? struct tgsi_ind_register *indirect = tgsi_dst->Register.Indirect ?
&tgsi_dst->Indirect : NULL; &tgsi_dst->Indirect : NULL;
nir_src val = nir_src_for_reg(dest.dest.reg.reg);
store->num_components = 4; nir_store_deref(b, ttn_array_deref(c, var, offset, indirect),
nir_intrinsic_set_write_mask(store, dest.write_mask); nir_ssa_for_src(b, val, 4), 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);
} }
} }