From 4bb9c0a28a5f06341060353dba1a017d154d51a4 Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Wed, 29 Dec 2021 19:23:14 -0800 Subject: [PATCH] nir_to_tgsi: Use the same address reg mappings as GLSL-to-TGSI did. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It turns out r600 has a bunch of expectations about the Dimension being in ADDR[1].x, and sampler or atomic indirects being in ADDR[2].x. It's simpler to just use this static assignment than our dynamic one, anyway. Reviewed-by: Marek Olšák Part-of: --- src/gallium/auxiliary/nir/nir_to_tgsi.c | 78 +++++++------------------ 1 file changed, 21 insertions(+), 57 deletions(-) diff --git a/src/gallium/auxiliary/nir/nir_to_tgsi.c b/src/gallium/auxiliary/nir/nir_to_tgsi.c index 71eee4ace0f..549cfea7804 100644 --- a/src/gallium/auxiliary/nir/nir_to_tgsi.c +++ b/src/gallium/auxiliary/nir/nir_to_tgsi.c @@ -45,7 +45,6 @@ struct ntt_compile { bool native_integers; bool has_txf_lz; - int next_addr_reg; bool addr_declared[2]; struct ureg_dst addr_reg[2]; @@ -631,49 +630,24 @@ ntt_get_load_const_src(struct ntt_compile *c, nir_load_const_instr *instr) } static struct ureg_src -ntt_reladdr(struct ntt_compile *c, struct ureg_src addr) +ntt_reladdr(struct ntt_compile *c, struct ureg_src addr, int addr_index) { - if (c->any_reg_as_address) { - /* Make sure we're getting the refcounting right even on any_reg - * drivers. - */ - c->next_addr_reg++; - + if (c->any_reg_as_address) return ureg_scalar(addr, 0); - } - assert(c->next_addr_reg < ARRAY_SIZE(c->addr_reg)); - - if (!c->addr_declared[c->next_addr_reg]) { - c->addr_reg[c->next_addr_reg] = ureg_writemask(ureg_DECL_address(c->ureg), - TGSI_WRITEMASK_X); - c->addr_declared[c->next_addr_reg] = true; + for (int i = 0; i <= addr_index; i++) { + if (!c->addr_declared[i]) { + c->addr_reg[i] = ureg_writemask(ureg_DECL_address(c->ureg), + TGSI_WRITEMASK_X); + c->addr_declared[i] = true; + } } if (c->native_integers) - ureg_UARL(c->ureg, c->addr_reg[c->next_addr_reg], addr); + ureg_UARL(c->ureg, c->addr_reg[addr_index], addr); else - ureg_ARL(c->ureg, c->addr_reg[c->next_addr_reg], addr); - return ureg_scalar(ureg_src(c->addr_reg[c->next_addr_reg++]), 0); -} - -static void -ntt_put_reladdr(struct ntt_compile *c) -{ - c->next_addr_reg--; - assert(c->next_addr_reg >= 0); -} - -static void -ntt_reladdr_dst_put(struct ntt_compile *c, struct ureg_dst dst) -{ - if (c->any_reg_as_address) - return; - - if (dst.Indirect) - ntt_put_reladdr(c); - if (dst.DimIndirect) - ntt_put_reladdr(c); + ureg_ARL(c->ureg, c->addr_reg[addr_index], addr); + return ureg_scalar(ureg_src(c->addr_reg[addr_index]), 0); } static struct ureg_src @@ -692,7 +666,7 @@ ntt_get_src(struct ntt_compile *c, nir_src src) if (src.reg.indirect) { struct ureg_src offset = ntt_get_src(c, *src.reg.indirect); return ureg_src_indirect(ureg_src(reg_temp), - ntt_reladdr(c, offset)); + ntt_reladdr(c, offset, 0)); } else { return ureg_src(reg_temp); } @@ -784,7 +758,7 @@ ntt_get_dest(struct ntt_compile *c, nir_dest *dest) if (dest->reg.indirect) { struct ureg_src offset = ntt_get_src(c, *dest->reg.indirect); - dst = ureg_dst_indirect(dst, ntt_reladdr(c, offset)); + dst = ureg_dst_indirect(dst, ntt_reladdr(c, offset, 0)); } } @@ -1276,7 +1250,7 @@ ntt_ureg_src_indirect(struct ntt_compile *c, struct ureg_src usrc, usrc.Index += ntt_src_as_uint(c, src); return usrc; } else { - return ureg_src_indirect(usrc, ntt_reladdr(c, ntt_get_src(c, src))); + return ureg_src_indirect(usrc, ntt_reladdr(c, ntt_get_src(c, src), 0)); } } @@ -1288,7 +1262,7 @@ ntt_ureg_dst_indirect(struct ntt_compile *c, struct ureg_dst dst, dst.Index += ntt_src_as_uint(c, src); return dst; } else { - return ureg_dst_indirect(dst, ntt_reladdr(c, ntt_get_src(c, src))); + return ureg_dst_indirect(dst, ntt_reladdr(c, ntt_get_src(c, src), 0)); } } @@ -1302,7 +1276,7 @@ ntt_ureg_src_dimension_indirect(struct ntt_compile *c, struct ureg_src usrc, else { return ureg_src_dimension_indirect(usrc, - ntt_reladdr(c, ntt_get_src(c, src)), + ntt_reladdr(c, ntt_get_src(c, src), 1), 0); } } @@ -1315,7 +1289,7 @@ ntt_ureg_dst_dimension_indirect(struct ntt_compile *c, struct ureg_dst udst, return ureg_dst_dimension(udst, ntt_src_as_uint(c, src)); } else { return ureg_dst_dimension_indirect(udst, - ntt_reladdr(c, ntt_get_src(c, src)), + ntt_reladdr(c, ntt_get_src(c, src), 1), 0); } } @@ -1357,7 +1331,7 @@ ntt_emit_load_ubo(struct ntt_compile *c, nir_intrinsic_instr *instr) addr_temp = ureg_DECL_temporary(c->ureg); ureg_UADD(c->ureg, addr_temp, ntt_get_src(c, instr->src[0]), ureg_imm1i(c->ureg, -c->first_ubo)); src = ureg_src_dimension_indirect(src, - ntt_reladdr(c, ureg_src(addr_temp)), + ntt_reladdr(c, ureg_src(addr_temp), 1), c->first_ubo); } @@ -1369,7 +1343,7 @@ ntt_emit_load_ubo(struct ntt_compile *c, nir_intrinsic_instr *instr) if (nir_src_is_const(instr->src[1])) { src.Index += ntt_src_as_uint(c, instr->src[1]); } else { - src = ureg_src_indirect(src, ntt_reladdr(c, ntt_get_src(c, instr->src[1]))); + src = ureg_src_indirect(src, ntt_reladdr(c, ntt_get_src(c, instr->src[1]), 0)); } int start_component = nir_intrinsic_component(instr); @@ -1451,7 +1425,7 @@ ntt_emit_mem(struct ntt_compile *c, nir_intrinsic_instr *instr, } else { addr_temp = ureg_DECL_temporary(c->ureg); ureg_USHR(c->ureg, addr_temp, ntt_get_src(c, instr->src[0]), ureg_imm1i(c->ureg, 2)); - memory = ureg_src_indirect(memory, ntt_reladdr(c, ureg_src(addr_temp))); + memory = ureg_src_indirect(memory, ntt_reladdr(c, ureg_src(addr_temp), 2)); } memory = ureg_src_dimension(memory, nir_intrinsic_base(instr)); nir_src = 0; @@ -1820,7 +1794,6 @@ ntt_emit_store_output(struct ntt_compile *c, nir_intrinsic_instr *instr) src = ureg_swizzle(src, swizzle[0], swizzle[1], swizzle[2], swizzle[3]); ureg_MOV(c->ureg, out, src); - ntt_reladdr_dst_put(c, out); } static void @@ -1843,7 +1816,6 @@ ntt_emit_load_output(struct ntt_compile *c, nir_intrinsic_instr *instr) } ureg_MOV(c->ureg, ntt_get_dest(c, &instr->dest), ureg_src(out)); - ntt_reladdr_dst_put(c, out); } static void @@ -2120,7 +2092,7 @@ ntt_emit_texture(struct ntt_compile *c, nir_tex_instr *instr) int sampler_src = nir_tex_instr_src_index(instr, nir_tex_src_sampler_offset); if (sampler_src >= 0) { struct ureg_src reladdr = ntt_get_src(c, instr->src[sampler_src].src); - sampler = ureg_src_indirect(sampler, ntt_reladdr(c, reladdr)); + sampler = ureg_src_indirect(sampler, ntt_reladdr(c, reladdr, 2)); } switch (instr->op) { @@ -2294,9 +2266,6 @@ ntt_emit_ssa_undef(struct ntt_compile *c, nir_ssa_undef_instr *instr) static void ntt_emit_instr(struct ntt_compile *c, nir_instr *instr) { - /* There is no addr reg in use before we start emitting an instr. */ - c->next_addr_reg = 0; - switch (instr->type) { case nir_instr_type_deref: /* ignored, will be walked by nir_intrinsic_image_*_deref. */ @@ -2435,11 +2404,6 @@ ntt_emit_block(struct ntt_compile *c, nir_block *block) static void ntt_emit_cf_list(struct ntt_compile *c, struct exec_list *list) { - /* There is no addr reg in use before we start emitting any part of a CF - * node (such as an if condition) - */ - c->next_addr_reg = 0; - foreach_list_typed(nir_cf_node, node, node, list) { switch (node->type) { case nir_cf_node_block: