nir_to_tgsi: Use the same address reg mappings as GLSL-to-TGSI did.

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 <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14360>
This commit is contained in:
Emma Anholt 2021-12-29 19:23:14 -08:00 committed by Marge Bot
parent daf59694ac
commit 4bb9c0a28a

View file

@ -45,7 +45,6 @@ struct ntt_compile {
bool native_integers; bool native_integers;
bool has_txf_lz; bool has_txf_lz;
int next_addr_reg;
bool addr_declared[2]; bool addr_declared[2];
struct ureg_dst addr_reg[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 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) { if (c->any_reg_as_address)
/* Make sure we're getting the refcounting right even on any_reg
* drivers.
*/
c->next_addr_reg++;
return ureg_scalar(addr, 0); return ureg_scalar(addr, 0);
}
assert(c->next_addr_reg < ARRAY_SIZE(c->addr_reg)); for (int i = 0; i <= addr_index; i++) {
if (!c->addr_declared[i]) {
if (!c->addr_declared[c->next_addr_reg]) { c->addr_reg[i] = ureg_writemask(ureg_DECL_address(c->ureg),
c->addr_reg[c->next_addr_reg] = ureg_writemask(ureg_DECL_address(c->ureg), TGSI_WRITEMASK_X);
TGSI_WRITEMASK_X); c->addr_declared[i] = true;
c->addr_declared[c->next_addr_reg] = true; }
} }
if (c->native_integers) 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 else
ureg_ARL(c->ureg, c->addr_reg[c->next_addr_reg], addr); ureg_ARL(c->ureg, c->addr_reg[addr_index], addr);
return ureg_scalar(ureg_src(c->addr_reg[c->next_addr_reg++]), 0); return ureg_scalar(ureg_src(c->addr_reg[addr_index]), 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);
} }
static struct ureg_src static struct ureg_src
@ -692,7 +666,7 @@ ntt_get_src(struct ntt_compile *c, nir_src src)
if (src.reg.indirect) { if (src.reg.indirect) {
struct ureg_src offset = ntt_get_src(c, *src.reg.indirect); struct ureg_src offset = ntt_get_src(c, *src.reg.indirect);
return ureg_src_indirect(ureg_src(reg_temp), return ureg_src_indirect(ureg_src(reg_temp),
ntt_reladdr(c, offset)); ntt_reladdr(c, offset, 0));
} else { } else {
return ureg_src(reg_temp); return ureg_src(reg_temp);
} }
@ -784,7 +758,7 @@ ntt_get_dest(struct ntt_compile *c, nir_dest *dest)
if (dest->reg.indirect) { if (dest->reg.indirect) {
struct ureg_src offset = ntt_get_src(c, *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); usrc.Index += ntt_src_as_uint(c, src);
return usrc; return usrc;
} else { } 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); dst.Index += ntt_src_as_uint(c, src);
return dst; return dst;
} else { } 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 else
{ {
return ureg_src_dimension_indirect(usrc, return ureg_src_dimension_indirect(usrc,
ntt_reladdr(c, ntt_get_src(c, src)), ntt_reladdr(c, ntt_get_src(c, src), 1),
0); 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)); return ureg_dst_dimension(udst, ntt_src_as_uint(c, src));
} else { } else {
return ureg_dst_dimension_indirect(udst, return ureg_dst_dimension_indirect(udst,
ntt_reladdr(c, ntt_get_src(c, src)), ntt_reladdr(c, ntt_get_src(c, src), 1),
0); 0);
} }
} }
@ -1357,7 +1331,7 @@ ntt_emit_load_ubo(struct ntt_compile *c, nir_intrinsic_instr *instr)
addr_temp = ureg_DECL_temporary(c->ureg); 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)); 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, src = ureg_src_dimension_indirect(src,
ntt_reladdr(c, ureg_src(addr_temp)), ntt_reladdr(c, ureg_src(addr_temp), 1),
c->first_ubo); 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])) { if (nir_src_is_const(instr->src[1])) {
src.Index += ntt_src_as_uint(c, instr->src[1]); src.Index += ntt_src_as_uint(c, instr->src[1]);
} else { } 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); int start_component = nir_intrinsic_component(instr);
@ -1451,7 +1425,7 @@ ntt_emit_mem(struct ntt_compile *c, nir_intrinsic_instr *instr,
} else { } else {
addr_temp = ureg_DECL_temporary(c->ureg); 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)); 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)); memory = ureg_src_dimension(memory, nir_intrinsic_base(instr));
nir_src = 0; 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]); src = ureg_swizzle(src, swizzle[0], swizzle[1], swizzle[2], swizzle[3]);
ureg_MOV(c->ureg, out, src); ureg_MOV(c->ureg, out, src);
ntt_reladdr_dst_put(c, out);
} }
static void 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)); ureg_MOV(c->ureg, ntt_get_dest(c, &instr->dest), ureg_src(out));
ntt_reladdr_dst_put(c, out);
} }
static void 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); int sampler_src = nir_tex_instr_src_index(instr, nir_tex_src_sampler_offset);
if (sampler_src >= 0) { if (sampler_src >= 0) {
struct ureg_src reladdr = ntt_get_src(c, instr->src[sampler_src].src); 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) { switch (instr->op) {
@ -2294,9 +2266,6 @@ ntt_emit_ssa_undef(struct ntt_compile *c, nir_ssa_undef_instr *instr)
static void static void
ntt_emit_instr(struct ntt_compile *c, nir_instr *instr) 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) { switch (instr->type) {
case nir_instr_type_deref: case nir_instr_type_deref:
/* ignored, will be walked by nir_intrinsic_image_*_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 static void
ntt_emit_cf_list(struct ntt_compile *c, struct exec_list *list) 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) { foreach_list_typed(nir_cf_node, node, node, list) {
switch (node->type) { switch (node->type) {
case nir_cf_node_block: case nir_cf_node_block: