From: Rob Clark Date: Thu, 5 Apr 2018 00:39:01 +0000 (-0400) Subject: ttn: convert to deref instructions X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f03a33a19a3ea2fffb50a3f3528fa39f6e3db478;p=mesa.git ttn: convert to deref instructions Signed-off-by: Rob Clark Acked-by: Rob Clark Acked-by: Bas Nieuwenhuizen Acked-by: Dave Airlie Reviewed-by: Kenneth Graunke --- 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); } }