pan/bi: Add move lowering pass
We need ALU mostly scalarized, but we get vector moves created from lower_vec_to_mov so let's scalarize that ourselves rather than bother NIR. Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4276>
This commit is contained in:
parent
58a51c49bb
commit
50d3f4df45
|
@ -838,6 +838,44 @@ bi_optimize_nir(nir_shader *nir)
|
|||
NIR_PASS(progress, nir, nir_opt_dce);
|
||||
}
|
||||
|
||||
static void
|
||||
bi_insert_mov32(bi_context *ctx, bi_instruction *parent, unsigned comp)
|
||||
{
|
||||
bi_instruction move = {
|
||||
.type = BI_MOV,
|
||||
.dest = parent->dest,
|
||||
.dest_type = nir_type_uint32,
|
||||
.writemask = (0xF << (4 * comp)),
|
||||
.src = { parent->src[0] },
|
||||
.src_types = { nir_type_uint32 },
|
||||
.swizzle = { { comp } }
|
||||
};
|
||||
|
||||
bi_emit_before(ctx, parent, move);
|
||||
}
|
||||
|
||||
static void
|
||||
bi_lower_mov(bi_context *ctx, bi_block *block)
|
||||
{
|
||||
bi_foreach_instr_in_block_safe(block, ins) {
|
||||
if (ins->type != BI_MOV) continue;
|
||||
if (util_bitcount(ins->writemask) <= 4) continue;
|
||||
|
||||
for (unsigned i = 0; i < 4; ++i) {
|
||||
unsigned quad = (ins->writemask >> (4 * i)) & 0xF;
|
||||
|
||||
if (quad == 0)
|
||||
continue;
|
||||
else if (quad == 0xF)
|
||||
bi_insert_mov32(ctx, ins, i);
|
||||
else
|
||||
unreachable("TODO: Lowering <32bit moves");
|
||||
}
|
||||
|
||||
bi_remove_instruction(ins);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
bifrost_compile_shader_nir(nir_shader *nir, panfrost_program *program, unsigned product_id)
|
||||
{
|
||||
|
@ -881,6 +919,11 @@ bifrost_compile_shader_nir(nir_shader *nir, panfrost_program *program, unsigned
|
|||
break; /* TODO: Multi-function shaders */
|
||||
}
|
||||
|
||||
bi_foreach_block(ctx, _block) {
|
||||
bi_block *block = (bi_block *) _block;
|
||||
bi_lower_mov(ctx, block);
|
||||
}
|
||||
|
||||
bool progress = false;
|
||||
|
||||
do {
|
||||
|
|
Loading…
Reference in New Issue