diff options
author | Rob Clark <[email protected]> | 2018-04-04 20:39:01 -0400 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2018-06-22 20:15:54 -0700 |
commit | f03a33a19a3ea2fffb50a3f3528fa39f6e3db478 (patch) | |
tree | cbe466ecf302f816eacc7d18cbd6e19862af0554 /src/gallium | |
parent | 82c498510eeaa6644e1646e138c86fddffdc9f1f (diff) |
ttn: convert to deref instructions
Signed-off-by: Rob Clark <[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/gallium')
-rw-r--r-- | src/gallium/auxiliary/nir/tgsi_to_nir.c | 52 |
1 files changed, 13 insertions, 39 deletions
diff --git a/src/gallium/auxiliary/nir/tgsi_to_nir.c b/src/gallium/auxiliary/nir/tgsi_to_nir.c index b5b4869b04f..1b31b564246 100644 --- a/src/gallium/auxiliary/nir/tgsi_to_nir.c +++ b/src/gallium/auxiliary/nir/tgsi_to_nir.c @@ -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 * 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 @@ -526,18 +514,10 @@ ttn_src_for_file_and_index(struct ttn_compile *c, unsigned file, unsigned index, 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; @@ -1829,17 +1809,11 @@ ttn_emit_instruction(struct ttn_compile *c) 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); } } |