mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 13:30:12 +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 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[c->next_addr_reg] = true;
|
c->addr_declared[i] = 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:
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue