X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fpanfrost%2Fmidgard%2Fmidgard_opt_perspective.c;h=34afcfa6c93bf1fac661c9a2c515e40237692422;hb=af97331aba5864ac3d029faab4e6ed0b216b318f;hp=df826bc30c1d3551263d7eb64a353a9c02fa9dd9;hpb=9ce75826cb00a252c6012d74046fa15bf0998080;p=mesa.git diff --git a/src/panfrost/midgard/midgard_opt_perspective.c b/src/panfrost/midgard/midgard_opt_perspective.c index df826bc30c1..34afcfa6c93 100644 --- a/src/panfrost/midgard/midgard_opt_perspective.c +++ b/src/panfrost/midgard/midgard_opt_perspective.c @@ -37,6 +37,16 @@ #include "compiler.h" +static bool +is_swizzle_0(unsigned *swizzle) +{ + for (unsigned c = 0; c < MIR_VEC_COMPONENTS; ++c) + if (swizzle[c]) + return false; + + return true; +} + bool midgard_opt_combine_projection(compiler_context *ctx, midgard_block *block) { @@ -45,44 +55,35 @@ midgard_opt_combine_projection(compiler_context *ctx, midgard_block *block) mir_foreach_instr_in_block_safe(block, ins) { /* First search for fmul */ if (ins->type != TAG_ALU_4) continue; - if (ins->alu.op != midgard_alu_op_fmul) continue; + if (ins->op != midgard_alu_op_fmul) continue; /* TODO: Flip */ /* Check the swizzles */ - midgard_vector_alu_src src1 = - vector_alu_from_unsigned(ins->alu.src1); - - midgard_vector_alu_src src2 = - vector_alu_from_unsigned(ins->alu.src2); - - if (!mir_is_simple_swizzle(src1.swizzle, ins->mask)) continue; - if (src2.swizzle != SWIZZLE_XXXX) continue; + if (!mir_is_simple_swizzle(ins->swizzle[0], ins->mask)) continue; + if (!is_swizzle_0(ins->swizzle[1])) continue; /* Awesome, we're the right form. Now check where src2 is from */ - unsigned frcp = ins->ssa_args.src1; - unsigned to = ins->ssa_args.dest; + unsigned frcp = ins->src[1]; + unsigned to = ins->dest; - if (frcp >= ctx->func->impl->ssa_alloc) continue; - if (to >= ctx->func->impl->ssa_alloc) continue; + if (frcp & PAN_IS_REG) continue; + if (to & PAN_IS_REG) continue; bool frcp_found = false; unsigned frcp_component = 0; unsigned frcp_from = 0; mir_foreach_instr_in_block_safe(block, sub) { - if (sub->ssa_args.dest != frcp) continue; - - midgard_vector_alu_src s = - vector_alu_from_unsigned(sub->alu.src1); + if (sub->dest != frcp) continue; - frcp_component = s.swizzle & 3; - frcp_from = sub->ssa_args.src0; + frcp_component = sub->swizzle[0][0]; + frcp_from = sub->src[0]; frcp_found = (sub->type == TAG_ALU_4) && - (sub->alu.op == midgard_alu_op_frcp); + (sub->op == midgard_alu_op_frcp); break; } @@ -98,9 +99,9 @@ midgard_opt_combine_projection(compiler_context *ctx, midgard_block *block) if (mir_use_count(ctx, frcp_from) > 2) continue; mir_foreach_instr_in_block_safe(block, v) { - if (v->ssa_args.dest != frcp_from) continue; + if (v->dest != frcp_from) continue; if (v->type != TAG_LOAD_STORE_4) break; - if (!OP_IS_LOAD_VARY_F(v->load_store.op)) break; + if (!OP_IS_LOAD_VARY_F(v->op)) break; ok = true; break; @@ -114,21 +115,20 @@ midgard_opt_combine_projection(compiler_context *ctx, midgard_block *block) midgard_instruction accel = { .type = TAG_LOAD_STORE_4, .mask = ins->mask, - .ssa_args = { - .dest = to, - .src0 = frcp_from, - .src1 = -1 - }, + .dest = to, + .dest_type = nir_type_float32, + .src = { frcp_from, ~0, ~0, ~0 }, + .src_types = { nir_type_float32 }, + .swizzle = SWIZZLE_IDENTITY_4, + .op = frcp_component == COMPONENT_W ? + midgard_op_ldst_perspective_division_w : + midgard_op_ldst_perspective_division_z, .load_store = { - .op = frcp_component == COMPONENT_W ? - midgard_op_ldst_perspective_division_w : - midgard_op_ldst_perspective_division_z, - .swizzle = SWIZZLE_XYZW, - .unknown = 0x24, + .arg_1 = 0x20 } }; - mir_insert_instruction_before(ins, accel); + mir_insert_instruction_before(ctx, ins, accel); mir_remove_instruction(ins); progress |= true; @@ -145,13 +145,13 @@ midgard_opt_varying_projection(compiler_context *ctx, midgard_block *block) mir_foreach_instr_in_block_safe(block, ins) { /* Search for a projection */ if (ins->type != TAG_LOAD_STORE_4) continue; - if (!OP_IS_PROJECTION(ins->load_store.op)) continue; + if (!OP_IS_PROJECTION(ins->op)) continue; - unsigned vary = ins->ssa_args.src0; - unsigned to = ins->ssa_args.dest; + unsigned vary = ins->src[0]; + unsigned to = ins->dest; - if (vary >= ctx->func->impl->ssa_alloc) continue; - if (to >= ctx->func->impl->ssa_alloc) continue; + if (vary & PAN_IS_REG) continue; + if (to & PAN_IS_REG) continue; if (!mir_single_use(ctx, vary)) continue; /* Check for a varying source. If we find it, we rewrite */ @@ -159,9 +159,9 @@ midgard_opt_varying_projection(compiler_context *ctx, midgard_block *block) bool rewritten = false; mir_foreach_instr_in_block_safe(block, v) { - if (v->ssa_args.dest != vary) continue; + if (v->dest != vary) continue; if (v->type != TAG_LOAD_STORE_4) break; - if (!OP_IS_LOAD_VARY_F(v->load_store.op)) break; + if (!OP_IS_LOAD_VARY_F(v->op)) break; /* We found it, so rewrite it to project. Grab the * modifier */ @@ -174,7 +174,7 @@ midgard_opt_varying_projection(compiler_context *ctx, midgard_block *block) break; bool projects_w = - ins->load_store.op == midgard_op_ldst_perspective_division_w; + ins->op == midgard_op_ldst_perspective_division_w; p.modifier = projects_w ? midgard_varying_mod_perspective_w : @@ -185,7 +185,7 @@ midgard_opt_varying_projection(compiler_context *ctx, midgard_block *block) v->load_store.varying_parameters = param; /* Use the new destination */ - v->ssa_args.dest = to; + v->dest = to; rewritten = true; break;