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 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),
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[c->next_addr_reg] = true;
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: