mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 09:10:11 +01:00
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:
parent
daf59694ac
commit
4bb9c0a28a
1 changed files with 21 additions and 57 deletions
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue